10139N/A--- libical-0.42/src/libical/icalparser.c.orig 2008-12-11 18:09:33.264006000 +0900
10139N/A+++ libical-0.42/src/libical/icalparser.c 2008-12-11 19:39:08.537992000 +0900
10139N/A@@ -81,6 +81,57 @@ static char* parser_get_param_name(char*
12217N/A
10139N/A #define TMP_BUF_SIZE 80
10139N/A
10139N/A+/*
10139N/A+ * Copied from glib.
10139N/A+ */
10139N/A+#define UTF8_COMPUTE(Char, Mask, Len) \
10139N/A+ if (Char < 128) \
10139N/A+ { \
10607N/A+ Len = 1; \
10295N/A+ Mask = 0x7f; \
14090N/A+ } \
10139N/A+ else if ((Char & 0xe0) == 0xc0) \
10139N/A+ { \
10139N/A+ Len = 2; \
10139N/A+ Mask = 0x1f; \
13262N/A+ } \
12773N/A+ else if ((Char & 0xf0) == 0xe0) \
12773N/A+ { \
12773N/A+ Len = 3; \
13441N/A+ Mask = 0x0f; \
10139N/A+ } \
10139N/A+ else if ((Char & 0xf8) == 0xf0) \
10139N/A+ { \
10139N/A+ Len = 4; \
10139N/A+ Mask = 0x07; \
10139N/A+ } \
10139N/A+ else if ((Char & 0xfc) == 0xf8) \
10139N/A+ { \
10139N/A+ Len = 5; \
10139N/A+ Mask = 0x03; \
10139N/A+ } \
10139N/A+ else if ((Char & 0xfe) == 0xfc) \
10139N/A+ { \
10139N/A+ Len = 6; \
10139N/A+ Mask = 0x01; \
10139N/A+ } \
10139N/A+ else \
10139N/A+ Len = -1;
10139N/A+
10139N/A+#define UTF8_GET(Result, Chars, Count, Mask, Len) \
10139N/A+ (Result) = (Chars)[0] & (Mask); \
10139N/A+ for ((Count) = 1; (Count) < (Len); ++(Count)) \
10139N/A+ { \
10139N/A+ if (((Chars)[(Count)] & 0xc0) != 0x80) \
10139N/A+ { \
10139N/A+ (Result) = -1; \
10139N/A+ break; \
10139N/A+ } \
10139N/A+ (Result) <<= 6; \
10139N/A+ (Result) |= ((Chars)[(Count)] & 0x3f); \
10139N/A+ }
10139N/A+
10139N/A+
10139N/A struct icalparser_impl
10139N/A {
10139N/A int buffer_full; /* flag indicates that temp is smaller that
10139N/A@@ -100,13 +151,89 @@ struct icalparser_impl
10139N/A };
10139N/A
10139N/A
10139N/A+int utf8_isspace_simple (int c)
10139N/A+{
10139N/A+ switch (c) {
10139N/A+ case 0x20:
12773N/A+ case 0xa0:
12773N/A+ case 0x1680:
12773N/A+ case 0x2002:
12773N/A+ case 0x2003:
12773N/A+ case 0x2004:
10139N/A+ case 0x2005:
10139N/A+ case 0x2006:
10139N/A+ case 0x2007:
10139N/A+ case 0x2008:
10139N/A+ case 0x2009:
10139N/A+ case 0x200a:
10139N/A+ case 0x200b:
10139N/A+ case 0x202f:
13270N/A+ case 0x205f:
10139N/A+ case 0x3000:
10139N/A+ case 0x303f:
10139N/A+ case 0xfeff:
10139N/A+ return 1;
10139N/A+ break;
10139N/A+ default:;
10139N/A+ }
10139N/A+
10139N/A+ return 0;
10139N/A+}
10139N/A+
10139N/A+/*
10139N/A+ * Copied from glib.
10139N/A+ */
10139N/A+char *utf8_find_prev_char (const char *str,
10139N/A+ const char *p)
10139N/A+{
10139N/A+ for (--p; p >= str; --p)
10139N/A+ {
10139N/A+ if ((*p & 0xc0) != 0x80)
10139N/A+ return (char *)p;
10139N/A+ }
10139N/A+ return NULL;
10139N/A+}
10139N/A+
10139N/A+
10139N/A+char *utf8_find_next_char (const char *p,
10139N/A+ const char *end)
10139N/A+{
10139N/A+ if (*p)
10139N/A+ {
10139N/A+ if (end)
10139N/A+ for (++p; p < end && (*p & 0xc0) == 0x80; ++p)
10139N/A+ ;
10139N/A+ else
10139N/A+ for (++p; (*p & 0xc0) == 0x80; ++p)
14090N/A+ ;
14090N/A+ }
13913N/A+ return (p == end) ? NULL : (char *)p;
13913N/A+}
13754N/A+
13754N/A+
13754N/A+int utf8_get_char (const char *p)
13631N/A+{
13631N/A+ int i, mask = 0, len;
13631N/A+ int result;
13631N/A+ unsigned char c = (unsigned char) *p;
13631N/A+
13441N/A+ UTF8_COMPUTE (c, mask, len);
13631N/A+ if (len == -1)
13420N/A+ return (int)-1;
13420N/A+ UTF8_GET (result, p, i, mask, len);
13420N/A+
13312N/A+ return result;
13312N/A+}
13312N/A+
13270N/A+
13270N/A /*
13270N/A * New version of strstrip() that does not move the pointer.
13262N/A */
13262N/A void strstriplt(char *buf)
13262N/A {
13103N/A size_t len;
13103N/A- int a;
13103N/A+ int a, c;
12812N/A+ char *p;
12812N/A
12812N/A if (buf==NULL) {
12631N/A return;
12631N/A@@ -115,17 +242,27 @@ void strstriplt(char *buf)
12631N/A return;
12631N/A }
12572N/A len = strlen(buf);
12572N/A- while ((buf[0] != 0) && (isspace(buf[len - 1]))) {
12572N/A- buf[--len] = 0;
12466N/A+ p = buf + len;
12466N/A+ while ((buf[0] != 0) && ((p = utf8_find_prev_char(buf, p)) != NULL)) {
12466N/A+ c = utf8_get_char (p);
12360N/A+ if (!utf8_isspace_simple (c))
12360N/A+ break;
12360N/A+ *p = 0;
12287N/A }
12295N/A if (buf[0] == 0) {
12295N/A return;
12295N/A }
12287N/A a = 0;
12287N/A- while ((buf[0]!=0) && (isspace(buf[a]))) {
12217N/A- a++;
12217N/A+ p = buf;
12217N/A+ while ((buf[0]!=0) && p && *p) {
12071N/A+ c = utf8_get_char (p);
12071N/A+ if (!utf8_isspace_simple (c))
12071N/A+ break;
12022N/A+ p = utf8_find_next_char (p, NULL);
12022N/A+ if (p != NULL)
12022N/A+ a = p - buf;
11922N/A }
11922N/A- if (a > 0) {
11922N/A+ if (p != NULL) {
11819N/A memmove(buf, &buf[a], len - a + 1);
11819N/A }
11819N/A }
11416N/A