comerr: avoid comma operator
[openafs.git] / src / comerr / compile_et.c
index 082d161..982cabb 100644 (file)
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID("$Header$");
+#include <roken.h>
+#include <afs/opr.h>
 
-#include <stdio.h>
-#include <stdlib.h>
-
-#ifndef AFS_NT40_ENV
-#include <sys/file.h>
-#include <sys/param.h>
-#endif
-
-#include <errno.h>
-#include <string.h>
-#ifdef AFS_AIX32_ENV
-#include <signal.h>
-#endif
 #include "mit-sipb-cr.h"
+#include "internal.h"
 #include "compiler.h"
 
 #ifndef lint
@@ -34,11 +23,10 @@ static const char copyright[] =
     "Copyright 1987,1988 by MIT Student Information Processing Board";
 #endif
 
-extern char *gensym();
 extern char *current_token;
 extern int table_number, current;
 char buffer[BUFSIZ];
-char *table_name = (char *)NULL;
+char *table_name = NULL;
 FILE *hfile, *cfile, *msfile;
 int version = 1;
 int use_msf = 0;
@@ -46,18 +34,26 @@ int use_msf = 0;
 /* lex stuff */
 extern FILE *yyin;
 extern FILE *yyout;
+#ifdef AFS_AIX51_ENV
+int yylineno = 0;
+#else
 extern int yylineno;
+#endif
 
