15e9cd1aeSAssar Westerlund /* 2*ae771770SStanislav Sedov * Copyright (c) 1998-2002 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 35*ae771770SStanislav Sedov 36*ae771770SStanislav Sedov #include "config.h" 37*ae771770SStanislav Sedov 385e9cd1aeSAssar Westerlund #include "compile_et.h" 395e9cd1aeSAssar Westerlund #include <getarg.h> 405e9cd1aeSAssar Westerlund 415e9cd1aeSAssar Westerlund #include <roken.h> 425e9cd1aeSAssar Westerlund #include <err.h> 435e9cd1aeSAssar Westerlund #include "parse.h" 445e9cd1aeSAssar Westerlund 455e9cd1aeSAssar Westerlund int numerror; 465e9cd1aeSAssar Westerlund extern FILE *yyin; 475e9cd1aeSAssar Westerlund 485e9cd1aeSAssar Westerlund extern void yyparse(void); 495e9cd1aeSAssar Westerlund 50c19800e8SDoug Rabson long base_id; 515e9cd1aeSAssar Westerlund int number; 525e9cd1aeSAssar Westerlund char *prefix; 535e9cd1aeSAssar Westerlund char *id_str; 545e9cd1aeSAssar Westerlund 555e9cd1aeSAssar Westerlund char name[128]; 565e9cd1aeSAssar Westerlund char Basename[128]; 575e9cd1aeSAssar Westerlund 585e9cd1aeSAssar Westerlund #ifdef YYDEBUG 595e9cd1aeSAssar Westerlund extern int yydebug = 1; 605e9cd1aeSAssar Westerlund #endif 615e9cd1aeSAssar Westerlund 625e9cd1aeSAssar Westerlund char *filename; 635e9cd1aeSAssar Westerlund char hfn[128]; 645e9cd1aeSAssar Westerlund char cfn[128]; 655e9cd1aeSAssar Westerlund 665e9cd1aeSAssar Westerlund struct error_code *codes = NULL; 675e9cd1aeSAssar Westerlund 685e9cd1aeSAssar Westerlund static int 695e9cd1aeSAssar Westerlund generate_c(void) 705e9cd1aeSAssar Westerlund { 715e9cd1aeSAssar Westerlund int n; 725e9cd1aeSAssar Westerlund struct error_code *ec; 735e9cd1aeSAssar Westerlund 745e9cd1aeSAssar Westerlund FILE *c_file = fopen(cfn, "w"); 755e9cd1aeSAssar Westerlund if(c_file == NULL) 765e9cd1aeSAssar Westerlund return 1; 775e9cd1aeSAssar Westerlund 785e9cd1aeSAssar Westerlund fprintf(c_file, "/* Generated from %s */\n", filename); 795e9cd1aeSAssar Westerlund if(id_str) 805e9cd1aeSAssar Westerlund fprintf(c_file, "/* %s */\n", id_str); 815e9cd1aeSAssar Westerlund fprintf(c_file, "\n"); 825e9cd1aeSAssar Westerlund fprintf(c_file, "#include <stddef.h>\n"); 835e9cd1aeSAssar Westerlund fprintf(c_file, "#include <com_err.h>\n"); 845e9cd1aeSAssar Westerlund fprintf(c_file, "#include \"%s\"\n", hfn); 855e9cd1aeSAssar Westerlund fprintf(c_file, "\n"); 86*ae771770SStanislav Sedov fprintf(c_file, "#define N_(x) (x)\n"); 87*ae771770SStanislav Sedov fprintf(c_file, "\n"); 885e9cd1aeSAssar Westerlund 898373020dSJacques Vidrine fprintf(c_file, "static const char *%s_error_strings[] = {\n", name); 905e9cd1aeSAssar Westerlund 915e9cd1aeSAssar Westerlund for(ec = codes, n = 0; ec; ec = ec->next, n++) { 925e9cd1aeSAssar Westerlund while(n < ec->number) { 935e9cd1aeSAssar Westerlund fprintf(c_file, "\t/* %03d */ \"Reserved %s error (%d)\",\n", 945e9cd1aeSAssar Westerlund n, name, n); 955e9cd1aeSAssar Westerlund n++; 965e9cd1aeSAssar Westerlund 975e9cd1aeSAssar Westerlund } 98*ae771770SStanislav Sedov fprintf(c_file, "\t/* %03d */ N_(\"%s\"),\n", 99*ae771770SStanislav Sedov ec->number, ec->string); 1005e9cd1aeSAssar Westerlund } 1015e9cd1aeSAssar Westerlund 1025e9cd1aeSAssar Westerlund fprintf(c_file, "\tNULL\n"); 1035e9cd1aeSAssar Westerlund fprintf(c_file, "};\n"); 1045e9cd1aeSAssar Westerlund fprintf(c_file, "\n"); 1058373020dSJacques Vidrine fprintf(c_file, "#define num_errors %d\n", number); 1068373020dSJacques Vidrine fprintf(c_file, "\n"); 1075e9cd1aeSAssar Westerlund fprintf(c_file, 1085e9cd1aeSAssar Westerlund "void initialize_%s_error_table_r(struct et_list **list)\n", 1095e9cd1aeSAssar Westerlund name); 1105e9cd1aeSAssar Westerlund fprintf(c_file, "{\n"); 1115e9cd1aeSAssar Westerlund fprintf(c_file, 1128373020dSJacques Vidrine " initialize_error_table_r(list, %s_error_strings, " 1138373020dSJacques Vidrine "num_errors, ERROR_TABLE_BASE_%s);\n", name, name); 1145e9cd1aeSAssar Westerlund fprintf(c_file, "}\n"); 1155e9cd1aeSAssar Westerlund fprintf(c_file, "\n"); 1165e9cd1aeSAssar Westerlund fprintf(c_file, "void initialize_%s_error_table(void)\n", name); 1175e9cd1aeSAssar Westerlund fprintf(c_file, "{\n"); 1185e9cd1aeSAssar Westerlund fprintf(c_file, 1198373020dSJacques Vidrine " init_error_table(%s_error_strings, ERROR_TABLE_BASE_%s, " 1208373020dSJacques Vidrine "num_errors);\n", name, name); 1215e9cd1aeSAssar Westerlund fprintf(c_file, "}\n"); 1225e9cd1aeSAssar Westerlund 1235e9cd1aeSAssar Westerlund fclose(c_file); 1245e9cd1aeSAssar Westerlund return 0; 1255e9cd1aeSAssar Westerlund } 1265e9cd1aeSAssar Westerlund 1275e9cd1aeSAssar Westerlund static int 1285e9cd1aeSAssar Westerlund generate_h(void) 1295e9cd1aeSAssar Westerlund { 1305e9cd1aeSAssar Westerlund struct error_code *ec; 1315e9cd1aeSAssar Westerlund char fn[128]; 1325e9cd1aeSAssar Westerlund FILE *h_file = fopen(hfn, "w"); 1335e9cd1aeSAssar Westerlund char *p; 1345e9cd1aeSAssar Westerlund 1355e9cd1aeSAssar Westerlund if(h_file == NULL) 1365e9cd1aeSAssar Westerlund return 1; 1375e9cd1aeSAssar Westerlund 1385e9cd1aeSAssar Westerlund snprintf(fn, sizeof(fn), "__%s__", hfn); 1395e9cd1aeSAssar Westerlund for(p = fn; *p; p++) 1405e9cd1aeSAssar Westerlund if(!isalnum((unsigned char)*p)) 1415e9cd1aeSAssar Westerlund *p = '_'; 1425e9cd1aeSAssar Westerlund 1435e9cd1aeSAssar Westerlund fprintf(h_file, "/* Generated from %s */\n", filename); 1445e9cd1aeSAssar Westerlund if(id_str) 1455e9cd1aeSAssar Westerlund fprintf(h_file, "/* %s */\n", id_str); 1465e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1475e9cd1aeSAssar Westerlund fprintf(h_file, "#ifndef %s\n", fn); 1485e9cd1aeSAssar Westerlund fprintf(h_file, "#define %s\n", fn); 1495e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1508373020dSJacques Vidrine fprintf(h_file, "struct et_list;\n"); 1515e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1525e9cd1aeSAssar Westerlund fprintf(h_file, 1535e9cd1aeSAssar Westerlund "void initialize_%s_error_table_r(struct et_list **);\n", 1545e9cd1aeSAssar Westerlund name); 1555e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1565e9cd1aeSAssar Westerlund fprintf(h_file, "void initialize_%s_error_table(void);\n", name); 1575e9cd1aeSAssar Westerlund fprintf(h_file, "#define init_%s_err_tbl initialize_%s_error_table\n", 1585e9cd1aeSAssar Westerlund name, name); 1595e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 1605e9cd1aeSAssar Westerlund fprintf(h_file, "typedef enum %s_error_number{\n", name); 1615e9cd1aeSAssar Westerlund 1625e9cd1aeSAssar Westerlund for(ec = codes; ec; ec = ec->next) { 163c19800e8SDoug Rabson fprintf(h_file, "\t%s = %ld%s\n", ec->name, base_id + ec->number, 1648373020dSJacques Vidrine (ec->next != NULL) ? "," : ""); 1655e9cd1aeSAssar Westerlund } 1665e9cd1aeSAssar Westerlund 1675e9cd1aeSAssar Westerlund fprintf(h_file, "} %s_error_number;\n", name); 1685e9cd1aeSAssar Westerlund fprintf(h_file, "\n"); 169c19800e8SDoug Rabson fprintf(h_file, "#define ERROR_TABLE_BASE_%s %ld\n", name, base_id); 1708373020dSJacques Vidrine fprintf(h_file, "\n"); 171*ae771770SStanislav Sedov fprintf(h_file, "#define COM_ERR_BINDDOMAIN_%s \"heim_com_err%ld\"\n", name, base_id); 172*ae771770SStanislav Sedov fprintf(h_file, "\n"); 1735e9cd1aeSAssar Westerlund fprintf(h_file, "#endif /* %s */\n", fn); 1745e9cd1aeSAssar Westerlund 1755e9cd1aeSAssar Westerlund 1765e9cd1aeSAssar Westerlund fclose(h_file); 1775e9cd1aeSAssar Westerlund return 0; 1785e9cd1aeSAssar Westerlund } 1795e9cd1aeSAssar Westerlund 1805e9cd1aeSAssar Westerlund static int 1815e9cd1aeSAssar Westerlund generate(void) 1825e9cd1aeSAssar Westerlund { 1835e9cd1aeSAssar Westerlund return generate_c() || generate_h(); 1845e9cd1aeSAssar Westerlund } 1855e9cd1aeSAssar Westerlund 1865e9cd1aeSAssar Westerlund int version_flag; 1875e9cd1aeSAssar Westerlund int help_flag; 1885e9cd1aeSAssar Westerlund struct getargs args[] = { 1895e9cd1aeSAssar Westerlund { "version", 0, arg_flag, &version_flag }, 1905e9cd1aeSAssar Westerlund { "help", 0, arg_flag, &help_flag } 1915e9cd1aeSAssar Westerlund }; 1925e9cd1aeSAssar Westerlund int num_args = sizeof(args) / sizeof(args[0]); 1935e9cd1aeSAssar Westerlund 1945e9cd1aeSAssar Westerlund static void 1955e9cd1aeSAssar Westerlund usage(int code) 1965e9cd1aeSAssar Westerlund { 1975e9cd1aeSAssar Westerlund arg_printusage(args, num_args, NULL, "error-table"); 1985e9cd1aeSAssar Westerlund exit(code); 1995e9cd1aeSAssar Westerlund } 2005e9cd1aeSAssar Westerlund 2015e9cd1aeSAssar Westerlund int 2025e9cd1aeSAssar Westerlund main(int argc, char **argv) 2035e9cd1aeSAssar Westerlund { 2045e9cd1aeSAssar Westerlund char *p; 205c19800e8SDoug Rabson int optidx = 0; 2065e9cd1aeSAssar Westerlund 207adb0ddaeSAssar Westerlund setprogname(argv[0]); 208c19800e8SDoug Rabson if(getarg(args, num_args, argc, argv, &optidx)) 2095e9cd1aeSAssar Westerlund usage(1); 2105e9cd1aeSAssar Westerlund if(help_flag) 2115e9cd1aeSAssar Westerlund usage(0); 2125e9cd1aeSAssar Westerlund if(version_flag) { 2135e9cd1aeSAssar Westerlund print_version(NULL); 2145e9cd1aeSAssar Westerlund exit(0); 2155e9cd1aeSAssar Westerlund } 2165e9cd1aeSAssar Westerlund 217c19800e8SDoug Rabson if(optidx == argc) 2185e9cd1aeSAssar Westerlund usage(1); 219c19800e8SDoug Rabson filename = argv[optidx]; 2205e9cd1aeSAssar Westerlund yyin = fopen(filename, "r"); 2215e9cd1aeSAssar Westerlund if(yyin == NULL) 2225e9cd1aeSAssar Westerlund err(1, "%s", filename); 2235e9cd1aeSAssar Westerlund 2245e9cd1aeSAssar Westerlund 225*ae771770SStanislav Sedov p = strrchr(filename, rk_PATH_DELIM); 2265e9cd1aeSAssar Westerlund if(p) 2275e9cd1aeSAssar Westerlund p++; 2285e9cd1aeSAssar Westerlund else 2295e9cd1aeSAssar Westerlund p = filename; 230c19800e8SDoug Rabson strlcpy(Basename, p, sizeof(Basename)); 2315e9cd1aeSAssar Westerlund 2325e9cd1aeSAssar Westerlund Basename[strcspn(Basename, ".")] = '\0'; 2335e9cd1aeSAssar Westerlund 2345e9cd1aeSAssar Westerlund snprintf(hfn, sizeof(hfn), "%s.h", Basename); 2355e9cd1aeSAssar Westerlund snprintf(cfn, sizeof(cfn), "%s.c", Basename); 2365e9cd1aeSAssar Westerlund 2375e9cd1aeSAssar Westerlund yyparse(); 2385e9cd1aeSAssar Westerlund if(numerror) 2395e9cd1aeSAssar Westerlund return 1; 2405e9cd1aeSAssar Westerlund 2415e9cd1aeSAssar Westerlund return generate(); 2425e9cd1aeSAssar Westerlund } 243