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 {