172445Sassar/* 2102644Snectar * Copyright (c) 1998-2002 Kungliga Tekniska H�gskolan 372445Sassar * (Royal Institute of Technology, Stockholm, Sweden). 472445Sassar * All rights reserved. 572445Sassar * 672445Sassar * Redistribution and use in source and binary forms, with or without 772445Sassar * modification, are permitted provided that the following conditions 872445Sassar * are met: 972445Sassar * 1072445Sassar * 1. Redistributions of source code must retain the above copyright 1172445Sassar * notice, this list of conditions and the following disclaimer. 1272445Sassar * 1372445Sassar * 2. Redistributions in binary form must reproduce the above copyright 1472445Sassar * notice, this list of conditions and the following disclaimer in the 1572445Sassar * documentation and/or other materials provided with the distribution. 1672445Sassar * 1772445Sassar * 3. Neither the name of the Institute nor the names of its contributors 1872445Sassar * may be used to endorse or promote products derived from this software 1972445Sassar * without specific prior written permission. 2072445Sassar * 2172445Sassar * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 2272445Sassar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2372445Sassar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2472445Sassar * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 2572445Sassar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2672445Sassar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2772445Sassar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2872445Sassar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2972445Sassar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3072445Sassar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3172445Sassar * SUCH DAMAGE. 3272445Sassar */ 3372445Sassar 3472445Sassar#undef ROKEN_RENAME 3572445Sassar#include "compile_et.h" 3672445Sassar#include <getarg.h> 3772445Sassar 38178825SdfrRCSID("$Id: compile_et.c 15426 2005-06-16 19:21:42Z lha $"); 3972445Sassar 4072445Sassar#include <roken.h> 4172445Sassar#include <err.h> 4272445Sassar#include "parse.h" 4372445Sassar 4472445Sassarint numerror; 4572445Sassarextern FILE *yyin; 4672445Sassar 4772445Sassarextern void yyparse(void); 4872445Sassar 49178825Sdfrlong base_id; 5072445Sassarint number; 5172445Sassarchar *prefix; 5272445Sassarchar *id_str; 5372445Sassar 5472445Sassarchar name[128]; 5572445Sassarchar Basename[128]; 5672445Sassar 5772445Sassar#ifdef YYDEBUG 5872445Sassarextern int yydebug = 1; 5972445Sassar#endif 6072445Sassar 6172445Sassarchar *filename; 6272445Sassarchar hfn[128]; 6372445Sassarchar cfn[128]; 6472445Sassar 6572445Sassarstruct error_code *codes = NULL; 6672445Sassar 6772445Sassarstatic int 6872445Sassargenerate_c(void) 6972445Sassar{ 7072445Sassar int n; 7172445Sassar struct error_code *ec; 7272445Sassar 7372445Sassar FILE *c_file = fopen(cfn, "w"); 7472445Sassar if(c_file == NULL) 7572445Sassar return 1; 7672445Sassar 7772445Sassar fprintf(c_file, "/* Generated from %s */\n", filename); 7872445Sassar if(id_str) 7972445Sassar fprintf(c_file, "/* %s */\n", id_str); 8072445Sassar fprintf(c_file, "\n"); 8172445Sassar fprintf(c_file, "#include <stddef.h>\n"); 8272445Sassar fprintf(c_file, "#include <com_err.h>\n"); 8372445Sassar fprintf(c_file, "#include \"%s\"\n", hfn); 8472445Sassar fprintf(c_file, "\n"); 8572445Sassar 86102644Snectar fprintf(c_file, "static const char *%s_error_strings[] = {\n", name); 8772445Sassar 8872445Sassar for(ec = codes, n = 0; ec; ec = ec->next, n++) { 8972445Sassar while(n < ec->number) { 9072445Sassar fprintf(c_file, "\t/* %03d */ \"Reserved %s error (%d)\",\n", 9172445Sassar n, name, n); 9272445Sassar n++; 9372445Sassar 9472445Sassar } 9572445Sassar fprintf(c_file, "\t/* %03d */ \"%s\",\n", ec->number, ec->string); 9672445Sassar } 9772445Sassar 9872445Sassar fprintf(c_file, "\tNULL\n"); 9972445Sassar fprintf(c_file, "};\n"); 10072445Sassar fprintf(c_file, "\n"); 101102644Snectar fprintf(c_file, "#define num_errors %d\n", number); 102102644Snectar fprintf(c_file, "\n"); 10372445Sassar fprintf(c_file, 10472445Sassar "void initialize_%s_error_table_r(struct et_list **list)\n", 10572445Sassar name); 10672445Sassar fprintf(c_file, "{\n"); 10772445Sassar fprintf(c_file, 108102644Snectar " initialize_error_table_r(list, %s_error_strings, " 109102644Snectar "num_errors, ERROR_TABLE_BASE_%s);\n", name, name); 11072445Sassar fprintf(c_file, "}\n"); 11172445Sassar fprintf(c_file, "\n"); 11272445Sassar fprintf(c_file, "void initialize_%s_error_table(void)\n", name); 11372445Sassar fprintf(c_file, "{\n"); 11472445Sassar fprintf(c_file, 115102644Snectar " init_error_table(%s_error_strings, ERROR_TABLE_BASE_%s, " 116102644Snectar "num_errors);\n", name, name); 11772445Sassar fprintf(c_file, "}\n"); 11872445Sassar 11972445Sassar fclose(c_file); 12072445Sassar return 0; 12172445Sassar} 12272445Sassar 12372445Sassarstatic int 12472445Sassargenerate_h(void) 12572445Sassar{ 12672445Sassar struct error_code *ec; 12772445Sassar char fn[128]; 12872445Sassar FILE *h_file = fopen(hfn, "w"); 12972445Sassar char *p; 13072445Sassar 13172445Sassar if(h_file == NULL) 13272445Sassar return 1; 13372445Sassar 13472445Sassar snprintf(fn, sizeof(fn), "__%s__", hfn); 13572445Sassar for(p = fn; *p; p++) 13672445Sassar if(!isalnum((unsigned char)*p)) 13772445Sassar *p = '_'; 13872445Sassar 13972445Sassar fprintf(h_file, "/* Generated from %s */\n", filename); 14072445Sassar if(id_str) 14172445Sassar fprintf(h_file, "/* %s */\n", id_str); 14272445Sassar fprintf(h_file, "\n"); 14372445Sassar fprintf(h_file, "#ifndef %s\n", fn); 14472445Sassar fprintf(h_file, "#define %s\n", fn); 14572445Sassar fprintf(h_file, "\n"); 146102644Snectar fprintf(h_file, "struct et_list;\n"); 14772445Sassar fprintf(h_file, "\n"); 14872445Sassar fprintf(h_file, 14972445Sassar "void initialize_%s_error_table_r(struct et_list **);\n", 15072445Sassar name); 15172445Sassar fprintf(h_file, "\n"); 15272445Sassar fprintf(h_file, "void initialize_%s_error_table(void);\n", name); 15372445Sassar fprintf(h_file, "#define init_%s_err_tbl initialize_%s_error_table\n", 15472445Sassar name, name); 15572445Sassar fprintf(h_file, "\n"); 15672445Sassar fprintf(h_file, "typedef enum %s_error_number{\n", name); 15772445Sassar 15872445Sassar for(ec = codes; ec; ec = ec->next) { 159178825Sdfr fprintf(h_file, "\t%s = %ld%s\n", ec->name, base_id + ec->number, 160102644Snectar (ec->next != NULL) ? "," : ""); 16172445Sassar } 16272445Sassar 16372445Sassar fprintf(h_file, "} %s_error_number;\n", name); 16472445Sassar fprintf(h_file, "\n"); 165178825Sdfr fprintf(h_file, "#define ERROR_TABLE_BASE_%s %ld\n", name, base_id); 166102644Snectar fprintf(h_file, "\n"); 16772445Sassar fprintf(h_file, "#endif /* %s */\n", fn); 16872445Sassar 16972445Sassar 17072445Sassar fclose(h_file); 17172445Sassar return 0; 17272445Sassar} 17372445Sassar 17472445Sassarstatic int 17572445Sassargenerate(void) 17672445Sassar{ 17772445Sassar return generate_c() || generate_h(); 17872445Sassar} 17972445Sassar 18072445Sassarint version_flag; 18172445Sassarint help_flag; 18272445Sassarstruct getargs args[] = { 18372445Sassar { "version", 0, arg_flag, &version_flag }, 18472445Sassar { "help", 0, arg_flag, &help_flag } 18572445Sassar}; 18672445Sassarint num_args = sizeof(args) / sizeof(args[0]); 18772445Sassar 18872445Sassarstatic void 18972445Sassarusage(int code) 19072445Sassar{ 19172445Sassar arg_printusage(args, num_args, NULL, "error-table"); 19272445Sassar exit(code); 19372445Sassar} 19472445Sassar 19572445Sassarint 19672445Sassarmain(int argc, char **argv) 19772445Sassar{ 19872445Sassar char *p; 199178825Sdfr int optidx = 0; 20072445Sassar 20178527Sassar setprogname(argv[0]); 202178825Sdfr if(getarg(args, num_args, argc, argv, &optidx)) 20372445Sassar usage(1); 20472445Sassar if(help_flag) 20572445Sassar usage(0); 20672445Sassar if(version_flag) { 20772445Sassar print_version(NULL); 20872445Sassar exit(0); 20972445Sassar } 21072445Sassar 211178825Sdfr if(optidx == argc) 21272445Sassar usage(1); 213178825Sdfr filename = argv[optidx]; 21472445Sassar yyin = fopen(filename, "r"); 21572445Sassar if(yyin == NULL) 21672445Sassar err(1, "%s", filename); 21772445Sassar 21872445Sassar 21972445Sassar p = strrchr(filename, '/'); 22072445Sassar if(p) 22172445Sassar p++; 22272445Sassar else 22372445Sassar p = filename; 224178825Sdfr strlcpy(Basename, p, sizeof(Basename)); 22572445Sassar 22672445Sassar Basename[strcspn(Basename, ".")] = '\0'; 22772445Sassar 22872445Sassar snprintf(hfn, sizeof(hfn), "%s.h", Basename); 22972445Sassar snprintf(cfn, sizeof(cfn), "%s.c", Basename); 23072445Sassar 23172445Sassar yyparse(); 23272445Sassar if(numerror) 23372445Sassar return 1; 23472445Sassar 23572445Sassar return generate(); 23672445Sassar} 237