aboutsummaryrefslogtreecommitdiffstats
path: root/dfa.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2016-09-09 08:37:55 +0300
committerArnold D. Robbins <arnold@skeeve.com>2016-09-09 08:37:55 +0300
commit41232b08f9db67a0a6d3e86324d776496c212560 (patch)
treeeb48b249f9f5bf56057143961d977403042395db /dfa.c
parent45ee4486199d449b9aeaeadcf98523d82f943ec8 (diff)
downloadegawk-41232b08f9db67a0a6d3e86324d776496c212560.tar.gz
egawk-41232b08f9db67a0a6d3e86324d776496c212560.tar.bz2
egawk-41232b08f9db67a0a6d3e86324d776496c212560.zip
Sync dfa.c. The neverending story.
Diffstat (limited to 'dfa.c')
-rw-r--r--dfa.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/dfa.c b/dfa.c
index cf9b2ba8..b162a3b3 100644
--- a/dfa.c
+++ b/dfa.c
@@ -1487,7 +1487,7 @@ lex (struct dfa *dfa)
{
zeroset (ccl);
for (c2 = 0; c2 < NOTCHAR; ++c2)
- if (unibyte_word_constituent (dfa, c2))
+ if (dfa->syntax.sbit[c2] == CTX_LETTER)
setbit (c2, ccl);
if (c == 'W')
notset (ccl);
@@ -2204,11 +2204,10 @@ charclass_context (struct dfa const *dfa, charclass c)
int context = 0;
unsigned int j;
- if (tstbit (dfa->syntax.eolbyte, c))
- context |= CTX_NEWLINE;
-
for (j = 0; j < CHARCLASS_WORDS; ++j)
{
+ if (c[j] & dfa->syntax.newline[j])
+ context |= CTX_NEWLINE;
if (c[j] & dfa->syntax.letters[j])
context |= CTX_LETTER;
if (c[j] & ~(dfa->syntax.letters[j] | dfa->syntax.newline[j]))
@@ -2702,13 +2701,27 @@ dfastate (state_num s, struct dfa *d, state_num trans[])
is to fail miserably. */
if (d->searchflag)
{
+ int c;
+
state_newline = 0;
state_letter = d->min_trcount - 1;
state = d->initstate_notbol;
- for (i = 0; i < NOTCHAR; ++i)
- trans[i] = unibyte_word_constituent (d, i) ? state_letter : state;
- trans[d->syntax.eolbyte] = state_newline;
+ for (c = 0; c < NOTCHAR; ++c)
+ {
+ switch (d->syntax.sbit[c])
+ {
+ case CTX_NEWLINE:
+ trans[c] = state_newline;
+ break;
+ case CTX_LETTER:
+ trans[c] = state_letter;
+ break;
+ default:
+ trans[c] = state;
+ break;
+ }
+ }
}
else
for (i = 0; i < NOTCHAR; ++i)
@@ -2811,12 +2824,18 @@ dfastate (state_num s, struct dfa *d, state_num trans[])
{
int c = j * CHARCLASS_WORD_BITS + k;
- if (c == d->syntax.eolbyte)
- trans[c] = state_newline;
- else if (unibyte_word_constituent (d, c))
- trans[c] = state_letter;
- else if (c < NOTCHAR)
- trans[c] = state;
+ switch (d->syntax.sbit[c])
+ {
+ case CTX_NEWLINE:
+ trans[c] = state_newline;
+ break;
+ case CTX_LETTER:
+ trans[c] = state_letter;
+ break;
+ default:
+ trans[c] = state;
+ break;
+ }
}
}