10 #include <Carbon/Carbon.h>
22 "description" :
"A Unicode (UTF-8) text string.",
23 "keywords" : [
"char *",
"character" ],
42 const char *textString = NULL;
43 if (json_object_get_type(js) == json_type_string)
57 return json_object_new_string(value);
71 if (length <= maxLength)
75 VuoText abbreviation =
VuoText_substring(subject, (where == VuoTextTruncation_End ? 1 : 1 + length - maxLength), maxLength);
77 VuoText summaryParts[2] = { abbreviation, ellipsis };
78 if (where == VuoTextTruncation_Beginning)
80 summaryParts[0] = ellipsis;
81 summaryParts[1] = abbreviation;
103 return strdup(
"<code>�</code>");
109 if (truncatedText != value)
113 if (truncatedText != value)
131 text = strdup(unquotedString);
155 if (data && ((
char *)data)[maxLength-1] == 0)
158 text = (
char *)calloc(1, maxLength);
159 memcpy(text, data, maxLength);
163 text = (
char *)calloc(1, maxLength+1);
164 for (
unsigned int i = 0; i < maxLength; ++i)
166 text[i] = ((
char *)data)[i];
167 if (((
char *)data)[i] == 0)
185 CFStringRef cfString = (CFStringRef)cfs;
188 const char *utf8StringPtr = CFStringGetCStringPtr(cfString, kCFStringEncodingUTF8);
193 CFIndex maxBytes = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfString), kCFStringEncodingUTF8) + 1;
194 char *t = calloc(1, maxBytes);
195 CFStringGetCString(cfString, t, maxBytes, kCFStringEncodingUTF8);
214 #define UTF8_ACCEPT 0
215 #define UTF8_REJECT 1
221 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,
222 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,
223 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,
224 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,
225 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,
226 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,
227 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,
228 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3,
229 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
230 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1,
231 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,
232 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,
233 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,
234 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,
244 for (uint32_t pos = 0, state = 0; *data && pos++ < size; ++data)
246 uint32_t
byte = *data;
247 uint32_t type =
utf8d[byte];
250 (
byte & 0x3fu) | (codepoint << 6) :
251 (0xff >> type) & (byte);
253 state =
utf8d[256 + state*16 + type];
289 CFStringRef cf_str = CFStringCreateWithBytes(kCFAllocatorDefault, (
const UInt8*) data, size *
sizeof(uint32_t), kCFStringEncodingUTF32LE,
false);
293 CFIndex str_len = CFStringGetLength(cf_str);
294 CFRange range = CFRangeMake(0, str_len);
296 CFIndex length = CFStringGetBytes(cf_str, range, kCFStringEncodingUTF8,
'?',
false, NULL, str_len, &usedBufLen );
300 char* buffer = (
char*) malloc(
sizeof(
char) * usedBufLen + 1);
302 CFStringGetBytes(cf_str, range, kCFStringEncodingUTF8,
'?',
false, (uint8_t*) buffer, usedBufLen + 1, &used);
324 size_t len = strlen(
string);
325 CFStringRef cf = CFStringCreateWithBytes(kCFAllocatorDefault, (
const UInt8 *)
string, len, kCFStringEncodingMacRoman,
false);
344 CFStringRef s = CFStringCreateWithCString(kCFAllocatorDefault, text, kCFStringEncodingUTF8);
348 size_t length = CFStringGetLength(s);
369 return !text || text[0] == 0;
391 if (! text1 || ! text2)
392 return (! text1 && ! text2);
394 CFStringRef s1 = CFStringCreateWithCString(kCFAllocatorDefault, text1, kCFStringEncodingUTF8);
398 CFStringRef s2 = CFStringCreateWithCString(kCFAllocatorDefault, text2, kCFStringEncodingUTF8);
405 CFComparisonResult result = CFStringCompare(s1, s2, kCFCompareNonliteral | kCFCompareWidthInsensitive);
409 return (result == kCFCompareEqualTo);
419 if (! text1 || ! text2)
420 return text1 && !text2;
422 CFStringRef s1 = CFStringCreateWithCString(kCFAllocatorDefault, text1, kCFStringEncodingUTF8);
426 CFStringRef s2 = CFStringCreateWithCString(kCFAllocatorDefault, text2, kCFStringEncodingUTF8);
433 CFComparisonResult result = CFStringCompare(s1, s2, kCFCompareNonliteral | kCFCompareWidthInsensitive | flags);
437 return (result == kCFCompareLessThan);
457 return isLessThan(text1, text2, kCFCompareCaseInsensitive);
468 return real1 < real2;
480 if (! comparison.isCaseSensitive)
487 if (comparison.type == VuoTextComparison_Equals)
491 else if (comparison.type == VuoTextComparison_Contains)
495 else if (comparison.type == VuoTextComparison_BeginsWith || comparison.type == VuoTextComparison_EndsWith)
506 int startIndex = (comparison.type == VuoTextComparison_BeginsWith ? 1 : aLength - bLength + 1);
515 else if (comparison.type == VuoTextComparison_MatchesWildcard)
520 return t1empty == t2empty;
522 locale_t oldLocale = uselocale(NULL);
523 locale_t locale = newlocale(LC_ALL_MASK,
"en_US.UTF-8", NULL);
526 match = fnmatch(text2, text1, 0) != FNM_NOMATCH;
528 uselocale(oldLocale);
532 else if (comparison.type == VuoTextComparison_MatchesRegEx)
537 return t1empty == t2empty;
540 int ret = regcomp(&re, text2, REG_EXTENDED);
544 regerror(ret, &re, errstr,
sizeof(errstr));
545 VUserLog(
"Error compiling regular expression: %s", errstr);
549 ret = regexec(&re, text1, 0, NULL, 0);
552 else if (ret == REG_NOMATCH)
557 regerror(ret, &re, errstr,
sizeof(errstr));
558 VUserLog(
"Error executing regular expression: %s", errstr);
563 if (! comparison.isCaseSensitive)
592 if (stringLength < substringLength)
595 for (
size_t i = startIndex; i <= stringLength - substringLength + 1; ++i)
629 size_t foundIndex = 0;
633 if (stringLength < substringLength)
636 for (
size_t i = 1; i <= stringLength - substringLength + 1; ++i)
661 if (stringLength < substringLength)
665 for (
size_t i = 1; i <= stringLength - substringLength + 1; ++i)
696 if (startIndex > originalLength)
701 length -= 1 - startIndex;
708 if (startIndex + length - 1 > originalLength)
709 length = originalLength - startIndex + 1;
711 size_t startIndexFromZero = startIndex - 1;
713 CFStringRef s = CFStringCreateWithCString(kCFAllocatorDefault,
string, kCFStringEncodingUTF8);
717 CFStringRef ss = CFStringCreateWithSubstring(kCFAllocatorDefault, s, CFRangeMake(startIndexFromZero, length));
734 CFMutableArrayRef a = CFArrayCreateMutable(kCFAllocatorDefault, textsCount, &kCFTypeArrayCallBacks);
735 for (
size_t i = 0; i < textsCount; ++i)
739 CFStringRef s = CFStringCreateWithCString(kCFAllocatorDefault, texts[i], kCFStringEncodingUTF8);
742 CFArrayAppendValue(a, s);
747 CFStringRef s = CFStringCreateByCombiningStrings(kCFAllocatorDefault, a, CFSTR(
""));
752 return compositeString;
761 if (!text || !separator)
764 CFMutableArrayRef splitTexts = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
766 CFStringRef textCF = CFStringCreateWithCString(kCFAllocatorDefault, text, kCFStringEncodingUTF8);
771 size_t textLength = CFStringGetLength(textCF);
773 CFStringRef separatorCF = CFStringCreateWithCString(kCFAllocatorDefault, separator, kCFStringEncodingUTF8);
776 VuoDefer(^{ CFRelease(separatorCF); });
778 size_t separatorLength = CFStringGetLength(separatorCF);
780 if (separatorLength > 0)
782 size_t startIndex = 1;
783 size_t separatorIndex = 0;
785 while (startIndex <= textLength)
787 CFRange rangeToSearch = CFRangeMake(startIndex - 1, textLength - (startIndex - 1));
789 Boolean found = CFStringFindWithOptions(textCF, separatorCF, rangeToSearch, 0, &foundRange);
790 separatorIndex = foundRange.location + 1;
792 separatorIndex = textLength + 1;
794 if (separatorIndex > startIndex || includeEmptyParts)
796 CFStringRef partStr = CFStringCreateWithSubstring(kCFAllocatorDefault, textCF, CFRangeMake(startIndex - 1, separatorIndex - startIndex));
799 CFArrayAppendValue(splitTexts, partStr);
804 startIndex = separatorIndex + separatorLength;
807 if (includeEmptyParts && textLength > 0 && separatorIndex + separatorLength - 1 == textLength)
809 CFStringRef emptyPartStr = CFStringCreateWithCString(kCFAllocatorDefault,
"", kCFStringEncodingUTF8);
812 CFArrayAppendValue(splitTexts, emptyPartStr);
813 CFRelease(emptyPartStr);
819 for (
size_t i = 1; i <= textLength; ++i)
821 CFStringRef partStr = CFStringCreateWithSubstring(kCFAllocatorDefault, textCF, CFRangeMake(i - 1, 1));
824 CFArrayAppendValue(splitTexts, partStr);
830 *partsCount = CFArrayGetCount(splitTexts);
832 for (
size_t i = 0; i < *partsCount; ++i)
834 CFStringRef part = CFArrayGetValueAtIndex(splitTexts, i);
837 CFRelease(splitTexts);
839 return splitTextsArr;
854 CFMutableStringRef subjectCF = CFStringCreateMutable(NULL, 0);
855 CFStringAppendCString(subjectCF, subject, kCFStringEncodingUTF8);
857 CFStringRef stringToFindCF = CFStringCreateWithCString(NULL, stringToFind, kCFStringEncodingUTF8);
860 CFRelease(subjectCF);
864 CFStringRef replacementCF = nil;
867 replacementCF = CFStringCreateWithCString(NULL, replacement, kCFStringEncodingUTF8);
870 CFRelease(stringToFindCF);
871 CFRelease(subjectCF);
876 CFStringFindAndReplace(subjectCF, stringToFindCF, replacementCF, CFRangeMake(0,CFStringGetLength(subjectCF)), kCFCompareNonliteral);
880 CFRelease(replacementCF);
881 CFRelease(stringToFindCF);
882 CFRelease(subjectCF);
884 return replacedSubject;
902 if(startIndex > len) {
903 const char *append[2] = { string, newText };
905 }
else if(startIndex <= 1) {
906 const char *append[2] = { newText,
string };
916 const char *append[3] = { left, newText, right };
931 length -= (1 - startIndex);
936 if(startIndex > len || length < 1)
957 va_start(args, format);
958 int size = vsnprintf(NULL, 0, format, args);
961 char *formattedString = (
char *)malloc(size+1);
962 va_start(args, format);
963 vsnprintf(formattedString, size+1, format, args);
966 return formattedString;
981 size_t len = strlen(text);
982 size_t firstNonSpace;
983 for (firstNonSpace = 0; firstNonSpace < len && isspace(text[firstNonSpace]); ++firstNonSpace);
985 if (firstNonSpace == len)
989 for (lastNonSpace = len-1; lastNonSpace > firstNonSpace && isspace(text[lastNonSpace]); --lastNonSpace);
999 size_t len = strlen(text);
1000 for (
size_t i = 0; i < len; ++i)
1001 if (((
unsigned char *)text)[i] > 127)
1020 size_t len = strlen(text);
1021 char *processedString = malloc(len + 1);
1022 for (
size_t i = 0; i < len; ++i)
1023 processedString[i] = tolower(text[i]);
1024 processedString[len] = 0;
1026 return processedString;
1030 CFMutableStringRef mutable_str = CFStringCreateMutable(NULL, 0);
1031 CFStringAppendCString(mutable_str, text, kCFStringEncodingUTF8);
1032 CFLocaleRef locale = CFLocaleCopyCurrent();
1037 CFStringLowercase(mutable_str, locale);
1041 CFStringUppercase(mutable_str, locale);
1045 CFStringCapitalize(mutable_str, locale);
1051 CFStringLowercase(mutable_str, locale);
1054 CFStringRef tmp = CFStringCreateWithSubstring(kCFAllocatorDefault, mutable_str, CFRangeMake(0, CFStringGetLength(mutable_str)));
1055 CFMutableStringRef all_upper = CFStringCreateMutableCopy(NULL, 0, tmp);
1057 CFStringUppercase(all_upper, locale);
1059 CFStringTokenizerRef tokenizer = CFStringTokenizerCreate( kCFAllocatorDefault,
1061 CFRangeMake(0, CFStringGetLength(all_upper)),
1062 kCFStringTokenizerUnitSentence,
1065 CFStringTokenizerTokenType tokenType = kCFStringTokenizerTokenNone;
1068 while(kCFStringTokenizerTokenNone != (tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)))
1070 CFRange tokenRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
1072 if (tokenRange.location != kCFNotFound && tokenRange.length > 0)
1074 CFRange firstCharRange = CFRangeMake(tokenRange.location, 1);
1075 CFStringRef firstLetter = CFStringCreateWithSubstring(kCFAllocatorDefault, mutable_str, firstCharRange);
1076 CFMutableStringRef upperFirst = CFStringCreateMutableCopy(NULL, 0, firstLetter);
1077 CFRelease(firstLetter);
1078 CFStringCapitalize(upperFirst, locale);
1079 CFStringReplace(mutable_str, firstCharRange, upperFirst);
1080 CFRelease(upperFirst);
1084 CFRelease(all_upper);
1085 CFRelease(tokenizer);
1093 CFRelease(mutable_str);
1095 return processedString;
1109 CFMutableStringRef cf_str = CFStringCreateMutable(NULL, 0);
1110 CFStringAppendCString(cf_str, text, kCFStringEncodingUTF8);
1112 size_t str_len = CFStringGetLength(cf_str);
1114 CFRange range = CFRangeMake(0, str_len);
1116 *length = (size_t) CFStringGetBytes(cf_str, range, kCFStringEncodingUTF32,
'?',
false, NULL, str_len, &usedBufLen );
1118 uint32_t* decimal = (uint32_t*) NULL;
1122 decimal = (uint32_t*) malloc(
sizeof(uint32_t) * usedBufLen );
1123 CFStringGetBytes(cf_str, range, kCFStringEncodingUTF32,
'?',
false, (uint8_t*) decimal, usedBufLen, NULL);