this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Detect more C header data

+62 -24
+62 -24
tools/darling-stub-gen
··· 71 71 def extract_framework_name(name): 72 72 return name[name.rfind("/") + 1 :] 73 73 74 + def write_objc_source_file_locs(cmake_file, classes, num_spaces): 75 + for cls in classes: 76 + cmake_file.write(" " * num_spaces + "src/%s.m\n" % cls) 77 + 74 78 # Main program start 75 79 if len(sys.argv) != 3: 76 80 usage() ··· 135 139 c_source.write(copyright) 136 140 137 141 c_source.write(""" 142 + #include <%s/%s.h> 138 143 #include <stdlib.h> 139 144 140 145 static int verbose = 0; ··· 143 148 static void initme(void) { 144 149 verbose = getenv("STUB_VERBOSE") != NULL; 145 150 } 146 - """) 147 - 148 - c_hdr_buffer = "\n#ifndef _%s_H_\n#define _%s_H_\n\n" % (target_name, target_name) 149 - 150 - for funcname in functions: 151 - #c_header.write("void* %s(void);\n" % funcname) 152 - c_hdr_buffer += "void* %s(void);\n" % funcname 153 - c_source.write(c_func_impl_stub % (funcname, funcname)) 151 + """ % (target_name, target_name)) 154 152 155 153 cmake = open(output_dir + "/CMakeLists.txt", "w") 156 154 ··· 175 173 176 174 uses_objc = "This file does not contain any Objective-C runtime information." not in class_dump_output 177 175 176 + c_header.write("\n#ifndef _%s_H_\n#define _%s_H_\n\n" % (target_name, target_name)) 177 + 178 178 if uses_objc: 179 - class_dump_all = subprocess.check_output(["class-dump", "-H", "-o", header_dir, full_path]).decode('utf8').strip() 179 + c_header.write("#import <Foundation/Foundation.h>\n\n") 180 + 181 + typedef_void_regex = re.compile("(typedef void.+?;)", re.DOTALL | re.MULTILINE) 182 + for typedef_void_def in typedef_void_regex.finditer(class_dump_output): 183 + c_header.write(typedef_void_def.groups()[0]) 184 + c_header.write("\n\n") 185 + 186 + structs_regex = re.compile("(struct (.+?)};)", re.DOTALL | re.MULTILINE) 187 + for struct_def in structs_regex.finditer(class_dump_output): 188 + c_header.write(struct_def.groups()[0]) 189 + c_header.write("\n\n") 190 + 191 + typedef_struct_regex = re.compile("(typedef struct {.+?}.+?;)", re.DOTALL | re.MULTILINE) 192 + for typedef_struct_def in typedef_struct_regex.finditer(class_dump_output): 193 + c_header.write(typedef_struct_def.groups()[0]) 194 + c_header.write("\n\n") 195 + 180 196 get_class_names = re.compile("@interface (.+) :.+") 181 197 classes = get_class_names.findall(class_dump_output) 182 - for classname in classes: 183 - impl = open(source_dir + classname + ".m", "w") 184 - impl.write(copyright) 185 - 186 - impl.write("#import <%s/%s.h>\n\n" % (target_name, target_name)) 187 - impl.write("@implementation " + classname + "\n\n") 188 - impl.write(msg_handling) 189 - impl.write("@end\n") 198 + 199 + protocols_regex = re.compile("(@protocol (.+?)[\n<].+?@end)", re.DOTALL | re.MULTILINE) 200 + classes_regex = re.compile("(@interface (.+?) :.+?@end)", re.DOTALL | re.MULTILINE) 201 + 202 + for protocol_def in protocols_regex.finditer(class_dump_output): 203 + protocol_contents, protocol_name = protocol_def.groups() 204 + proto_header = open(header_dir + protocol_name + ".h", "w") 205 + proto_header.write(copyright) 206 + proto_header.write("#import <%s/%s.h>\n\n" % (target_name, target_name)) 207 + proto_header.write(protocol_contents) 208 + proto_header.close() 209 + c_header.write("#import <%s/%s.h>\n" % (target_name, protocol_name)) 190 210 191 - c_header.write("#import <%s/%s.h>\n" % (target_name, classname)) 211 + for class_def in classes_regex.finditer(class_dump_output): 212 + class_contents, class_name = class_def.groups() 213 + class_header = open(header_dir + class_name + ".h", "w") 214 + class_header.write(copyright) 215 + class_header.write("#import <%s/%s.h>\n\n" % (target_name, target_name)) 216 + class_header.write(class_contents) 217 + class_header.close() 218 + c_header.write("#import <%s/%s.h>\n" % (target_name, class_name)) 219 + 220 + class_impl = open(source_dir + class_name + ".m", "w") 221 + class_impl.write(copyright) 222 + class_impl.write("#import <%s/%s.h>\n\n" % (target_name, class_name)) 223 + class_impl.write("@implementation " + class_name + "\n\n") 224 + class_impl.write(msg_handling) 225 + class_impl.write("@end\n") 226 + 227 + c_header.write("\n") 192 228 193 - if uses_objc: 194 - cmake.write("file(GLOB %s_OBJC_SOURCES src/*.m)\n\n" % target_name) 229 + for funcname in functions: 230 + c_header.write("void* %s(void);\n" % funcname) 231 + c_source.write(c_func_impl_stub % (funcname, funcname)) 195 232 196 233 if library: 197 - source_files = "src/%s.c\n${%s_OBJC_SOURCES}" % (target_name, target_name) 198 - cmake.write("add_darling_library(%s SHARED %s)\n" % (target_name, source_files)) 234 + cmake.write("add_darling_library(%s SHARED\n" % target_name) 235 + cmake.write(" src/%s.c\n" % target_name) 236 + write_objc_source_file_locs(cmake, classes, 4) 237 + cmake.write(")\n") 199 238 cmake.write("make_fat(%s)\n" % target_name) 200 239 libraries = "system objc" if uses_objc else "system" 201 240 cmake.write("target_link_libraries(%s %s)\n" % (target_name, libraries)) ··· 209 248 cmake.write(" SOURCES\n") 210 249 cmake.write(" src/%s.c\n" % target_name) 211 250 if uses_objc: 212 - cmake.write(" ${%s_OBJC_SOURCES}\n" % target_name) 251 + write_objc_source_file_locs(cmake, classes, 8) 213 252 214 253 cmake.write("\n") 215 254 ··· 220 259 cmake.write(" Foundation\n") 221 260 cmake.write(")\n") 222 261 223 - c_header.write(c_hdr_buffer) 224 262 c_header.write("\n#endif\n")