void _remakebuiltins(list files, string builtinsDef)
{
    string file;
    string dest;
    int cid;
    int idx;
    string gramH;

    gramH = g_wip + "/gram.h";

    printf("rebuilding " + builtinsDef + " and " + gramH + "\n");

    run("rm -f " + gramH + " " + builtinsDef);

    fprintf(gramH,
                "#ifndef GRAM_H_\n",
                "#define GRAM_H_\n"
                "/*\n"
                "  Automatically generated by build\n"
                "  Do not edit\n"
                "*/\n"
                );

    fprintf(builtinsDef,
                "/*\n"
                "  Automatically generated by build\n"
                "  Do not edit\n"
                "*/\n"
                "#include \"gram.h\"\n"
                "Builtin builtin_array[] = \n"
                "{\n"
                );

    for (idx = 0; idx < sizeof(files); idx++)
    {
        dest = "";
        file = change_ext(files[idx], "");
        for (cid = 4; cid < strlen(file); cid++)
            dest += file[cid];
        dest = strupr(dest);

        fprintf(gramH, "  void gram_", dest, "(void);\n");
        fprintf(builtinsDef, 
                    "   {\"", dest, "\", gram_", dest, " },\n");
    }

    fprintf(gramH, "#endif\n");
    fprintf(builtinsDef, 
        "   { 0, 0 }\n"
        "};\n");
}

void buildBuiltins()
{
    string file;
    list files;
    int idx;
    string builtinsDef;

    builtinsDef = g_wip + "/builtins.def";

    chdir("src/yodl");
    files = makelist("gram*.c");
    chdir(g_cwd);

    for (idx = 0; idx < sizeof(files); idx++)
    {
        file = files[idx];
        if ("src/yodl/" + file younger builtinsDef)
        {
            _remakebuiltins(files, builtinsDef);
            break;
        }
    }
}
