@@ -9,9 +9,13 @@ def collect_typedefs(ast):
99 if not isinstance (node , c_ast .Typedef ):
1010 continue
1111
12+ if node .name in typedefs :
13+ raise Exception (f"Duplicate typedef found: { node .name } " )
14+
1215 typedef_name = node .name
1316 typedef_type = node .type
1417 typedefs [typedef_name ] = typedef_type
18+
1519 return typedefs
1620
1721
@@ -23,31 +27,30 @@ def resolve_base_type(ptr_decl):
2327 cur_type = ptr_decl
2428 pointer_type_name = ""
2529
26- while isinstance (cur_type , c_ast .PtrDecl ) or isinstance (
27- cur_type , c_ast .TypeDecl
28- ):
29- if isinstance (cur_type , c_ast .PtrDecl ):
30- cur_type = cur_type .type
31- pointer_type_name += "*"
32- elif isinstance (cur_type , c_ast .TypeDecl ):
33- if isinstance (cur_type .type , c_ast .IdentifierType ):
34- base_type_name = " " .join (cur_type .type .names )
35- pointer_type_name = base_type_name + pointer_type_name
36- return pointer_type_name
37- else :
38- pointer_type_name = "" .join (cur_type .type .name ) + pointer_type_name
39- return pointer_type_name
40- return None
30+ while isinstance (cur_type , c_ast .PtrDecl ):
31+ cur_type = cur_type .type
32+ pointer_type_name += "*"
33+
34+ assert isinstance (cur_type , c_ast .TypeDecl )
35+ if isinstance (cur_type .type , c_ast .IdentifierType ):
36+ base_type_name = " " .join (cur_type .type .names )
37+ pointer_type_name = base_type_name + pointer_type_name
38+ else :
39+ pointer_type_name = "" .join (cur_type .type .name ) + pointer_type_name
40+
41+ return pointer_type_name
4142
4243 resolved_type = typedefs .get (type_name )
4344
4445 if resolved_type is None :
4546 return type_name
4647
48+ print (f"\n \n Resolving typedef { type_name } :" )
49+
4750 if isinstance (resolved_type , c_ast .TypeDecl ):
4851 if isinstance (resolved_type .type , c_ast .Enum ):
4952 print (f"Resolved enum typedef { type_name } " )
50- return type_name
53+ return type_name
5154
5255 if isinstance (resolved_type .type , c_ast .Struct ):
5356 print (f"Resolved struct typedef { type_name } " )
@@ -60,9 +63,8 @@ def resolve_base_type(ptr_decl):
6063 if isinstance (resolved_type .type , c_ast .IdentifierType ):
6164 base_type_name = " " .join (resolved_type .type .names )
6265 print (f"Resolved base typedef { type_name } to { base_type_name } " )
63- return type_name
66+ return type_name
6467
65- resolved_type .show ()
6668 raise Exception (f"Unhandled TypeDecl typedef { type_name } " )
6769 elif isinstance (resolved_type , c_ast .PtrDecl ):
6870 pointer_type_name = resolve_base_type (resolved_type )
@@ -113,19 +115,22 @@ def generate_checked_function(func, typedefs):
113115 new_func .append (") {" )
114116
115117 # Add null checks for pointer parameters
118+ new_func .append (f" Result res;" )
116119 has_variadic = False
117120 for param in params :
118121 if isinstance (param , c_ast .EllipsisParam ):
119122 # Restructure to use va_list
120123 new_func .append (" va_list args;" )
121124 has_variadic = True
122125 elif isinstance (param .type , c_ast .PtrDecl ):
126+ new_func .append (f" // Check for null pointer parameter: { param .name } " )
123127 new_func .append (f" if ({ param .name } == NULL) {{" )
124- new_func .append (f" Result res = {{ .error_code = -1 }} ;" )
128+ new_func .append (f" res.error_code = -1;" )
125129 new_func .append (f" return res;" )
126130 new_func .append (f" }}" )
127131
128132 # Call the original function
133+ new_func .append (f" // Execute the original function" )
129134 if return_type == "void" :
130135 new_func .append (f" { func_name } ({ ', ' .join (param_list )} );" )
131136 elif has_variadic :
@@ -140,9 +145,9 @@ def generate_checked_function(func, typedefs):
140145 )
141146
142147 # Handle returned values
143- new_func .append (f" Result res; " )
148+ new_func .append (f" // Assign return value and error code " )
144149 if return_type == "void" :
145- new_func .append (f" res = {{ .error_code = 0 }} ;" )
150+ new_func .append (f" res.error_code = 0;" )
146151 elif return_type == "_Bool" :
147152 new_func .append (f" res.error_code = 0 ? original_result : -2;" )
148153 new_func .append (f" res.value._Bool_value = original_result;" )
@@ -224,8 +229,8 @@ def process_header():
224229 for func in functions :
225230 if isinstance (func .type .type , c_ast .TypeDecl ):
226231 return_type = " " .join (func .type .type .type .names )
227- resolved_type = resolve_typedef (typedefs , return_type )
228- return_types .add (resolved_type )
232+ # resolved_type = resolve_typedef(typedefs, return_type)
233+ return_types .add (return_type )
229234
230235 # Update the Result struct with all return types
231236 for return_type in return_types :
0 commit comments