Tcl_UniChar Tcl_UniCharToTitle(Tcl_UniChar c) { if (c < 0x7f) return toupper(c); CFMutableStringRef str = CFStringCreateMutableWithExternalCharactersNoCopy(kCFAllocatorDefault,&c, 1,0, kCFAllocatorNull); CFStringCapitalize(str,NULL); Tcl_UniChar retval = c; if (CFStringGetLength(str)) { // make sure one exists retval = CFStringGetCharacterAtIndex(str, 0); } CFRelease(str); return retval; }
void stringManipulation(void) { CFMutableStringRef strChange; CFStringRef strOuter, find, replace, find2, replace2, find3, replace3, bigger, smaller, result; CFComparisonResult comp; CFLocaleRef curLocale; Boolean isHyphenationSupported = false; show(CFSTR("------------------String Manipulations---------------")); // Create a simple immutable string from a Pascal string and convert it to Unicode strOuter = CFStringCreateWithCString(NULL, "Hello Cruel World", kCFStringEncodingASCII); strChange = CFStringCreateMutableCopy(NULL, CFStringGetLength(strOuter), strOuter); find = CFStringCreateWithCString(NULL, "Cruel", kCFStringEncodingASCII); replace = CFStringCreateWithCString(NULL, "Cool", kCFStringEncodingASCII); find2 = CFStringCreateWithCString(NULL, "Keep", kCFStringEncodingASCII); replace2 = CFStringCreateWithCString(NULL, "Be", kCFStringEncodingASCII); find3 = CFStringCreateWithCString(NULL, "Change.", kCFStringEncodingASCII); replace3 = CFStringCreateWithCString(NULL, "Ball.", kCFStringEncodingASCII); bigger = CFStringCreateWithCString(NULL, "version 2.5", kCFStringEncodingASCII); smaller = CFStringCreateWithCString(NULL, "version 2.0", kCFStringEncodingASCII); show(CFSTR("String Outer : %@"), strOuter); show(CFSTR("String Find : %@"), find); show(CFSTR("String Replace : %@"), replace); CFStringFindAndReplace(strChange, find, replace, CFRangeMake(0, CFStringGetLength(strChange)), 0); show(CFSTR("Replaced : %@"), strChange); CFStringAppendCString(strChange, "! Keep the change.", kCFStringEncodingASCII); show(CFSTR("Appended : %@"), strChange); curLocale = CFLocaleCopyCurrent (); isHyphenationSupported = CFStringIsHyphenationAvailableForLocale(curLocale); show(CFSTR("Is Hyphenation supported for this locale? %@"), ((isHyphenationSupported) ? CFSTR ("Yes") : CFSTR("No"))); CFStringUppercase(strChange, curLocale); show(CFSTR("Upper Cased : %@"), strChange); CFStringLowercase(strChange, curLocale); show(CFSTR("Lower Cased : %@"), strChange); CFStringCapitalize(strChange, curLocale); show(CFSTR("Capitalized : %@"), strChange); CFStringUppercase(strChange, curLocale); show(CFSTR("Up Cased (again) : %@"), strChange); CFStringFindAndReplace(strChange, find2, replace2, CFRangeMake(0, CFStringGetLength(strChange)), 0); show(CFSTR("Replaced? : %@"), strChange); CFStringFindAndReplace(strChange, find2, replace2, CFRangeMake(0, CFStringGetLength(strChange)), kCFCompareCaseInsensitive); show(CFSTR("Case insensitive : %@"), strChange); CFStringCapitalize(strChange, curLocale); show(CFSTR("Capitalized : %@"), strChange); CFStringFindAndReplace(strChange, replace2, find2, CFRangeMake(0, CFStringGetLength(strChange)), kCFCompareAnchored); show(CFSTR("Should Be Unchanged: %@"), strChange); CFStringFindAndReplace(strChange, find3, replace3, CFRangeMake(0, CFStringGetLength(strChange)), kCFCompareAnchored|kCFCompareBackwards); show(CFSTR("Should Be Changed : %@"), strChange); show(CFSTR("Which is bigger %@ or %@?"), bigger, smaller); comp = CFStringCompare(bigger, smaller, 0); result = (comp == kCFCompareGreaterThan) ? bigger : smaller; show(CFSTR("Base Compare Says : %@"), result); comp = CFStringCompare(bigger, smaller, kCFCompareNumerically); result = (comp == kCFCompareGreaterThan) ? bigger : smaller; show(CFSTR("Numerical Compare : %@"), result); CFRelease(curLocale); CFRelease(replace); CFRelease(find); CFRelease(replace2); CFRelease(find2); CFRelease(replace3); CFRelease(find3); CFRelease(bigger); CFRelease(smaller); CFRelease(strChange); }