]> granicus.if.org Git - re2c/commitdiff
- Add /*!max:re2c */ which emits a '#define YYMAXFILL <max>\n' line
authorhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Fri, 8 Apr 2005 18:42:45 +0000 (18:42 +0000)
committerhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Fri, 8 Apr 2005 18:42:45 +0000 (18:42 +0000)
  This allows to define buffers of the minimum required length. Occurence
  must follow '/*re2c */ and cannot preceed it.

bootstrap/scanner.cc
code.cc
globals.h
main.cc
scanner.re
test/bug1054496.c [new file with mode: 0755]
test/bug1054496.re [new file with mode: 0755]

index 878286ad62782dbe0aa03625ce4fa359583133aa..450e982805dcc48cd228193913be94f5f91cd7f0 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.9.4 on Sun Oct 31 23:17:13 2004 */
+/* Generated by re2c 0.9.5.dev on Fri Apr  8 20:22:23 2005 */
 #line 1 "scanner.re"
 /* $Id$ */
 #include <stdlib.h>
@@ -7,6 +7,7 @@
 #include "scanner.h"
 #include "parser.h"
 #include "y.tab.h"
+#include "globals.h"
 
 extern YYSTYPE yylval;
 
@@ -64,11 +65,12 @@ char *Scanner::fill(char *cursor){
     return cursor;
 }
 
-#line 75 "scanner.re"
+#line 76 "scanner.re"
 
 
 int Scanner::echo(std::ostream &out){
     char *cursor = cur;
+    bool ignore_eoc = false;
 
     // Catch EOF
     if (eof && cursor == eof)
@@ -84,72 +86,133 @@ echo:
        YYCTYPE yych;
        unsigned int yyaccept;
        goto yy0;
-yy1:   ++YYCURSOR;
+       ++YYCURSOR;
 yy0:
-       if((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
+       if((YYLIMIT - YYCURSOR) < 11) YYFILL(11);
        yych = *YYCURSOR;
-       if(yych <= 0x0A){
-               if(yych <= 0x00)        goto yy6;
-               if(yych <= 0x09)        goto yy8;
-               goto yy4;
+       if(yych <= ')'){
+               if(yych <= 0x00)        goto yy7;
+               if(yych == 0x0A)        goto yy5;
+               goto yy9;
        } else {
-               if(yych != '/') goto yy8;
+               if(yych <= '*') goto yy4;
+               if(yych != '/') goto yy9;
                goto yy2;
        }
 yy2:   yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych == '*') goto yy9;
+       if(yych == '*') goto yy12;
        goto yy3;
 yy3:
-#line 97 "scanner.re"
-{ goto echo; }
-#line 31 "scanner.cc"
-yy4:   ++YYCURSOR;
-       goto yy5;
-yy5:
-#line 92 "scanner.re"
-{ out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok));
-                                 tok = pos = cursor; cline++;
-                                 goto echo; }
-#line 39 "scanner.cc"
-yy6:   ++YYCURSOR;
-       goto yy7;
-yy7:
-#line 95 "scanner.re"
-{ out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok) - 1); // -1 so we don't write out the \0
-                                 if(cursor == eof) { RETURN(0); } }
-#line 46 "scanner.cc"
-yy8:   yych = *++YYCURSOR;
+#line 122 "scanner.re"
+{
+                                       goto echo;
+                               }
+#line 34 "scanner.cc"
+yy4:   yych = *++YYCURSOR;
+       if(yych == '/') goto yy10;
        goto yy3;
+yy5:   ++YYCURSOR;
+       goto yy6;
+yy6:
+#line 111 "scanner.re"
+{
+                                       out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok));
+                                       tok = pos = cursor; cline++;
+                                       goto echo;
+                               }
+#line 47 "scanner.cc"
+yy7:   ++YYCURSOR;
+       goto yy8;
+yy8:
+#line 116 "scanner.re"
+{
+                                       out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok) - 1); // -1 so we don't write out the \0
+                                       if(cursor == eof) {
+                                               RETURN(0);
+                                       }
+                               }
+#line 58 "scanner.cc"
 yy9:   yych = *++YYCURSOR;
-       if(yych == '!') goto yy11;
-       goto yy10;
-yy10:  YYCURSOR = YYMARKER;
+       goto yy3;
+yy10:  ++YYCURSOR;
+       goto yy11;
+yy11:
+#line 102 "scanner.re"
+{
+                                       if (ignore_eoc) {
+                                               ignore_eoc = false;
+                                       } else {
+                                               out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok));
+                                       }
+                                       tok = pos = cursor;
+                                       goto echo;
+                               }
+#line 74 "scanner.cc"
+yy12:  yych = *++YYCURSOR;
+       if(yych == '!') goto yy14;
+       goto yy13;
+yy13:  YYCURSOR = YYMARKER;
        switch(yyaccept){
        case 0: goto yy3;
        }
