From 796231864882de932677fb1adb5296143d9a3f38 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Thu, 5 Aug 2004 17:38:05 +0000 Subject: In the case of start() or end() failing, loop starting with the first 2004-08-03 Jeffrey Stedfast * camel-url-scanner.c (camel_url_scanner_scan): In the case of start() or end() failing, loop starting with the first character immediately following the failed match position. Fixes bug #62136. svn path=/trunk/; revision=26831 --- camel/camel-url-scanner.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'camel/camel-url-scanner.c') diff --git a/camel/camel-url-scanner.c b/camel/camel-url-scanner.c index 891a47610e..1240731f9b 100644 --- a/camel/camel-url-scanner.c +++ b/camel/camel-url-scanner.c @@ -30,6 +30,7 @@ #include #include "e-util/e-trie.h" +#include "camel-utf8.h" #include "camel-url-scanner.h" @@ -76,29 +77,36 @@ camel_url_scanner_add (CamelUrlScanner *scanner, urlpattern_t *pattern) gboolean camel_url_scanner_scan (CamelUrlScanner *scanner, const char *in, size_t inlen, urlmatch_t *match) { - const char *pos, *inend; + const char *pos, *inptr, *inend; urlpattern_t *pat; int pattern; g_return_val_if_fail (scanner != NULL, FALSE); g_return_val_if_fail (in != NULL, FALSE); - if (!(pos = e_trie_search (scanner->trie, in, inlen, &pattern))) - return FALSE; - - pat = g_ptr_array_index (scanner->patterns, pattern); - - match->pattern = pat->pattern; - match->prefix = pat->prefix; - + inptr = in; inend = in + inlen; - if (!pat->start (in, pos, inend, match)) - return FALSE; - if (!pat->end (in, pos, inend, match)) - return FALSE; + do { + if (!(pos = e_trie_search (scanner->trie, inptr, inlen, &pattern))) + return FALSE; + + pat = g_ptr_array_index (scanner->patterns, pattern); + + match->pattern = pat->pattern; + match->prefix = pat->prefix; + + if (pat->start (in, pos, inend, match) && pat->end (in, pos, inend, match)) + return TRUE; + + inptr = pos; + if (camel_utf8_getc_limit ((const unsigned char **) &inptr, inend) == 0xffff) + break; + + inlen = inend - inptr; + } while (inptr < inend); - return TRUE; + return FALSE; } -- cgit