]> granicus.if.org Git - re2c/commitdiff
- Added re2c:yyfill:check inplace configuration.
authorhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Fri, 21 Mar 2008 21:23:07 +0000 (21:23 +0000)
committerhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Fri, 21 Mar 2008 21:23:07 +0000 (21:23 +0000)
- Added re2c:define:YYSETSTATE:naked inplace configuration.

re2c/CHANGELOG
re2c/code.cc
re2c/globals.h
re2c/htdocs/index.html
re2c/htdocs/manual.html
re2c/main.cc
re2c/re2c.1.in
re2c/test/config4g.ifs.c [new file with mode: 0755]
re2c/test/config4g.ifs.re [new file with mode: 0755]

index 6130bbd4871691f9094c2f61c3ccc55adc097765..9d0740044ede2146412585a46481137e7fb129c1 100644 (file)
@@ -1,5 +1,7 @@
 Version 0.13.4 (2008-??-??)
 ---------------------------
+- Added re2c:yyfill:check inplace configuration.
+- Added re2c:define:YYSETSTATE:naked inplace configuration.
 
 Version 0.13.3 (2008-03-14)
 ---------------------------
index 326b60e47c2fca47dd537cb702c3c2da390fda32..510fcc4aa7998ffe71d5db2aed286e9df9e0ff65 100644 (file)
@@ -420,14 +420,21 @@ static void need(std::ostream &o, uint ind, uint n, bool & readCh, bool bSetMark
 
        if (bUseYYFill && n > 0)
        {
+               o << indent(ind);
                if (n == 1)
                {
-                       o << indent(ind) << "if (" << mapCodeName["YYLIMIT"] << " == " << mapCodeName["YYCURSOR"] << ") ";
+                       if (bUseYYFillCheck)
+                       {
+                               o << "if (" << mapCodeName["YYLIMIT"] << " == " << mapCodeName["YYCURSOR"] << ") ";
+                       }
                        genYYFill(o, ind, n);
                }
                else
                {
-                       o << indent(ind) << "if ((" << mapCodeName["YYLIMIT"] << " - " << mapCodeName["YYCURSOR"] << ") < " << n << ") ";
+                       if (bUseYYFillCheck)
+                       {
+                               o << "if ((" << mapCodeName["YYLIMIT"] << " - " << mapCodeName["YYCURSOR"] << ") < " << n << ") ";
+                       }
                        genYYFill(o, ind, n);
                }
        }
@@ -2115,6 +2122,10 @@ void Scanner::config(const Str& cfg, int num)
        {
                bUseYYFillParam = num != 0;
        }
+       else if (cfg.to_string() == "yyfill:check")
+       {
+               bUseYYFillCheck = num != 0;
+       }
        else if (cfg.to_string() == "cgoto:threshold")
        {
                cGotoThreshold = num;
@@ -2148,6 +2159,10 @@ void Scanner::config(const Str& cfg, int num)
        {
                bUseYYGetStateNaked = num != 0;
        }
+       else if (cfg.to_string() == "define:YYSETSTATE:naked")
+       {
+               bUseYYSetStateNaked = num != 0;
+       }
        else
        {
                std::string msg = "unrecognized configuration name '";
index f5c887bbcf8ab29049d749f722ca82e79d9161a0..d94ec071100ef22829d57eb6ac1c788492ca7292 100644 (file)
@@ -69,10 +69,12 @@ extern bool bUseStateAbort;
 extern bool bUseStateNext;
 extern bool bUseYYFill;
 extern bool bUseYYFillParam;
+extern bool bUseYYFillCheck;
 extern bool bUseYYFillNaked;
 extern bool bUseYYSetConditionParam;
 extern bool bUseYYGetConditionNaked;
 extern bool bUseYYSetStateParam;
+extern bool bUseYYSetStateNaked;
 extern bool bUseYYGetStateNaked;
 extern bool bWroteGetState;
 extern bool bWroteCondCheck;
index bd1caa72bb10d5afa7b0ae6f00de4d53a21f9607..8d913f3e5cee6eb8411db441991b8eb2610512fa 100755 (executable)
@@ -81,6 +81,8 @@ fixes which were incorporated. <a href=
 <hr />
 <h1>Changelog</h1>
 <h2>2008-??-??: 0.13.4</h2>
+<li>Added re2c:yyfill:check inplace configuration.</li>
+<li>Added re2c:define:YYSETSTATE:naked inplace configuration.</li>
 <ul>
 </ul>
 <h2>2008-03-14: 0.13.3</h2>
index c2ff8331cc14bcddba82a3b89733a8fb8d6f15ff..1c6834cd2f5a5481829bafa7991c429ee5bba803 100755 (executable)
@@ -508,6 +508,9 @@ will be generated.</dd>
 <dd>Set this to zero to suppress generation of YYFILL(n). When using this be sure
 to verify that the generated scanner does not read behind input. Allowing
 this behavior might introduce sever security issues to you programs.</dd>
+<dt><i>re2c:yyfill:check</i> <b>=</b> 1 </b>;</b></dt>
+<dd>This can be set 0 to suppress output of the pre condition using YYCURSOR and
+YYLIMIT which becomes usefull when YYLIMIT + max(YYFILL) is always accessible.</dd>
 <dt><i>re2c:yyfill:parameter</i> <b>=</b> 1 <b>;</b></dt>
 <dd>Allows to suppress parameter passing to <b>YYFILL</b> calls. If set to zero 
 then no parameter is passed to <b>YYFILL</b>. However <b>define:YYFILL@LEN</b>
@@ -597,6 +600,8 @@ inside <b>YYSETCONDITION</b> will be replaced with the actual new condition valu
 <dt><i>re2c:define:YYSETSTATE</i> <b>=</b> YYSETSTATE <b>;</b></dt>
 <dd>Allows to overwrite the define <b>YYSETSTATE</b> and thus avoiding it by setting the
 value to the actual code needed.</dd>
+<dt><i>re2c:define:YYSETSTATE:naked</i> <b>=</b> 0 <b>;</b></dt>
+<dt>Wehn set to 1 neither braces, parameter nor semicolon gets emitted.</dt>
 <dt><i>re2c:define:YYSETSTATE@state</i> <b>=</b> @@ <b>;</b></dt>
 <dd>When using <b>re2c:define:YYSETSTATE</b> then any occurence of this text 
 inside <b>YYSETSTATE</b> will be replaced with the actual new state value.</dd>
index 22c270af716c52a5b9aa3ab17f79846a292390da..b33ace15d743c8ca2650d98073d5120963227b44 100644 (file)
@@ -53,10 +53,12 @@ bool bUseStartLabel  = false;
 bool bUseStateNext   = false;
 bool bUseYYFill      = true;
 bool bUseYYFillParam = true;
+bool bUseYYFillCheck = true;
 bool bUseYYFillNaked = false;
 bool bUseYYSetConditionParam = true;
 bool bUseYYGetConditionNaked = false;
 bool bUseYYSetStateParam = true;
+bool bUseYYSetStateNaked = false;
 bool bUseYYGetStateNaked = false;
 
 std::string startLabelName;
index a9640ab5c4f714f631b2bee8effe530bfdaa6acc..1088a935042ecbce85300df06e40eec5013a9656 100644 (file)
@@ -613,6 +613,10 @@ Set this to zero to suppress generation of YYFILL(n). When using this be sure
 to verify that the generated scanner does not read behind input. Allowing
 this behavior might introduce sever security issues to you programs.
 .TP
+\fIre2c:yyfill:check\fP \fB=\fP 1 \fB;\fP
+This can be set 0 to suppress output of the pre condition using YYCURSOR and
+YYLIMIT which becomes usefull when YYLIMIT + max(YYFILL) is always accessible.
+.TP
 \fIre2c:yyfill:parameter\fP \fB=\fP 1 \fB;\fP
 Allows to suppress parameter passing to \fBYYFILL\fP calls. If set to zero 
 then no parameter is passed to \fBYYFILL\fP. However \fBdefine:YYFILL@LEN\fP
@@ -726,6 +730,9 @@ inside \fBYYSETCONDITION\fP will be replaced with the actual new condition value
 Allows to overwrite the define \fBYYSETSTATE\fP and thus avoiding it by setting the
 value to the actual code needed.
 .TP
+\fIre2c:define:YYSETSTATE:naked\fP \fB=\fP 0 \fB;\fP
+Wehn set to 1 neither braces, parameter nor semicolon gets emitted.
+.TP
 \fIre2c:define:YYSETSTATE@state\fP \fB=\fP @@ \fB;\fP
 When using \fIre2c:define:YYSETSTATE\fP then any occurence of this text 
 inside \fBYYSETSTATE\fP will be replaced with the actual new state value.
diff --git a/re2c/test/config4g.ifs.c b/re2c/test/config4g.ifs.c
new file mode 100755 (executable)
index 0000000..e7aa002
--- /dev/null
@@ -0,0 +1,47 @@
+/* Generated by re2c */
+#define        NULL            ((char*) 0)
+
+const unsigned char *scan(const unsigned char *p, unsigned int len, int *state)
+{
+       unsigned char c;
+       const unsigned char *q;
+       const unsigned char * const e = p + len;
+
+       switch (*state) {
+       default: goto yy0;
+       case 0: goto yyFillLabel0;
+       case 1: goto yyFillLabel1;
+       }
+
+
+yy0:
+       *state = 0;
+       if (p >= e) {
+               return NULL;
+       }
+yyFillLabel0:
+       c = *p;
+       if (c <= '/') goto yy4;
+       if (c >= ':') goto yy4;
+       ++p;
+       c = *p;
+       goto yy7;
+yy3:
+       { return p; }
+yy4:
+       ++p;
+       { return NULL; }
+yy6:
+       ++p;
+       *state = 1;
+       if (p >= e) {
+               return NULL;
+       }
+yyFillLabel1:
+       c = *p;
+yy7:
+       if (c <= '/') goto yy3;
+       if (c <= '9') goto yy6;
+       goto yy3;
+
+}
diff --git a/re2c/test/config4g.ifs.re b/re2c/test/config4g.ifs.re
new file mode 100755 (executable)
index 0000000..4d17b33
--- /dev/null
@@ -0,0 +1,31 @@
+#define        NULL            ((char*) 0)
+
+const unsigned char *scan(const unsigned char *p, unsigned int len, int *state)
+{
+       unsigned char c;
+       const unsigned char *q;
+       const unsigned char * const e = p + len;
+/*!re2c
+re2c:variable:yych           = c;
+re2c:indent:top              = 1;
+re2c:state:abort             = 0;
+re2c:state:nextlabel         = 0;
+re2c:define:YYCTYPE          = char;
+re2c:define:YYCURSOR         = p;
+re2c:define:YYLIMIT          = e;
+re2c:define:YYMARKER         = q;
+re2c:yyfill:check            = 0;
+re2c:define:YYFILL:naked     = 1;
+re2c:define:YYFILL           = "if (p >= e) {\n\t\treturn NULL;\n\t}";
+re2c:define:YYSETSTATE       = "*state = @;";
+re2c:define:YYSETSTATE:naked = 1;
+re2c:define:YYSETSTATE@state = "@";
+re2c:define:YYGETSTATE       = "*state";
+re2c:define:YYGETSTATE:naked = 1;
+*/
+/*!getstate:re2c */
+/*!re2c
+       [0-9]+          { return p; }
+       [\000-\377]     { return NULL; }
+*/
+}