-yy11:  yych = *++YYCURSOR;
-       if(yych != 'r') goto yy10;
-       goto yy12;
-yy12:  yych = *++YYCURSOR;
-       if(yych != 'e') goto yy10;
-       goto yy13;
-yy13:  yych = *++YYCURSOR;
-       if(yych != '2') goto yy10;
-       goto yy14;
 yy14:  yych = *++YYCURSOR;
-       if(yych != 'c') goto yy10;
-       goto yy15;
-yy15:  ++YYCURSOR;
-       goto yy16;
-yy16:
-#line 89 "scanner.re"
-{ out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok));
-                                 tok = cursor;
-                                 RETURN(1); }
-#line 75 "scanner.cc"
+       if(yych == 'm') goto yy15;
+       if(yych == 'r') goto yy16;
+       goto yy13;
+yy15:  yych = *++YYCURSOR;
+       if(yych == 'a') goto yy21;
+       goto yy13;
+yy16:  yych = *++YYCURSOR;
+       if(yych != 'e') goto yy13;
+       goto yy17;
+yy17:  yych = *++YYCURSOR;
+       if(yych != '2') goto yy13;
+       goto yy18;
+yy18:  yych = *++YYCURSOR;
+       if(yych != 'c') goto yy13;
+       goto yy19;
+yy19:  ++YYCURSOR;
+       goto yy20;
+yy20:
+#line 91 "scanner.re"
+{ 
+                                       out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok));
+                                       tok = cursor;
+                                       RETURN(1);
+                               }
+#line 107 "scanner.cc"
+yy21:  yych = *++YYCURSOR;
+       if(yych != 'x') goto yy13;
+       goto yy22;
+yy22:  yych = *++YYCURSOR;
+       if(yych != ':') goto yy13;
+       goto yy23;
+yy23:  yych = *++YYCURSOR;
+       if(yych != 'r') goto yy13;
+       goto yy24;
+yy24:  yych = *++YYCURSOR;
+       if(yych != 'e') goto yy13;
+       goto yy25;
+yy25:  yych = *++YYCURSOR;
+       if(yych != '2') goto yy13;
+       goto yy26;
+yy26:  yych = *++YYCURSOR;
+       if(yych != 'c') goto yy13;
+       goto yy27;
+yy27:  ++YYCURSOR;
+       goto yy28;
+yy28:
+#line 96 "scanner.re"
+{
+                                       out << "#define YYMAXFILL " << maxFill << std::endl;
+                                       tok = pos = cursor;
+                                       ignore_eoc = true;
+                                       goto echo;
+                               }
+#line 136 "scanner.cc"
 }
-#line 98 "scanner.re"
+#line 125 "scanner.re"
 
 }
 
@@ -163,487 +226,487 @@ scan:
     tline = cline;
     tok = cursor;
 
-#line 79 "scanner.cc"
+#line 140 "scanner.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
-       goto yy17;
-yy18:  ++YYCURSOR;
-yy17:
+       goto yy29;
+       ++YYCURSOR;
+yy29:
        if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = *YYCURSOR;
        if(yych <= '/'){
                if(yych <= '"'){
                        if(yych <= 0x0A){
-                               if(yych <= 0x08)        goto yy39;
-                               if(yych <= 0x09)        goto yy35;
-                               goto yy37;
+                               if(yych <= 0x08)        goto yy51;
+                               if(yych <= 0x09)        goto yy47;
+                               goto yy49;
                        } else {
-                               if(yych == ' ') goto yy35;
-                               if(yych <= '!') goto yy39;
-                               goto yy25;
+                               if(yych == ' ') goto yy47;
+                               if(yych <= '!') goto yy51;
+                               goto yy37;
                        }
                } else {
                        if(yych <= ')'){
-                               if(yych <= '&') goto yy39;
-                               if(yych <= '\'')        goto yy27;
-                               goto yy31;
+                               if(yych <= '&') goto yy51;
+                               if(yych <= '\'')        goto yy39;
+                               goto yy43;
                        } else {
-                               if(yych <= '*') goto yy23;
-                               if(yych <= '+') goto yy32;
-                               if(yych <= '.') goto yy39;
-                               goto yy21;
+                               if(yych <= '*') goto yy35;
+                               if(yych <= '+') goto yy44;
+                               if(yych <= '.') goto yy51;
+                               goto yy33;
                        }
                }
        } else {
                if(yych <= '@'){
                        if(yych <= '<'){
-                               if(yych == ';') goto yy31;
-                               goto yy39;
+                               if(yych == ';') goto yy43;
+                               goto yy51;
                        } else {
-                               if(yych <= '=') goto yy31;
-                               if(yych == '?') goto yy32;
-                               goto yy39;
+                               if(yych <= '=') goto yy43;
+                               if(yych == '?') goto yy44;
+                               goto yy51;
                        }
                } else {
                        if(yych <= '`'){
-                               if(yych <= 'Z') goto yy33;
-                               if(yych <= '[') goto yy29;
-                               if(yych <= '\\')        goto yy31;
-                               goto yy39;
+                               if(yych <= 'Z') goto yy45;
+                               if(yych <= '[') goto yy41;
+                               if(yych <= '\\')        goto yy43;
+                               goto yy51;
                        } else {
-                               if(yych <= 'z') goto yy33;
-                               if(yych <= '{') goto yy19;
-                               if(yych <= '|') goto yy31;
-                               goto yy39;
+                               if(yych <= 'z') goto yy45;
+                               if(yych <= '{') goto yy31;
+                               if(yych <= '|') goto yy43;
+                               goto yy51;
                        }
                }
        }
