︙ | | |
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
|
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
|
-
+
|
default:
@throw [OFInvalidEncodingException exception];
}
j = 0;
for (size_t i = 0; i < cStringLength; i++) {
unsigned char character = (unsigned char)cString[i];
of_unichar_t unichar;
OFUnichar unichar;
char buffer[4];
size_t byteLength;
if (character < tableOffset) {
_s->cString[j++] = cString[i];
continue;
}
|
︙ | | |
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
|
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
|
-
+
|
[self release];
@throw e;
}
return self;
}
- (instancetype)initWithCharacters: (const of_unichar_t *)characters
- (instancetype)initWithCharacters: (const OFUnichar *)characters
length: (size_t)length
{
self = [super init];
@try {
size_t j;
|
︙ | | |
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
|
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
|
-
+
|
_s->cString = of_alloc((length * 4) + 1, 1);
_s->length = length;
_s->freeWhenDone = true;
j = 0;
for (size_t i = 0; i < length; i++) {
of_unichar_t character =
OFUnichar character =
(swap ? OF_BSWAP16(string[i]) : string[i]);
size_t len;
/* Missing high surrogate */
if ((character & 0xFC00) == 0xDC00)
@throw [OFInvalidEncodingException exception];
|
︙ | | |
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
|
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
|
-
+
-
+
-
+
|
return OFOrderedAscending;
#ifdef OF_HAVE_UNICODE_TABLES
}
i = j = 0;
while (i < _s->cStringLength && j < otherCStringLength) {
of_unichar_t c1, c2;
OFUnichar c1, c2;
ssize_t l1, l2;
l1 = of_string_utf8_decode(_s->cString + i,
_s->cStringLength - i, &c1);
l2 = of_string_utf8_decode(otherCString + j,
otherCStringLength - j, &c2);
if (l1 <= 0 || l2 <= 0 || c1 > 0x10FFFF || c2 > 0x10FFFF)
@throw [OFInvalidEncodingException exception];
if (c1 >> 8 < OF_UNICODE_CASEFOLDING_TABLE_SIZE) {
of_unichar_t tc =
OFUnichar tc =
of_unicode_casefolding_table[c1 >> 8][c1 & 0xFF];
if (tc)
c1 = tc;
}
if (c2 >> 8 < OF_UNICODE_CASEFOLDING_TABLE_SIZE) {
of_unichar_t tc =
OFUnichar tc =
of_unicode_casefolding_table[c2 >> 8][c2 & 0xFF];
if (tc)
c2 = tc;
}
if (c1 > c2)
|
︙ | | |
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
|
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
|
-
+
|
if (_s->hashed)
return _s->hash;
OF_HASH_INIT(hash);
for (size_t i = 0; i < _s->cStringLength; i++) {
of_unichar_t c;
OFUnichar c;
ssize_t length;
if ((length = of_string_utf8_decode(_s->cString + i,
_s->cStringLength - i, &c)) <= 0)
@throw [OFInvalidEncodingException exception];
OF_HASH_ADD(hash, (c & 0xFF0000) >> 16);
|
︙ | | |
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
|
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
|
-
+
-
+
-
+
-
+
-
+
|
_s->hash = hash;
_s->hashed = true;
return hash;
}
- (of_unichar_t)characterAtIndex: (size_t)idx
- (OFUnichar)characterAtIndex: (size_t)idx
{
of_unichar_t character;
OFUnichar character;
if (idx >= _s->length)
@throw [OFOutOfRangeException exception];
if (!_s->isUTF8)
return _s->cString[idx];
idx = of_string_utf8_get_position(_s->cString, idx, _s->cStringLength);
if (of_string_utf8_decode(_s->cString + idx,
_s->cStringLength - idx, &character) <= 0)
@throw [OFInvalidEncodingException exception];
return character;
}
- (void)getCharacters: (of_unichar_t *)buffer inRange: (OFRange)range
- (void)getCharacters: (OFUnichar *)buffer inRange: (OFRange)range
{
/* TODO: Could be slightly optimized */
void *pool = objc_autoreleasePoolPush();
const of_unichar_t *characters = self.characters;
const OFUnichar *characters = self.characters;
if (range.length > SIZE_MAX - range.location ||
range.location + range.length > _s->length)
@throw [OFOutOfRangeException exception];
memcpy(buffer, characters + range.location,
range.length * sizeof(of_unichar_t));
range.length * sizeof(OFUnichar));
objc_autoreleasePoolPop(pool);
}
- (OFRange)rangeOfString: (OFString *)string
options: (int)options
range: (OFRange)range
|
︙ | | |
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
|
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
|
-
+
-
+
-
+
-
+
|
[array makeImmutable];
objc_autoreleasePoolPop(pool);
return array;
}
- (const of_unichar_t *)characters
- (const OFUnichar *)characters
{
of_unichar_t *buffer = of_alloc(_s->length, sizeof(of_unichar_t));
OFUnichar *buffer = of_alloc(_s->length, sizeof(OFUnichar));
size_t i = 0, j = 0;
while (i < _s->cStringLength) {
of_unichar_t c;
OFUnichar c;
ssize_t cLen;
cLen = of_string_utf8_decode(_s->cString + i,
_s->cStringLength - i, &c);
if (cLen <= 0 || c > 0x10FFFF) {
free(buffer);
@throw [OFInvalidEncodingException exception];
}
buffer[j++] = c;
i += cLen;
}
return [[OFData dataWithItemsNoCopy: buffer
count: _s->length
itemSize: sizeof(of_unichar_t)
itemSize: sizeof(OFUnichar)
freeWhenDone: true] items];
}
- (const of_char32_t *)UTF32StringWithByteOrder: (OFByteOrder)byteOrder
{
of_char32_t *buffer = of_alloc(_s->length + 1, sizeof(of_char32_t));
size_t i = 0, j = 0;
|
︙ | | |