summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authorJohn Millaway <john43@users.sourceforge.net>2006-03-27 22:04:15 +0000
committerJohn Millaway <john43@users.sourceforge.net>2006-03-27 22:04:15 +0000
commit9863e4026315429cf0f2bbe4e8e389b8aaa2c9b3 (patch)
treed3593d1483af6d4ab9dcbe75efe55b6f4f4e9f6a /parse.y
parenta1037c0e1e7ffba540b80c38e4d95265312781b3 (diff)
Implemented dot-all syntax.
Added test for dot-all syntax in test suite.
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y31
1 files changed, 22 insertions, 9 deletions
diff --git a/parse.y b/parse.y
index cecda23..e66deb8 100644
--- a/parse.y
+++ b/parse.y
@@ -105,13 +105,14 @@ char *alloca ();
/* Bletch, ^^^^ that was ugly! */
-int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, rulelen;
+int pat, scnum, eps, headcnt, trailcnt, lastchar, i, rulelen;
int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule;
int *scon_stk;
int scon_stk_ptr;
static int madeany = false; /* whether we've made the '.' character class */
+static int ccldot, cclany;
int previous_continued_action; /* whether the previous rule's action was '|' */
#define format_warn3(fmt, a1, a2) \
@@ -728,21 +729,33 @@ singleton : singleton '*'
if ( ! madeany )
{
/* Create the '.' character class. */
- anyccl = cclinit();
- ccladd( anyccl, '\n' );
- cclnegate( anyccl );
+ ccldot = cclinit();
+ ccladd( ccldot, '\n' );
+ cclnegate( ccldot );
- if ( useecs )
- mkeccl( ccltbl + cclmap[anyccl],
- ccllen[anyccl], nextecm,
- ecgroup, csize, csize );
+ if ( useecs )
+ mkeccl( ccltbl + cclmap[ccldot],
+ ccllen[ccldot], nextecm,
+ ecgroup, csize, csize );
+
+ /* Create the (?s:'.') character class. */
+ cclany = cclinit();
+ cclnegate( cclany );
+
+ if ( useecs )
+ mkeccl( ccltbl + cclmap[cclany],
+ ccllen[cclany], nextecm,
+ ecgroup, csize, csize );
madeany = true;
}
++rulelen;
- $$ = mkstate( -anyccl );
+ if (sf_dot_all())
+ $$ = mkstate( -cclany );
+ else
+ $$ = mkstate( -ccldot );
}
| fullccl