#include #include #include #include void eval(char* code, int run) { char *tempname = mktemp(strdup("/tmp/evaltempXXXXXX")); char buf[500]; FILE *temp; void *handle; sprintf(buf, "%s.c", tempname); temp = fopen(buf, "w"); if (run) fprintf(temp,"void evalrun() {\n"); fprintf(temp, "%s\n", code); if (run) fprintf(temp,"}\n"); fclose(temp); sprintf(buf, "gcc %s.c -shared -o %s.so\n", tempname, tempname); system(buf); sprintf(buf, "%s.c"); unlink(buf); sprintf(buf, "%s.so"); handle = dlopen(buf, RTLD_LAZY|RTLD_GLOBAL); if (run) ((void*(*)())(dlsym(handle,"evalrun")))(); unlink(buf); free(tempname); } int main() { eval("int foo(int x){ return x+1; }", 0); eval("int bar(int x){ return foo(x)*2; }", 0); eval("printf(\"bar(3) = %d\\n\", bar(3));", 1); return 0; }