Mercurial > projects > ldc
comparison runtime/internal/adi.d @ 855:e78e1d559a76
Apply fix for #151.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Mon, 15 Dec 2008 21:09:33 +0100 |
parents | a26b0c5d5942 |
children |
comparison
equal
deleted
inserted
replaced
854:0ffa92f4ac99 | 855:e78e1d559a76 |
---|---|
61 * reversed. | 61 * reversed. |
62 */ | 62 */ |
63 | 63 |
64 extern (C) char[] _adReverseChar(char[] a) | 64 extern (C) char[] _adReverseChar(char[] a) |
65 { | 65 { |
66 bool hadErrors = false; | |
66 if (a.length > 1) | 67 if (a.length > 1) |
67 { | 68 { |
68 char[6] tmp; | 69 char[6] tmp; |
69 char[6] tmplo; | 70 char[6] tmplo; |
70 char* lo = a.ptr; | 71 char* lo = a.ptr; |
84 hi--; | 85 hi--; |
85 continue; | 86 continue; |
86 } | 87 } |
87 | 88 |
88 uint stridelo = UTF8stride[clo]; | 89 uint stridelo = UTF8stride[clo]; |
89 // don't barf on invalid strides, just ignore it | 90 if (stridelo > 6) { // invalid UTF-8 0xFF |
90 if (stridelo == 0xFF) | 91 stridelo = 1; |
91 stridelo = 1; | 92 hadErrors=true; |
93 } | |
92 | 94 |
93 uint stridehi = 1; | 95 uint stridehi = 1; |
94 while ((chi & 0xC0) == 0x80) | 96 while ((chi & 0xC0) == 0x80 && hi >= lo) |
95 { | 97 { |
96 chi = *--hi; | 98 chi = *--hi; |
97 stridehi++; | 99 stridehi++; |
98 assert(hi >= lo); | 100 } |
99 } | 101 if (lo >= hi) { |
100 if (lo == hi) | 102 if (lo > hi) { |
103 hadErrors = true; | |
104 } | |
101 break; | 105 break; |
106 } | |
107 if (stridehi > 6) { | |
108 hadErrors = true; | |
109 stridehi = 6; | |
110 } | |
102 | 111 |
103 debug(adi) printf("\tstridelo = %d, stridehi = %d\n", stridelo, stridehi); | 112 debug(adi) printf("\tstridelo = %d, stridehi = %d\n", stridelo, stridehi); |
104 if (stridelo == stridehi) | 113 if (stridelo == stridehi) |
105 { | 114 { |
106 | |
107 memcpy(tmp.ptr, lo, stridelo); | 115 memcpy(tmp.ptr, lo, stridelo); |
108 memcpy(lo, hi, stridelo); | 116 memcpy(lo, hi, stridelo); |
109 memcpy(hi, tmp.ptr, stridelo); | 117 memcpy(hi, tmp.ptr, stridelo); |
110 lo += stridelo; | 118 lo += stridelo; |
111 hi--; | 119 hi--; |
122 | 130 |
123 lo += stridehi; | 131 lo += stridehi; |
124 hi = hi - 1 + (stridehi - stridelo); | 132 hi = hi - 1 + (stridehi - stridelo); |
125 } | 133 } |
126 } | 134 } |
135 if (hadErrors) | |
136 throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__); | |
127 return a; | 137 return a; |
128 } | 138 } |
129 | 139 |
130 unittest | 140 unittest |
131 { | 141 { |
159 * reversed. | 169 * reversed. |
160 */ | 170 */ |
161 | 171 |
162 extern (C) wchar[] _adReverseWchar(wchar[] a) | 172 extern (C) wchar[] _adReverseWchar(wchar[] a) |
163 { | 173 { |
174 bool hadErrors = false; | |
164 if (a.length > 1) | 175 if (a.length > 1) |
165 { | 176 { |
166 wchar[2] tmp; | 177 wchar[2] tmp; |
167 wchar* lo = a.ptr; | 178 wchar* lo = a.ptr; |
168 wchar* hi = &a[length - 1]; | 179 wchar* hi = &a[length - 1]; |
186 int stridehi = 1; | 197 int stridehi = 1; |
187 if (chi >= 0xDC00 && chi <= 0xDFFF) | 198 if (chi >= 0xDC00 && chi <= 0xDFFF) |
188 { | 199 { |
189 chi = *--hi; | 200 chi = *--hi; |
190 stridehi++; | 201 stridehi++; |
191 assert(hi >= lo); | 202 } |
192 } | 203 if (lo >= hi) { |
193 if (lo == hi) | 204 if (lo > hi) { |
205 hadErrors = true; | |
206 } | |
194 break; | 207 break; |
208 } | |
195 | 209 |
196 if (stridelo == stridehi) | 210 if (stridelo == stridehi) |
197 { int stmp; | 211 { int stmp; |
198 | 212 |
199 assert(stridelo == 2); | 213 assert(stridelo == 2); |
215 | 229 |
216 lo += stridehi; | 230 lo += stridehi; |
217 hi = hi - 1 + (stridehi - stridelo); | 231 hi = hi - 1 + (stridehi - stridelo); |
218 } | 232 } |
219 } | 233 } |
234 if (hadErrors) | |
235 throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__); | |
220 return a; | 236 return a; |
221 } | 237 } |
222 | 238 |
223 unittest | 239 unittest |
224 { | 240 { |