]> granicus.if.org Git - re2c/commitdiff
Reduce boilerplate in option parser with a few macros.
authorUlya Trofimovich <skvadrik@gmail.com>
Sun, 30 Dec 2018 11:42:38 +0000 (11:42 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Sun, 30 Dec 2018 11:42:38 +0000 (11:42 +0000)
re2c/bootstrap/src/conf/parse_opts.cc
re2c/src/conf/parse_opts.re

index 3d685afb20d6ae12f2697211ef8b81003a5ff2a7..8ae98986acc7b19119199dde451b801deea353ca 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.1.1 on Sun Dec 30 10:57:46 2018 */
+/* Generated by re2c 1.1.1 on Sun Dec 30 11:40:02 2018 */
 #line 1 "../src/conf/parse_opts.re"
 #include "src/code/input_api.h"
 #include "src/conf/msg.h"
@@ -19,19 +19,26 @@ static inline bool next (char * & arg, char ** & argv)
 parse_opts_t parse_opts(char **argv, conopt_t &globopts, Opt &opts, Warn &warn)
 {
 #define YYCTYPE unsigned char
-    char *YYCURSOR, *YYMARKER, *p;
+
+#define NEXT_ARG(option, label) \
+    do { \
+        if (next (YYCURSOR, argv)) goto label; \
+        else { error_arg(option); return EXIT_FAIL; } \
+    } while(0)
+
+#define ERROR(msg, arg) \
+    do { error(msg, arg); return EXIT_FAIL; } while(0)
+
+    char *YYCURSOR, *YYMARKER;
     Warn::option_t option;
 
-#line 29 "../src/conf/parse_opts.re"
+#line 39 "../src/conf/parse_opts.re"
 
 
 opt:
-    if (!next (YYCURSOR, argv))
-    {
-        goto end;
-    }
+    if (!next (YYCURSOR, argv)) goto end;
 
-#line 35 "src/conf/parse_opts.cc"
+#line 42 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -75,12 +82,9 @@ opt:
        goto yy4;
 yy2:
        ++YYCURSOR;
-#line 38 "../src/conf/parse_opts.re"
-       {
-        error ("bad option: %s", *argv);
-        return EXIT_FAIL;
-    }
-#line 84 "src/conf/parse_opts.cc"
+#line 44 "../src/conf/parse_opts.re"
+       { ERROR("bad option: %s", *argv); }
+#line 88 "src/conf/parse_opts.cc"
 yy4:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yybm[0+yych] & 128) {
@@ -95,25 +99,25 @@ yy6:
        } else {
                if (yych == 'W') goto yy14;
        }
-#line 61 "../src/conf/parse_opts.re"
+#line 58 "../src/conf/parse_opts.re"
        { goto opt_short; }
-#line 101 "src/conf/parse_opts.cc"
+#line 105 "src/conf/parse_opts.cc"
 yy8:
        ++YYCURSOR;
-#line 59 "../src/conf/parse_opts.re"
+#line 56 "../src/conf/parse_opts.re"
        { if (!opts.source (*argv))     return EXIT_FAIL; goto opt; }
-#line 106 "src/conf/parse_opts.cc"
+#line 110 "src/conf/parse_opts.cc"
 yy10:
        ++YYCURSOR;
-#line 58 "../src/conf/parse_opts.re"
+#line 55 "../src/conf/parse_opts.re"
        { if (!opts.source ("<stdin>")) return EXIT_FAIL; goto opt; }
-#line 111 "src/conf/parse_opts.cc"
+#line 115 "src/conf/parse_opts.cc"
 yy12:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy16;
-#line 62 "../src/conf/parse_opts.re"
+#line 59 "../src/conf/parse_opts.re"
        { goto opt_long; }
-#line 117 "src/conf/parse_opts.cc"
+#line 121 "src/conf/parse_opts.cc"
 yy14:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -124,31 +128,26 @@ yy14:
                if (yych == 'n') goto yy22;
        }
 yy15:
-#line 66 "../src/conf/parse_opts.re"
+#line 63 "../src/conf/parse_opts.re"
        { option = Warn::W;        goto opt_warn; }
-#line 130 "src/conf/parse_opts.cc"
+#line 134 "src/conf/parse_opts.cc"
 yy16:
        ++YYCURSOR;
-#line 44 "../src/conf/parse_opts.re"
+#line 46 "../src/conf/parse_opts.re"
        {
-        // all remaining arguments are non-options
-        // so they must be input files
+        // remaining args are non-options, so they must be input files
         // re2c expects exactly one input file
-        for (char * f; next (f, argv);)
-        {
-            if (!opts.source (f))
-            {
-                return EXIT_FAIL;
-            }
+        for (char * f; next (f, argv);) {
+            if (!opts.source (f)) return EXIT_FAIL;
         }
         goto end;
     }
-#line 147 "src/conf/parse_opts.cc"
+#line 146 "src/conf/parse_opts.cc"
 yy18:
        ++YYCURSOR;
-#line 64 "../src/conf/parse_opts.re"
+#line 61 "../src/conf/parse_opts.re"
        { warn.set_all ();       goto opt; }
-#line 152 "src/conf/parse_opts.cc"
+#line 151 "src/conf/parse_opts.cc"
 yy20:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'r') goto yy23;
@@ -180,9 +179,9 @@ yy26:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == 'e') goto yy29;
 yy27:
-#line 67 "../src/conf/parse_opts.re"
+#line 64 "../src/conf/parse_opts.re"
        { option = Warn::WNO;      goto opt_warn; }
-#line 186 "src/conf/parse_opts.cc"
+#line 185 "src/conf/parse_opts.cc"
 yy28:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'r') goto yy30;
@@ -202,14 +201,14 @@ yy31:
        goto yy21;
 yy32:
        ++YYCURSOR;
-#line 65 "../src/conf/parse_opts.re"
+#line 62 "../src/conf/parse_opts.re"
        { warn.set_all_error (); goto opt; }
-#line 208 "src/conf/parse_opts.cc"
+#line 207 "src/conf/parse_opts.cc"
 yy34:
        ++YYCURSOR;
-#line 68 "../src/conf/parse_opts.re"
+#line 65 "../src/conf/parse_opts.re"
        { option = Warn::WERROR;   goto opt_warn; }
-#line 213 "src/conf/parse_opts.cc"
+#line 212 "src/conf/parse_opts.cc"
 yy36:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'o') goto yy21;
@@ -218,16 +217,16 @@ yy36:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != '-') goto yy21;
        ++YYCURSOR;
-#line 69 "../src/conf/parse_opts.re"
+#line 66 "../src/conf/parse_opts.re"
        { option = Warn::WNOERROR; goto opt_warn; }
-#line 224 "src/conf/parse_opts.cc"
+#line 223 "src/conf/parse_opts.cc"
 }
-#line 70 "../src/conf/parse_opts.re"
+#line 67 "../src/conf/parse_opts.re"
 
 
 opt_warn:
 
-#line 231 "src/conf/parse_opts.cc"
+#line 230 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
@@ -243,12 +242,9 @@ opt_warn:
 yy43:
        ++YYCURSOR;
 yy44:
-#line 75 "../src/conf/parse_opts.re"
-       {
-        error ("bad warning: %s", *argv);
-        return EXIT_FAIL;
-    }
-#line 252 "src/conf/parse_opts.cc"
+#line 71 "../src/conf/parse_opts.re"
+       { ERROR("bad warning: %s", *argv); }
+#line 248 "src/conf/parse_opts.cc"
 yy45:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == 'o') goto yy51;
@@ -675,9 +671,9 @@ yy150:
        goto yy52;
 yy151:
        ++YYCURSOR;
-#line 83 "../src/conf/parse_opts.re"
-       { warn.set (Warn::SWAPPED_RANGE,            option); goto opt; }
-#line 681 "src/conf/parse_opts.cc"
+#line 77 "../src/conf/parse_opts.re"
+       { warn.set (Warn::SWAPPED_RANGE,          option); goto opt; }
+#line 677 "src/conf/parse_opts.cc"
 yy153:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'r') goto yy160;
