]> granicus.if.org Git - re2c/commitdiff
- Fix [ 1163046 ] re2c hangs when processing valid re-file
authorhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Fri, 8 Apr 2005 19:45:35 +0000 (19:45 +0000)
committerhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Fri, 8 Apr 2005 19:45:35 +0000 (19:45 +0000)
bootstrap/scanner.cc
code.cc
test/bug1163046.c [new file with mode: 0755]
test/bug1163046.re [new file with mode: 0755]
test/cnokw.c

index 450e982805dcc48cd228193913be94f5f91cd7f0..d70874db2e3d8537071bff5af7d4b6aad40f2e86 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.9.5.dev on Fri Apr  8 20:22:23 2005 */
+/* Generated by re2c 0.9.5.dev on Fri Apr  8 21:09:05 2005 */
 #line 1 "scanner.re"
 /* $Id$ */
 #include <stdlib.h>
diff --git a/code.cc b/code.cc
index 95a90312f28783bd60abbf2b0796291597edff12..0020fed384c91128a4218ce0cfddf540e13b85ea 100644 (file)
--- a/code.cc
+++ b/code.cc
@@ -875,7 +875,11 @@ uint maxDist(State *s)
 
                        if (!t->link)
                        {
-                               m += maxDist(t);
+                               if (t->depth == -1)
+                               {
+                                       t->depth = maxDist(t);
+                               }
+                               m += t->depth;
                        }
 
                        if (m > mm)
