/src/avahi/avahi-common/utf8.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* This file is based on the GLIB utf8 validation functions. The |
2 | | * original license text follows. */ |
3 | | |
4 | | /* gutf8.c - Operations on UTF-8 strings. |
5 | | * |
6 | | * Copyright (C) 1999 Tom Tromey |
7 | | * Copyright (C) 2000 Red Hat, Inc. |
8 | | * |
9 | | * This library is free software; you can redistribute it and/or |
10 | | * modify it under the terms of the GNU Lesser General Public |
11 | | * License as published by the Free Software Foundation; either |
12 | | * version 2 of the License, or (at your option) any later version. |
13 | | * |
14 | | * This library is distributed in the hope that it will be useful, |
15 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 | | * Lesser General Public License for more details. |
18 | | * |
19 | | * You should have received a copy of the GNU Lesser General Public |
20 | | * License along with this library; if not, write to the |
21 | | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
22 | | * Boston, MA 02111-1307, USA. |
23 | | */ |
24 | | |
25 | | #ifdef HAVE_CONFIG_H |
26 | | #include <config.h> |
27 | | #endif |
28 | | |
29 | | #include <stdlib.h> |
30 | | |
31 | | #include "utf8.h" |
32 | | |
33 | | #define UNICODE_VALID(Char) \ |
34 | 0 | ((Char) < 0x110000 && \ |
35 | 0 | (((Char) & 0xFFFFF800) != 0xD800) && \ |
36 | 0 | ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ |
37 | 0 | ((Char) & 0xFFFE) != 0xFFFE) |
38 | | |
39 | | |
40 | | #define CONTINUATION_CHAR \ |
41 | 0 | do { \ |
42 | 0 | if ((*(const unsigned char *)p & 0xc0) != 0x80) /* 10xxxxxx */ \ |
43 | 0 | goto error; \ |
44 | 0 | val <<= 6; \ |
45 | 0 | val |= (*(const unsigned char *)p) & 0x3f; \ |
46 | 0 | } while(0) |
47 | | |
48 | | |
49 | | const char * |
50 | | avahi_utf8_valid (const char *str) |
51 | | |
52 | 371 | { |
53 | 371 | unsigned val = 0; |
54 | 371 | unsigned min = 0; |
55 | 371 | const char *p; |
56 | | |
57 | 35.6M | for (p = str; *p; p++) |
58 | 35.6M | { |
59 | 35.6M | if (*(const unsigned char *)p < 128) |
60 | 35.6M | /* done */; |
61 | 0 | else |
62 | 0 | { |
63 | 0 | if ((*(const unsigned char *)p & 0xe0) == 0xc0) /* 110xxxxx */ |
64 | 0 | { |
65 | 0 | if ( ((*(const unsigned char *)p & 0x1e) == 0)) |
66 | 0 | goto error; |
67 | 0 | p++; |
68 | 0 | if ( ((*(const unsigned char *)p & 0xc0) != 0x80)) /* 10xxxxxx */ |
69 | 0 | goto error; |
70 | 0 | } |
71 | 0 | else |
72 | 0 | { |
73 | 0 | if ((*(const unsigned char *)p & 0xf0) == 0xe0) /* 1110xxxx */ |
74 | 0 | { |
75 | 0 | min = (1 << 11); |
76 | 0 | val = *(const unsigned char *)p & 0x0f; |
77 | 0 | goto TWO_REMAINING; |
78 | 0 | } |
79 | 0 | else if ((*(const unsigned char *)p & 0xf8) == 0xf0) /* 11110xxx */ |
80 | 0 | { |
81 | 0 | min = (1 << 16); |
82 | 0 | val = *(const unsigned char *)p & 0x07; |
83 | 0 | } |
84 | 0 | else |
85 | 0 | goto error; |
86 | | |
87 | 0 | p++; |
88 | 0 | CONTINUATION_CHAR; |
89 | 0 | TWO_REMAINING: |
90 | 0 | p++; |
91 | 0 | CONTINUATION_CHAR; |
92 | 0 | p++; |
93 | 0 | CONTINUATION_CHAR; |
94 | | |
95 | 0 | if ( (val < min)) |
96 | 0 | goto error; |
97 | | |
98 | 0 | if ( (!UNICODE_VALID(val))) |
99 | 0 | goto error; |
100 | 0 | } |
101 | | |
102 | 0 | continue; |
103 | | |
104 | 0 | error: |
105 | 0 | return NULL; |
106 | 0 | } |
107 | 35.6M | } |
108 | | |
109 | 371 | return str; |
110 | 371 | } |