@@ -13,9 +13,13 @@ def generate_checked_function(func):
1313 params = func .type .args .params if func .type .args else []
1414
1515 # Determine the return type
16+ return_pointer = False
1617 return_type = "void" # Default to void if no return type is specified
1718 if isinstance (func .type .type , c_ast .TypeDecl ):
1819 return_type = " " .join (func .type .type .type .names )
20+ # TODO: figure out a better way to detect typedef from pointer
21+ if isinstance (func .type .type , c_ast .PtrDecl ):
22+ return_pointer = True
1923
2024 # Start building the new function
2125 new_func = [f"static inline Result { new_func_name } (" ]
@@ -55,36 +59,41 @@ def generate_checked_function(func):
5559 # Call the original function
5660 if return_type == "void" :
5761 new_func .append (f" { func_name } ({ ', ' .join (param_list )} );" )
58- new_func .append (f" Result res = {{ .error_code = 0 }};" )
5962 elif has_variadic :
6063 new_func .append (" va_start(args, " + param_list [- 2 ] + ");" )
6164 new_func .append (
6265 f" { return_type } original_result = { func_name } ({ ', ' .join (param_list [:- 1 ])} , args);"
6366 )
6467 new_func .append (" va_end(args);" )
65- new_func .append (f" Result res;" )
66- new_func .append (f" if (original_result == 0) {{" )
68+ else :
69+ new_func .append (
70+ f" { return_type } original_result = { func_name } ({ ', ' .join (param_list )} );"
71+ )
72+
73+ # Handle returned values
74+ new_func .append (f" Result res;" )
75+ if return_type == "void" :
76+ new_func .append (f" res = {{ .error_code = 0 }};" )
77+ elif return_type == "_Bool" :
78+ new_func .append (f" res.error_code = 0 ? original_result : -2;" )
79+ new_func .append (f" res.value._Bool_value = original_result;" )
80+ # if return type is a pointer or typedef from pointer
81+ elif return_pointer :
82+ new_func .append (f" if (original_result != NULL) {{" )
6783 new_func .append (f" res.error_code = 0;" )
6884 new_func .append (f" res.value.{ return_type } _value = original_result;" )
6985 new_func .append (f" }} else {{" )
7086 new_func .append (f" res.error_code = -2;" )
7187 new_func .append (f" }}" )
7288 else :
73- new_func .append (
74- f" { return_type } original_result = { func_name } ({ ', ' .join (param_list )} );"
75- )
76- new_func .append (f" Result res;" )
7789 new_func .append (f" if (original_result == 0) {{" )
7890 new_func .append (f" res.error_code = 0;" )
79-
80- new_func .append (f" res.value.{ return_type } _value = original_result;" )
91+ new_func .append (f" res.value._Bool_value = original_result;" )
8192 new_func .append (f" }} else {{" )
8293 new_func .append (f" res.error_code = -2;" )
8394 new_func .append (f" }}" )
8495
8596 new_func .append (f" return res;" )
86- new_func .append ("}" )
87-
8897 return "\n " .join (new_func )
8998
9099
0 commit comments