deleting data after regex match with SILC_STR_REGEX. Affected
files are lib/silcutil/silcbuffmt.[ch].
+ * Handle regex anychar (.) with bounded repeat correctly.
+ Affected file is lib/silcutil/silcregex.c.
+
Sat Jan 5 18:00:06 EET 2008 Pekka Riikonen <priikone@silcnet.org>
* Added silc_buffer_equal to lib/silcutil/silcbuffer.h.
Rnormals and one Rplus. The third is compiled as n-1 Rnormals
and m-n Rnormals with Roptionals. 0 values have special
compilation. */
- int min, max, i;
+ int min, max, i, alen = 2;
if (pos >= size)
goto normal_char; /* Consider literal */
goto normal_char; /* Consider literal */
pos -= 2;
NEXTCHAR(a);
+ if (translate)
+ a = translate[(unsigned char)a];
+ op = silc_regexp_plain_ops[(unsigned char)a];
+
+ if (op == Ranychar) {
+ opcode = Canychar;
+ a = 0;
+ alen = 1;
+ }
+
NEXTCHAR(ch);
/* Get min value */
/* Store min - 1 many Cexacts. */
for (i = 0; i < min - 1; i++) {
SET_LEVEL_START;
- ALLOC(2);
- STORE(Cexact);
- STORE((unsigned char)a);
+ ALLOC(alen);
+ STORE(opcode);
+ if (a)
+ STORE((unsigned char)a);
}
break;
}
/* Store min - 1 many Cexacts. */
for (i = 0; i < min - 1; i++) {
SET_LEVEL_START;
- ALLOC(2);
- STORE(Cexact);
- STORE((unsigned char)a);
+ ALLOC(alen);
+ STORE(opcode);
+ if (a)
+ STORE((unsigned char)a);
}
/* Store Rplus */
/* Store min - 1 many Cexacts. */
for (i = 0; min && i < min - 1; i++) {
SET_LEVEL_START;
- ALLOC(2);
- STORE(Cexact);
- STORE((unsigned char)a);
+ ALLOC(alen);
+ STORE(opcode);
+ if (a)
+ STORE((unsigned char)a);
}
/* Store max - min Cexacts and Roptionals. */
for (i = 0; i < max - min; i++) {
SET_LEVEL_START;
- ALLOC(2);
- STORE(Cexact);
- STORE((unsigned char)a);
+ ALLOC(alen);
+ STORE(opcode);
+ if (a)
+ STORE((unsigned char)a);
ALLOC(3);
INSERT_JUMP(CURRENT_LEVEL_START, Cfailure_jump,
pattern_offset + 3);
#define SILC_PARAM_REGEX 109
#define SILC_PARAM_OFFSET_START 110
#define SILC_PARAM_OFFSET_END 111
-#define SILC_PARAM_APPEND 112
-#define SILC_PARAM_DELETE 113
+#define SILC_PARAM_DELETE 112
#define SILC_PARAM_ALLOC 0x00010000 /* Allocate, bitmask */
+#define SILC_PARAM_APPEND 0x00020000 /* Append, bitmask */
/* Macros */
silc_log_set_debug_string("*regex*,*errno*");
}
+ regex = ".{5}";
+ SILC_LOG_DEBUG(("Regex %s", regex));
+ string = "abcdefghijklmn";
+ SILC_LOG_DEBUG(("Match %s", string));
+ if (!silc_regex(string, regex, &bmatch, NULL))
+ goto err;
+ silc_buffer_printf(&bmatch, TRUE);
+
+ regex = ".....";
+ SILC_LOG_DEBUG(("Regex %s", regex));
+ string = "abcdefghijklmn";
+ SILC_LOG_DEBUG(("Match %s", string));
+ if (!silc_regex(string, regex, &bmatch, NULL))
+ goto err;
+ silc_buffer_printf(&bmatch, TRUE);
+
regex = "^a{0}$";
SILC_LOG_DEBUG(("Regex %s", regex));
string = "";