diff --git a/test/bug1163046.c b/test/bug1163046.c
new file mode 100755 (executable)
index 0000000..470304b
--- /dev/null
@@ -0,0 +1,302 @@
+
+#line 1 "bug1163046.re"
+#include <iostream>
+
+#define YYCTYPE unsigned char
+#define YYCURSOR cursor
+#define YYLIMIT cursor
+#define YYMARKER marker
+#define YYFILL(n)
+
+bool scan(const char *text)
+{
+       YYCTYPE *start = (YYCTYPE *)text;
+       YYCTYPE *cursor = (YYCTYPE *)text;
+       YYCTYPE *marker = (YYCTYPE *)text;
+next:
+       YYCTYPE *token = cursor;
+
+#line 6 "<stdout>"
+{
+       YYCTYPE yych;
+       unsigned int yyaccept;
+       goto yy0;
+       ++YYCURSOR;
+yy0:
+       if((YYLIMIT - YYCURSOR) < 45) YYFILL(45);
+       yych = *YYCURSOR;
+       switch(yych){
+       case 0x00:      goto yy5;
+       case '(':       goto yy2;
+       default:        goto yy4;
+       }
+yy2:   yyaccept = 0;
+       yych = *(YYMARKER = ++YYCURSOR);
+       switch(yych){
+       case 'T':       case 't':       goto yy7;
+       default:        goto yy3;
+       }
+yy3:
+#line 23 "bug1163046.re"
+{ goto next; }
+#line 29 "<stdout>"
+yy4:   yych = *++YYCURSOR;
+       goto yy3;
+yy5:   ++YYCURSOR;
+       goto yy6;
+yy6:
+#line 25 "bug1163046.re"
+{ return false; }
+#line 37 "<stdout>"
+yy7:   yych = *++YYCURSOR;
+       switch(yych){
+       case 'H':       case 'h':       goto yy9;
+       default:        goto yy8;
+       }
+yy8:   YYCURSOR = YYMARKER;
+       switch(yyaccept){
+       case 0: goto yy3;
+       }
+yy9:   yych = *++YYCURSOR;
+       switch(yych){
+       case 'I':       case 'i':       goto yy10;
+       default:        goto yy8;
+       }
+yy10:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'S':       case 's':       goto yy11;
+       default:        goto yy8;
+       }
+yy11:  yych = *++YYCURSOR;
+       switch(yych){
+       case ' ':       goto yy12;
+       default:        goto yy8;
+       }
+yy12:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'F':       case 'f':       goto yy13;
+       default:        goto yy8;
+       }
+yy13:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'I':       case 'i':       goto yy14;
+       default:        goto yy8;
+       }
+yy14:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'L':       case 'l':       goto yy15;
+       default:        goto yy8;
+       }
+yy15:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'E':       case 'e':       goto yy16;
+       default:        goto yy8;
+       }
+yy16:  yych = *++YYCURSOR;
+       switch(yych){
+       case ' ':       goto yy17;
+       default:        goto yy8;
+       }
+yy17:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'M':       case 'm':       goto yy18;
+       default:        goto yy8;
+       }
+yy18:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'U':       case 'u':       goto yy19;
+       default:        goto yy8;
+       }
+yy19:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'S':       case 's':       goto yy20;
+       default:        goto yy8;
+       }
+yy20:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'T':       case 't':       goto yy21;
+       default:        goto yy8;
+       }
+yy21:  yych = *++YYCURSOR;
+       switch(yych){
+       case ' ':       goto yy22;
+       default:        goto yy8;
+       }
+yy22:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'B':       case 'b':       goto yy23;
+       default:        goto yy8;
+       }
+yy23:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'E':       case 'e':       goto yy24;
+       default:        goto yy8;
+       }
+yy24:  yych = *++YYCURSOR;
+       switch(yych){
+       case ' ':       goto yy25;
+       default:        goto yy8;
+       }
+yy25:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'C':       case 'c':       goto yy26;
+       default:        goto yy8;
+       }
+yy26:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'O':       case 'o':       goto yy27;
+       default:        goto yy8;
+       }
+yy27:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'N':       case 'n':       goto yy28;
+       default:        goto yy8;
+       }
+yy28:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'V':       case 'v':       goto yy29;
+       default:        goto yy8;
+       }
+yy29:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'E':       case 'e':       goto yy30;
+       default:        goto yy8;
+       }
+yy30:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'R':       case 'r':       goto yy31;
+       default:        goto yy8;
+       }
+yy31:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'T':       case 't':       goto yy32;
+       default:        goto yy8;
+       }
+yy32:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'E':       case 'e':       goto yy33;
+       default:        goto yy8;
+       }
+yy33:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'D':       case 'd':       goto yy34;
+       default:        goto yy8;
+       }
+yy34:  yych = *++YYCURSOR;
+       switch(yych){
+       case ' ':       goto yy35;
+       default:        goto yy8;
+       }
+yy35:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'W':       case 'w':       goto yy36;
+       default:        goto yy8;
+       }
+yy36:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'I':       case 'i':       goto yy37;
+       default:        goto yy8;
+       }
+yy37:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'T':       case 't':       goto yy38;
+       default:        goto yy8;
+       }
+yy38:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'H':       case 'h':       goto yy39;
+       default:        goto yy8;
+       }
+yy39:  yych = *++YYCURSOR;
+       switch(yych){
+       case ' ':       goto yy40;
+       default:        goto yy8;
+       }
+yy40:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'B':       case 'b':       goto yy41;
+       default:        goto yy8;
+       }
+yy41:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'I':       case 'i':       goto yy42;
+       default:        goto yy8;
+       }
+yy42:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'N':       case 'n':       goto yy43;
+       default:        goto yy8;
+       }
+yy43:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'H':       case 'h':       goto yy44;
+       default:        goto yy8;
+       }
+yy44:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'E':       case 'e':       goto yy45;
+       default:        goto yy8;
+       }
+yy45:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'X':       case 'x':       goto yy46;
+       default:        goto yy8;
+       }
+yy46:  yych = *++YYCURSOR;
+       switch(yych){
+       case ' ':       goto yy47;
+       default:        goto yy8;
+       }
+yy47:  yych = *++YYCURSOR;
+       switch(yych){
+       case '4':       goto yy48;
+       default:        goto yy8;
+       }
+yy48:  yych = *++YYCURSOR;
+       switch(yych){
+       case '.':       goto yy49;
+       default:        goto yy8;
+       }
+yy49:  yych = *++YYCURSOR;
+       switch(yych){
+       case '0':       goto yy50;
+       default:        goto yy8;
+       }
+yy50:  yych = *++YYCURSOR;
+       switch(yych){
+       case ')':       goto yy51;
+       default:        goto yy8;
+       }
+yy51:  ++YYCURSOR;
+       goto yy52;
+yy52:
+#line 18 "bug1163046.re"
+{
+               if (token == start || *(token - 1) == '\n')
+               return true; else goto next;
+       }
+#line 265 "<stdout>"
+}
+#line 26 "bug1163046.re"
+
+       return false;
+}
+
+#define do_scan(str, expect) \
+       res = scan(str) == expect ? 0 : 1; \
+       std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \
+       result += res
+
+#define YYMAXFILL 45
+
+
+int main(int,void**)
+{
+       int res, result = 0;
+       do_scan("(This file must be converted with BinHex 4.0)", 1);
+       do_scan("x(This file must be converted with BinHex 4.0)", 0);
+       do_scan("(This file must be converted with BinHex 4.0)x", 1);
+       do_scan("x(This file must be converted with BinHex 4.0)x", 0);
+       
+       return result;
+}
diff --git a/test/bug1163046.re b/test/bug1163046.re
new file mode 100755 (executable)
index 0000000..fee9bd6
--- /dev/null
@@ -0,0 +1,46 @@
+#include <iostream>
+
+#define YYCTYPE unsigned char
+#define YYCURSOR cursor
+#define YYLIMIT cursor
+#define YYMARKER marker
+#define YYFILL(n)
+
+bool scan(const char *text)
+{
+       YYCTYPE *start = (YYCTYPE *)text;
+       YYCTYPE *cursor = (YYCTYPE *)text;
+       YYCTYPE *marker = (YYCTYPE *)text;
+next:
+       YYCTYPE *token = cursor;
+/*!re2c
+'(This file must be converted with BinHex 4.0)'
+       {
+               if (token == start || *(token - 1) == '\n')
+               return true; else goto next;
+       }
+[\001-\377]
+       { goto next; }
+[\000]
+       { return false; }
+*/
+       return false;
+}
+
+#define do_scan(str, expect) \
+       res = scan(str) == expect ? 0 : 1; \
+       std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \
+       result += res
+
+/*!max:re2c */
+
+int main(int,void**)
+{
+       int res, result = 0;
+       do_scan("(This file must be converted with BinHex 4.0)", 1);
+       do_scan("x(This file must be converted with BinHex 4.0)", 0);
+       do_scan("(This file must be converted with BinHex 4.0)x", 1);
+       do_scan("x(This file must be converted with BinHex 4.0)x", 0);
+       
+       return result;
+}
index cf5e22155b5ade8c631225583ff9aa47690ab5ed..20590ac486dd188462b0e33312736257fadca6f2 100644 (file)
@@ -133,7 +133,7 @@ std:
        goto yy0;
        ++YYCURSOR;
 yy0:
-       if((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
+       if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
        yych = *YYCURSOR;
        switch(yych){
        case 0x09:      case 0x0B: