diff options
author | Jeffrey Stedfast <fejj@ximian.com> | 2002-12-04 02:23:17 +0800 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2002-12-04 02:23:17 +0800 |
commit | 7ddf575be5cfb146d586ce30f7cc01a162a2e9c9 (patch) | |
tree | c3fb77e7e20a9fc7ebb1eed35b73d43309fa4728 /camel/broken-date-parser.c | |
parent | 0fe83413d09ea683050aa1fc8f8b46b72aaafd72 (diff) | |
download | gsoc2013-evolution-7ddf575be5cfb146d586ce30f7cc01a162a2e9c9.tar.gz gsoc2013-evolution-7ddf575be5cfb146d586ce30f7cc01a162a2e9c9.tar.zst gsoc2013-evolution-7ddf575be5cfb146d586ce30f7cc01a162a2e9c9.zip |
Fixed to not get false positives when the token is shorter than the actual
2002-12-03 Jeffrey Stedfast <fejj@ximian.com>
* broken-date-parser.c (get_tzone): Fixed to not get false
positives when the token is shorter than the actual timezone
string (but matches the first little bit of it).
(datetok): Modified to properly handle when the first char of a
token is a special char (such as a '-') that is also used as a
token delimiter.
svn path=/trunk/; revision=18996
Diffstat (limited to 'camel/broken-date-parser.c')
-rw-r--r-- | camel/broken-date-parser.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/camel/broken-date-parser.c b/camel/broken-date-parser.c index 238665cb93..f6e697896c 100644 --- a/camel/broken-date-parser.c +++ b/camel/broken-date-parser.c @@ -123,14 +123,18 @@ datetok (const char *date) start = date; while (*start) { /* kill leading whitespace */ - for ( ; *start && isspace ((int) *start); start++); + while (*start && isspace ((int) *start)) + start++; - mask = 0; + if (*start == '\0') + break; + + mask = datetok_table[*start]; /* find the end of this token */ - for (end = start; *end && !strchr ("-/,\t\r\n ", *end); end++) { - mask |= datetok_table[*end]; - } + end = start + 1; + while (*end && !strchr ("-/,\t\r\n ", *end)) + mask |= datetok_table[*end++]; if (end != start) { token = g_malloc (sizeof (struct _date_token)); @@ -277,22 +281,31 @@ get_time (const unsigned char *in, unsigned int inlen, int *hour, int *min, int static int get_tzone (struct _date_token **token) { - int i; + const unsigned char *inptr, *inend; + unsigned int inlen; + int i, t; for (i = 0; *token && i < 2; *token = (*token)->next, i++) { - const unsigned char *inptr = (*token)->start; - unsigned int inlen = (*token)->len; + inptr = (*token)->start; + inlen = (*token)->len; + inend = inptr + inlen; if (*inptr == '+' || *inptr == '-') { return decode_int (inptr, inlen); } else { - int t; - - if (*inptr == '(') + if (*inptr == '(') { inptr++; + if (*(inend - 1) == ')') + inlen -= 2; + else + inlen--; + } for (t = 0; t < 15; t++) { - unsigned int len = MIN (strlen (tz_offsets[t].name), inlen - 1); + unsigned int len = strlen (tz_offsets[t].name); + + if (len != inlen) + continue; if (!strncmp (inptr, tz_offsets[t].name, len)) return tz_offsets[t].offset; |