diff options
author | Jeffrey Stedfast <fejj@novell.com> | 2004-08-06 01:38:05 +0800 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2004-08-06 01:38:05 +0800 |
commit | 796231864882de932677fb1adb5296143d9a3f38 (patch) | |
tree | c2734d0c915b1fab27f0da3e5fc099c669c8a0c9 /camel/camel-url-scanner.c | |
parent | 132c7a5a27f26c2a6f0dcb569cbf05d13fc9b1e2 (diff) | |
download | gsoc2013-evolution-796231864882de932677fb1adb5296143d9a3f38.tar.gz gsoc2013-evolution-796231864882de932677fb1adb5296143d9a3f38.tar.zst gsoc2013-evolution-796231864882de932677fb1adb5296143d9a3f38.zip |
In the case of start() or end() failing, loop starting with the first
2004-08-03 Jeffrey Stedfast <fejj@novell.com>
* 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
Diffstat (limited to 'camel/camel-url-scanner.c')
-rw-r--r-- | camel/camel-url-scanner.c | 36 |
1 files changed, 22 insertions, 14 deletions
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 <ctype.h> #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; } |