302 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
303 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
304 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
305 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
306 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
307 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
308 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
309 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3,
310 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
311 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1,
312 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1,
313 1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,
314 1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1,
315 1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
878 if (!text || !separator)
881 CFMutableArrayRef splitTexts = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
883 CFStringRef textCF = CFStringCreateWithCString(kCFAllocatorDefault, text, kCFStringEncodingUTF8);
888 size_t textLength = CFStringGetLength(textCF);
890 CFStringRef separatorCF = CFStringCreateWithCString(kCFAllocatorDefault, separator, kCFStringEncodingUTF8);
893 VuoDefer(^{ CFRelease(separatorCF); });
895 size_t separatorLength = CFStringGetLength(separatorCF);
897 if (separatorLength > 0)
899 size_t startIndex = 1;
900 size_t separatorIndex = 0;
902 while (startIndex <= textLength)
904 CFRange rangeToSearch = CFRangeMake(startIndex - 1, textLength - (startIndex - 1));
906 Boolean found = CFStringFindWithOptions(textCF, separatorCF, rangeToSearch, 0, &foundRange);
907 separatorIndex = foundRange.location + 1;
909 separatorIndex = textLength + 1;
911 if (separatorIndex > startIndex || includeEmptyParts)
913 CFStringRef partStr = CFStringCreateWithSubstring(kCFAllocatorDefault, textCF, CFRangeMake(startIndex - 1, separatorIndex - startIndex));
916 CFArrayAppendValue(splitTexts, partStr);
921 startIndex = separatorIndex + separatorLength;
924 if (includeEmptyParts && textLength > 0 && separatorIndex + separatorLength - 1 == textLength)
926 CFStringRef emptyPartStr = CFStringCreateWithCString(kCFAllocatorDefault,
"", kCFStringEncodingUTF8);
929 CFArrayAppendValue(splitTexts, emptyPartStr);
930 CFRelease(emptyPartStr);
936 for (
size_t i = 1; i <= textLength; ++i)
938 CFStringRef partStr = CFStringCreateWithSubstring(kCFAllocatorDefault, textCF, CFRangeMake(i - 1, 1));
941 CFArrayAppendValue(splitTexts, partStr);
947 *partsCount = CFArrayGetCount(splitTexts);
949 for (
size_t i = 0; i < *partsCount; ++i)
951 CFStringRef part = CFArrayGetValueAtIndex(splitTexts, i);
954 CFRelease(splitTexts);
956 return splitTextsArr;
1140 size_t len = strlen(text);
1141 char *processedString = malloc(len + 1);
1142 for (
size_t i = 0; i < len; ++i)
1143 processedString[i] = tolower(text[i]);
1144 processedString[len] = 0;
1146 return processedString;
1150 CFMutableStringRef mutable_str = CFStringCreateMutable(NULL, 0);
1151 CFStringAppendCString(mutable_str, text, kCFStringEncodingUTF8);
1152 CFLocaleRef locale = CFLocaleCopyCurrent();
1157 CFStringLowercase(mutable_str, locale);
1161 CFStringUppercase(mutable_str, locale);
1165 CFStringCapitalize(mutable_str, locale);
1171 CFStringLowercase(mutable_str, locale);
1174 CFStringRef tmp = CFStringCreateWithSubstring(kCFAllocatorDefault, mutable_str, CFRangeMake(0, CFStringGetLength(mutable_str)));
1175 CFMutableStringRef all_upper = CFStringCreateMutableCopy(NULL, 0, tmp);
1177 CFStringUppercase(all_upper, locale);
1179 CFStringTokenizerRef tokenizer = CFStringTokenizerCreate( kCFAllocatorDefault,
1181 CFRangeMake(0, CFStringGetLength(all_upper)),
1182 kCFStringTokenizerUnitSentence,
1185 CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone;
1188 while(kCFStringTokenizerTokenNone != (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)))
1190 CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
1192 if (tokenRange.location != kCFNotFound && tokenRange.length > 0)
1194 CFRange firstCharRange = CFRangeMake(tokenRange.location, 1);
1195 CFStringRef firstLetter = CFStringCreateWithSubstring(kCFAllocatorDefault, mutable_str, firstCharRange);
1196 CFMutableStringRef upperFirst = CFStringCreateMutableCopy(NULL, 0, firstLetter);
1197 CFRelease(firstLetter);
1198 CFStringCapitalize(upperFirst, locale);
1199 CFStringReplace(mutable_str, firstCharRange, upperFirst);
1200 CFRelease(upperFirst);
1204 CFRelease(all_upper);
1205 CFRelease(tokenizer);
1213 CFRelease(mutable_str);
1215 return processedString;