-yy19:  yyaccept = 0;
+yy31:  yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych <= '/') goto yy20;
-       if(yych <= '9') goto yy65;
-       goto yy20;
-yy20:
-#line 111 "scanner.re"
+       if(yych <= '/') goto yy32;
+       if(yych <= '9') goto yy77;
+       goto yy32;
+yy32:
+#line 138 "scanner.re"
 { depth = 1;
                                  goto code;
                                }
-#line 145 "scanner.cc"
-yy21:  ++YYCURSOR;
-       if((yych = *YYCURSOR) == '*')   goto yy63;
-       goto yy22;
-yy22:
-#line 137 "scanner.re"
+#line 206 "scanner.cc"
+yy33:  ++YYCURSOR;
+       if((yych = *YYCURSOR) == '*')   goto yy75;
+       goto yy34;
+yy34:
+#line 164 "scanner.re"
 { RETURN(*tok); }
-#line 152 "scanner.cc"
-yy23:  ++YYCURSOR;
-       if((yych = *YYCURSOR) == '/')   goto yy61;
-       goto yy24;
-yy24:
-#line 139 "scanner.re"
+#line 213 "scanner.cc"
+yy35:  ++YYCURSOR;
+       if((yych = *YYCURSOR) == '/')   goto yy73;
+       goto yy36;
+yy36:
+#line 166 "scanner.re"
 { yylval.op = *tok;
                                  RETURN(CLOSE); }
-#line 160 "scanner.cc"
-yy25:  yyaccept = 1;
+#line 221 "scanner.cc"
+yy37:  yyaccept = 1;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych != 0x0A)        goto yy57;
-       goto yy26;
-yy26:
-#line 128 "scanner.re"
+       if(yych != 0x0A)        goto yy69;
+       goto yy38;
+yy38:
+#line 155 "scanner.re"
 { fatal("unterminated string constant (missing \")"); }
-#line 168 "scanner.cc"
-yy27:  yyaccept = 2;
+#line 229 "scanner.cc"
+yy39:  yyaccept = 2;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych != 0x0A)        goto yy52;
-       goto yy28;
-yy28:
-#line 129 "scanner.re"
+       if(yych != 0x0A)        goto yy64;
+       goto yy40;
+yy40:
+#line 156 "scanner.re"
 { fatal("unterminated string constant (missing ')"); }
-#line 176 "scanner.cc"
-yy29:  yyaccept = 3;
+#line 237 "scanner.cc"
+yy41:  yyaccept = 3;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych != 0x0A)        goto yy46;
-       goto yy30;
-yy30:
-#line 135 "scanner.re"
+       if(yych != 0x0A)        goto yy58;
+       goto yy42;
+yy42:
+#line 162 "scanner.re"
 { fatal("unterminated range (missing ])"); }
-#line 184 "scanner.cc"
-yy31:  yych = *++YYCURSOR;
-       goto yy22;
-yy32:  yych = *++YYCURSOR;
-       goto yy24;
-yy33:  ++YYCURSOR;
+#line 245 "scanner.cc"
+yy43:  yych = *++YYCURSOR;
+       goto yy34;
+yy44:  yych = *++YYCURSOR;
+       goto yy36;
+yy45:  ++YYCURSOR;
        yych = *YYCURSOR;
-       goto yy44;
-yy34:
-#line 154 "scanner.re"
+       goto yy56;
+yy46:
+#line 181 "scanner.re"
 { cur = cursor;
                                  yylval.symbol = Symbol::find(token());
                                  return ID; }
-#line 196 "scanner.cc"
-yy35:  ++YYCURSOR;
+#line 257 "scanner.cc"
+yy47:  ++YYCURSOR;
        yych = *YYCURSOR;
-       goto yy42;
-yy36:
-#line 158 "scanner.re"
+       goto yy54;
+yy48:
+#line 185 "scanner.re"
 { goto scan; }
-#line 202 "scanner.cc"
-yy37:  ++YYCURSOR;
-       goto yy38;
-yy38:
-#line 160 "scanner.re"
+#line 263 "scanner.cc"
+yy49:  ++YYCURSOR;
+       goto yy50;
+yy50:
+#line 187 "scanner.re"
 { if(cursor == eof) RETURN(0);
                                  pos = cursor; cline++;
                                  goto scan;
                                }