@@ -716,14 +712,14 @@ yy161:
        goto yy52;
 yy162:
        ++YYCURSOR;
-#line 86 "../src/conf/parse_opts.re"
-       { warn.set (Warn::USELESS_ESCAPE,           option); goto opt; }
-#line 722 "src/conf/parse_opts.cc"
+#line 80 "../src/conf/parse_opts.re"
+       { warn.set (Warn::USELESS_ESCAPE,         option); goto opt; }
+#line 718 "src/conf/parse_opts.cc"
 yy164:
        ++YYCURSOR;
-#line 79 "../src/conf/parse_opts.re"
-       { warn.set (Warn::CONDITION_ORDER,          option); goto opt; }
-#line 727 "src/conf/parse_opts.cc"
+#line 73 "../src/conf/parse_opts.re"
+       { warn.set (Warn::CONDITION_ORDER,        option); goto opt; }
+#line 723 "src/conf/parse_opts.cc"
 yy166:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'c') goto yy171;
@@ -782,18 +778,18 @@ yy179:
        goto yy52;
 yy180:
        ++YYCURSOR;
-#line 85 "../src/conf/parse_opts.re"
-       { warn.set (Warn::UNREACHABLE_RULES,        option); goto opt; }
-#line 788 "src/conf/parse_opts.cc"
+#line 79 "../src/conf/parse_opts.re"
+       { warn.set (Warn::UNREACHABLE_RULES,      option); goto opt; }
+#line 784 "src/conf/parse_opts.cc"
 yy182:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 's') goto yy187;
        goto yy52;
 yy183:
        ++YYCURSOR;
-#line 81 "../src/conf/parse_opts.re"
-       { warn.set (Warn::MATCH_EMPTY_STRING,       option); goto opt; }
-#line 797 "src/conf/parse_opts.cc"
+#line 75 "../src/conf/parse_opts.re"
+       { warn.set (Warn::MATCH_EMPTY_STRING,     option); goto opt; }
+#line 793 "src/conf/parse_opts.cc"
 yy185:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'g') goto yy188;
@@ -828,28 +824,28 @@ yy192:
        goto yy52;
 yy193:
        ++YYCURSOR;
-#line 80 "../src/conf/parse_opts.re"
-       { warn.set (Warn::EMPTY_CHARACTER_CLASS,    option); goto opt; }
-#line 834 "src/conf/parse_opts.cc"
+#line 74 "../src/conf/parse_opts.re"
+       { warn.set (Warn::EMPTY_CHARACTER_CLASS,  option); goto opt; }
+#line 830 "src/conf/parse_opts.cc"
 yy195:
        ++YYCURSOR;
-#line 82 "../src/conf/parse_opts.re"
-       { warn.set (Warn::NONDETERMINISTIC_TAGS,    option); goto opt; }
-#line 839 "src/conf/parse_opts.cc"
+#line 76 "../src/conf/parse_opts.re"
+       { warn.set (Warn::NONDETERMINISTIC_TAGS,  option); goto opt; }
+#line 835 "src/conf/parse_opts.cc"
 yy197:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych >= 0x01) goto yy52;
        ++YYCURSOR;
-#line 84 "../src/conf/parse_opts.re"
-       { warn.set (Warn::UNDEFINED_CONTROL_FLOW,   option); goto opt; }
-#line 846 "src/conf/parse_opts.cc"
+#line 78 "../src/conf/parse_opts.re"
+       { warn.set (Warn::UNDEFINED_CONTROL_FLOW, option); goto opt; }
+#line 842 "src/conf/parse_opts.cc"
 }
-#line 87 "../src/conf/parse_opts.re"
+#line 81 "../src/conf/parse_opts.re"
 
 
 opt_short:
 
-#line 853 "src/conf/parse_opts.cc"
+#line 849 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
@@ -937,167 +933,164 @@ opt_short:
                }
        }
        ++YYCURSOR;
-#line 96 "../src/conf/parse_opts.re"
+#line 87 "../src/conf/parse_opts.re"
        { goto opt; }
-#line 943 "src/conf/parse_opts.cc"
+#line 939 "src/conf/parse_opts.cc"
 yy204:
        ++YYCURSOR;
-#line 92 "../src/conf/parse_opts.re"
-       {
-        error ("bad short option: %s", *argv);
-        return EXIT_FAIL;
-    }
-#line 951 "src/conf/parse_opts.cc"
+#line 85 "../src/conf/parse_opts.re"
+       { ERROR("bad short option: %s", *argv); }
+#line 944 "src/conf/parse_opts.cc"
 yy206:
        ++YYCURSOR;
-#line 127 "../src/conf/parse_opts.re"
+#line 121 "../src/conf/parse_opts.re"
        { goto opt_short; }
-#line 956 "src/conf/parse_opts.cc"
+#line 949 "src/conf/parse_opts.cc"
 yy208:
        ++YYCURSOR;
-#line 122 "../src/conf/parse_opts.re"
+#line 110 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::UTF8);   goto opt_short; }
-#line 961 "src/conf/parse_opts.cc"
+#line 954 "src/conf/parse_opts.cc"
 yy210:
        ++YYCURSOR;
-#line 97 "../src/conf/parse_opts.re"
+#line 88 "../src/conf/parse_opts.re"
        { usage ();   return EXIT_OK; }
-#line 966 "src/conf/parse_opts.cc"
+#line 959 "src/conf/parse_opts.cc"
 yy212:
        ++YYCURSOR;
-#line 102 "../src/conf/parse_opts.re"
+#line 93 "../src/conf/parse_opts.re"
        { globopts.target = TARGET_DOT;      goto opt_short; }
-#line 971 "src/conf/parse_opts.cc"
+#line 964 "src/conf/parse_opts.cc"
 yy214:
        ++YYCURSOR;
-#line 104 "../src/conf/parse_opts.re"
+#line 95 "../src/conf/parse_opts.re"
        { globopts.FFlag = true;             goto opt_short; }
-#line 976 "src/conf/parse_opts.cc"
+#line 969 "src/conf/parse_opts.cc"
 yy216:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy256;
-#line 109 "../src/conf/parse_opts.re"
-       { goto opt_incpath; }
-#line 982 "src/conf/parse_opts.cc"
+#line 113 "../src/conf/parse_opts.re"
+       { *argv = YYCURSOR; goto opt_incpath; }
+#line 975 "src/conf/parse_opts.cc"
 yy218:
        ++YYCURSOR;
-#line 117 "../src/conf/parse_opts.re"
+#line 105 "../src/conf/parse_opts.re"
        { opts.set_posix_captures(true);  goto opt_short; }
-#line 987 "src/conf/parse_opts.cc"
+#line 980 "src/conf/parse_opts.cc"
 yy220:
        ++YYCURSOR;
-#line 106 "../src/conf/parse_opts.re"
+#line 97 "../src/conf/parse_opts.re"
        { globopts.target = TARGET_SKELETON; goto opt_short; }
-#line 992 "src/conf/parse_opts.cc"
+#line 985 "src/conf/parse_opts.cc"
 yy222:
        ++YYCURSOR;
-#line 116 "../src/conf/parse_opts.re"
+#line 104 "../src/conf/parse_opts.re"
        { opts.set_tags(true);            goto opt_short; }
-#line 997 "src/conf/parse_opts.cc"
+#line 990 "src/conf/parse_opts.cc"
 yy224:
        ++YYCURSOR;
-#line 99 "../src/conf/parse_opts.re"
+#line 90 "../src/conf/parse_opts.re"
        { vernum ();  return EXIT_OK; }
-#line 1002 "src/conf/parse_opts.cc"
+#line 995 "src/conf/parse_opts.cc"
 yy226:
        ++YYCURSOR;
