#include #include #include #include const char *gl_types; va_list gl_ap; void get_args(PlTerm *t) { int n; const char *types; PlTerm *args, *parg; va_list ap = gl_ap; n = strlen(gl_types); args = (PlTerm *)malloc(n * sizeof(PlTerm)); if (!args) exit(1); for (parg = args, types = gl_types; *types; parg++, types++) switch (*types) { case 'c': *parg = Mk_Codes(va_arg(ap, char *)); break; default: (void)va_arg(ap, void *); *parg = Mk_Variable(); break; } *t = Mk_Proper_List(n, args); free(args); } void put_args(PlTerm t) { int n; const char *types; PlTerm *args, *parg; va_list ap = gl_ap; n = strlen(gl_types); args = (PlTerm *)malloc(n * sizeof(PlTerm)); if (!args) exit(1); Rd_Proper_List(t, args); for (parg = args, types = gl_types; *types; parg++, types++) switch (*types) { case 'C': *va_arg(ap, char **) = strdup(Rd_Codes(*parg)); break; default: (void)va_arg(ap, void *); *parg = Mk_Variable(); break; } free(args); } int call_prolog(const char *functor, const char *types, ...) { PlTerm arg; va_list ap; int ret; arg = Mk_String((char *)functor); gl_types = types; va_start(ap, types); gl_ap = ap; ret = (Pl_Query_Start(Find_Atom("call_prolog"), 1, &arg, TRUE) == PL_SUCCESS); Pl_Query_End(PL_RECOVER); va_end(ap); return ret; } int main(int argc, char *argv[]) { int i; Start_Prolog(0, 0); for (i = 0; i < 1000000; i++) { char buf[30]; char *res; sprintf(buf, "%d", i); call_prolog("reverse", "cC", buf, &res); printf("%s\n", res); free(res); } Stop_Prolog(); return 0; }