aboutsummaryrefslogtreecommitdiffstats
path: root/camel/broken-date-parser.c
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2002-12-04 02:23:17 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2002-12-04 02:23:17 +0800
commit7ddf575be5cfb146d586ce30f7cc01a162a2e9c9 (patch)
treec3fb77e7e20a9fc7ebb1eed35b73d43309fa4728 /camel/broken-date-parser.c
parent0fe83413d09ea683050aa1fc8f8b46b72aaafd72 (diff)
downloadgsoc2013-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.c37
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;