-#line 111 "../src/conf/parse_opts.re"
+#line 99 "../src/conf/parse_opts.re"
        { opts.set_bFlag(true);           goto opt_short; }
-#line 1007 "src/conf/parse_opts.cc"
+#line 1000 "src/conf/parse_opts.cc"
 yy228:
        ++YYCURSOR;
-#line 101 "../src/conf/parse_opts.re"
+#line 92 "../src/conf/parse_opts.re"
        { globopts.cFlag = true;             goto opt_short; }
-#line 1012 "src/conf/parse_opts.cc"
+#line 1005 "src/conf/parse_opts.cc"
 yy230:
        ++YYCURSOR;
-#line 112 "../src/conf/parse_opts.re"
+#line 100 "../src/conf/parse_opts.re"
        { opts.set_dFlag(true);           goto opt_short; }
-#line 1017 "src/conf/parse_opts.cc"
+#line 1010 "src/conf/parse_opts.cc"
 yy232:
        ++YYCURSOR;
-#line 118 "../src/conf/parse_opts.re"
+#line 106 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::EBCDIC); goto opt_short; }
-#line 1022 "src/conf/parse_opts.cc"
+#line 1015 "src/conf/parse_opts.cc"
 yy234:
        ++YYCURSOR;
-#line 103 "../src/conf/parse_opts.re"
+#line 94 "../src/conf/parse_opts.re"
        { globopts.fFlag = true;             goto opt_short; }
-#line 1027 "src/conf/parse_opts.cc"
+#line 1020 "src/conf/parse_opts.cc"
 yy236:
        ++YYCURSOR;
-#line 113 "../src/conf/parse_opts.re"
+#line 101 "../src/conf/parse_opts.re"
        { opts.set_gFlag(true);           goto opt_short; }
-#line 1032 "src/conf/parse_opts.cc"
+#line 1025 "src/conf/parse_opts.cc"
 yy238:
        ++YYCURSOR;
-#line 114 "../src/conf/parse_opts.re"
+#line 102 "../src/conf/parse_opts.re"
        { opts.set_iFlag(true);           goto opt_short; }
-#line 1037 "src/conf/parse_opts.cc"
+#line 1030 "src/conf/parse_opts.cc"
 yy240:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy258;
-#line 124 "../src/conf/parse_opts.re"
-       { *argv = YYCURSOR;                                                             goto opt_output; }
-#line 1043 "src/conf/parse_opts.cc"
+#line 116 "../src/conf/parse_opts.re"
+       { *argv = YYCURSOR; goto opt_output; }
+#line 1036 "src/conf/parse_opts.cc"
 yy242:
        ++YYCURSOR;
-#line 105 "../src/conf/parse_opts.re"
+#line 96 "../src/conf/parse_opts.re"
        { globopts.rFlag = true;             goto opt_short; }
-#line 1048 "src/conf/parse_opts.cc"
+#line 1041 "src/conf/parse_opts.cc"
 yy244:
        ++YYCURSOR;
-#line 115 "../src/conf/parse_opts.re"
+#line 103 "../src/conf/parse_opts.re"
        { opts.set_sFlag(true);           goto opt_short; }
-#line 1053 "src/conf/parse_opts.cc"
+#line 1046 "src/conf/parse_opts.cc"
 yy246:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy260;
-#line 126 "../src/conf/parse_opts.re"
-       { *argv = YYCURSOR;                                                                  goto opt_header; }
-#line 1059 "src/conf/parse_opts.cc"
+#line 119 "../src/conf/parse_opts.re"
+       { *argv = YYCURSOR; goto opt_header; }
+#line 1052 "src/conf/parse_opts.cc"
 yy248:
        ++YYCURSOR;
-#line 119 "../src/conf/parse_opts.re"
+#line 107 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::UTF32);  goto opt_short; }
-#line 1064 "src/conf/parse_opts.cc"
+#line 1057 "src/conf/parse_opts.cc"
 yy250:
        ++YYCURSOR;
-#line 98 "../src/conf/parse_opts.re"
+#line 89 "../src/conf/parse_opts.re"
        { version (); return EXIT_OK; }
-#line 1069 "src/conf/parse_opts.cc"
+#line 1062 "src/conf/parse_opts.cc"
 yy252:
        ++YYCURSOR;
-#line 120 "../src/conf/parse_opts.re"
+#line 108 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::UCS2);   goto opt_short; }
-#line 1074 "src/conf/parse_opts.cc"
+#line 1067 "src/conf/parse_opts.cc"
 yy254:
        ++YYCURSOR;
-#line 121 "../src/conf/parse_opts.re"
+#line 109 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::UTF16);  goto opt_short; }
-#line 1079 "src/conf/parse_opts.cc"
+#line 1072 "src/conf/parse_opts.cc"
 yy256:
        ++YYCURSOR;
-#line 108 "../src/conf/parse_opts.re"
-       { if (!next (YYCURSOR, argv)) { error_arg ("-I"); return EXIT_FAIL; } goto opt_incpath; }
-#line 1084 "src/conf/parse_opts.cc"
+#line 112 "../src/conf/parse_opts.re"
+       { NEXT_ARG("-I", opt_incpath); }
+#line 1077 "src/conf/parse_opts.cc"
 yy258:
        ++YYCURSOR;
-#line 123 "../src/conf/parse_opts.re"
-       { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; }
-#line 1089 "src/conf/parse_opts.cc"
+#line 115 "../src/conf/parse_opts.re"
+       { NEXT_ARG("-o, --output", opt_output); }
+#line 1082 "src/conf/parse_opts.cc"
 yy260:
        ++YYCURSOR;
-#line 125 "../src/conf/parse_opts.re"
-       { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; }
-#line 1094 "src/conf/parse_opts.cc"
+#line 118 "../src/conf/parse_opts.re"
+       { NEXT_ARG("-t, --type-header", opt_header); }
+#line 1087 "src/conf/parse_opts.cc"
 }
-#line 128 "../src/conf/parse_opts.re"
+#line 122 "../src/conf/parse_opts.re"
 
 
 opt_long:
 
-#line 1101 "src/conf/parse_opts.cc"
+#line 1094 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
@@ -1123,12 +1116,9 @@ opt_long:
 yy264:
        ++YYCURSOR;
 yy265:
-#line 133 "../src/conf/parse_opts.re"
-       {
-        error ("bad long option: %s", *argv);
-        return EXIT_FAIL;
-    }
-#line 1132 "src/conf/parse_opts.cc"
+#line 126 "../src/conf/parse_opts.re"
+       { ERROR("bad long option: %s", *argv); }
+#line 1122 "src/conf/parse_opts.cc"
 yy266:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == 'i') goto yy282;
@@ -1492,9 +1482,9 @@ yy347:
        goto yy283;
 yy348:
        ++YYCURSOR;
-#line 162 "../src/conf/parse_opts.re"
+#line 153 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::EBCDIC);    goto opt; }
-#line 1498 "src/conf/parse_opts.cc"
+#line 1488 "src/conf/parse_opts.cc"
 yy350:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '-') goto yy384;
@@ -1656,9 +1646,9 @@ yy387:
        goto yy283;
 yy388:
        ++YYCURSOR;
-#line 137 "../src/conf/parse_opts.re"
+#line 128 "../src/conf/parse_opts.re"
        { usage ();   return EXIT_OK; }
-#line 1662 "src/conf/parse_opts.cc"
+#line 1652 "src/conf/parse_opts.cc"
 yy390:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy427;
@@ -1717,9 +1707,9 @@ yy403:
        goto yy283;
 yy404:
        ++YYCURSOR;
-#line 157 "../src/conf/parse_opts.re"
+#line 148 "../src/conf/parse_opts.re"
        { opts.set_tags (true);              goto opt; }
-#line 1723 "src/conf/parse_opts.cc"
+#line 1713 "src/conf/parse_opts.cc"
 yy406:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'h') goto yy442;