-char * xmalloc (size) unsigned int size; {
-    char * p = malloc (size);
+char *
+xmalloc(unsigned int size)
+{
+    char *p = malloc(size);
     if (!p) {
-       perror (whoami);
-       exit (1);
+       perror(whoami);
+       exit(1);
     }
     return p;
 }
 
-static int check_arg (str_list, arg) char const *const *str_list, *arg; {
+static int
+check_arg(char const *const *str_list, char const *arg)
+{
     while (*str_list)
        if (!strcmp(arg, *str_list++))
            return 1;
@@ -83,14 +79,15 @@ static const char *const language_names[] = {
     0,
 };
 
-static const char * const c_src_prolog[] = {
+static const char *const c_src_prolog[] = {
+    "#include <afsconfig.h>\n",
     "#include <afs/param.h>\n",
     "#include <afs/error_table.h>\n",
     "static const char * const text[] = {\n",
     0,
 };
 
-static const char * const krc_src_prolog[] = {
+static const char *const krc_src_prolog[] = {
     "#ifdef __STDC__\n",
     "#define NOARGS void\n",
     "#else\n",
@@ -113,36 +110,46 @@ static const char msf_warning[] =
 char c_file[MAXPATHLEN];       /* output file */
 char h_file[MAXPATHLEN];       /* output */
 char msf_file[MAXPATHLEN];
-
-static void usage () {
-    fprintf (stderr, "%s: usage: %s ERROR_TABLE [-debug] [-language LANG] [-h INCLUDE] [-v version]\n",
-            whoami, whoami);
-    exit (1);
+char et_file[MAXPATHLEN];      /* full path to input file */
+
+static void
+usage(void)
+{
+    fprintf(stderr,
+           "%s: usage: %s ERROR_TABLE [-debug] [-language LANG] [-h INCLUDE] [-p prefix] [-v version]\n",
+           whoami, whoami);
+    exit(1);
 }
 
-static void dup_err (type, one, two) char const *type, *one, *two; {
-    fprintf (stderr, "%s: multiple %s specified: `%s' and `%s'\n",
-            whoami, type, one, two);
-    usage ();
+static void
+dup_err(char const *type, char const *one, char const *two)
+{
+    fprintf(stderr, "%s: multiple %s specified: `%s' and `%s'\n", whoami,
+           type, one, two);
+    usage();
 }
 
 #include "AFS_component_version_number.c"
 
-int main (argc, argv) int argc; char **argv; {
+int
+main(int argc, char **argv)
+{
     char *p, *ename;
-    char const * const *cpp;
+    char const *const *cpp;
     int got_language = 0;
     char *got_include = 0;
+    char *got_prefix = ".";
+    char lcname[6];
 
 #ifdef AFS_AIX32_ENV
     /*
-     * The following signal action for AIX is necessary so that in case of a 
-     * crash (i.e. core is generated) we can include the user's data section 
+     * The following signal action for AIX is necessary so that in case of a
+     * crash (i.e. core is generated) we can include the user's data section
      * in the core dump. Unfortunately, by default, only a partial core is
      * generated which, in many cases, isn't too useful.
      */
     struct sigaction nsa;
-    
+
     sigemptyset(&nsa.sa_mask);
     nsa.sa_handler = SIG_DFL;
     nsa.sa_flags = SA_FULLDUMP;
@@ -152,117 +159,133 @@ int main (argc, argv) int argc; char **argv; {
     debug = 0;
     filename = 0;
     whoami = argv[0];
-    p = strrchr (whoami, '/');
+    p = strrchr(whoami, '/');
     if (p)
-       whoami = p+1;
-    while (argv++, --argc) {
-       char *arg = *argv;
+       whoami = p + 1;
+    while (--argc) {
+       char *arg = *++argv;
        if (arg[0] != '-') {
            if (filename)
-               dup_err ("filenames", filename, arg);
+               dup_err("filenames", filename, arg);
            filename = arg;
-       }
-       else {
+       } else {
            arg++;
-           if (check_arg (debug_args, arg))
+           if (check_arg(debug_args, arg))
                debug++;
-           else if (check_arg (lang_args, arg)) {
+           else if (check_arg(lang_args, arg)) {
                got_language++;
-               arg = *++argv, argc--;
+               arg = *++argv;
+               argc--;
                if (!arg)
-                   usage ();
+                   usage();
                if (language)
-                   dup_err ("languanges", language_names[(int)language], arg);
-#define check_lang(x,v) else if (!strcasecmp(arg,x)) language = v
-               check_lang ("c", lang_C);
-               check_lang ("ansi_c", lang_C);
-               check_lang ("ansi-c", lang_C);
-               check_lang ("krc", lang_KRC);
-               check_lang ("kr_c", lang_KRC);
-               check_lang ("kr-c", lang_KRC);
-               check_lang ("k&r-c", lang_KRC);
-               check_lang ("k&r_c", lang_KRC);
-               check_lang ("c++", lang_CPP);
-               check_lang ("cplusplus", lang_CPP);
-               check_lang ("c-plus-plus", lang_CPP);
+                   dup_err("languanges", language_names[(int)language], arg);
+
+#define check_lang(x,v) if (!strcasecmp(arg,x)) language = v
+               check_lang("c", lang_C);
+               check_lang("ansi_c", lang_C);
+               check_lang("ansi-c", lang_C);
+               check_lang("krc", lang_KRC);
+               check_lang("kr_c", lang_KRC);
+               check_lang("kr-c", lang_KRC);
+               check_lang("k&r-c", lang_KRC);
+               check_lang("k&r_c", lang_KRC);
+               check_lang("c++", lang_CPP);
+               check_lang("cplusplus", lang_CPP);
+               check_lang("c-plus-plus", lang_CPP);
 #undef check_lang
-               else {
-                   fprintf (stderr, "%s: unknown language name `%s'\n",
-                            whoami, arg);
-                   fprintf (stderr, "\tpick one of: C K&R-C\n");
-                   exit (1);
+
+               if (!language) {
+                   fprintf(stderr, "%s: unknown language name `%s'\n",
+                           whoami, arg);
+                   fprintf(stderr, "\tpick one of: C K&R-C\n");
+                   exit(1);
                }
-           }
-           else if (strcmp (arg, "h") == 0) {
-               arg = *++argv, argc--;
-               if (!arg) usage ();
+           } else if (strcmp(arg, "h") == 0) {
+               arg = *++argv;
+               argc--;
+               if (!arg)
+                   usage();
                got_include = arg;
-           }
-           else if (strcmp (arg, "v") == 0) {
-               arg = *++argv, argc--;
+           } else if (strcmp(arg, "p") == 0) {
+               arg = *++argv;
+               argc--;
+               if (!arg)
+                   usage();
+               got_prefix = arg;
+           } else if (strcmp(arg, "v") == 0) {
+               arg = *++argv;
+               argc--;
+               if (arg == NULL) {
+                   fprintf(stderr, "%s: -v option requires an argument\n",
+                           whoami);
+                   usage();
+                   exit(1);
+               }
                version = atoi(arg);
                if (version != 1 && version != 2) {
-                   fprintf (stderr, "%s: unknown control argument -`%s'\n",
-                            whoami, arg);
-                   usage ();
+                   fprintf(stderr, "%s: unknown control argument -`%s'\n",
+                           whoami, arg);
+                   usage();
                    exit(1);
                }
-               if (version == 2) use_msf = 1;
-           }
-           else {
-               fprintf (stderr, "%s: unknown control argument -`%s'\n",
-                        whoami, arg);
-               usage ();
+               if (version == 2)
+                   use_msf = 1;
+           } else {
+               fprintf(stderr, "%s: unknown control argument -`%s'\n",
+                       whoami, arg);
+               usage();
            }
        }
     }
     if (!filename)
-       usage ();
+       usage();
     if (!got_language)
        language = lang_C;
     else if (language == lang_CPP) {
-       fprintf (stderr, "%s: Sorry, C++ support is not yet finished.\n",
-                whoami);
-       exit (1);
+       fprintf(stderr, "%s: Sorry, C++ support is not yet finished.\n",
+               whoami);
+       exit(1);
     }
 
 
     p = strrchr(filename, '/');
-    if (p == (char *)NULL)
+    if (p == NULL)
        p = filename;
     else
        p++;
-    ename = xmalloc (strlen(p) + 5);
-    strcpy (ename, p);
+    ename = xmalloc(strlen(p) + 5);
+    strcpy(ename, p);
 
     /* Now, flush .et suffix if it exists.   */
     p = strrchr(ename, '.');
     if (p != NULL) {
-       if (strcmp (p, ".et") == 0)
+       if (strcmp(p, ".et") == 0)
            *p = 0;
     }
 
     if (use_msf) {
        sprintf(msf_file, "%s.msf", ename);
-    }  else {
+    } else {
        sprintf(c_file, "%s.c", ename);
     }
     if (got_include) {
-        sprintf(h_file, "%s.h", got_include);
+       sprintf(h_file, "%s.h", got_include);
     } else {
-        sprintf(h_file, "%s.h", ename);
+       sprintf(h_file, "%s.h", ename);
     }
     p = strrchr(filename, '.');
-    if (p == NULL)
-    {
-        p = xmalloc (strlen(filename) + 4);
-        sprintf(p, "%s.et", filename);
-        filename = p;
+    if (p == NULL) {
+       p = xmalloc(strlen(filename) + 4);
+       sprintf(p, "%s.et", filename);
+       filename = p;
     }
 
-    yyin = fopen(filename, "r");
+    sprintf(et_file, "%s/%s", got_prefix, filename);
+
+    yyin = fopen(et_file, "r");
     if (!yyin) {
-       perror(filename);
+       perror(et_file);
        exit(1);
     }
 
@@ -272,54 +295,59 @@ int main (argc, argv) int argc; char **argv; {
     }
 
     hfile = fopen(h_file, "w");
-    if (hfile == (FILE *)NULL) {
+    if (hfile == NULL) {
        perror(h_file);
        exit(1);
     }
-    fprintf (hfile, warning, h_file);
+    fprintf(hfile, warning, h_file);
     if (got_include) {
-       char  buffer[BUFSIZ];
-       char  prolog_h_file[MAXPATHLEN];
+       char buffer[BUFSIZ];
+       char prolog_h_file[MAXPATHLEN];
        FILE *prolog_hfile;
-       int   count, written;
+       int count, written;
 
-       strcpy (prolog_h_file, got_include);
-       strcat (prolog_h_file, ".p.h");
+       strcpy(prolog_h_file, got_prefix);
+       strcat(prolog_h_file, "/");
+       strcat(prolog_h_file, got_include);
+       strcat(prolog_h_file, ".p.h");
        prolog_hfile = fopen(prolog_h_file, "r");
        if (prolog_hfile) {
-           fprintf (stderr, "Including %s at beginning of %s file.\n", prolog_h_file, h_file);
-           fprintf (hfile, "/* Including %s at beginning of %s file. */\n\n",
-                    prolog_h_file, h_file);
+           fprintf(stderr, "Including %s at beginning of %s file.\n",
+                   prolog_h_file, h_file);
+           fprintf(hfile, "/* Including %s at beginning of %s file. */\n\n",
+                   prolog_h_file, h_file);
            do {
-               count = fread (buffer, sizeof(char), sizeof(buffer), prolog_hfile);
+               count =
+                   fread(buffer, sizeof(char), sizeof(buffer), prolog_hfile);
                if (count == EOF) {
                    perror(prolog_h_file);
                    exit(1);
                }
-               written = fwrite (buffer, sizeof(char), count, hfile);
+               written = fwrite(buffer, sizeof(char), count, hfile);
                if (count != written) {
                    perror(prolog_h_file);
                    exit(1);
                }
            } while (count > 0);
-           fprintf (hfile, "\n/* End of prolog file %s. */\n\n", prolog_h_file);
+           fprintf(hfile, "\n/* End of prolog file %s. */\n\n",
+                   prolog_h_file);
        }
     }
 
     if (use_msf) {
        msfile = fopen(msf_file, "w");
-       if (msfile == (FILE *)NULL) {
+       if (msfile == NULL) {
            perror(msf_file);
            exit(1);
        }
        fprintf(msfile, msf_warning, msf_file);
     } else {
        cfile = fopen(c_file, "w");
-       if (cfile == (FILE *)NULL) {
+       if (cfile == NULL) {
            perror(c_file);
            exit(1);
        }
-       fprintf (cfile, warning, c_file);
+       fprintf(cfile, warning, c_file);
 
        /* prologue */
        if (language == lang_C)
@@ -327,9 +355,9 @@ int main (argc, argv) int argc; char **argv; {
        else if (language == lang_KRC)
            cpp = krc_src_prolog;
        else
-           abort ();
+           abort();
        while (*cpp)
-           fputs (*cpp++, cfile);
+           fputs(*cpp++, cfile);
     }
 
     /* parse it */
@@ -337,41 +365,54 @@ int main (argc, argv) int argc; char **argv; {
     fclose(yyin);              /* bye bye input file */
 
     if (!use_msf) {
-       fputs ("    0\n};\n\n", cfile);
+       fputs("    0\n};\n\n", cfile);
        fprintf(cfile,
                "static const struct error_table et = { text, %ldL, %d };\n\n",
-               (long int) table_number, current);
+               (long int)table_number, current);
        fputs("static struct et_list etlink = { 0, &et};\n\n", cfile);
-       fprintf(cfile, "void initialize_%s_error_table (%s) {\n",
-               table_name, (language == lang_C) ? "void" : "NOARGS");
-       fputs("    add_to_error_table(&etlink);\n", cfile);
+       fprintf(cfile, "void initialize_%s_error_table(void) {\n",
+               table_name);
+       fputs("    afs_add_to_error_table(&etlink);\n", cfile);
        fputs("}\n", cfile);
        fclose(cfile);
 
 
-       fprintf (hfile, "extern void initialize_%s_error_table ();\n",
-                table_name);
+       fprintf(hfile, "extern void initialize_%s_error_table(void);\n",
+               table_name);
     } else {
-       fprintf (hfile, "#define initialize_%s_error_table()\n",
-                table_name);
+       fprintf(hfile, "#define initialize_%s_error_table(void)\n",
+               table_name);
     }
 
-    fprintf (hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n",
-            table_name, (long int) table_number);
+    fprintf(hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n", table_name,
+           (long int)table_number);
     /* compatibility... */
-    fprintf (hfile, "\n/* for compatibility with older versions... */\n");
-    fprintf (hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
-            table_name, table_name);
-    fprintf (hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", table_name,
-            table_name);
+    fprintf(hfile, "\n/* for compatibility with older versions... */\n");
+    fprintf(hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
+           table_name, table_name);
+    fprintf(hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", table_name,
+           table_name);
+    fprintf(hfile, "\n/* for compatibility with other users... */\n");
+    lcstring(lcname, table_name, sizeof(lcname));
+    fprintf(hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n", lcname,
+           (long int)table_number);
+    fprintf(hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
+           lcname, table_name);
+    fprintf(hfile,
+           "#define initialize_%s_error_table initialize_%s_error_table\n",
+           lcname, table_name);
+    fprintf(hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", lcname,
+           lcname);
     fclose(hfile);             /* bye bye include file */
     if (use_msf)
        fclose(msfile);
     return 0;
 }
 
-void yyerror(const char *s) {
+void
+yyerror(const char *s)
+{
     fputs(s, stderr);
-    fprintf(stderr, "\nLine number %d; last token was '%s'\n",
-           yylineno, current_token);
+    fprintf(stderr, "\nLine number %d; last token was '%s'\n", yylineno,
+           current_token);
 }