]> granicus.if.org Git - re2c/commitdiff
- Allow to test with specific switches by providing them in test filename
authorhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Thu, 29 Dec 2005 15:42:02 +0000 (15:42 +0000)
committerhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Thu, 29 Dec 2005 15:42:02 +0000 (15:42 +0000)
- Add first unicode tests

run_tests.sh.in
test/cvsignore.c [new file with mode: 0755]
test/cvsignore.re [new file with mode: 0755]
test/cvsignore.s.c [new file with mode: 0755]
test/cvsignore.s.re [new file with mode: 0755]
test/cvsignore.w.c [new file with mode: 0755]
test/cvsignore.w.re [new file with mode: 0755]

index b981f478b1c43f712c67b07425cd3762d0879cf8..df5aa192f42abf34dd1509d4ce9d07670be15ced 100644 (file)
@@ -3,9 +3,10 @@ result=0
 errcnt=0
 for x in @top_srcdir@/test/*.re; do
        echo $x
+       switches=`basename $x|sed -e 's/^.*\.\([^.]*\)\..*$/-\1/g' -e 's/^[^-].*//'g`
        # don't use the -o flag, since it makes it harder to diff.
        outname=@builddir@/test/`basename ${x%.re}.temp`
-       @builddir@/re2c $x 2>&1 | sed -e "s,$x,`basename $x`,g" -e "s,/\* Generated by re2c .*\*/,/\* Generated by re2c \*/,g" > $outname
+       @builddir@/re2c $switches $x 2>&1 | sed -e "s,$x,`basename $x`,g" -e "s,/\* Generated by re2c .*\*/,/\* Generated by re2c \*/,g" > $outname
        if cmp -s ${x%.re}.c $outname; then
                echo "Passed."
                rm $outname