@@ -1806,9 +1796,9 @@ yy426:
        goto yy283;
 yy427:
        ++YYCURSOR;
-#line 170 "../src/conf/parse_opts.re"
-       { goto opt_input; }
-#line 1812 "src/conf/parse_opts.cc"
+#line 162 "../src/conf/parse_opts.re"
+       { NEXT_ARG("--input",            opt_input); }
+#line 1802 "src/conf/parse_opts.cc"
 yy429:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '-') goto yy464;
@@ -1875,9 +1865,9 @@ yy444:
        goto yy283;
 yy445:
        ++YYCURSOR;
-#line 166 "../src/conf/parse_opts.re"
+#line 157 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::UTF8);      goto opt; }
-#line 1881 "src/conf/parse_opts.cc"
+#line 1871 "src/conf/parse_opts.cc"
 yy447:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy482;
@@ -1973,9 +1963,9 @@ yy469:
        goto yy283;
 yy470:
        ++YYCURSOR;
-#line 167 "../src/conf/parse_opts.re"
-       { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; }
-#line 1979 "src/conf/parse_opts.cc"
+#line 159 "../src/conf/parse_opts.re"
+       { NEXT_ARG("-o, --output",       opt_output); }
+#line 1969 "src/conf/parse_opts.cc"
 yy472:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'a') goto yy507;
@@ -2010,14 +2000,14 @@ yy479:
        goto yy283;
 yy480:
        ++YYCURSOR;
-#line 165 "../src/conf/parse_opts.re"
+#line 156 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::UTF16);     goto opt; }
-#line 2016 "src/conf/parse_opts.cc"
+#line 2006 "src/conf/parse_opts.cc"
 yy482:
        ++YYCURSOR;
-#line 139 "../src/conf/parse_opts.re"
+#line 130 "../src/conf/parse_opts.re"
        { vernum ();  return EXIT_OK; }
-#line 2021 "src/conf/parse_opts.cc"
+#line 2011 "src/conf/parse_opts.cc"
 yy484:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy516;
@@ -2140,14 +2130,14 @@ yy513:
        goto yy283;
 yy514:
        ++YYCURSOR;
-#line 163 "../src/conf/parse_opts.re"
+#line 154 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::UTF32);     goto opt; }
-#line 2146 "src/conf/parse_opts.cc"
+#line 2136 "src/conf/parse_opts.cc"
 yy516:
        ++YYCURSOR;
-#line 138 "../src/conf/parse_opts.re"
+#line 129 "../src/conf/parse_opts.re"
        { version (); return EXIT_OK; }
-#line 2151 "src/conf/parse_opts.cc"
+#line 2141 "src/conf/parse_opts.cc"
 yy518:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'r') goto yy550;
@@ -2195,18 +2185,18 @@ yy527:
        }
 yy528:
        ++YYCURSOR;
-#line 175 "../src/conf/parse_opts.re"
+#line 168 "../src/conf/parse_opts.re"
        { globopts.dump_nfa = true;        goto opt; }
-#line 2201 "src/conf/parse_opts.cc"
+#line 2191 "src/conf/parse_opts.cc"
 yy530:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'p') goto yy564;
        goto yy283;
 yy531:
        ++YYCURSOR;
-#line 142 "../src/conf/parse_opts.re"
+#line 133 "../src/conf/parse_opts.re"
        { globopts.target = TARGET_DOT;      goto opt; }
-#line 2210 "src/conf/parse_opts.cc"
+#line 2200 "src/conf/parse_opts.cc"
 yy533:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 's') goto yy565;
@@ -2249,18 +2239,18 @@ yy542:
        goto yy283;
 yy543:
        ++YYCURSOR;
-#line 145 "../src/conf/parse_opts.re"
+#line 136 "../src/conf/parse_opts.re"
        { globopts.rFlag = true;             goto opt; }
-#line 2255 "src/conf/parse_opts.cc"
+#line 2245 "src/conf/parse_opts.cc"
 yy545:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 's') goto yy575;
        goto yy283;
 yy546:
        ++YYCURSOR;
-#line 148 "../src/conf/parse_opts.re"
+#line 139 "../src/conf/parse_opts.re"
        { globopts.target = TARGET_SKELETON; goto opt; }
-#line 2264 "src/conf/parse_opts.cc"
+#line 2254 "src/conf/parse_opts.cc"
 yy548:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 's') goto yy576;
@@ -2303,9 +2293,9 @@ yy557:
        goto yy283;
 yy558:
        ++YYCURSOR;
-#line 180 "../src/conf/parse_opts.re"
+#line 173 "../src/conf/parse_opts.re"
        { globopts.dump_adfa = true;       goto opt; }
-#line 2309 "src/conf/parse_opts.cc"
+#line 2299 "src/conf/parse_opts.cc"
 yy560:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'e') goto yy587;
@@ -2400,9 +2390,9 @@ yy582:
        goto yy283;
 yy583:
        ++YYCURSOR;
-#line 141 "../src/conf/parse_opts.re"
+#line 132 "../src/conf/parse_opts.re"
        { globopts.cFlag = true;             goto opt; }
-#line 2406 "src/conf/parse_opts.cc"
+#line 2396 "src/conf/parse_opts.cc"
 yy585:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 't') goto yy615;
@@ -2429,9 +2419,9 @@ yy590:
        goto yy283;
 yy591:
        ++YYCURSOR;
-#line 161 "../src/conf/parse_opts.re"
+#line 152 "../src/conf/parse_opts.re"
        { opts.set_eager_skip(true);         goto opt; }
-#line 2435 "src/conf/parse_opts.cc"
+#line 2425 "src/conf/parse_opts.cc"
 yy593:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy621;
@@ -2446,9 +2436,9 @@ yy595:
        goto yy283;
 yy596:
        ++YYCURSOR;
-#line 154 "../src/conf/parse_opts.re"
+#line 145 "../src/conf/parse_opts.re"
        { opts.set_sFlag (true);             goto opt; }
-#line 2452 "src/conf/parse_opts.cc"
+#line 2442 "src/conf/parse_opts.cc"
 yy598:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'f') goto yy626;
@@ -2467,9 +2457,9 @@ yy601:
        goto yy283;
 yy602:
        ++YYCURSOR;
-#line 147 "../src/conf/parse_opts.re"
+#line 138 "../src/conf/parse_opts.re"
        { globopts.version = false;          goto opt; }
-#line 2473 "src/conf/parse_opts.cc"
+#line 2463 "src/conf/parse_opts.cc"
 yy604:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'r') goto yy630;
@@ -2488,14 +2478,14 @@ yy607:
        goto yy283;
 yy608:
        ++YYCURSOR;
-#line 164 "../src/conf/parse_opts.re"
+#line 155 "../src/conf/parse_opts.re"
        { opts.set_encoding(Enc::UCS2);      goto opt; }
-#line 2494 "src/conf/parse_opts.cc"
+#line 2484 "src/conf/parse_opts.cc"
 yy610:
        ++YYCURSOR;
-#line 150 "../src/conf/parse_opts.re"
+#line 141 "../src/conf/parse_opts.re"
        { opts.set_bFlag (true);             goto opt; }
-#line 2499 "src/conf/parse_opts.cc"
+#line 2489 "src/conf/parse_opts.cc"
 yy612:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 't') goto yy636;
@@ -2534,18 +2524,18 @@ yy620:
        goto yy283;
 yy621:
        ++YYCURSOR;
-#line 171 "../src/conf/parse_opts.re"
-       { goto opt_empty_class; }
-#line 2540 "src/conf/parse_opts.cc"
+#line 163 "../src/conf/parse_opts.re"
+       { NEXT_ARG("--empty-class",      opt_empty_class); }
+#line 2530 "src/conf/parse_opts.cc"
 yy623:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'i') goto yy649;
        goto yy283;
 yy624:
        ++YYCURSOR;