-#line 211 "scanner.cc"
-yy39:  ++YYCURSOR;
-       goto yy40;
-yy40:
-#line 165 "scanner.re"
+#line 272 "scanner.cc"
+yy51:  ++YYCURSOR;
+       goto yy52;
+yy52:
+#line 192 "scanner.re"
 { std::cerr << "unexpected character: " << *tok << std::endl;
                                  goto scan;
                                }
-#line 219 "scanner.cc"
-yy41:  ++YYCURSOR;
+#line 280 "scanner.cc"
+yy53:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       goto yy42;
-yy42:  if(yych == 0x09)        goto yy41;
-       if(yych == ' ') goto yy41;
-       goto yy36;
-yy43:  ++YYCURSOR;
+       goto yy54;
+yy54:  if(yych == 0x09)        goto yy53;
+       if(yych == ' ') goto yy53;
+       goto yy48;
+yy55:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       goto yy44;
-yy44:  if(yych <= '@'){
-               if(yych <= '/') goto yy34;
-               if(yych <= '9') goto yy43;
-               goto yy34;
+       goto yy56;
+yy56:  if(yych <= '@'){
+               if(yych <= '/') goto yy46;
+               if(yych <= '9') goto yy55;
+               goto yy46;
        } else {
-               if(yych <= 'Z') goto yy43;
-               if(yych <= '`') goto yy34;
-               if(yych <= 'z') goto yy43;
-               goto yy34;
+               if(yych <= 'Z') goto yy55;
+               if(yych <= '`') goto yy46;
+               if(yych <= 'z') goto yy55;
+               goto yy46;
        }
-yy45:  ++YYCURSOR;
+yy57:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       goto yy46;
-yy46:  if(yych <= '['){
-               if(yych != 0x0A)        goto yy45;
-               goto yy47;
+       goto yy58;
+yy58:  if(yych <= '['){
+               if(yych != 0x0A)        goto yy57;
+               goto yy59;
        } else {
-               if(yych <= '\\')        goto yy48;
-               if(yych <= ']') goto yy49;
-               goto yy45;
+               if(yych <= '\\')        goto yy60;
+               if(yych <= ']') goto yy61;
+               goto yy57;
        }
-yy47:  YYCURSOR = YYMARKER;
+yy59:  YYCURSOR = YYMARKER;
        switch(yyaccept){
-       case 0: goto yy20;
-       case 1: goto yy26;
-       case 2: goto yy28;
-       case 3: goto yy30;
+       case 0: goto yy32;
+       case 1: goto yy38;
+       case 2: goto yy40;
+       case 3: goto yy42;
        }
-yy48:  ++YYCURSOR;
+yy60:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       if(yych == 0x0A)        goto yy47;
-       goto yy45;
-yy49:  ++YYCURSOR;
-       goto yy50;
-yy50:
-#line 131 "scanner.re"
+       if(yych == 0x0A)        goto yy59;
+       goto yy57;
+yy61:  ++YYCURSOR;
+       goto yy62;
+yy62:
+#line 158 "scanner.re"
 { cur = cursor;
                                  yylval.regexp = ranToRE(token());
                                  return RANGE; }
-#line 276 "scanner.cc"
-yy51:  ++YYCURSOR;
+#line 337 "scanner.cc"
+yy63:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       goto yy52;
-yy52:  if(yych <= '&'){
-               if(yych == 0x0A)        goto yy47;
-               goto yy51;
+       goto yy64;
+yy64:  if(yych <= '&'){
+               if(yych == 0x0A)        goto yy59;
+               goto yy63;
        } else {
-               if(yych <= '\'')        goto yy54;
-               if(yych != '\\')        goto yy51;
-               goto yy53;
+               if(yych <= '\'')        goto yy66;
+               if(yych != '\\')        goto yy63;
+               goto yy65;
        }
-yy53:  ++YYCURSOR;
+yy65:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       if(yych == 0x0A)        goto yy47;
-       goto yy51;
-yy54:  ++YYCURSOR;
-       goto yy55;
-yy55:
-#line 124 "scanner.re"
+       if(yych == 0x0A)        goto yy59;
+       goto yy63;
+yy66:  ++YYCURSOR;
+       goto yy67;
+yy67:
+#line 151 "scanner.re"
 { cur = cursor;
                                  yylval.regexp = strToCaseInsensitiveRE(token());
                                  return STRING; }
-#line 303 "scanner.cc"
-yy56:  ++YYCURSOR;
+#line 364 "scanner.cc"
+yy68:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       goto yy57;
-yy57:  if(yych <= '!'){
-               if(yych == 0x0A)        goto yy47;
-               goto yy56;
+       goto yy69;
+yy69:  if(yych <= '!'){
+               if(yych == 0x0A)        goto yy59;
+               goto yy68;
        } else {
-               if(yych <= '"') goto yy59;
-               if(yych != '\\')        goto yy56;
-               goto yy58;
+               if(yych <= '"') goto yy71;
+               if(yych != '\\')        goto yy68;
+               goto yy70;
        }
-yy58:  ++YYCURSOR;
+yy70:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       if(yych == 0x0A)        goto yy47;
-       goto yy56;
-yy59:  ++YYCURSOR;
-       goto yy60;
-yy60:
-#line 120 "scanner.re"
+       if(yych == 0x0A)        goto yy59;
+       goto yy68;
+yy71:  ++YYCURSOR;
+       goto yy72;
+yy72:
+#line 147 "scanner.re"
 { cur = cursor;
                                  yylval.regexp = strToRE(token());
                                  return STRING; }
-#line 330 "scanner.cc"
-yy61:  ++YYCURSOR;
-       goto yy62;
-yy62:
-#line 117 "scanner.re"
+#line 391 "scanner.cc"
+yy73:  ++YYCURSOR;
+       goto yy74;
+yy74:
+#line 144 "scanner.re"
 { tok = cursor;
                                  RETURN(0); }
-#line 337 "scanner.cc"
-yy63:  ++YYCURSOR;
-       goto yy64;
-yy64:
-#line 114 "scanner.re"
+#line 398 "scanner.cc"
+yy75:  ++YYCURSOR;
+       goto yy76;
+yy76:
+#line 141 "scanner.re"
 { depth = 1;
                                  goto comment; }
-#line 344 "scanner.cc"
-yy65:  ++YYCURSOR;
-       if(YYLIMIT == YYCURSOR) YYFILL(1);
+#line 405 "scanner.cc"
+yy77:  ++YYCURSOR;
+       if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = *YYCURSOR;
-       goto yy66;
-yy66:  if(yych <= '/'){
-               if(yych == ',') goto yy69;
-               goto yy47;
+       goto yy78;
+yy78:  if(yych <= '/'){
+               if(yych == ',') goto yy81;
+               goto yy59;
        } else {
-               if(yych <= '9') goto yy65;
-               if(yych != '}') goto yy47;
-               goto yy67;
+               if(yych <= '9') goto yy77;
+               if(yych != '}') goto yy59;
+               goto yy79;
        }
-yy67:  ++YYCURSOR;
-       goto yy68;
-yy68:
-#line 142 "scanner.re"
+yy79:  ++YYCURSOR;
+       goto yy80;
+yy80:
+#line 169 "scanner.re"
 { yylval.extop.minsize = atoi((char *)tok+1);
                                  yylval.extop.maxsize = atoi((char *)tok+1);
                                  RETURN(CLOSESIZE); }
-#line 365 "scanner.cc"
-yy69:  yych = *++YYCURSOR;
-       if(yych != '}') goto yy73;
-       goto yy70;
-yy70:  ++YYCURSOR;
-       goto yy71;
-yy71:
-#line 150 "scanner.re"
+#line 426 "scanner.cc"
+yy81:  yych = *++YYCURSOR;
+       if(yych != '}') goto yy85;
+       goto yy82;
+yy82:  ++YYCURSOR;
+       goto yy83;
+yy83:
+#line 177 "scanner.re"
 { yylval.extop.minsize = atoi((char *)tok+1);
                                  yylval.extop.maxsize = -1;
                                  RETURN(CLOSESIZE); }
-#line 376 "scanner.cc"
-yy72:  ++YYCURSOR;
+#line 437 "scanner.cc"
+yy84:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       goto yy73;
-yy73:  if(yych <= '/') goto yy47;
-       if(yych <= '9') goto yy72;
-       if(yych != '}') goto yy47;
-       goto yy74;
-yy74:  ++YYCURSOR;
-       goto yy75;
-yy75:
-#line 146 "scanner.re"
+       goto yy85;
+yy85:  if(yych <= '/') goto yy59;
+       if(yych <= '9') goto yy84;
+       if(yych != '}') goto yy59;
+       goto yy86;
+yy86:  ++YYCURSOR;
+       goto yy87;
+yy87:
+#line 173 "scanner.re"
 { yylval.extop.minsize = atoi((char *)tok+1);
                                  yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1));
                                  RETURN(CLOSESIZE); }
-#line 393 "scanner.cc"
+#line 454 "scanner.cc"
 }
-#line 168 "scanner.re"
+#line 195 "scanner.re"
 
 
 code:
 
-#line 397 "scanner.cc"
+#line 458 "scanner.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
-       goto yy76;
-yy77:  ++YYCURSOR;
-yy76:
+       goto yy88;
+       ++YYCURSOR;
+yy88:
        if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = *YYCURSOR;
        if(yych <= '&'){
                if(yych <= 0x0A){
-                       if(yych <= 0x09)        goto yy84;
-                       goto yy82;
+                       if(yych <= 0x09)        goto yy96;
+                       goto yy94;
                } else {
-                       if(yych == '"') goto yy86;
-                       goto yy84;
+                       if(yych == '"') goto yy98;
+                       goto yy96;
                }
        } else {
                if(yych <= '{'){
-                       if(yych <= '\'')        goto yy87;
-                       if(yych <= 'z') goto yy84;
-                       goto yy80;
+                       if(yych <= '\'')        goto yy99;
+                       if(yych <= 'z') goto yy96;
+                       goto yy92;
                } else {
-                       if(yych != '}') goto yy84;
-                       goto yy78;
+                       if(yych != '}') goto yy96;
+                       goto yy90;
                }
        }
-yy78:  ++YYCURSOR;
-       goto yy79;
-yy79:
-#line 172 "scanner.re"
+yy90:  ++YYCURSOR;
+       goto yy91;
+yy91:
+#line 199 "scanner.re"
 { if(--depth == 0){
                                        cur = cursor;
                                        yylval.token = new Token(token(), tline);
                                        return CODE;
                                  }
                                  goto code; }
-#line 434 "scanner.cc"
-yy80:  ++YYCURSOR;
-       goto yy81;
-yy81:
-#line 178 "scanner.re"
+#line 495 "scanner.cc"
+yy92:  ++YYCURSOR;
+       goto yy93;
+yy93:
+#line 205 "scanner.re"
 { ++depth;
                                  goto code; }
-#line 441 "scanner.cc"
-yy82:  ++YYCURSOR;
-       goto yy83;
-yy83:
-#line 180 "scanner.re"
+#line 502 "scanner.cc"
+yy94:  ++YYCURSOR;
+       goto yy95;
+yy95:
+#line 207 "scanner.re"
 { if(cursor == eof) fatal("missing '}'");
                                  pos = cursor; cline++;
                                  goto code;
                                }
-#line 450 "scanner.cc"
-yy84:  ++YYCURSOR;
-       goto yy85;
-yy85:
-#line 184 "scanner.re"
+#line 511 "scanner.cc"
+yy96:  ++YYCURSOR;
+       goto yy97;
+yy97:
+#line 211 "scanner.re"
 { goto code; }
-#line 456 "scanner.cc"
-yy86:  yyaccept = 0;
+#line 517 "scanner.cc"
+yy98:  yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych == 0x0A)        goto yy85;
-       goto yy93;
-yy87:  yyaccept = 0;
+       if(yych == 0x0A)        goto yy97;
+       goto yy105;
+yy99:  yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych == 0x0A)        goto yy85;
-       goto yy89;
-yy88:  ++YYCURSOR;
+       if(yych == 0x0A)        goto yy97;
+       goto yy101;
+yy100: ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       goto yy89;
-yy89:  if(yych <= '&'){
-               if(yych != 0x0A)        goto yy88;
-               goto yy90;
+       goto yy101;
+yy101: if(yych <= '&'){
+               if(yych != 0x0A)        goto yy100;
+               goto yy102;
        } else {
-               if(yych <= '\'')        goto yy84;
-               if(yych == '\\')        goto yy91;
-               goto yy88;
+               if(yych <= '\'')        goto yy96;
+               if(yych == '\\')        goto yy103;
+               goto yy100;
        }
-yy90:  YYCURSOR = YYMARKER;
+yy102: YYCURSOR = YYMARKER;
        switch(yyaccept){
-       case 0: goto yy85;
+       case 0: goto yy97;
        }
-yy91:  ++YYCURSOR;
+yy103: ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       if(yych == 0x0A)        goto yy90;
-       goto yy88;
-yy92:  ++YYCURSOR;
+       if(yych == 0x0A)        goto yy102;
+       goto yy100;
+yy104: ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       goto yy93;
-yy93:  if(yych <= '!'){
-               if(yych == 0x0A)        goto yy90;
-               goto yy92;
+       goto yy105;
+yy105: if(yych <= '!'){
+               if(yych == 0x0A)        goto yy102;
+               goto yy104;
        } else {
-               if(yych <= '"') goto yy84;
-               if(yych != '\\')        goto yy92;
-               goto yy94;
+               if(yych <= '"') goto yy96;
+               if(yych != '\\')        goto yy104;
+               goto yy106;
        }
-yy94:  ++YYCURSOR;
+yy106: ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       if(yych == 0x0A)        goto yy90;
-       goto yy92;
+       if(yych == 0x0A)        goto yy102;
+       goto yy104;
 }
-#line 185 "scanner.re"
+#line 212 "scanner.re"
 
 
 comment:
 
-#line 510 "scanner.cc"
+#line 571 "scanner.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
-       goto yy95;
-yy96:  ++YYCURSOR;
-yy95:
+       goto yy107;
+       ++YYCURSOR;
+yy107:
        if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = *YYCURSOR;
        if(yych <= ')'){
-               if(yych == 0x0A)        goto yy100;
-               goto yy102;
+               if(yych == 0x0A)        goto yy112;
+               goto yy114;
        } else {
-               if(yych <= '*') goto yy97;
-               if(yych == '/') goto yy99;
-               goto yy102;
+               if(yych <= '*') goto yy109;
+               if(yych == '/') goto yy111;
+               goto yy114;
        }
-yy97:  ++YYCURSOR;
-       if((yych = *YYCURSOR) == '/')   goto yy105;
-       goto yy98;
-yy98:
-#line 199 "scanner.re"
+yy109: ++YYCURSOR;
+       if((yych = *YYCURSOR) == '/')   goto yy117;
+       goto yy110;
+yy110:
+#line 226 "scanner.re"
 { goto comment; }
-#line 533 "scanner.cc"
-yy99:  yych = *++YYCURSOR;
-       if(yych == '*') goto yy103;
-       goto yy98;
-yy100: ++YYCURSOR;
-       goto yy101;
-yy101:
-#line 195 "scanner.re"
+#line 594 "scanner.cc"
+yy111: yych = *++YYCURSOR;
+       if(yych == '*') goto yy115;
+       goto yy110;
+yy112: ++YYCURSOR;
+       goto yy113;
+yy113:
+#line 222 "scanner.re"
 { if(cursor == eof) RETURN(0);
                                  tok = pos = cursor; cline++;
                                  goto comment;
                                }
-#line 545 "scanner.cc"
-yy102: yych = *++YYCURSOR;
-       goto yy98;
-yy103: ++YYCURSOR;
-       goto yy104;
-yy104:
-#line 193 "scanner.re"
+#line 606 "scanner.cc"
+yy114: yych = *++YYCURSOR;
+       goto yy110;
+yy115: ++YYCURSOR;
+       goto yy116;
+yy116:
+#line 220 "scanner.re"
 { ++depth;
                                  goto comment; }
-#line 554 "scanner.cc"
-yy105: ++YYCURSOR;
-       goto yy106;
-yy106:
-#line 189 "scanner.re"
+#line 615 "scanner.cc"
+yy117: ++YYCURSOR;
+       goto yy118;
+yy118:
+#line 216 "scanner.re"
 { if(--depth == 0)
                                        goto scan;
                                    else
                                        goto comment; }
-#line 563 "scanner.cc"
+#line 624 "scanner.cc"
 }