diff --git a/test/cvsignore.c b/test/cvsignore.c
new file mode 100755 (executable)
index 0000000..3f808c8
--- /dev/null
@@ -0,0 +1,309 @@
+/* Generated by re2c */
+#line 1 "cvsignore.re"
+
+#define YYFILL(n) if (cursor >= limit) break;
+#define YYCTYPE char
+#define YYCURSOR cursor
+#define YYLIMIT limit
+#define YYMARKER marker
+
+#line 16 "cvsignore.re"
+
+
+#define APPEND(text) \
+       append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
+
+inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
+{
+       memcpy(output + outsize, text, len);
+       outsize += (len / sizeof(YYCTYPE));
+}
+
+void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
+{
+       // rule
+       // scan lines
+       // find $ in lines
+       //   compact $<keyword>: .. $ to $<keyword>$
+  
+       YYCTYPE *output;
+       const YYCTYPE *cursor, *limit, *marker;
+
+       cursor = marker = output = *pText;
+
+       size_t insize = *pSize;
+       size_t outsize = 0;
+
+       limit = cursor + insize;
+
+       while(1) {
+loop:
+
+#line 43 "<stdout>"
+{
+       YYCTYPE yych;
+       unsigned int yyaccept = 0;
+       goto yy0;
+       ++YYCURSOR;
+yy0:
+       if((YYLIMIT - YYCURSOR) < 11) YYFILL(11);
+       yych = *YYCURSOR;
+       switch(yych){
+       case '$':       goto yy2;
+       default:        goto yy4;
+       }
+yy2:   yyaccept = 0;
+       yych = *(YYMARKER = ++YYCURSOR);
+       switch(yych){
+       case 'D':       goto yy10;
+       case 'I':       goto yy9;
+       case 'L':       goto yy8;
+       case 'R':       goto yy7;
+       case 'S':       goto yy5;
+       default:        goto yy3;
+       }
+yy3:
+#line 53 "cvsignore.re"
+{ output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
+#line 69 "<stdout>"
+yy4:   yych = *++YYCURSOR;
+       goto yy3;
+yy5:   yych = *++YYCURSOR;
+       switch(yych){
+       case 'o':       goto yy44;
+       default:        goto yy6;
+       }
+yy6:   YYCURSOR = YYMARKER;
+       switch(yyaccept){
+       case 0: goto yy3;
+       }
+yy7:   yych = *++YYCURSOR;
+       switch(yych){
+       case 'e':       goto yy32;
+       default:        goto yy6;
+       }
+yy8:   yych = *++YYCURSOR;
+       switch(yych){
+       case 'o':       goto yy25;
+       default:        goto yy6;
+       }
+yy9:   yych = *++YYCURSOR;
+       switch(yych){
+       case 'd':       goto yy19;
+       default:        goto yy6;
+       }
+yy10:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'a':       goto yy11;
+       default:        goto yy6;
+       }
+yy11:  yych = *++YYCURSOR;
+       switch(yych){
+       case 't':       goto yy12;
+       default:        goto yy6;
+       }
+yy12:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'e':       goto yy13;
+       default:        goto yy6;
+       }
+yy13:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy15;
+       case ':':       goto yy14;
+       default:        goto yy6;
+       }
+yy14:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy6;
+       default:        goto yy18;
+       }
+yy15:  ++YYCURSOR;
+       goto yy16;
+yy16:
+#line 48 "cvsignore.re"
+{ APPEND(L"$Date$"); goto loop; }
+#line 127 "<stdout>"
+yy17:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy18;
+yy18:  switch(yych){
+       case 0x0A:      goto yy6;
+       case '$':       goto yy15;
+       default:        goto yy17;
+       }
+yy19:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy21;
+       case ':':       goto yy20;
+       default:        goto yy6;
+       }
+yy20:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy6;
+       default:        goto yy24;
+       }
+yy21:  ++YYCURSOR;
+       goto yy22;
+yy22:
+#line 49 "cvsignore.re"
+{ APPEND(L"$Id$"); goto loop; }
+#line 153 "<stdout>"
+yy23:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy24;
+yy24:  switch(yych){
+       case 0x0A:      goto yy6;
+       case '$':       goto yy21;
+       default:        goto yy23;
+       }
+yy25:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'g':       goto yy26;
+       default:        goto yy6;
+       }
+yy26:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy28;
+       case ':':       goto yy27;
+       default:        goto yy6;
+       }
+yy27:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy6;
+       default:        goto yy31;
+       }
+yy28:  ++YYCURSOR;
+       goto yy29;
+yy29:
+#line 50 "cvsignore.re"
+{ APPEND(L"$Log$
+{ APPEND(L"Revision 1.1  2005/12/29 15:42:02  helly
+{ APPEND(L"- Allow to test with specific switches by providing them in test filename
+{ APPEND(L"- Add first unicode tests
+{ APPEND(L""); goto loop; }
+#line 184 "<stdout>"
+yy30:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy31;
+yy31:  switch(yych){
+       case 0x0A:      goto yy6;
+       case '$':       goto yy28;
+       default:        goto yy30;
+       }
+yy32:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'v':       goto yy33;
+       default:        goto yy6;
+       }
+yy33:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'i':       goto yy34;
+       default:        goto yy6;
+       }
+yy34:  yych = *++YYCURSOR;
+       switch(yych){
+       case 's':       goto yy35;
+       default:        goto yy6;
+       }
+yy35:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'i':       goto yy36;
+       default:        goto yy6;
+       }
+yy36:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'o':       goto yy37;
+       default:        goto yy6;
+       }
+yy37:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'n':       goto yy38;
+       default:        goto yy6;
+       }
+yy38:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy40;
+       case ':':       goto yy39;
+       default:        goto yy6;
+       }
+yy39:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy6;
+       default:        goto yy43;
+       }
+yy40:  ++YYCURSOR;
+       goto yy41;
+yy41:
+#line 51 "cvsignore.re"
+{ APPEND(L"$Revision$"); goto loop; }
+#line 240 "<stdout>"
+yy42:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy43;
+yy43:  switch(yych){
+       case 0x0A:      goto yy6;
+       case '$':       goto yy40;
+       default:        goto yy42;
+       }
+yy44:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'u':       goto yy45;
+       default:        goto yy6;
+       }
+yy45:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'r':       goto yy46;
+       default:        goto yy6;
+       }
+yy46:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'c':       goto yy47;
+       default:        goto yy6;
+       }
+yy47:  yych = *++YYCURSOR;
+       switch(yych){
+       case 'e':       goto yy48;
+       default:        goto yy6;
+       }
+yy48:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy50;
+       case ':':       goto yy49;
+       default:        goto yy6;
+       }
+yy49:  yych = *++YYCURSOR;
+       switch(yych){
+       case '$':       goto yy6;
+       default:        goto yy53;
+       }
+yy50:  ++YYCURSOR;
+       goto yy51;
+yy51:
+#line 52 "cvsignore.re"
+{ APPEND(L"$Source$"); goto loop; }
+#line 286 "<stdout>"
+yy52:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy53;
+yy53:  switch(yych){
+       case 0x0A:      goto yy6;
+       case '$':       goto yy50;
+       default:        goto yy52;
+       }
+}
+#line 55 "cvsignore.re"
+
+       }
+       output[outsize] = '\0';
+
+       // set the new size
+       *pSize = outsize;
+       
+       *pbChanged = (insize == outsize) ? 0 : 1;
+}
diff --git a/test/cvsignore.re b/test/cvsignore.re
new file mode 100755 (executable)
index 0000000..f4108e4
--- /dev/null
@@ -0,0 +1,67 @@
+
+#define YYFILL(n) if (cursor >= limit) break;
+#define YYCTYPE char
+#define YYCURSOR cursor
+#define YYLIMIT limit
+#define YYMARKER marker
+
+/*!re2c
+any     = (.|"\n");
+value  = (":" (.\"$")+)?;
+cvsdat = "Date";
+cvsid  = "Id";
+cvslog = "Log";
+cvsrev = "Revision";
+cvssrc = "Source";
+*/
+
+#define APPEND(text) \
+       append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
+
+inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
+{
+       memcpy(output + outsize, text, len);
+       outsize += (len / sizeof(YYCTYPE));
+}
+
+void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
+{
+       // rule
+       // scan lines
+       // find $ in lines
+       //   compact $<keyword>: .. $ to $<keyword>$
+  
+       YYCTYPE *output;
+       const YYCTYPE *cursor, *limit, *marker;
+
+       cursor = marker = output = *pText;
+
+       size_t insize = *pSize;
+       size_t outsize = 0;
+
+       limit = cursor + insize;
+
+       while(1) {
+loop:
+/*!re2c
+
+"$" cvsdat value "$"   { APPEND(L"$Date$"); goto loop; }
+"$" cvsid  value "$"   { APPEND(L"$Id$"); goto loop; }
+"$" cvslog value "$"   { APPEND(L"$Log$
+"$" cvslog value "$"   { APPEND(L"Revision 1.1  2005/12/29 15:42:02  helly
+"$" cvslog value "$"   { APPEND(L"- Allow to test with specific switches by providing them in test filename
+"$" cvslog value "$"   { APPEND(L"- Add first unicode tests
+"$" cvslog value "$"   { APPEND(L""); goto loop; }
+"$" cvsrev value "$"   { APPEND(L"$Revision$"); goto loop; }
+"$" cvssrc value "$"   { APPEND(L"$Source$"); goto loop; }
+any                                            { output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
+
+*/
+       }
+       output[outsize] = '\0';
+
+       // set the new size
+       *pSize = outsize;
+       
+       *pbChanged = (insize == outsize) ? 0 : 1;
+}
diff --git a/test/cvsignore.s.c b/test/cvsignore.s.c
new file mode 100755 (executable)
index 0000000..ec74940
--- /dev/null
@@ -0,0 +1,241 @@
+/* Generated by re2c */
+#line 1 "cvsignore.s.re"
+
+#define YYFILL(n) if (cursor >= limit) break;
+#define YYCTYPE char
+#define YYCURSOR cursor
+#define YYLIMIT limit
+#define YYMARKER marker
+
+#line 16 "cvsignore.s.re"
+
+
+#define APPEND(text) \
+       append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
+
+inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
+{
+       memcpy(output + outsize, text, len);
+       outsize += (len / sizeof(YYCTYPE));
+}
+
+void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
+{
+       // rule
+       // scan lines
+       // find $ in lines
+       //   compact $<keyword>: .. $ to $<keyword>$
+  
+       YYCTYPE *output;
+       const YYCTYPE *cursor, *limit, *marker;
+
+       cursor = marker = output = *pText;
+
+       size_t insize = *pSize;
+       size_t outsize = 0;
+
+       limit = cursor + insize;
+
+       while(1) {
+loop:
+
+#line 43 "<stdout>"
+{
+       YYCTYPE yych;
+       unsigned int yyaccept = 0;
+       goto yy0;
+       ++YYCURSOR;
+yy0:
+       if((YYLIMIT - YYCURSOR) < 11) YYFILL(11);
+       yych = *YYCURSOR;
+       if(yych != '$') goto yy4;
+       goto yy2;
+yy2:   yyaccept = 0;
+       yych = *(YYMARKER = ++YYCURSOR);
+       switch(yych){
+       case 'D':       goto yy10;
+       case 'I':       goto yy9;
+       case 'L':       goto yy8;
+       case 'R':       goto yy7;
+       case 'S':       goto yy5;
+       default:        goto yy3;
+       }
+yy3:
+#line 53 "cvsignore.s.re"
+{ output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
+#line 67 "<stdout>"
+yy4:   yych = *++YYCURSOR;
+       goto yy3;
+yy5:   yych = *++YYCURSOR;
+       if(yych == 'o') goto yy44;
+       goto yy6;
+yy6:   YYCURSOR = YYMARKER;
+       switch(yyaccept){
+       case 0: goto yy3;
+       }
+yy7:   yych = *++YYCURSOR;
+       if(yych == 'e') goto yy32;
+       goto yy6;
+yy8:   yych = *++YYCURSOR;
+       if(yych == 'o') goto yy25;
+       goto yy6;
+yy9:   yych = *++YYCURSOR;
+       if(yych == 'd') goto yy19;
+       goto yy6;
+yy10:  yych = *++YYCURSOR;
+       if(yych != 'a') goto yy6;
+       goto yy11;
+yy11:  yych = *++YYCURSOR;
+       if(yych != 't') goto yy6;
+       goto yy12;
+yy12:  yych = *++YYCURSOR;
+       if(yych != 'e') goto yy6;
+       goto yy13;
+yy13:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy15;
+       if(yych != ':') goto yy6;
+       goto yy14;
+yy14:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy18;
+yy15:  ++YYCURSOR;
+       goto yy16;
+yy16:
+#line 48 "cvsignore.s.re"
+{ APPEND(L"$Date$"); goto loop; }
+#line 107 "<stdout>"
+yy17:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy18;
+yy18:  if(yych == 0x0A)        goto yy6;
+       if(yych == '$') goto yy15;
+       goto yy17;
+yy19:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy21;
+       if(yych != ':') goto yy6;
+       goto yy20;
+yy20:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy24;
+yy21:  ++YYCURSOR;
+       goto yy22;
+yy22:
+#line 49 "cvsignore.s.re"
+{ APPEND(L"$Id$"); goto loop; }
+#line 127 "<stdout>"
+yy23:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy24;
+yy24:  if(yych == 0x0A)        goto yy6;
+       if(yych == '$') goto yy21;
+       goto yy23;
+yy25:  yych = *++YYCURSOR;
+       if(yych != 'g') goto yy6;
+       goto yy26;
+yy26:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy28;
+       if(yych != ':') goto yy6;
+       goto yy27;
+yy27:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy31;
+yy28:  ++YYCURSOR;
+       goto yy29;
+yy29:
+#line 50 "cvsignore.s.re"
+{ APPEND(L"$Log$
+{ APPEND(L"Revision 1.1  2005/12/29 15:42:02  helly
+{ APPEND(L"- Allow to test with specific switches by providing them in test filename
+{ APPEND(L"- Add first unicode tests
+{ APPEND(L""); goto loop; }
+#line 150 "<stdout>"
+yy30:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy31;
+yy31:  if(yych == 0x0A)        goto yy6;
+       if(yych == '$') goto yy28;
+       goto yy30;
+yy32:  yych = *++YYCURSOR;
+       if(yych != 'v') goto yy6;
+       goto yy33;
+yy33:  yych = *++YYCURSOR;
+       if(yych != 'i') goto yy6;
+       goto yy34;
+yy34:  yych = *++YYCURSOR;
+       if(yych != 's') goto yy6;
+       goto yy35;
+yy35:  yych = *++YYCURSOR;
+       if(yych != 'i') goto yy6;
+       goto yy36;
+yy36:  yych = *++YYCURSOR;
+       if(yych != 'o') goto yy6;
+       goto yy37;
+yy37:  yych = *++YYCURSOR;
+       if(yych != 'n') goto yy6;
+       goto yy38;
+yy38:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy40;
+       if(yych != ':') goto yy6;
+       goto yy39;
+yy39:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy43;
+yy40:  ++YYCURSOR;
+       goto yy41;
+yy41:
+#line 51 "cvsignore.s.re"
+{ APPEND(L"$Revision$"); goto loop; }
+#line 188 "<stdout>"
+yy42:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy43;
+yy43:  if(yych == 0x0A)        goto yy6;
+       if(yych == '$') goto yy40;
+       goto yy42;
+yy44:  yych = *++YYCURSOR;
+       if(yych != 'u') goto yy6;
+       goto yy45;
+yy45:  yych = *++YYCURSOR;
+       if(yych != 'r') goto yy6;
+       goto yy46;
+yy46:  yych = *++YYCURSOR;
+       if(yych != 'c') goto yy6;
+       goto yy47;
+yy47:  yych = *++YYCURSOR;
+       if(yych != 'e') goto yy6;
+       goto yy48;
+yy48:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy50;
+       if(yych != ':') goto yy6;
+       goto yy49;
+yy49:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy53;
+yy50:  ++YYCURSOR;
+       goto yy51;
+yy51:
+#line 52 "cvsignore.s.re"
+{ APPEND(L"$Source$"); goto loop; }
+#line 220 "<stdout>"
+yy52:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy53;
+yy53:  if(yych == 0x0A)        goto yy6;
+       if(yych == '$') goto yy50;
+       goto yy52;
+}
+#line 55 "cvsignore.s.re"
+
+       }
+       output[outsize] = '\0';
+
+       // set the new size
+       *pSize = outsize;
+       
+       *pbChanged = (insize == outsize) ? 0 : 1;
+}
diff --git a/test/cvsignore.s.re b/test/cvsignore.s.re
new file mode 100755 (executable)
index 0000000..f4108e4
--- /dev/null
@@ -0,0 +1,67 @@
+
+#define YYFILL(n) if (cursor >= limit) break;
+#define YYCTYPE char
+#define YYCURSOR cursor
+#define YYLIMIT limit
+#define YYMARKER marker
+
+/*!re2c
+any     = (.|"\n");
+value  = (":" (.\"$")+)?;
+cvsdat = "Date";
+cvsid  = "Id";
+cvslog = "Log";
+cvsrev = "Revision";
+cvssrc = "Source";
+*/
+
+#define APPEND(text) \
+       append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
+
+inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
+{
+       memcpy(output + outsize, text, len);
+       outsize += (len / sizeof(YYCTYPE));
+}
+
+void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
+{
+       // rule
+       // scan lines
+       // find $ in lines
+       //   compact $<keyword>: .. $ to $<keyword>$
+  
+       YYCTYPE *output;
+       const YYCTYPE *cursor, *limit, *marker;
+
+       cursor = marker = output = *pText;
+
+       size_t insize = *pSize;
+       size_t outsize = 0;
+
+       limit = cursor + insize;
+
+       while(1) {
+loop:
+/*!re2c
+
+"$" cvsdat value "$"   { APPEND(L"$Date$"); goto loop; }
+"$" cvsid  value "$"   { APPEND(L"$Id$"); goto loop; }
+"$" cvslog value "$"   { APPEND(L"$Log$
+"$" cvslog value "$"   { APPEND(L"Revision 1.1  2005/12/29 15:42:02  helly
+"$" cvslog value "$"   { APPEND(L"- Allow to test with specific switches by providing them in test filename
+"$" cvslog value "$"   { APPEND(L"- Add first unicode tests
+"$" cvslog value "$"   { APPEND(L""); goto loop; }
+"$" cvsrev value "$"   { APPEND(L"$Revision$"); goto loop; }
+"$" cvssrc value "$"   { APPEND(L"$Source$"); goto loop; }
+any                                            { output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
+
+*/
+       }
+       output[outsize] = '\0';
+
+       // set the new size
+       *pSize = outsize;
+       
+       *pbChanged = (insize == outsize) ? 0 : 1;
+}
diff --git a/test/cvsignore.w.c b/test/cvsignore.w.c
new file mode 100755 (executable)
index 0000000..5140163
--- /dev/null
@@ -0,0 +1,241 @@
+/* Generated by re2c */
+#line 1 "cvsignore.w.re"
+
+#define YYFILL(n) if (cursor >= limit) break;
+#define YYCTYPE unsigned short
+#define YYCURSOR cursor
+#define YYLIMIT limit
+#define YYMARKER marker
+
+#line 16 "cvsignore.w.re"
+
+
+#define APPEND(text) \
+       append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
+
+inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
+{
+       memcpy(output + outsize, text, len);
+       outsize += (len / sizeof(YYCTYPE));
+}
+
+void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
+{
+       // rule
+       // scan lines
+       // find $ in lines
+       //   compact $<keyword>: .. $ to $<keyword>$
+  
+       YYCTYPE *output;
+       const YYCTYPE *cursor, *limit, *marker;
+
+       cursor = marker = output = *pText;
+
+       size_t insize = *pSize;
+       size_t outsize = 0;
+
+       limit = cursor + insize;
+
+       while(1) {
+loop:
+
+#line 43 "<stdout>"
+{
+       YYCTYPE yych;
+       unsigned int yyaccept = 0;
+       goto yy0;
+       ++YYCURSOR;
+yy0:
+       if((YYLIMIT - YYCURSOR) < 11) YYFILL(11);
+       yych = *YYCURSOR;
+       if(yych != '$') goto yy4;
+       goto yy2;
+yy2:   yyaccept = 0;
+       yych = *(YYMARKER = ++YYCURSOR);
+       switch(yych){
+       case 'D':       goto yy10;
+       case 'I':       goto yy9;
+       case 'L':       goto yy8;
+       case 'R':       goto yy7;
+       case 'S':       goto yy5;
+       default:        goto yy3;
+       }
+yy3:
+#line 53 "cvsignore.w.re"
+{ output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
+#line 67 "<stdout>"
+yy4:   yych = *++YYCURSOR;
+       goto yy3;
+yy5:   yych = *++YYCURSOR;
+       if(yych == 'o') goto yy44;
+       goto yy6;
+yy6:   YYCURSOR = YYMARKER;
+       switch(yyaccept){
+       case 0: goto yy3;
+       }
+yy7:   yych = *++YYCURSOR;
+       if(yych == 'e') goto yy32;
+       goto yy6;
+yy8:   yych = *++YYCURSOR;
+       if(yych == 'o') goto yy25;
+       goto yy6;
+yy9:   yych = *++YYCURSOR;
+       if(yych == 'd') goto yy19;
+       goto yy6;
+yy10:  yych = *++YYCURSOR;
+       if(yych != 'a') goto yy6;
+       goto yy11;
+yy11:  yych = *++YYCURSOR;
+       if(yych != 't') goto yy6;
+       goto yy12;
+yy12:  yych = *++YYCURSOR;
+       if(yych != 'e') goto yy6;
+       goto yy13;
+yy13:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy15;
+       if(yych != ':') goto yy6;
+       goto yy14;
+yy14:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy18;
+yy15:  ++YYCURSOR;
+       goto yy16;
+yy16:
+#line 48 "cvsignore.w.re"
+{ APPEND(L"$Date$"); goto loop; }
+#line 107 "<stdout>"
+yy17:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy18;
+yy18:  if(yych == 0x000A)      goto yy6;
+       if(yych == '$') goto yy15;
+       goto yy17;
+yy19:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy21;
+       if(yych != ':') goto yy6;
+       goto yy20;
+yy20:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy24;
+yy21:  ++YYCURSOR;
+       goto yy22;
+yy22:
+#line 49 "cvsignore.w.re"
+{ APPEND(L"$Id$"); goto loop; }
+#line 127 "<stdout>"
+yy23:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy24;
+yy24:  if(yych == 0x000A)      goto yy6;
+       if(yych == '$') goto yy21;
+       goto yy23;
+yy25:  yych = *++YYCURSOR;
+       if(yych != 'g') goto yy6;
+       goto yy26;
+yy26:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy28;
+       if(yych != ':') goto yy6;
+       goto yy27;
+yy27:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy31;
+yy28:  ++YYCURSOR;
+       goto yy29;
+yy29:
+#line 50 "cvsignore.w.re"
+{ APPEND(L"$Log$
+{ APPEND(L"Revision 1.1  2005/12/29 15:42:02  helly
+{ APPEND(L"- Allow to test with specific switches by providing them in test filename
+{ APPEND(L"- Add first unicode tests
+{ APPEND(L""); goto loop; }
+#line 150 "<stdout>"
+yy30:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy31;
+yy31:  if(yych == 0x000A)      goto yy6;
+       if(yych == '$') goto yy28;
+       goto yy30;
+yy32:  yych = *++YYCURSOR;
+       if(yych != 'v') goto yy6;
+       goto yy33;
+yy33:  yych = *++YYCURSOR;
+       if(yych != 'i') goto yy6;
+       goto yy34;
+yy34:  yych = *++YYCURSOR;
+       if(yych != 's') goto yy6;
+       goto yy35;
+yy35:  yych = *++YYCURSOR;
+       if(yych != 'i') goto yy6;
+       goto yy36;
+yy36:  yych = *++YYCURSOR;
+       if(yych != 'o') goto yy6;
+       goto yy37;
+yy37:  yych = *++YYCURSOR;
+       if(yych != 'n') goto yy6;
+       goto yy38;
+yy38:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy40;
+       if(yych != ':') goto yy6;
+       goto yy39;
+yy39:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy43;
+yy40:  ++YYCURSOR;
+       goto yy41;
+yy41:
+#line 51 "cvsignore.w.re"
+{ APPEND(L"$Revision$"); goto loop; }
+#line 188 "<stdout>"
+yy42:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy43;
+yy43:  if(yych == 0x000A)      goto yy6;
+       if(yych == '$') goto yy40;
+       goto yy42;
+yy44:  yych = *++YYCURSOR;
+       if(yych != 'u') goto yy6;
+       goto yy45;
+yy45:  yych = *++YYCURSOR;
+       if(yych != 'r') goto yy6;
+       goto yy46;
+yy46:  yych = *++YYCURSOR;
+       if(yych != 'c') goto yy6;
+       goto yy47;
+yy47:  yych = *++YYCURSOR;
+       if(yych != 'e') goto yy6;
+       goto yy48;
+yy48:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy50;
+       if(yych != ':') goto yy6;
+       goto yy49;
+yy49:  yych = *++YYCURSOR;
+       if(yych == '$') goto yy6;
+       goto yy53;
+yy50:  ++YYCURSOR;
+       goto yy51;
+yy51:
+#line 52 "cvsignore.w.re"
+{ APPEND(L"$Source$"); goto loop; }
+#line 220 "<stdout>"
+yy52:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       goto yy53;
+yy53:  if(yych == 0x000A)      goto yy6;
+       if(yych == '$') goto yy50;
+       goto yy52;
+}
+#line 55 "cvsignore.w.re"
+
+       }
+       output[outsize] = '\0';
+
+       // set the new size
+       *pSize = outsize;
+       
+       *pbChanged = (insize == outsize) ? 0 : 1;
+}
diff --git a/test/cvsignore.w.re b/test/cvsignore.w.re
new file mode 100755 (executable)
index 0000000..74d4dce
--- /dev/null
@@ -0,0 +1,67 @@
+
+#define YYFILL(n) if (cursor >= limit) break;
+#define YYCTYPE unsigned short
+#define YYCURSOR cursor
+#define YYLIMIT limit
+#define YYMARKER marker
+
+/*!re2c
+any     = (.|"\n");
+value  = (":" (.\"$")+)?;
+cvsdat = "Date";
+cvsid  = "Id";
+cvslog = "Log";
+cvsrev = "Revision";
+cvssrc = "Source";
+*/
+
+#define APPEND(text) \
+       append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))
+
+inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)
+{
+       memcpy(output + outsize, text, len);
+       outsize += (len / sizeof(YYCTYPE));
+}
+
+void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)
+{
+       // rule
+       // scan lines
+       // find $ in lines
+       //   compact $<keyword>: .. $ to $<keyword>$
+  
+       YYCTYPE *output;
+       const YYCTYPE *cursor, *limit, *marker;
+
+       cursor = marker = output = *pText;
+
+       size_t insize = *pSize;
+       size_t outsize = 0;
+
+       limit = cursor + insize;
+
+       while(1) {
+loop:
+/*!re2c
+
+"$" cvsdat value "$"   { APPEND(L"$Date$"); goto loop; }
+"$" cvsid  value "$"   { APPEND(L"$Id$"); goto loop; }
+"$" cvslog value "$"   { APPEND(L"$Log$
+"$" cvslog value "$"   { APPEND(L"Revision 1.1  2005/12/29 15:42:02  helly
+"$" cvslog value "$"   { APPEND(L"- Allow to test with specific switches by providing them in test filename
+"$" cvslog value "$"   { APPEND(L"- Add first unicode tests
+"$" cvslog value "$"   { APPEND(L""); goto loop; }
+"$" cvsrev value "$"   { APPEND(L"$Revision$"); goto loop; }
+"$" cvssrc value "$"   { APPEND(L"$Source$"); goto loop; }
+any                                            { output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }
+
+*/
+       }
+       output[outsize] = '\0';
+
+       // set the new size
+       *pSize = outsize;
+       
+       *pbChanged = (insize == outsize) ? 0 : 1;
+}