-#line 144 "../src/conf/parse_opts.re"
+#line 135 "../src/conf/parse_opts.re"
        { globopts.FFlag = true;             goto opt; }
-#line 2549 "src/conf/parse_opts.cc"
+#line 2539 "src/conf/parse_opts.cc"
 yy626:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'o') goto yy650;
@@ -2568,18 +2558,18 @@ yy630:
        goto yy283;
 yy631:
        ++YYCURSOR;
-#line 173 "../src/conf/parse_opts.re"
+#line 166 "../src/conf/parse_opts.re"
        { goto opt; }
-#line 2574 "src/conf/parse_opts.cc"
+#line 2564 "src/conf/parse_opts.cc"
 yy633:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 't') goto yy656;
        goto yy283;
 yy634:
        ++YYCURSOR;
-#line 168 "../src/conf/parse_opts.re"
-       { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; }
-#line 2583 "src/conf/parse_opts.cc"
+#line 160 "../src/conf/parse_opts.re"
+       { NEXT_ARG("-t, --type-header",  opt_header); }
+#line 2573 "src/conf/parse_opts.cc"
 yy636:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'i') goto yy657;
@@ -2594,28 +2584,28 @@ yy638:
        goto yy283;
 yy639:
        ++YYCURSOR;
-#line 151 "../src/conf/parse_opts.re"
+#line 142 "../src/conf/parse_opts.re"
        { opts.set_dFlag (true);             goto opt; }
-#line 2600 "src/conf/parse_opts.cc"
+#line 2590 "src/conf/parse_opts.cc"
 yy641:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'i') goto yy661;
        goto yy283;
 yy642:
        ++YYCURSOR;
-#line 177 "../src/conf/parse_opts.re"
+#line 170 "../src/conf/parse_opts.re"
        { globopts.dump_dfa_det = true;    goto opt; }
-#line 2609 "src/conf/parse_opts.cc"
+#line 2599 "src/conf/parse_opts.cc"
 yy644:
        ++YYCURSOR;
-#line 179 "../src/conf/parse_opts.re"
+#line 172 "../src/conf/parse_opts.re"
        { globopts.dump_dfa_min = true;    goto opt; }
-#line 2614 "src/conf/parse_opts.cc"
+#line 2604 "src/conf/parse_opts.cc"
 yy646:
        ++YYCURSOR;
-#line 176 "../src/conf/parse_opts.re"
+#line 169 "../src/conf/parse_opts.re"
        { globopts.dump_dfa_raw = true;    goto opt; }
-#line 2619 "src/conf/parse_opts.cc"
+#line 2609 "src/conf/parse_opts.cc"
 yy648:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'p') goto yy662;
@@ -2634,9 +2624,9 @@ yy651:
        goto yy283;
 yy652:
        ++YYCURSOR;
-#line 159 "../src/conf/parse_opts.re"
+#line 150 "../src/conf/parse_opts.re"
        { opts.set_lookahead(false);         goto opt; }
-#line 2640 "src/conf/parse_opts.cc"
+#line 2630 "src/conf/parse_opts.cc"
 yy654:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'a') goto yy667;
@@ -2655,9 +2645,9 @@ yy657:
        goto yy283;
 yy658:
        ++YYCURSOR;
-#line 156 "../src/conf/parse_opts.re"
+#line 147 "../src/conf/parse_opts.re"
        { opts.set_bCaseInverted (true);     goto opt; }
-#line 2661 "src/conf/parse_opts.cc"
+#line 2651 "src/conf/parse_opts.cc"
 yy660:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy671;
@@ -2676,9 +2666,9 @@ yy663:
        goto yy283;
 yy664:
        ++YYCURSOR;
-#line 153 "../src/conf/parse_opts.re"
+#line 144 "../src/conf/parse_opts.re"
        { opts.set_iFlag (true);             goto opt; }
-#line 2682 "src/conf/parse_opts.cc"
+#line 2672 "src/conf/parse_opts.cc"
 yy666:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'd') goto yy676;
@@ -2701,9 +2691,9 @@ yy670:
        goto yy283;
 yy671:
        ++YYCURSOR;
-#line 152 "../src/conf/parse_opts.re"
+#line 143 "../src/conf/parse_opts.re"
        { opts.set_gFlag (true);             goto opt; }
-#line 2707 "src/conf/parse_opts.cc"
+#line 2697 "src/conf/parse_opts.cc"
 yy673:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'n') goto yy683;
@@ -2726,14 +2716,14 @@ yy677:
        goto yy283;
 yy678:
        ++YYCURSOR;
-#line 158 "../src/conf/parse_opts.re"
+#line 149 "../src/conf/parse_opts.re"
        { opts.set_posix_captures(true);     goto opt; }
-#line 2732 "src/conf/parse_opts.cc"
+#line 2722 "src/conf/parse_opts.cc"
 yy680:
        ++YYCURSOR;
-#line 143 "../src/conf/parse_opts.re"
+#line 134 "../src/conf/parse_opts.re"
        { globopts.fFlag = true;             goto opt; }
-#line 2737 "src/conf/parse_opts.cc"
+#line 2727 "src/conf/parse_opts.cc"
 yy682:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy690;
@@ -2744,14 +2734,14 @@ yy683:
        goto yy283;
 yy684:
        ++YYCURSOR;
-#line 178 "../src/conf/parse_opts.re"
+#line 171 "../src/conf/parse_opts.re"
        { globopts.dump_dfa_tagopt = true; goto opt; }
-#line 2750 "src/conf/parse_opts.cc"
+#line 2740 "src/conf/parse_opts.cc"
 yy686:
        ++YYCURSOR;
-#line 169 "../src/conf/parse_opts.re"
-       { goto opt_encoding_policy; }
-#line 2755 "src/conf/parse_opts.cc"
+#line 161 "../src/conf/parse_opts.re"
+       { NEXT_ARG("--encoding-policy",  opt_encoding_policy); }
+#line 2745 "src/conf/parse_opts.cc"
 yy688:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 't') goto yy694;
@@ -2762,37 +2752,37 @@ yy689:
        goto yy283;
 yy690:
        ++YYCURSOR;
-#line 155 "../src/conf/parse_opts.re"
+#line 146 "../src/conf/parse_opts.re"
        { opts.set_bCaseInsensitive (true);  goto opt; }
-#line 2768 "src/conf/parse_opts.cc"
+#line 2758 "src/conf/parse_opts.cc"
 yy692:
        ++YYCURSOR;
-#line 172 "../src/conf/parse_opts.re"
-       { goto opt_dfa_minimization; }
-#line 2773 "src/conf/parse_opts.cc"
+#line 164 "../src/conf/parse_opts.re"
+       { NEXT_ARG("--dfa-minimization", opt_dfa_minimization); }
+#line 2763 "src/conf/parse_opts.cc"
 yy694:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'e') goto yy697;
        goto yy283;
 yy695:
        ++YYCURSOR;
-#line 160 "../src/conf/parse_opts.re"
+#line 151 "../src/conf/parse_opts.re"
        { opts.set_optimize_tags(false);     goto opt; }
-#line 2782 "src/conf/parse_opts.cc"
+#line 2772 "src/conf/parse_opts.cc"
 yy697:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych >= 0x01) goto yy283;
        ++YYCURSOR;
-#line 146 "../src/conf/parse_opts.re"
+#line 137 "../src/conf/parse_opts.re"
        { globopts.bNoGenerationDate = true; goto opt; }
-#line 2789 "src/conf/parse_opts.cc"
+#line 2779 "src/conf/parse_opts.cc"
 }
-#line 181 "../src/conf/parse_opts.re"
+#line 174 "../src/conf/parse_opts.re"
 
 
 opt_output:
 
-#line 2796 "src/conf/parse_opts.cc"
+#line 2786 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2834,28 +2824,25 @@ opt_output:
        if (yych != '-') goto yy704;
 yy702:
        ++YYCURSOR;
