/* $Id: gluegen.c,v 1.6 2003/04/06 03:47:38 wafer Exp $ */ #include #include #include "glue.h" const char *type_to_string (type_t t) { switch (t) { case double_t: return "double"; case int_t: return "int"; case string_t: return "string"; } return NULL; } void glue_gen (FILE *glue_file, FILE *glue_header_file, FILE *register_file) { int j; static int n_reg_func = 0; /* first make a glue wrapper */ fprintf(glue_file, "value_t %s_glue (value_t *argv, int argc)\n{\n", i->name); fprintf(glue_file, "\tvalue_t ret;\n"); if (i->ret != void_t) { /* make a temporary variable to hold the function return */ fprintf(glue_file, "\t%s temp;\n", type_to_string(i->ret)); } /* set up the arguments */ for (j = 0; j < i->argc; ++j) fprintf(glue_file, "\t%s arg%d;\n", type_to_string(i->argt[j]), j); fprintf(glue_file, "\n"); for (j = 0; j < i->argc; ++j) { fprintf(glue_file, "\tconv_"); switch (i->argt[j]) { case double_t: fprintf(glue_file, "float(&"); break; case int_t: fprintf(glue_file, "int(&"); break; case string_t: fprintf(glue_file, "string("); break; } fprintf(glue_file, "arg%d, &argv[%d]);\n", j, j); } /* make the function call */ fprintf(glue_file, "\n"); if (i->ret != void_t) fprintf(glue_file, "\ttemp = "); else fprintf(glue_file, "\t"); fprintf(glue_file, "%s(", i->name); for (j = 0; j < i->argc; ++j) { fprintf(glue_file, "arg%d", j); if (j == i->argc - 1) continue; fprintf(glue_file, ","); } fprintf(glue_file, ");\n"); /* assign the temporary variable to the right field in the return */ switch (i->ret) { case double_t: fprintf(glue_file, "\n\tret.val_type = %s;\n\tret.value.%s = temp;\n", "val_float", "v_float"); break; case int_t: fprintf(glue_file, "\n\tret.val_type = %s;\n\tret.value.%s = temp;\n", "val_int", "v_int"); break; case string_t: fprintf(glue_file, "\n\tret.val_type = %s;\n\t" "strncpy(ret.value.%s, temp, STRING_LIT_LEN);\n", "val_string", "v_string"); break; case void_t: break; } /* clean up and leave */ fprintf(glue_file, "\n\treturn ret;\n}\n\n"); /* declare it in the header file */ fprintf(glue_header_file, "value_t %s_glue (value_t *argv, int argc);\n", i->name); /* now register the glue function in the identifier list */ fprintf(register_file, "\t{\n"); fprintf(register_file, "\t\tident_t *id = ident_create(\"%s\");\n", i->name); fprintf(register_file, "\t\tid->cont.func = %s_glue;\n", i->name); fprintf(register_file, "\t\tid->type = func;\n"); fprintf(register_file, "\t\tid->is_declared = 1;\n\t}\n"); n_reg_func++; return; }