1847a7462SMark Murray /* 2*ae771770SStanislav Sedov * Copyright (c) 1998-2002 Kungliga Tekniska Högskolan 3847a7462SMark Murray * (Royal Institute of Technology, Stockholm, Sweden). 4847a7462SMark Murray * All rights reserved. 5847a7462SMark Murray * 6847a7462SMark Murray * Redistribution and use in source and binary forms, with or without 7847a7462SMark Murray * modification, are permitted provided that the following conditions 8847a7462SMark Murray * are met: 9847a7462SMark Murray * 10847a7462SMark Murray * 1. Redistributions of source code must retain the above copyright 11847a7462SMark Murray * notice, this list of conditions and the following disclaimer. 12847a7462SMark Murray * 13847a7462SMark Murray * 2. Redistributions in binary form must reproduce the above copyright 14847a7462SMark Murray * notice, this list of conditions and the following disclaimer in the 15847a7462SMark Murray * documentation and/or other materials provided with the distribution. 16847a7462SMark Murray * 172b2b3720SJacques Vidrine * 3. Neither the name of the Institute nor the names of its contributors 18847a7462SMark Murray * may be used to endorse or promote products derived from this software 19847a7462SMark Murray * without specific prior written permission. 20847a7462SMark Murray * 21847a7462SMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22847a7462SMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23847a7462SMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24847a7462SMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25847a7462SMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26847a7462SMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27847a7462SMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28847a7462SMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29847a7462SMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30847a7462SMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31847a7462SMark Murray * SUCH DAMAGE. 32847a7462SMark Murray */ 33847a7462SMark Murray 34847a7462SMark Murray #undef ROKEN_RENAME 35*ae771770SStanislav Sedov 36*ae771770SStanislav Sedov #define rk_PATH_DELIM '/' 37*ae771770SStanislav Sedov 38847a7462SMark Murray #include "compile_et.h" 39847a7462SMark Murray #include <getarg.h> 40847a7462SMark Murray 41*ae771770SStanislav Sedov #include <roken.h> 42847a7462SMark Murray #include <err.h> 43847a7462SMark Murray #include "parse.h" 44847a7462SMark Murray 45847a7462SMark Murray int numerror; 46847a7462SMark Murray extern FILE *yyin; 47847a7462SMark Murray 48847a7462SMark Murray extern void yyparse(void); 49847a7462SMark Murray 5057680329SDoug Rabson long base_id; 51847a7462SMark Murray int number; 52847a7462SMark Murray char *prefix; 53847a7462SMark Murray char *id_str; 54847a7462SMark Murray 55847a7462SMark Murray char name[128]; 56847a7462SMark Murray char Basename[128]; 57847a7462SMark Murray 58847a7462SMark Murray #ifdef YYDEBUG 59847a7462SMark Murray extern int yydebug = 1; 60847a7462SMark Murray #endif 61847a7462SMark Murray 62847a7462SMark Murray char *filename; 63847a7462SMark Murray char hfn[128]; 64847a7462SMark Murray char cfn[128]; 65847a7462SMark Murray 66847a7462SMark Murray struct error_code *codes = NULL; 67847a7462SMark Murray 68847a7462SMark Murray static int 69847a7462SMark Murray generate_c(void) 70847a7462SMark Murray { 71847a7462SMark Murray int n; 72847a7462SMark Murray struct error_code *ec; 73847a7462SMark Murray 74847a7462SMark Murray FILE *c_file = fopen(cfn, "w"); 75847a7462SMark Murray if(c_file == NULL) 76847a7462SMark Murray return 1; 77847a7462SMark Murray 78847a7462SMark Murray fprintf(c_file, "/* Generated from %s */\n", filename); 79847a7462SMark Murray if(id_str) 80847a7462SMark Murray fprintf(c_file, "/* %s */\n", id_str); 81847a7462SMark Murray fprintf(c_file, "\n"); 82847a7462SMark Murray fprintf(c_file, "#include <stddef.h>\n"); 83847a7462SMark Murray fprintf(c_file, "#include <com_err.h>\n"); 84847a7462SMark Murray fprintf(c_file, "#include \"%s\"\n", hfn); 85847a7462SMark Murray fprintf(c_file, "\n"); 86*ae771770SStanislav Sedov fprintf(c_file, "#define N_(x) (x)\n"); 87*ae771770SStanislav Sedov fprintf(c_file, "\n"); 88847a7462SMark Murray 892b2b3720SJacques Vidrine fprintf(c_file, "static const char *%s_error_strings[] = {\n", name); 90847a7462SMark Murray 91847a7462SMark Murray for(ec = codes, n = 0; ec; ec = ec->next, n++) { 92847a7462SMark Murray while(n < ec->number) { 93847a7462SMark Murray fprintf(c_file, "\t/* %03d */ \"Reserved %s error (%d)\",\n", 94847a7462SMark Murray n, name, n); 95847a7462SMark Murray n++; 96847a7462SMark Murray 97847a7462SMark Murray } 98*ae771770SStanislav Sedov fprintf(c_file, "\t/* %03d */ N_(\"%s\"),\n", 99*ae771770SStanislav Sedov ec->number, ec->string); 100847a7462SMark Murray } 101847a7462SMark Murray 102847a7462SMark Murray fprintf(c_file, "\tNULL\n"); 103847a7462SMark Murray fprintf(c_file, "};\n"); 104847a7462SMark Murray fprintf(c_file, "\n"); 1052b2b3720SJacques Vidrine fprintf(c_file, "#define num_errors %d\n", number); 1062b2b3720SJacques Vidrine fprintf(c_file, "\n"); 107847a7462SMark Murray fprintf(c_file, 108847a7462SMark Murray "void initialize_%s_error_table_r(struct et_list **list)\n", 109847a7462SMark Murray name); 110847a7462SMark Murray fprintf(c_file, "{\n"); 111847a7462SMark Murray fprintf(c_file, 1122b2b3720SJacques Vidrine " initialize_error_table_r(list, %s_error_strings, " 1132b2b3720SJacques Vidrine "num_errors, ERROR_TABLE_BASE_%s);\n", name, name); 114847a7462SMark Murray fprintf(c_file, "}\n"); 115847a7462SMark Murray fprintf(c_file, "\n"); 116847a7462SMark Murray fprintf(c_file, "void initialize_%s_error_table(void)\n", name); 117847a7462SMark Murray fprintf(c_file, "{\n"); 118847a7462SMark Murray fprintf(c_file, 1192b2b3720SJacques Vidrine " init_error_table(%s_error_strings, ERROR_TABLE_BASE_%s, " 1202b2b3720SJacques Vidrine "num_errors);\n", name, name); 121847a7462SMark Murray fprintf(c_file, "}\n"); 122847a7462SMark Murray 123847a7462SMark Murray fclose(c_file); 124847a7462SMark Murray return 0; 125847a7462SMark Murray } 126847a7462SMark Murray 127847a7462SMark Murray static int 128847a7462SMark Murray generate_h(void) 129847a7462SMark Murray { 130847a7462SMark Murray struct error_code *ec; 131847a7462SMark Murray char fn[128]; 132847a7462SMark Murray FILE *h_file = fopen(hfn, "w"); 133847a7462SMark Murray char *p; 134847a7462SMark Murray 135847a7462SMark Murray if(h_file == NULL) 136847a7462SMark Murray return 1; 137847a7462SMark Murray 138847a7462SMark Murray snprintf(fn, sizeof(fn), "__%s__", hfn); 139847a7462SMark Murray for(p = fn; *p; p++) 140847a7462SMark Murray if(!isalnum((unsigned char)*p)) 141847a7462SMark Murray *p = '_'; 142847a7462SMark Murray 143847a7462SMark Murray fprintf(h_file, "/* Generated from %s */\n", filename); 144847a7462SMark Murray if(id_str) 145847a7462SMark Murray fprintf(h_file, "/* %s */\n", id_str); 146847a7462SMark Murray fprintf(h_file, "\n"); 147847a7462SMark Murray fprintf(h_file, "#ifndef %s\n", fn); 148847a7462SMark Murray fprintf(h_file, "#define %s\n", fn); 149847a7462SMark Murray fprintf(h_file, "\n"); 1502b2b3720SJacques Vidrine fprintf(h_file, "struct et_list;\n"); 151847a7462SMark Murray fprintf(h_file, "\n"); 152847a7462SMark Murray fprintf(h_file, 153847a7462SMark Murray "void initialize_%s_error_table_r(struct et_list **);\n", 154847a7462SMark Murray name); 155847a7462SMark Murray fprintf(h_file, "\n"); 156847a7462SMark Murray fprintf(h_file, "void initialize_%s_error_table(void);\n", name); 157847a7462SMark Murray fprintf(h_file, "#define init_%s_err_tbl initialize_%s_error_table\n", 158847a7462SMark Murray name, name); 159847a7462SMark Murray fprintf(h_file, "\n"); 160847a7462SMark Murray fprintf(h_file, "typedef enum %s_error_number{\n", name); 161847a7462SMark Murray 162847a7462SMark Murray for(ec = codes; ec; ec = ec->next) { 16357680329SDoug Rabson fprintf(h_file, "\t%s = %ld%s\n", ec->name, base_id + ec->number, 1642b2b3720SJacques Vidrine (ec->next != NULL) ? "," : ""); 165847a7462SMark Murray } 166847a7462SMark Murray 167847a7462SMark Murray fprintf(h_file, "} %s_error_number;\n", name); 168847a7462SMark Murray fprintf(h_file, "\n"); 16957680329SDoug Rabson fprintf(h_file, "#define ERROR_TABLE_BASE_%s %ld\n", name, base_id); 1702b2b3720SJacques 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"); 173847a7462SMark Murray fprintf(h_file, "#endif /* %s */\n", fn); 174847a7462SMark Murray 175847a7462SMark Murray 176847a7462SMark Murray fclose(h_file); 177847a7462SMark Murray return 0; 178847a7462SMark Murray } 179847a7462SMark Murray 180847a7462SMark Murray static int 181847a7462SMark Murray generate(void) 182847a7462SMark Murray { 183847a7462SMark Murray return generate_c() || generate_h(); 184847a7462SMark Murray } 185847a7462SMark Murray 186*ae771770SStanislav Sedov int version_flag; 187847a7462SMark Murray int help_flag; 188847a7462SMark Murray struct getargs args[] = { 189*ae771770SStanislav Sedov { "version", 0, arg_flag, &version_flag }, 190847a7462SMark Murray { "help", 0, arg_flag, &help_flag } 191847a7462SMark Murray }; 192847a7462SMark Murray int num_args = sizeof(args) / sizeof(args[0]); 193847a7462SMark Murray 194847a7462SMark Murray static void 195847a7462SMark Murray usage(int code) 196847a7462SMark Murray { 197847a7462SMark Murray arg_printusage(args, num_args, NULL, "error-table"); 198847a7462SMark Murray exit(code); 199847a7462SMark Murray } 200847a7462SMark Murray 201847a7462SMark Murray int 202847a7462SMark Murray main(int argc, char **argv) 203847a7462SMark Murray { 204847a7462SMark Murray char *p; 20557680329SDoug Rabson int optidx = 0; 206847a7462SMark Murray 2072b2b3720SJacques Vidrine setprogname(argv[0]); 20857680329SDoug Rabson if(getarg(args, num_args, argc, argv, &optidx)) 209847a7462SMark Murray usage(1); 210847a7462SMark Murray if(help_flag) 211847a7462SMark Murray usage(0); 212*ae771770SStanislav Sedov if(version_flag) { 213*ae771770SStanislav Sedov print_version(NULL); 214*ae771770SStanislav Sedov exit(0); 215*ae771770SStanislav Sedov } 216847a7462SMark Murray 21757680329SDoug Rabson if(optidx == argc) 218847a7462SMark Murray usage(1); 21957680329SDoug Rabson filename = argv[optidx]; 220847a7462SMark Murray yyin = fopen(filename, "r"); 221847a7462SMark Murray if(yyin == NULL) 222847a7462SMark Murray err(1, "%s", filename); 223847a7462SMark Murray 224847a7462SMark Murray 225*ae771770SStanislav Sedov p = strrchr(filename, rk_PATH_DELIM); 226847a7462SMark Murray if(p) 227847a7462SMark Murray p++; 228847a7462SMark Murray else 229847a7462SMark Murray p = filename; 23057680329SDoug Rabson strlcpy(Basename, p, sizeof(Basename)); 231847a7462SMark Murray 232847a7462SMark Murray Basename[strcspn(Basename, ".")] = '\0'; 233847a7462SMark Murray 234847a7462SMark Murray snprintf(hfn, sizeof(hfn), "%s.h", Basename); 235847a7462SMark Murray snprintf(cfn, sizeof(cfn), "%s.c", Basename); 236847a7462SMark Murray 237847a7462SMark Murray yyparse(); 238847a7462SMark Murray if(numerror) 239847a7462SMark Murray return 1; 240847a7462SMark Murray 241847a7462SMark Murray return generate(); 242847a7462SMark Murray } 243