-#line 186 "../src/conf/parse_opts.re"
-       {
-        error ("bad argument to option -o, --output: %s", *argv);
-        return EXIT_FAIL;
-    }
-#line 2843 "src/conf/parse_opts.cc"
+#line 178 "../src/conf/parse_opts.re"
+       { ERROR("bad argument to option -o, --output: %s", *argv); }
+#line 2830 "src/conf/parse_opts.cc"
 yy704:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yybm[0+yych] & 128) {
                goto yy704;
        }
        ++YYCURSOR;
-#line 190 "../src/conf/parse_opts.re"
+#line 179 "../src/conf/parse_opts.re"
        { opts.set_output_file (*argv); goto opt; }
-#line 2852 "src/conf/parse_opts.cc"
+#line 2839 "src/conf/parse_opts.cc"
 }
-#line 191 "../src/conf/parse_opts.re"
+#line 180 "../src/conf/parse_opts.re"
 
 
 opt_header:
 
-#line 2859 "src/conf/parse_opts.cc"
+#line 2846 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2897,29 +2884,25 @@ opt_header:
        if (yych != '-') goto yy712;
 yy710:
        ++YYCURSOR;
-#line 196 "../src/conf/parse_opts.re"
-       {
-        error ("bad argument to option -t, --type-header: %s", *argv);
-        return EXIT_FAIL;
-    }
-#line 2906 "src/conf/parse_opts.cc"
+#line 184 "../src/conf/parse_opts.re"
+       { ERROR("bad argument to option -t, --type-header: %s", *argv); }
+#line 2890 "src/conf/parse_opts.cc"
 yy712:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yybm[0+yych] & 128) {
                goto yy712;
        }
        ++YYCURSOR;
-#line 200 "../src/conf/parse_opts.re"
+#line 185 "../src/conf/parse_opts.re"
        { opts.set_header_file (*argv); goto opt; }
-#line 2915 "src/conf/parse_opts.cc"
+#line 2899 "src/conf/parse_opts.cc"
 }
-#line 201 "../src/conf/parse_opts.re"
+#line 186 "../src/conf/parse_opts.re"
 
 
 opt_incpath:
-    p = YYCURSOR;
 
-#line 2923 "src/conf/parse_opts.cc"
+#line 2906 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2961,36 +2944,25 @@ opt_incpath:
        if (yych != '-') goto yy720;
 yy718:
        ++YYCURSOR;
-#line 206 "../src/conf/parse_opts.re"
-       {
-        error ("bad argument to option -I: %s", *argv);
-        return EXIT_FAIL;
-    }
-#line 2970 "src/conf/parse_opts.cc"
+#line 190 "../src/conf/parse_opts.re"
+       { ERROR("bad argument to option -I: %s", *argv); }
+#line 2950 "src/conf/parse_opts.cc"
 yy720:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yybm[0+yych] & 128) {
                goto yy720;
        }
        ++YYCURSOR;
-#line 210 "../src/conf/parse_opts.re"
-       {
-        globopts.incpaths.push_back(getstr(p, YYCURSOR - 1));
-        goto opt;
-    }
-#line 2982 "src/conf/parse_opts.cc"
+#line 191 "../src/conf/parse_opts.re"
+       { globopts.incpaths.push_back(*argv); goto opt; }
+#line 2959 "src/conf/parse_opts.cc"
 }
-#line 214 "../src/conf/parse_opts.re"
+#line 192 "../src/conf/parse_opts.re"
 
 
 opt_encoding_policy:
-    if (!next (YYCURSOR, argv))
-    {
-        error_arg ("--encoding-policy");
-        return EXIT_FAIL;
-    }
 
-#line 2994 "src/conf/parse_opts.cc"
+#line 2966 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
@@ -3002,12 +2974,12 @@ opt_encoding_policy:
        }
        ++YYCURSOR;
 yy727:
-#line 224 "../src/conf/parse_opts.re"
+#line 196 "../src/conf/parse_opts.re"
        {
-        error ("bad argument to option --encoding-policy (expected: ignore | substitute | fail): %s", *argv);
-        return EXIT_FAIL;
+        ERROR("bad argument to option --encoding-policy "
+            "(expected: ignore | substitute | fail): %s", *argv);
     }
-#line 3011 "src/conf/parse_opts.cc"
+#line 2983 "src/conf/parse_opts.cc"
 yy728:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == 'a') goto yy731;
@@ -3060,9 +3032,9 @@ yy740:
        goto yy732;
 yy741:
        ++YYCURSOR;
-#line 230 "../src/conf/parse_opts.re"
+#line 202 "../src/conf/parse_opts.re"
        { opts.set_encoding_policy (Enc::POLICY_FAIL);       goto opt; }
-#line 3066 "src/conf/parse_opts.cc"
+#line 3038 "src/conf/parse_opts.cc"
 yy743:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'e') goto yy745;
@@ -3081,9 +3053,9 @@ yy746:
        goto yy732;
 yy747:
        ++YYCURSOR;
-#line 228 "../src/conf/parse_opts.re"
+#line 200 "../src/conf/parse_opts.re"
        { opts.set_encoding_policy (Enc::POLICY_IGNORE);     goto opt; }
-#line 3087 "src/conf/parse_opts.cc"
+#line 3059 "src/conf/parse_opts.cc"
 yy749:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'u') goto yy732;
@@ -3094,21 +3066,16 @@ yy749:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych >= 0x01) goto yy732;
        ++YYCURSOR;
-#line 229 "../src/conf/parse_opts.re"
+#line 201 "../src/conf/parse_opts.re"
        { opts.set_encoding_policy (Enc::POLICY_SUBSTITUTE); goto opt; }
-#line 3100 "src/conf/parse_opts.cc"
+#line 3072 "src/conf/parse_opts.cc"
 }
-#line 231 "../src/conf/parse_opts.re"
+#line 203 "../src/conf/parse_opts.re"
 
 
 opt_input:
-    if (!next (YYCURSOR, argv))
-    {
-        error_arg ("--input");
-        return EXIT_FAIL;
-    }
 
-#line 3112 "src/conf/parse_opts.cc"
+#line 3079 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
@@ -3118,12 +3085,12 @@ opt_input:
 yy757:
        ++YYCURSOR;
 yy758:
-#line 241 "../src/conf/parse_opts.re"
+#line 207 "../src/conf/parse_opts.re"
        {
-        error ("bad argument to option --input (expected: default | custom): %s", *argv);
-        return EXIT_FAIL;
+        ERROR("bad argument to option --input "
+            "(expected: default | custom): %s", *argv);
     }
-#line 3127 "src/conf/parse_opts.cc"
+#line 3094 "src/conf/parse_opts.cc"
 yy759:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == 'u') goto yy761;
@@ -3176,28 +3143,23 @@ yy771:
        goto yy762;
 yy772:
        ++YYCURSOR;
-#line 246 "../src/conf/parse_opts.re"
+#line 212 "../src/conf/parse_opts.re"
        { opts.set_input_api(INPUT_CUSTOM);  goto opt; }
-#line 3182 "src/conf/parse_opts.cc"
+#line 3149 "src/conf/parse_opts.cc"
 yy774:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych >= 0x01) goto yy762;
        ++YYCURSOR;
-#line 245 "../src/conf/parse_opts.re"
+#line 211 "../src/conf/parse_opts.re"
        { opts.set_input_api(INPUT_DEFAULT); goto opt; }
-#line 3189 "src/conf/parse_opts.cc"
+#line 3156 "src/conf/parse_opts.cc"
 }
-#line 247 "../src/conf/parse_opts.re"
+#line 213 "../src/conf/parse_opts.re"
 
 
 opt_empty_class:
-    if (!next (YYCURSOR, argv))
-    {
-        error_arg ("--empty-class");
-        return EXIT_FAIL;
-    }
 
