zilasm/main: Extend wrong_arg routine.
[zilutils.git] / zilasm / main.c
index 16216762177fdb16012e306824e524745b8eb879..daa943c7919c76808084a9eba2926fe558b82258 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdarg.h>
 #include <string.h>
 #include <getopt.h>
 #include <time.h>
@@ -37,30 +38,37 @@ static struct option const long_options[] =
     { "zorkid",   required_argument, NULL, ZORKID   },
     { "serial",   required_argument, NULL, ZSERIAL  },
     { NULL, 0, NULL, 0 }
+
 };
 
 struct
 {
-    int  zversion;     /* 0 - 8   */
-    int  zorkid;       /* 0 - 255 */
-    char zserial[7];   /* YYMMDD  */
+    int  zversion;     /* 0 - 8     */
+    int  zorkid;       /* 0 - 65535 */
+    char zserial[7];   /* YYMMDD    */
 } Config;
 
-void wrong_arg()
+void wrong_arg(const char *err, ...)
 {
+    if (err)
+    {
+        va_list ap;
+        va_start(ap, err);
+        vfprintf(stderr, err, ap);
+        va_end(ap);
+    }
     fprintf(stderr, "Try `" PACKAGE_NAME " --help' for more information.\n");
     exit(1);
 }
 
 void print_version()
 {
-    printf(PACKAGE_STRING "\n"
-           "License AGPLv3+: GNU AGPL version 3 or later\n"
-           "<http://gnu.org/licenses/agpl.html>\n"
-           "This is free software: you are free to change and redistribute it.\n"
-           "There is NO WARRANTY, to the extent permitted by law.\n"
+    printf( PACKAGE_STRING "\n"
+            "License AGPLv3+: GNU AGPL version 3 or later\n"
+            "<http://gnu.org/licenses/agpl.html>\n"
+            "This is free software: you are free to change and redistribute it.\n"
+            "There is NO WARRANTY, to the extent permitted by law.\n"
           );
-
     exit(0);
 }
 
@@ -72,11 +80,10 @@ void print_usage(int failed)
            "--help     Display this help\n"
            "\n"
            "--zversion (accepts numbers 1 - 8, defaults to 1 if not specified)\n"
-           "--zorkid   (accepts digits, defaults to 0 if not specified)\n"
+           "--zorkid   (integer between 0 and 65535, defaults to 0 if not specified)\n"
            "--serial   (six characters of ASCII, defaults to current date\n"
            "            in the form YYMMDD if not specified)\n"
           );
-
     exit(failed);
 }
 
@@ -84,14 +91,14 @@ void fill_zserial(void)
 {
     time_t t;
     struct tm *timeinfo;
-    time(&t);
+    time (&t);
     timeinfo = localtime(&t);
-    strftime(Config.zserial, sizeof(Config.zserial), "%y%m%d", timeinfo);
+    strftime (Config.zserial, sizeof(Config.zserial), "%y%m%d", timeinfo);
 }
 
 void fill_config(void)
 {
-    Config.zversion = 1;
+    Config.zversion = 6;
     Config.zorkid   = 0;
     fill_zserial();
 }
@@ -103,17 +110,14 @@ void parse_intarg(int *dest, const char name[], int min, int max, int defval)
         *dest = defval;
         return;
     }
-
     int n = atoi(optarg);
     if (n >= min && n <= max)
     {
         *dest = n;
         return;
     }
-
-    fprintf(stderr, "Wrong %s value %s, must be integer between %d and %d\n",
-            name, optarg, min, max);
-    wrong_arg();
+    wrong_arg("Wrong %s value %s, must be integer between %d and %d\n",
+              name, optarg, min, max);
 }
 
 void parse_zserial(void)
@@ -123,23 +127,19 @@ void parse_zserial(void)
         fill_zserial();
         return;
     }
-
     size_t n = strlen(optarg);
     if (n == sizeof(Config.zserial) - 1)
     {
         char *p = optarg;
         while (*p && isalnum(*p))
             p++;
-
-        if (!*p) /* ..optarg contains alphanumeric only? */
+        if (!*p)    /* ..optarg contains alphanumeric only? */
         {
             strncpy(Config.zserial, optarg, sizeof(Config.zserial));
             return;
         }
     }
-
-    fprintf(stderr, "Wrong zserial value %s, must be 6 ASCII characters\n", optarg);
-    wrong_arg();
+    wrong_arg("Wrong zserial value %s, must be 6 ascii characters\n", optarg);
 }
 
 int main(int argc, char *argv[], char *envp[])
@@ -147,25 +147,25 @@ int main(int argc, char *argv[], char *envp[])
     fill_config();
 
     int opt = 0;
-    while ((opt = getopt_long(argc, argv, "hV", long_options, NULL)) != -1)
+    while ((opt = getopt_long (argc, argv, "hV", long_options, NULL)) != -1)
     {
-        switch (opt)
+        switch(opt)
         {
         case 'h'     :
             print_usage(0);
         case 'V'     :
             print_version();
         case ZVERSION:
-            parse_intarg(&Config.zversion, "zversion", 1, 8,   1);
+            parse_intarg(&Config.zversion, "zversion", 1, 8,      1);
             break;
         case ZORKID  :
-            parse_intarg(&Config.zorkid,   "zorkid",   0, 255, 0);
+            parse_intarg(&Config.zorkid,   "zorkid",   0, 0xFFFF, 0);
             break;
         case ZSERIAL :
             parse_zserial();
             break;
         default      :
-            wrong_arg();
+            wrong_arg(0);
         }
     }