15e9cd1aeSAssar Westerlund /* 25e9cd1aeSAssar Westerlund * Copyright (c) 1998, 1999 Kungliga Tekniska H�gskolan 35e9cd1aeSAssar Westerlund * (Royal Institute of Technology, Stockholm, Sweden). 45e9cd1aeSAssar Westerlund * All rights reserved. 55e9cd1aeSAssar Westerlund * 65e9cd1aeSAssar Westerlund * Redistribution and use in source and binary forms, with or without 75e9cd1aeSAssar Westerlund * modification, are permitted provided that the following conditions 85e9cd1aeSAssar Westerlund * are met: 95e9cd1aeSAssar Westerlund * 105e9cd1aeSAssar Westerlund * 1. Redistributions of source code must retain the above copyright 115e9cd1aeSAssar Westerlund * notice, this list of conditions and the following disclaimer. 125e9cd1aeSAssar Westerlund * 135e9cd1aeSAssar Westerlund * 2. Redistributions in binary form must reproduce the above copyright 145e9cd1aeSAssar Westerlund * notice, this list of conditions and the following disclaimer in the 155e9cd1aeSAssar Westerlund * documentation and/or other materials provided with the distribution. 165e9cd1aeSAssar Westerlund * 175e9cd1aeSAssar Westerlund * 3. Neither the name of the Institute nor the names of its contributors 185e9cd1aeSAssar Westerlund * may be used to endorse or promote products derived from this software 195e9cd1aeSAssar Westerlund * without specific prior written permission. 205e9cd1aeSAssar Westerlund * 215e9cd1aeSAssar Westerlund * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 225e9cd1aeSAssar Westerlund * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 235e9cd1aeSAssar Westerlund * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 245e9cd1aeSAssar Westerlund * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 255e9cd1aeSAssar Westerlund * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 265e9cd1aeSAssar Westerlund * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 275e9cd1aeSAssar Westerlund * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 285e9cd1aeSAssar Westerlund * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 295e9cd1aeSAssar Westerlund * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 305e9cd1aeSAssar Westerlund * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 315e9cd1aeSAssar Westerlund * SUCH DAMAGE. 325e9cd1aeSAssar Westerlund */ 335e9cd1aeSAssar Westerlund 345e9cd1aeSAssar Westerlund #undef ROKEN_RENAME 355e9cd1aeSAssar Westerlund #include "compile_et.h" 365e9cd1aeSAssar Westerlund #include <getarg.h> 375e9cd1aeSAssar Westerlund 38adb0ddaeSAssar Westerlund RCSID("$Id: compile_et.c,v 1.14 2001/02/20 01:44:53 assar Exp $"); 395e9cd1aeSAssar Westerlund 405e9cd1aeSAssar Westerlund #include <roken.h> 415e9cd1aeSAssar Westerlund #include <err.h> 425e9cd1aeSAssar Westerlund #include "parse.h" 435e9cd1aeSAssar Westerlund 445e9cd1aeSAssar Westerlund int numerror; 455e9cd1aeSAssar Westerlund extern FILE *yyin; 465e9cd1aeSAssar Westerlund 475e9cd1aeSAssar Westerlund extern void yyparse(void); 485e9cd1aeSAssar Westerlund 495e9cd1aeSAssar Westerlund long base; 505e9cd1aeSAssar Westerlund int number; 515e9cd1aeSAssar Westerlund char *prefix; 525e9cd1aeSAssar Westerlund char *id_str; 535e9cd1aeSAssar Westerlund 545e9cd1aeSAssar Westerlund char name[128]; 555e9cd1aeSAssar Westerlund char Basename[128]; 565e9cd1aeSAssar Westerlund 575e9cd1aeSAssar Westerlund #ifdef YYDEBUG 585e9cd1aeSAssar Westerlund extern int yydebug = 1; 595e9cd1aeSAssar Westerlund #endif 605e9cd1aeSAssar Westerlund 615e9cd1aeSAssar Westerlund char *filename; 625e9cd1aeSAssar Westerlund char hfn[128]; 635e9cd1aeSAssar Westerlund char cfn[128]; 645e9cd1aeSAssar Westerlund 655e9cd1aeSAssar Westerlund struct error_code *codes = NULL; 665e9cd1aeSAssar Westerlund 675e9cd1aeSAssar Westerlund static int 685e9cd1aeSAssar Westerlund generate_c(void) 695e9cd1aeSAssar Westerlund { 705e9cd1aeSAssar Westerlund int n; 715e9cd1aeSAssar Westerlund struct error_code *ec; 725e9cd1aeSAssar Westerlund 735e9cd1aeSAssar Westerlund FILE *c_file = fopen(cfn, "w"); 745e9cd1aeSAssar Westerlund if(c_file == NULL) 755e9cd1aeSAssar Westerlund return 1; 765e9cd1aeSAssar Westerlund 775e9cd1aeSAssar Westerlund fprintf(c_file, "/* Generated from %s */\n", filename); 785e9cd1aeSAssar Westerlund if(id_str) 795e9cd1aeSAssar Westerlund fprintf(c_file, "/* %s */\n", id_str); 805e9cd1aeSAssar Westerlund fprintf(c_file, "\n"); 815e9cd1aeSAssar Westerlund fprintf(c_file, "#include <stddef.h>\n"); 825e9cd1aeSAssar Westerlund fprintf(c_file, "#include <com_err.h>\n"); 835e9cd1aeSAssar Westerlund fprintf(c_file, "#include \"%s\"\n", hfn); 845e9cd1aeSAssar Westerlund fprintf(c_file, "\n"); 855e9cd1aeSAssar Westerlund 865e9cd1aeSAssar Westerlund fprintf(c_file, "static const char *text[] = {\n"); 875e9cd1aeSAssar Westerlund 885e9cd1aeSAssar Westerlund for(ec = codes, n = 0; ec; ec = ec->next, n++) { 895e9cd1aeSAssar Westerlund while(n < ec->number) { 905e9cd1aeSAssar Westerlund fprintf(c_file, "\t/* %03d */ \"Reserved %s error (%d)\",\n", 915e9cd1aeSAssar Westerlund n, name, n); 925e9cd1aeSAssar Westerlund n++; 935e9cd1aeSAssar Westerlund 945e9cd1aeSAssar Westerlund } 955e9cd1aeSAssar Westerlund fprintf(c_file, "\t/* %03d */ \"%s\",\n", ec->number, ec->string); 965e9cd1aeSAssar Westerlund } 975e9cd1aeSAssar Westerlund 985e9cd1aeSAssar Westerlund fprintf(c_file, "\tNULL\n"); 995e9cd1aeSAssar Westerlund fprintf(c_file, "};\n"); 1005e9cd1aeSAssar Westerlund fprintf(c_file, "\n"); 1015e9cd1aeSAssar Westerlund fprintf(c_file, 1025e9cd1aeSAssar Westerlund "void initialize_%s_error_table_r(struct et_list **list)\n", 1035e9cd1aeSAssar Westerlund name); 1045e9cd1aeSAssar Westerlund fprintf(c_file, "{\n"); 1055e9cd1aeSAssar Westerlund fprintf(c_file, 1065e9cd1aeSAssar Westerlund " initialize_error_table_r(list, text, " 1075e9cd1aeSAssar Westerlund "%s_num_errors, ERROR_TABLE_BASE_%s);\n", name, name); 1085e9cd1aeSAssar Westerlund fprintf(c_file, "}\n"); 1095e9cd1aeSAssar Westerlund fprintf(c_file, "\n"); 1105e9cd1aeSAssar Westerlund fprintf(c_file, "void initialize_%s_error_table(void)\n", name); 1115e9cd1aeSAssar Westerlund fprintf(c_file, "{\n"); 1125e9cd1aeSAssar Westerlund fprintf(c_file, 1135e9cd1aeSAssar Westerlund " init_error_table(text, ERROR_TABLE_BASE_%s, " 1145e9cd1aeSAssar Westerlund "%s_num_errors);\n", name, name); 1155e9cd1aeSAssar Westerlund fprintf(c_file, "}\n"); 1165e9cd1aeSAssar Westerlund 1175e9cd1aeSAssar Westerlund fclose(c_file); 1185e9cd1aeSAssar Westerlund return 0; 1195e9cd1aeSAssar Westerlund } 1205e9cd1aeSAssar Westerlund 1215e9cd1aeSAssar Westerlund static int 1225e9cd1aeSAssar Westerlund generate_h(void) 1235e9cd1aeSAssar Westerlund { 1245e9cd1aeSAssar Westerlund struct error_code *ec; 1255e9cd1aeSAssar Westerlund char fn[128]; 1265e9cd1aeSAssar Westerlund FILE *h_file = fopen(hfn, "w"); 1275e9cd1aeSAssar Westerlund char *p; 1285e9cd1aeSAssar Westerlund 1295e9cd1aeSAssar Westerlund if(h_file == NULL) 1305e9cd1aeSAssar Westerlund return 1; 1315e9cd1aeSAssar Westerlund 1325e9cd1aeSAssar Westerlund snprintf(fn, sizeof(fn), "__%s__", hfn); 1335e9cd1aeSAssar Westerlund for(p = fn; *p; p++) 1345e9cd1aeSAssar Westerlund if(!isalnum((unsigned char)*p)) 1355e9cd1aeSAssar Westerlund *p = '_'; 1365e9cd1aeSAssar Westerlund 1375e9cd1aeSAssar Westerlund fprintf(h_file, "/* Generated from %s */\n", filename); 1385e9cd1aeSAssar Westerlund if(id_str) 1395e9cd1aeSAssar Westerlund fprintf(h_file, "/* %s */\n", id_str); 1405e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1415e9cd1aeSAssar Westerlund fprintf(h_file, "#ifndef %s\n", fn); 1425e9cd1aeSAssar Westerlund fprintf(h_file, "#define %s\n", fn); 1435e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1445e9cd1aeSAssar Westerlund fprintf(h_file, "#include <com_right.h>\n"); 1455e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1465e9cd1aeSAssar Westerlund fprintf(h_file, 1475e9cd1aeSAssar Westerlund "void initialize_%s_error_table_r(struct et_list **);\n", 1485e9cd1aeSAssar Westerlund name); 1495e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1505e9cd1aeSAssar Westerlund fprintf(h_file, "void initialize_%s_error_table(void);\n", name); 1515e9cd1aeSAssar Westerlund fprintf(h_file, "#define init_%s_err_tbl initialize_%s_error_table\n", 1525e9cd1aeSAssar Westerlund name, name); 1535e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1545e9cd1aeSAssar Westerlund fprintf(h_file, "typedef enum %s_error_number{\n", name); 1555e9cd1aeSAssar Westerlund fprintf(h_file, "\tERROR_TABLE_BASE_%s = %ld,\n", name, base); 1565e9cd1aeSAssar Westerlund fprintf(h_file, "\t%s_err_base = %ld,\n", name, base); 1575e9cd1aeSAssar Westerlund 1585e9cd1aeSAssar Westerlund for(ec = codes; ec; ec = ec->next) { 1595e9cd1aeSAssar Westerlund fprintf(h_file, "\t%s = %ld,\n", ec->name, base + ec->number); 1605e9cd1aeSAssar Westerlund } 1615e9cd1aeSAssar Westerlund 1625e9cd1aeSAssar Westerlund fprintf(h_file, "\t%s_num_errors = %d\n", name, number); 1635e9cd1aeSAssar Westerlund fprintf(h_file, "} %s_error_number;\n", name); 1645e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1655e9cd1aeSAssar Westerlund fprintf(h_file, "#endif /* %s */\n", fn); 1665e9cd1aeSAssar Westerlund 1675e9cd1aeSAssar Westerlund 1685e9cd1aeSAssar Westerlund fclose(h_file); 1695e9cd1aeSAssar Westerlund return 0; 1705e9cd1aeSAssar Westerlund } 1715e9cd1aeSAssar Westerlund 1725e9cd1aeSAssar Westerlund static int 1735e9cd1aeSAssar Westerlund generate(void) 1745e9cd1aeSAssar Westerlund { 1755e9cd1aeSAssar Westerlund return generate_c() || generate_h(); 1765e9cd1aeSAssar Westerlund } 1775e9cd1aeSAssar Westerlund 1785e9cd1aeSAssar Westerlund int version_flag; 1795e9cd1aeSAssar Westerlund int help_flag; 1805e9cd1aeSAssar Westerlund struct getargs args[] = { 1815e9cd1aeSAssar Westerlund { "version", 0, arg_flag, &version_flag }, 1825e9cd1aeSAssar Westerlund { "help", 0, arg_flag, &help_flag } 1835e9cd1aeSAssar Westerlund }; 1845e9cd1aeSAssar Westerlund int num_args = sizeof(args) / sizeof(args[0]); 1855e9cd1aeSAssar Westerlund 1865e9cd1aeSAssar Westerlund static void 1875e9cd1aeSAssar Westerlund usage(int code) 1885e9cd1aeSAssar Westerlund { 1895e9cd1aeSAssar Westerlund arg_printusage(args, num_args, NULL, "error-table"); 1905e9cd1aeSAssar Westerlund exit(code); 1915e9cd1aeSAssar Westerlund } 1925e9cd1aeSAssar Westerlund 1935e9cd1aeSAssar Westerlund int 1945e9cd1aeSAssar Westerlund main(int argc, char **argv) 1955e9cd1aeSAssar Westerlund { 1965e9cd1aeSAssar Westerlund char *p; 1975e9cd1aeSAssar Westerlund int optind = 0; 1985e9cd1aeSAssar Westerlund 199adb0ddaeSAssar Westerlund setprogname(argv[0]); 2005e9cd1aeSAssar Westerlund if(getarg(args, num_args, argc, argv, &optind)) 2015e9cd1aeSAssar Westerlund usage(1); 2025e9cd1aeSAssar Westerlund if(help_flag) 2035e9cd1aeSAssar Westerlund usage(0); 2045e9cd1aeSAssar Westerlund if(version_flag) { 2055e9cd1aeSAssar Westerlund print_version(NULL); 2065e9cd1aeSAssar Westerlund exit(0); 2075e9cd1aeSAssar Westerlund } 2085e9cd1aeSAssar Westerlund 2095e9cd1aeSAssar Westerlund if(optind == argc) 2105e9cd1aeSAssar Westerlund usage(1); 2115e9cd1aeSAssar Westerlund filename = argv[optind]; 2125e9cd1aeSAssar Westerlund yyin = fopen(filename, "r"); 2135e9cd1aeSAssar Westerlund if(yyin == NULL) 2145e9cd1aeSAssar Westerlund err(1, "%s", filename); 2155e9cd1aeSAssar Westerlund 2165e9cd1aeSAssar Westerlund 2175e9cd1aeSAssar Westerlund p = strrchr(filename, '/'); 2185e9cd1aeSAssar Westerlund if(p) 2195e9cd1aeSAssar Westerlund p++; 2205e9cd1aeSAssar Westerlund else 2215e9cd1aeSAssar Westerlund p = filename; 2225e9cd1aeSAssar Westerlund strncpy(Basename, p, sizeof(Basename)); 2235e9cd1aeSAssar Westerlund Basename[sizeof(Basename) - 1] = '\0'; 2245e9cd1aeSAssar Westerlund 2255e9cd1aeSAssar Westerlund Basename[strcspn(Basename, ".")] = '\0'; 2265e9cd1aeSAssar Westerlund 2275e9cd1aeSAssar Westerlund snprintf(hfn, sizeof(hfn), "%s.h", Basename); 2285e9cd1aeSAssar Westerlund snprintf(cfn, sizeof(cfn), "%s.c", Basename); 2295e9cd1aeSAssar Westerlund 2305e9cd1aeSAssar Westerlund yyparse(); 2315e9cd1aeSAssar Westerlund if(numerror) 2325e9cd1aeSAssar Westerlund return 1; 2335e9cd1aeSAssar Westerlund 2345e9cd1aeSAssar Westerlund return generate(); 2355e9cd1aeSAssar Westerlund } 236