-#line 3201 "src/conf/parse_opts.cc"
+#line 3163 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
@@ -3205,12 +3167,12 @@ opt_empty_class:
        if (yych == 'm') goto yy782;
        ++YYCURSOR;
 yy780:
-#line 257 "../src/conf/parse_opts.re"
+#line 217 "../src/conf/parse_opts.re"
        {
-        error ("bad argument to option --empty-class (expected: match-empty | match-none | error): %s", *argv);
-        return EXIT_FAIL;
+        ERROR("bad argument to option --empty-class "
+            "(expected: match-empty | match-none | error): %s", *argv);
     }
-#line 3214 "src/conf/parse_opts.cc"
+#line 3176 "src/conf/parse_opts.cc"
 yy781:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == 'r') goto yy783;
@@ -3255,9 +3217,9 @@ yy791:
        goto yy784;
 yy792:
        ++YYCURSOR;
-#line 263 "../src/conf/parse_opts.re"
+#line 223 "../src/conf/parse_opts.re"
        { opts.set_empty_class_policy (EMPTY_CLASS_ERROR);       goto opt; }
-#line 3261 "src/conf/parse_opts.cc"
+#line 3223 "src/conf/parse_opts.cc"
 yy794:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'e') goto yy795;
@@ -3301,26 +3263,21 @@ yy803:
        goto yy784;
 yy804:
        ++YYCURSOR;
-#line 262 "../src/conf/parse_opts.re"
+#line 222 "../src/conf/parse_opts.re"
        { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_NONE);  goto opt; }
-#line 3307 "src/conf/parse_opts.cc"
+#line 3269 "src/conf/parse_opts.cc"
 yy806:
        ++YYCURSOR;
-#line 261 "../src/conf/parse_opts.re"
+#line 221 "../src/conf/parse_opts.re"
        { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_EMPTY); goto opt; }
-#line 3312 "src/conf/parse_opts.cc"
+#line 3274 "src/conf/parse_opts.cc"
 }
-#line 264 "../src/conf/parse_opts.re"
+#line 224 "../src/conf/parse_opts.re"
 
 
 opt_dfa_minimization:
-    if (!next (YYCURSOR, argv))
-    {
-        error_arg ("--minimization");
-        return EXIT_FAIL;
-    }
 
-#line 3324 "src/conf/parse_opts.cc"
+#line 3281 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
@@ -3328,12 +3285,12 @@ opt_dfa_minimization:
        if (yych == 't') goto yy813;
        ++YYCURSOR;
 yy811:
-#line 274 "../src/conf/parse_opts.re"
+#line 228 "../src/conf/parse_opts.re"
        {
-        error ("bad argument to option --dfa-minimization (expected: table | moore): %s", *argv);
-        return EXIT_FAIL;
+        ERROR("bad argument to option --dfa-minimization "
+            "(expected: table | moore): %s", *argv);
     }
-#line 3337 "src/conf/parse_opts.cc"
+#line 3294 "src/conf/parse_opts.cc"
 yy812:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == 'o') goto yy814;
@@ -3378,16 +3335,16 @@ yy822:
        goto yy815;
 yy823:
        ++YYCURSOR;
-#line 279 "../src/conf/parse_opts.re"
+#line 233 "../src/conf/parse_opts.re"
        { opts.set_dfa_minimization (DFA_MINIMIZATION_MOORE); goto opt; }
-#line 3384 "src/conf/parse_opts.cc"
+#line 3341 "src/conf/parse_opts.cc"
 yy825:
        ++YYCURSOR;
-#line 278 "../src/conf/parse_opts.re"
+#line 232 "../src/conf/parse_opts.re"
        { opts.set_dfa_minimization (DFA_MINIMIZATION_TABLE); goto opt; }
-#line 3389 "src/conf/parse_opts.cc"
+#line 3346 "src/conf/parse_opts.cc"
 }
-#line 280 "../src/conf/parse_opts.re"
+#line 234 "../src/conf/parse_opts.re"
 
 
 end:
@@ -3399,6 +3356,8 @@ end:
 
     return OK;
 
+#undef NEXT_ARG
+#undef ERROR
 #undef YYCTYPE
 }
 
