Binds the generated C function names to Nit function names
# Builds the .c and .h files to be used when generating a Stack Trace
# Binds the generated C function names to Nit function names
fun build_c_to_nit_bindings
do
var compile_dir = toolchain.compile_dir
var stream = new FileWriter.open("{compile_dir}/c_functions_hash.c")
stream.write("#include <string.h>\n")
stream.write("#include <stdlib.h>\n")
stream.write("#include \"c_functions_hash.h\"\n")
stream.write("typedef struct C_Nit_Names\{char* name; char* nit_name;\}C_Nit_Names;\n")
stream.write("const char* get_nit_name(register const char* procproc, register unsigned int len)\{\n")
stream.write("char* procname = malloc(len+1);")
stream.write("memcpy(procname, procproc, len);")
stream.write("procname[len] = '\\0';")
stream.write("static const C_Nit_Names map[{names.length}] = \{\n")
for i in names.keys do
stream.write("\{\"")
stream.write(i.escape_to_c)
stream.write("\",\"")
stream.write(names[i].escape_to_c)
stream.write("\"\},\n")
end
stream.write("\};\n")
stream.write("int i;")
stream.write("for(i = 0; i < {names.length}; i++)\{")
stream.write("if(strcmp(procname,map[i].name) == 0)\{")
stream.write("free(procname);")
stream.write("return map[i].nit_name;")
stream.write("\}")
stream.write("\}")
stream.write("free(procname);")
stream.write("return NULL;")
stream.write("\}\n")
stream.close
stream = new FileWriter.open("{compile_dir}/c_functions_hash.h")
stream.write("const char* get_nit_name(register const char* procname, register unsigned int len);\n")
stream.close
extern_bodies.add(new ExternCFile("c_functions_hash.c", ""))
end
src/compiler/abstract_compiler.nit:696,2--737,4