-#line 200 "scanner.re"
+#line 227 "scanner.re"
 
 }
 
diff --git a/code.cc b/code.cc
index fbf1229fd17515422eca0a54761195b3e0ef1b39..95a90312f28783bd60abbf2b0796291597edff12 100644 (file)
--- a/code.cc
+++ b/code.cc
@@ -997,9 +997,14 @@ void DFA::emit(std::ostream &o)
 
        uint nRules = 0;
 
+       maxFill = 1;
        for (s = head; s; s = s->next)
        {
                s->depth = maxDist(s);
+               if (maxFill < s->depth)
+               {
+                       maxFill = s->depth;
+               }
                if (s->rule && s->rule->accept >= nRules)
                {
                        nRules = s->rule->accept + 1;
@@ -1145,7 +1150,6 @@ void DFA::emit(std::ostream &o)
        o << "{\n\tYYCTYPE yych;\n\tunsigned int yyaccept;\n";
        oline += 3;
 
-
        if (bFlag)
        {
                BitMap::gen(o, lbChar, ubChar);
index 39f6f1db2d9454b66bc09d6541e4d53e56cf4955..0a610ef7c5062f4a960f90246e6ad2a816f6ccdd 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -36,6 +36,7 @@ extern char *outputFileName;
 extern bool sFlag;
 extern bool bFlag;
 extern unsigned int oline;
+extern uint maxFill;
 
 extern uchar asc2ebc[256];
 extern uchar ebc2asc[256];
diff --git a/main.cc b/main.cc
index 77c7747a9dea1f0b94991e2e49ea01c0f682b866..42901c29d815e8436835a5ab901d0ad97ca3fe1f 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -21,6 +21,7 @@ char *outputFileName = 0;
 bool sFlag = false;
 bool bFlag = false;
 unsigned int oline = 1;
+uint maxFill = 1;
 label_list<uint> vUsedLabels;
 
 using namespace std;
@@ -115,7 +116,7 @@ int main(int argc, char *argv[])
                                cout << version << "\n";
                                return 2;
                        }
-
+                       
                        case 'h':
 
                        case '?':
index 12f265ae882ef01629ee0c584173c95b10a35ad3..9795426eaae32df02e97f75887e61743b8c8d900 100644 (file)
@@ -5,6 +5,7 @@
 #include "scanner.h"
 #include "parser.h"
 #include "y.tab.h"
+#include "globals.h"
 
 extern YYSTYPE yylval;
 
@@ -76,6 +77,7 @@ digit         = [0-9];
 
 int Scanner::echo(std::ostream &out){
     char *cursor = cur;
+    bool ignore_eoc = false;
 
     // Catch EOF
     if (eof && cursor == eof)
@@ -86,15 +88,40 @@ int Scanner::echo(std::ostream &out){
     tok = cursor;
 echo:
 /*!re2c
-       "/*!re2c"               { out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok));
-                                 tok = cursor;
-                                 RETURN(1); }
-       "\n"                    { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok));
-                                 tok = pos = cursor; cline++;
-                                 goto echo; }
-       zero                    { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok) - 1); // -1 so we don't write out the \0
-                                 if(cursor == eof) { RETURN(0); } }
-       any                     { goto echo; }
+       "/*!re2c"       { 
+                                       out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok));
+                                       tok = cursor;
+                                       RETURN(1);
+                               }
+       "/*!max:re2c" {
+                                       out << "#define YYMAXFILL " << maxFill << std::endl;
+                                       tok = pos = cursor;
+                                       ignore_eoc = true;
+                                       goto echo;
+                               }
+       "*" "/"         {
+                                       if (ignore_eoc) {
+                                               ignore_eoc = false;
+                                       } else {
+                                               out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok));
+                                       }
+                                       tok = pos = cursor;
+                                       goto echo;
+                               }
+       "\n"            {
+                                       out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok));
+                                       tok = pos = cursor; cline++;
+                                       goto echo;
+                               }
+       zero            {
+                                       out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok) - 1); // -1 so we don't write out the \0
+                                       if(cursor == eof) {
+                                               RETURN(0);
+                                       }
+                               }
+       any                     {
+                                       goto echo;
+                               }
 */
 }
 
diff --git a/test/bug1054496.c b/test/bug1054496.c
new file mode 100755 (executable)
index 0000000..73c5588
--- /dev/null
@@ -0,0 +1,234 @@
+
+#line 1 "bug1054496.re"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define RET(n) printf("%d\n", n); return n
+#define TAG_EOI        0
+#define TAG_A  1
+#define TAG_TAG        2
+
+int scan(char *s, int l)
+{
+       char *p = s;
+       char *q;
+#define YYCTYPE         char
+#define YYCURSOR        p
+#define YYLIMIT         (s+l)
+#define YYMARKER        q
+#define YYFILL(n)
+cont:
+
+#line 6 "<stdout>"
+{
+       YYCTYPE yych;
+       unsigned int yyaccept;
+       goto yy0;
+       ++YYCURSOR;
+yy0:
+       if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+       yych = *YYCURSOR;
+       switch(yych){
+       case 0x00:      goto yy4;
+       case '<':       goto yy2;
+       default:        goto yy6;
+       }
+yy2:   ++YYCURSOR;
+       switch((yych = *YYCURSOR)) {
+       case 'A':       case 'a':       goto yy7;
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy9;
+       default:        goto yy3;
+       }
+yy3:
+#line 25 "bug1054496.re"
+{ goto cont; }
+#line 77 "<stdout>"
+yy4:   ++YYCURSOR;
+       goto yy5;
+yy5:
+#line 24 "bug1054496.re"
+{ RET(TAG_EOI); }
+#line 83 "<stdout>"
+yy6:   yych = *++YYCURSOR;
+       goto yy3;
+yy7:   ++YYCURSOR;
+       switch((yych = *YYCURSOR)) {
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy9;
+       default:        goto yy8;
+       }
+yy8:
+#line 22 "bug1054496.re"
+{ RET(TAG_A); }
+#line 144 "<stdout>"
+yy9:   ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy10;
+yy10:  switch(yych){
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy9;
+       default:        goto yy11;
+       }
+yy11:
+#line 23 "bug1054496.re"
+{ RET(TAG_TAG); }
+#line 207 "<stdout>"
+}
+#line 26 "bug1054496.re"
+
+}
+
+#define do_scan(str) scan(str, strlen(str))
+
+main()
+{
+       do_scan("0");
+}
diff --git a/test/bug1054496.re b/test/bug1054496.re
new file mode 100755 (executable)
index 0000000..ccfb320
--- /dev/null
@@ -0,0 +1,34 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define RET(n) printf("%d\n", n); return n
+#define TAG_EOI        0
+#define TAG_A  1
+#define TAG_TAG        2
+
+int scan(char *s, int l)
+{
+       char *p = s;
+       char *q;
+#define YYCTYPE         char
+#define YYCURSOR        p
+#define YYLIMIT         (s+l)
+#define YYMARKER        q
+#define YYFILL(n)
+cont:
+/*!re2c
+any = [\001-\377];
+'<a'                   { RET(TAG_A); }
+[<][A-Za-z]+   { RET(TAG_TAG); }
+[\000]                 { RET(TAG_EOI); }
+any                            { goto cont; }
+*/
+}
+
+#define do_scan(str) scan(str, strlen(str))
+
+main()
+{
+       do_scan("0");
+}