* Sebastian Hammer, Adam Dickmeiss
*
* $Log: dfa.c,v $
- * Revision 1.5 1995-10-02 15:17:58 adam
+ * Revision 1.7 1995-11-27 09:23:02 adam
+ * New berbatim hook in regular expressions. "[]n ..".
+ *
+ * Revision 1.6 1995/10/16 09:31:25 adam
+ * Bug fix.
+ *
+ * Revision 1.5 1995/10/02 15:17:58 adam
* Bug fix in dfa_delete.
*
* Revision 1.4 1995/09/28 09:18:52 adam
static int err_code;
static int inside_string;
static const unsigned char *expr_ptr;
+static int expr_verbatim;
static unsigned short *ctrl_chars;
static struct Tnode **posar;
parse_info = dfap;
err_code = 0;
expr_ptr = (unsigned char *) *s;
+ expr_verbatim = 0;
inside_string = 0;
lex ();
*esc = 0;
if (*expr_ptr == '\0' || isspace(*expr_ptr))
return 0;
- else if (*expr_ptr != '\\')
+ else if (*expr_ptr != '\\' || expr_verbatim)
+ {
+ if (*expr_ptr == '[' && expr_ptr[1] == ']' && !expr_verbatim)
+ {
+ int i = 2;
+ int val = 0;
+ while (expr_ptr[i] >= '0' && expr_ptr[i] <= '9')
+ val = val*10 + expr_ptr[i++]-'0';
+ if (i > 2)
+ {
+ if (expr_ptr[i] == ' ')
+ i++;
+ expr_verbatim = val;
+ expr_ptr += i;
+ }
+ }
+ if (expr_verbatim)
+ {
+ assert (expr_verbatim > 0);
+ *esc = 1;
+ --expr_verbatim;
+ }
return *expr_ptr++;
+ }
*esc = 1;
switch (*++expr_ptr)
{
return read_charset();
else if (look_ch == ' ')
return 0;
- else
+ else
{
for (cc = ctrl_chars; *cc; cc += 2)
if (*cc == look_ch)
{
char_0 = max_char+1;
for (pos_i = pos; (i = *pos_i) != -1; ++pos_i)
- if (posar[i]->u.ch[1] >= char_1)
- if ((c=posar[i]->u.ch[0]) < char_0)
- if (c < char_1)
- char_0 = char_1;
- else
- char_0 = c;
+ if (posar[i]->u.ch[1] >= char_1
+ && (c=posar[i]->u.ch[0]) < char_0)
+ if (c < char_1)
+ char_0 = char_1;
+ else
+ char_0 = c;
- char_1 = max_char;
if (char_0 > max_char)
break;
+
+ char_1 = max_char;
+
tran_set = mk_Set (poset);
for (pos_i = pos; (i = *pos_i) != -1; ++pos_i)
- if ((c=posar[i]->u.ch[1]) >= char_0)
- if (posar[i]->u.ch[0] <= char_0)
- {
- if (c < char_1)
- char_1 = c;
- tran_set = union_Set (poset, tran_set, followpos[i]);
- }
- else if (c <= char_1)
- char_1 = c-1;
+ {
+ if ((c=posar[i]->u.ch[0]) > char_0 && c <= char_1)
+ char_1 = c - 1; /* forward chunk */
+ else if ((c=posar[i]->u.ch[1]) >= char_0 && c < char_1)
+ char_1 = c; /* backward chunk */
+ if (posar[i]->u.ch[1] >= char_0 && posar[i]->u.ch[0] <= char_0)
+ tran_set = union_Set (poset, tran_set, followpos[i]);
+ }
if (tran_set)
{
add_DFA_state (dfas, &tran_set, &dfa_to);