index f1b20e7ef0384b8956df949f63bc84af216e86ce..ca0a539575769c14103d87a32d431b4fbe2e7350 100644 (file)
@@ -17,7 +17,17 @@ static inline bool next (char * & arg, char ** & argv)
 parse_opts_t parse_opts(char **argv, conopt_t &globopts, Opt &opts, Warn &warn)
 {
 #define YYCTYPE unsigned char
-    char *YYCURSOR, *YYMARKER, *p;
+
+#define NEXT_ARG(option, label) \
+    do { \
+        if (next (YYCURSOR, argv)) goto label; \
+        else { error_arg(option); return EXIT_FAIL; } \
+    } while(0)
+
+#define ERROR(msg, arg) \
+    do { error(msg, arg); return EXIT_FAIL; } while(0)
+
+    char *YYCURSOR, *YYMARKER;
     Warn::option_t option;
 
 /*!re2c
@@ -29,28 +39,15 @@ parse_opts_t parse_opts(char **argv, conopt_t &globopts, Opt &opts, Warn &warn)
 */
 
 opt:
-    if (!next (YYCURSOR, argv))
-    {
-        goto end;
-    }
+    if (!next (YYCURSOR, argv)) goto end;
 /*!re2c
-    *
-    {
-        error ("bad option: %s", *argv);
-        return EXIT_FAIL;
-    }
+    * { ERROR("bad option: %s", *argv); }
 
-    "--" end
-    {
-        // all remaining arguments are non-options
-        // so they must be input files
+    "--" end {
+        // remaining args are non-options, so they must be input files
         // re2c expects exactly one input file
-        for (char * f; next (f, argv);)
-        {
-            if (!opts.source (f))
-            {
-                return EXIT_FAIL;
-            }
+        for (char * f; next (f, argv);) {
+            if (!opts.source (f)) return EXIT_FAIL;
         }
         goto end;
     }
@@ -71,28 +68,22 @@ opt:
 
 opt_warn:
 /*!re2c
-    *
-    {
-        error ("bad warning: %s", *argv);
-        return EXIT_FAIL;
-    }
-    "condition-order"          end { warn.set (Warn::CONDITION_ORDER,          option); goto opt; }
-    "empty-character-class"    end { warn.set (Warn::EMPTY_CHARACTER_CLASS,    option); goto opt; }
-    "match-empty-string"       end { warn.set (Warn::MATCH_EMPTY_STRING,       option); goto opt; }
-    "nondeterministic-tags"    end { warn.set (Warn::NONDETERMINISTIC_TAGS,    option); goto opt; }
-    "swapped-range"            end { warn.set (Warn::SWAPPED_RANGE,            option); goto opt; }
-    "undefined-control-flow"   end { warn.set (Warn::UNDEFINED_CONTROL_FLOW,   option); goto opt; }
-    "unreachable-rules"        end { warn.set (Warn::UNREACHABLE_RULES,        option); goto opt; }
-    "useless-escape"           end { warn.set (Warn::USELESS_ESCAPE,           option); goto opt; }
+    * { ERROR("bad warning: %s", *argv); }
+
+    "condition-order"          end { warn.set (Warn::CONDITION_ORDER,        option); goto opt; }
+    "empty-character-class"    end { warn.set (Warn::EMPTY_CHARACTER_CLASS,  option); goto opt; }
+    "match-empty-string"       end { warn.set (Warn::MATCH_EMPTY_STRING,     option); goto opt; }
+    "nondeterministic-tags"    end { warn.set (Warn::NONDETERMINISTIC_TAGS,  option); goto opt; }
+    "swapped-range"            end { warn.set (Warn::SWAPPED_RANGE,          option); goto opt; }
+    "undefined-control-flow"   end { warn.set (Warn::UNDEFINED_CONTROL_FLOW, option); goto opt; }
+    "unreachable-rules"        end { warn.set (Warn::UNREACHABLE_RULES,      option); goto opt; }
+    "useless-escape"           end { warn.set (Warn::USELESS_ESCAPE,         option); goto opt; }
 */
 
 opt_short:
 /*!re2c
-    *
-    {
-        error ("bad short option: %s", *argv);
-        return EXIT_FAIL;
-    }
+    * { ERROR("bad short option: %s", *argv); }
+
     end { goto opt; }
     [?h] { usage ();   return EXIT_OK; }
     "v"  { version (); return EXIT_OK; }
@@ -105,9 +96,6 @@ opt_short:
     "r" { globopts.rFlag = true;             goto opt_short; }
     "S" { globopts.target = TARGET_SKELETON; goto opt_short; }
 
-    "I" end { if (!next (YYCURSOR, argv)) { error_arg ("-I"); return EXIT_FAIL; } goto opt_incpath; }
-    "I"     { goto opt_incpath; }
-
     "b" { opts.set_bFlag(true);           goto opt_short; }
     "d" { opts.set_dFlag(true);           goto opt_short; }
     "g" { opts.set_gFlag(true);           goto opt_short; }
@@ -120,20 +108,23 @@ opt_short:
     "w" { opts.set_encoding(Enc::UCS2);   goto opt_short; }
     "x" { opts.set_encoding(Enc::UTF16);  goto opt_short; }
     "8" { opts.set_encoding(Enc::UTF8);   goto opt_short; }
-    "o" end { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; }
-    "o"     { *argv = YYCURSOR;                                                             goto opt_output; }
-    "t" end { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; }
-    "t"     { *argv = YYCURSOR;                                                                  goto opt_header; }
+
+    "I" end { NEXT_ARG("-I", opt_incpath); }
+    "I"     { *argv = YYCURSOR; goto opt_incpath; }
+
+    "o" end { NEXT_ARG("-o, --output", opt_output); }
+    "o"     { *argv = YYCURSOR; goto opt_output; }
+
+    "t" end { NEXT_ARG("-t, --type-header", opt_header); }
+    "t"     { *argv = YYCURSOR; goto opt_header; }
+
     "1" { goto opt_short; } // deprecated
 */
 
 opt_long:
 /*!re2c
-    *
-    {
-        error ("bad long option: %s", *argv);
-        return EXIT_FAIL;
-    }
+    * { ERROR("bad long option: %s", *argv); }
+
     "help"                  end { usage ();   return EXIT_OK; }
     "version"               end { version (); return EXIT_OK; }
     "vernum"                end { vernum ();  return EXIT_OK; }
@@ -164,12 +155,14 @@ opt_long:
     "wide-chars"            end { opts.set_encoding(Enc::UCS2);      goto opt; }
     "utf-16"                end { opts.set_encoding(Enc::UTF16);     goto opt; }
     "utf-8"                 end { opts.set_encoding(Enc::UTF8);      goto opt; }
-    "output"                end { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; }
-    "type-header"           end { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; }
-    "encoding-policy"       end { goto opt_encoding_policy; }
-    "input"                 end { goto opt_input; }
-    "empty-class"           end { goto opt_empty_class; }
-    "dfa-minimization"      end { goto opt_dfa_minimization; }
+
+    "output"                end { NEXT_ARG("-o, --output",       opt_output); }
+    "type-header"           end { NEXT_ARG("-t, --type-header",  opt_header); }
+    "encoding-policy"       end { NEXT_ARG("--encoding-policy",  opt_encoding_policy); }
+    "input"                 end { NEXT_ARG("--input",            opt_input); }
+    "empty-class"           end { NEXT_ARG("--empty-class",      opt_empty_class); }
+    "dfa-minimization"      end { NEXT_ARG("--dfa-minimization", opt_dfa_minimization); }
+
     "single-pass"           end { goto opt; } // deprecated
 
     "dump-nfa"              end { globopts.dump_nfa = true;        goto opt; }
@@ -182,48 +175,27 @@ opt_long:
 
 opt_output:
 /*!re2c
-    *
-    {
-        error ("bad argument to option -o, --output: %s", *argv);
-        return EXIT_FAIL;
-    }
+    * { ERROR("bad argument to option -o, --output: %s", *argv); }
     filename end { opts.set_output_file (*argv); goto opt; }
 */
 
 opt_header:
 /*!re2c
-    *
-    {
-        error ("bad argument to option -t, --type-header: %s", *argv);
-        return EXIT_FAIL;
-    }
+    * { ERROR("bad argument to option -t, --type-header: %s", *argv); }
     filename end { opts.set_header_file (*argv); goto opt; }
 */
 
 opt_incpath:
-    p = YYCURSOR;
 /*!re2c
-    * {
-        error ("bad argument to option -I: %s", *argv);
-        return EXIT_FAIL;
-    }
-    filename end {
-        globopts.incpaths.push_back(getstr(p, YYCURSOR - 1));
-        goto opt;
-    }
+    * { ERROR("bad argument to option -I: %s", *argv); }
+    filename end { globopts.incpaths.push_back(*argv); goto opt; }
 */
 
 opt_encoding_policy:
-    if (!next (YYCURSOR, argv))
-    {
-        error_arg ("--encoding-policy");
-        return EXIT_FAIL;
-    }
 /*!re2c
-    *
-    {
-        error ("bad argument to option --encoding-policy (expected: ignore | substitute | fail): %s", *argv);
-        return EXIT_FAIL;
+    * {
+        ERROR("bad argument to option --encoding-policy "
+            "(expected: ignore | substitute | fail): %s", *argv);
     }
     "ignore"     end { opts.set_encoding_policy (Enc::POLICY_IGNORE);     goto opt; }
     "substitute" end { opts.set_encoding_policy (Enc::POLICY_SUBSTITUTE); goto opt; }
@@ -231,32 +203,20 @@ opt_encoding_policy:
 */
 
 opt_input:
-    if (!next (YYCURSOR, argv))
-    {
-        error_arg ("--input");
-        return EXIT_FAIL;
-    }
 /*!re2c
-    *
-    {
-        error ("bad argument to option --input (expected: default | custom): %s", *argv);
-        return EXIT_FAIL;
+    * {
+        ERROR("bad argument to option --input "
+            "(expected: default | custom): %s", *argv);
     }
     "default" end { opts.set_input_api(INPUT_DEFAULT); goto opt; }
     "custom"  end { opts.set_input_api(INPUT_CUSTOM);  goto opt; }
 */
 
 opt_empty_class:
-    if (!next (YYCURSOR, argv))
-    {
-        error_arg ("--empty-class");
-        return EXIT_FAIL;
-    }
 /*!re2c
-    *
-    {
-        error ("bad argument to option --empty-class (expected: match-empty | match-none | error): %s", *argv);
-        return EXIT_FAIL;
+    * {
+        ERROR("bad argument to option --empty-class "
+            "(expected: match-empty | match-none | error): %s", *argv);
     }
     "match-empty" end { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_EMPTY); goto opt; }
     "match-none"  end { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_NONE);  goto opt; }
@@ -264,16 +224,10 @@ opt_empty_class:
 */
 
 opt_dfa_minimization:
-    if (!next (YYCURSOR, argv))
-    {
-        error_arg ("--minimization");
-        return EXIT_FAIL;
-    }
 /*!re2c
-    *
-    {
-        error ("bad argument to option --dfa-minimization (expected: table | moore): %s", *argv);
-        return EXIT_FAIL;
+    * {
+        ERROR("bad argument to option --dfa-minimization "
+            "(expected: table | moore): %s", *argv);
     }
     "table" end { opts.set_dfa_minimization (DFA_MINIMIZATION_TABLE); goto opt; }
     "moore" end { opts.set_dfa_minimization (DFA_MINIMIZATION_MOORE); goto opt; }
@@ -288,6 +242,8 @@ end:
 
     return OK;
 
+#undef NEXT_ARG
+#undef ERROR
 #undef YYCTYPE
 }