]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added uni_utf8_str_is_valid().
authorTimo Sirainen <tss@iki.fi>
Tue, 10 Nov 2009 02:21:55 +0000 (21:21 -0500)
committerTimo Sirainen <tss@iki.fi>
Tue, 10 Nov 2009 02:21:55 +0000 (21:21 -0500)
--HG--
branch : HEAD

src/lib/unichar.c
src/lib/unichar.h

index 7a0a95f105e1446795527547363e231a5001f239..bbd043edf3d6798788e61217dded6dc7c1a674f0 100644 (file)
@@ -323,8 +323,8 @@ is_valid_utf8_seq(const unsigned char *input, unsigned int size)
        return len;
 }
 
-bool uni_utf8_get_valid_data(const unsigned char *input, size_t size,
-                            buffer_t *buf)
+static int uni_utf8_find_invalid_pos(const unsigned char *input, size_t size,
+                                    size_t *pos_r)
 {
        size_t i, len;
 
@@ -334,13 +334,24 @@ bool uni_utf8_get_valid_data(const unsigned char *input, size_t size,
                        i++;
                else {
                        len = is_valid_utf8_seq(input + i, size-i);
-                       if (unlikely(len == 0))
-                               goto broken;
+                       if (unlikely(len == 0)) {
+                               *pos_r = i;
+                               return -1;
+                       }
                        i += len;
                }
        }
-       return TRUE;
-broken:
+       return 0;
+}
+
+bool uni_utf8_get_valid_data(const unsigned char *input, size_t size,
+                            buffer_t *buf)
+{
+       size_t i, len;
+
+       if (uni_utf8_find_invalid_pos(input, size, &i) == 0)
+               return TRUE;
+
        /* broken utf-8 input - skip the broken characters */
        buffer_append(buf, input, i++);
 
@@ -362,3 +373,11 @@ broken:
        }
        return FALSE;
 }
+
+bool uni_utf8_str_is_valid(const char *str)
+{
+       size_t i;
+
+       return uni_utf8_find_invalid_pos((const unsigned char *)str,
+                                        strlen(str), &i) == 0;
+}
index 73a1c5439e1052d6a9b030c4ab56f06da3efab87..5dfaf8e70fb1789af28b2463b1a561140e118ae6 100644 (file)
@@ -69,5 +69,7 @@ int uni_utf8_to_decomposed_titlecase(const void *input, size_t max_len,
    replacement character (0xfffd), write the output to buf and return FALSE. */
 bool uni_utf8_get_valid_data(const unsigned char *input, size_t size,
                             buffer_t *buf);
+/* Returns TRUE if string is valid UTF-8 input. */
+bool uni_utf8_str_is_valid(const char *str);
 
 #endif