/* CFString.h Copyright (C) 2010 Free Software Foundation, Inc. Written by: Stefan Bidigaray Date: January, 2010 This file is part of CoreBase. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __COREFOUNDATION_CFSTRING_H__ #define __COREFOUNDATION_CFSTRING_H__ #include "CFBase.h" #include "CFArray.h" #include "CFCharacterSet.h" #include "CFData.h" #include "CFDictionary.h" #include "CFLocale.h" #include CF_EXTERN_C_BEGIN /** \defgroup CFStringRef CFString Reference \brief The CFString type defines opaque objects representing strings. CFString is "toll-free bridged" to NSString. \{ */ /* * Data Types */ typedef UInt32 CFStringEncoding; /* * Constants */ typedef enum { kCFCompareCaseInsensitive = 1, kCFCompareBackwards = 4, kCFCompareAnchored = 8, kCFCompareNonliteral = 16, kCFCompareLocalized = 32, kCFCompareNumerically = 64, #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) kCFCompareDiacriticInsensitive = 128, kCFCompareWidthInsensitive = 256, kCFCompareForcedOrdering = 512 #endif } CFStringCompareFlags; enum CFStringBuiltInEncodings { kCFStringEncodingMacRoman = 0, kCFStringEncodingWindowsLatin1 = 0x0500, kCFStringEncodingISOLatin1 = 0x0201, kCFStringEncodingNextStepLatin = 0x0B01, kCFStringEncodingASCII = 0x0600, kCFStringEncodingUnicode = 0x0100, kCFStringEncodingUTF8 = 0x08000100, kCFStringEncodingNonLossyASCII = 0x0BFF, #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) kCFStringEncodingUTF16 = 0x0100, kCFStringEncodingUTF16BE = 0x10000100, kCFStringEncodingUTF16LE = 0x14000100, kCFStringEncodingUTF32 = 0x0c000100, kCFStringEncodingUTF32BE = 0x18000100, kCFStringEncodingUTF32LE = 0x1c000100 #endif }; #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST) # define kCFStringEncodingInvalidId (0xffffffffU) #endif /** \def CFSTR(x) \brief Creates a constant string object. \note This macro will create the constant string at runtime. */ /* The 'pure' attribute tells the compiler that this function will always return the same result with the same input. If it has any skill, then constant propagation passes will magically make sure that this function is called as few times as possible. */ CF_EXPORT CFStringRef __CFStringMakeConstantString (const char *str) GS_PURE_FUNCTION; //#define CFSTR(x) __CFStringMakeConstantString("" x "") #ifdef __CONSTANT_CFSTRINGS__ #define CFSTR(x) ((CFStringRef) __builtin___CFStringMakeConstantString ("" x "")) #else #define CFSTR(x) __CFStringMakeConstantString("" x "") #endif /** \name Creating a CFString \{ */ CF_EXPORT CFArrayRef CFStringCreateArrayBySeparatingStrings (CFAllocatorRef alloc, CFStringRef theString, CFStringRef separatorString); CF_EXPORT CFStringRef CFStringCreateByCombiningStrings (CFAllocatorRef alloc, CFArrayRef theArray, CFStringRef separatorString); CF_EXPORT CFStringRef CFStringCreateCopy (CFAllocatorRef alloc, CFStringRef theString); CF_EXPORT CFStringRef CFStringCreateFromExternalRepresentation (CFAllocatorRef alloc, CFDataRef data, CFStringEncoding encoding); CF_EXPORT CFStringRef CFStringCreateWithBytes (CFAllocatorRef alloc, const UInt8 *bytes, CFIndex numBytes, CFStringEncoding encoding, Boolean isExternalRepresentation); CF_EXPORT CFStringRef CFStringCreateWithCharacters (CFAllocatorRef alloc, const UniChar *chars, CFIndex numChars); CF_EXPORT CFStringRef CFStringCreateWithCharactersNoCopy (CFAllocatorRef alloc, const UniChar *chars, CFIndex numChars, CFAllocatorRef contentsDeallocator); CF_EXPORT CFStringRef CFStringCreateWithCString (CFAllocatorRef alloc, const char *cStr, CFStringEncoding encoding); CF_EXPORT CFStringRef CFStringCreateWithCStringNoCopy (CFAllocatorRef alloc, const char *cStr, CFStringEncoding encoding, CFAllocatorRef contentsDeallocator); CF_EXPORT CFStringRef CFStringCreateWithFormat (CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, ...); CF_EXPORT CFStringRef CFStringCreateWithFormatAndArguments (CFAllocatorRef alloc, CFDictionaryRef formatOptions, CFStringRef format, va_list arguments); CF_EXPORT CFStringRef CFStringCreateWithSubstring (CFAllocatorRef alloc, CFStringRef str, CFRange range); #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) CF_EXPORT CFStringRef CFStringCreateWithFileSystemRepresentation (CFAllocatorRef alloc, const char *buffer); #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) CF_EXPORT CFStringRef CFStringCreateWithBytesNoCopy (CFAllocatorRef alloc, const UInt8 *bytes, CFIndex numBytes, CFStringEncoding encoding, Boolean isExternalReprentation, CFAllocatorRef contentsDeallocator); #endif /** \} */ /** \name Searching CFStrings \{ */ CF_EXPORT CFArrayRef CFStringCreateArrayWithFindResults (CFAllocatorRef alloc, CFStringRef theString, CFStringRef stringToFind, CFRange rangeToSearch, CFStringCompareFlags compareOptions); CF_EXPORT CFRange CFStringFind (CFStringRef theString, CFStringRef stringToFind, CFStringCompareFlags compareOptions); CF_EXPORT Boolean CFStringFindWithOptions (CFStringRef theString, CFStringRef stringToFind, CFRange rangeToSearch, CFStringCompareFlags searchOptions, CFRange *result); CF_EXPORT Boolean CFStringFindWithOptionsAndLocale (CFStringRef theString,CFStringRef stringToFind, CFRange rangeToSearch, CFStringCompareFlags searchOptions, CFLocaleRef locale, CFRange *result); CF_EXPORT void CFStringGetLineBounds (CFStringRef theString, CFRange range, CFIndex *lineBeginIndex, CFIndex *lineEndIndex, CFIndex *contentsEndIndex); #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST) CF_EXPORT Boolean CFStringFindCharacterFromSet (CFStringRef theString, CFCharacterSetRef theSet, CFRange rangeToSearch, CFStringCompareFlags searchOptions, CFRange *result); #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) CF_EXPORT void CFStringGetParagraphBounds (CFStringRef string, CFRange range, CFIndex *parBeginIndex, CFIndex *parEndIndex, CFIndex *contentsEndIndex); #endif /** \} */ /** \name Comparing String \{ */ CF_EXPORT CFComparisonResult CFStringCompare (CFStringRef theString1, CFStringRef theString2, CFStringCompareFlags compareOptions); CF_EXPORT CFComparisonResult CFStringCompareWithOptions (CFStringRef theString1, CFStringRef theString2, CFRange rangeToCOmpare, CFStringCompareFlags compareOptions); CF_EXPORT Boolean CFStringHasPrefix (CFStringRef theString, CFStringRef prefix); CF_EXPORT Boolean CFStringHasSuffix (CFStringRef theString, CFStringRef suffix); #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) CF_EXPORT CFComparisonResult CFStringCompareWithOptionsAndLocale (CFStringRef theString1, CFStringRef theString2, CFRange rangeToCOmpare, CFStringCompareFlags compareOptions, CFLocaleRef locale); #endif /** \} */ /** \name Accessing Characters \{ */ CF_EXPORT CFDataRef CFStringCreateExternalRepresentation (CFAllocatorRef alloc, CFStringRef theString, CFStringEncoding encoding, UInt8 lossByte); CF_EXPORT CFIndex CFStringGetBytes (CFStringRef theString, CFRange range, CFStringEncoding encoding, UInt8 lossByte, Boolean isExternalRepresentation, UInt8 *buffer, CFIndex maxBufLen, CFIndex *usedBufLen); CF_EXPORT UniChar CFStringGetCharacterAtIndex (CFStringRef theString, CFIndex idx); CF_EXPORT void CFStringGetCharacters (CFStringRef theString, CFRange range, UniChar *buffer); CF_EXPORT const UniChar * CFStringGetCharactersPtr (CFStringRef theString); CF_EXPORT Boolean CFStringGetCString (CFStringRef theString, char *buffer, CFIndex bufferSize, CFStringEncoding encoding); CF_EXPORT const char * CFStringGetCStringPtr (CFStringRef theString, CFStringEncoding encoding); CF_EXPORT CFIndex CFStringGetLength (CFStringRef str); CF_EXPORT CFRange CFStringGetRangeOfComposedCharactersAtIndex (CFStringRef theString, CFIndex theIndex); #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST) CF_EXPORT UTF32Char CFStringGetLongCharacterForSurrogatePair (UniChar surrogateHigh, UniChar surrogateLow); CF_EXPORT Boolean CFStringGetSurrogatePairForLongCharacter (UTF32Char character, UniChar *surrogates); CF_EXPORT Boolean CFStringIsSurrogateHighCharacter (UniChar character); CF_EXPORT Boolean CFStringIsSurrogateLowCharacter (UniChar character); #endif /** \} */ /** \name Working with Encodings \{ */ CF_EXPORT CFStringRef CFStringConvertEncodingToIANACharSetName (CFStringEncoding encoding); CF_EXPORT unsigned long CFStringConvertEncodingToNSStringEncoding (CFStringEncoding encoding); UInt32 CFStringConvertEncodingToWindowsCodepage (CFStringEncoding encoding); CF_EXPORT CFStringEncoding CFStringConvertIANACharSetNameToEncoding (CFStringRef theString); CF_EXPORT CFStringEncoding CFStringConvertNSStringEncodingToEncoding (unsigned long encoding); CF_EXPORT CFStringEncoding CFStringConvertWindowsCodepageToEncoding (UInt32 codepage); CF_EXPORT CFStringEncoding CFStringGetFastestEncoding (CFStringRef theString); CF_EXPORT const CFStringEncoding * CFStringGetListOfAvailableEncodings (void); CF_EXPORT CFIndex CFStringGetMaximumSizeForEncoding (CFIndex length, CFStringEncoding encoding); CF_EXPORT CFStringEncoding CFStringGetMostCompatibleMacStringEncoding (CFStringEncoding encoding); CF_EXPORT CFStringRef CFStringGetNameOfEncoding (CFStringEncoding encoding); CF_EXPORT CFStringEncoding CFStringGetSmallestEncoding (CFStringRef theString); CF_EXPORT CFStringEncoding CFStringGetSystemEncoding (void); CF_EXPORT Boolean CFStringIsEncodingAvailable (CFStringEncoding encoding); #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) CF_EXPORT Boolean CFStringGetFileSystemRepresentation (CFStringRef string, char *buffer, CFIndex maxBufLen); CF_EXPORT CFIndex CFStringGetMaximumSizeOfFileSystemRepresentation (CFStringRef string); #endif /** \} */ /** \name Getting Numeric Values \{ */ CF_EXPORT double CFStringGetDoubleValue (CFStringRef str); CF_EXPORT SInt32 CFStringGetIntValue (CFStringRef str); /** \} */ /** \name Getting String Properties \{ */ CF_EXPORT void CFShow (CFTypeRef obj); CF_EXPORT void CFShowStr (CFStringRef str); CF_EXPORT CFTypeID CFStringGetTypeID (void); /** \} */ /** \name Pascal Strings \{ */ CF_EXPORT CFStringRef CFStringCreateWithPascalString (CFAllocatorRef alloc, ConstStr255Param pStr, CFStringEncoding encoding); CF_EXPORT CFStringRef CFStringCreateWithPascalStringNoCopy (CFAllocatorRef alloc, ConstStr255Param pStr, CFStringEncoding encoding, CFAllocatorRef contentsDeallocate); CF_EXPORT Boolean CFStringGetPascalString (CFStringRef theString, StringPtr buffer, CFIndex bufferSize, CFStringEncoding encoding); CF_EXPORT ConstStringPtr CFStringGetPascalStringPtr (CFStringRef theString, CFStringEncoding encoding); /** \} */ /** \} */ /** \defgroup CFMutableStringRef CFMutableString Reference * \{ */ #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST) typedef enum { kCFStringNormalizationFormD = 0, kCFStringNormalizationFormKD = 1, kCFStringNormalizationFormC = 2, kCFStringNormalizationFormKC = 3 } CFStringNormalizationForm; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) CF_EXPORT const CFStringRef kCFStringTransformStripCombiningMarks; CF_EXPORT const CFStringRef kCFStringTransformToLatin; CF_EXPORT const CFStringRef kCFStringTransformFullwidthHalfwidth; CF_EXPORT const CFStringRef kCFStringTransformLatinKatakana; CF_EXPORT const CFStringRef kCFStringTransformLatinHiragana; CF_EXPORT const CFStringRef kCFStringTransformHiraganaKatakana; CF_EXPORT const CFStringRef kCFStringTransformMandarinLatin; CF_EXPORT const CFStringRef kCFStringTransformLatinHangul; CF_EXPORT const CFStringRef kCFStringTransformLatinArabic; CF_EXPORT const CFStringRef kCFStringTransformLatinHebrew; CF_EXPORT const CFStringRef kCFStringTransformLatinThai; CF_EXPORT const CFStringRef kCFStringTransformLatinCyrillic; CF_EXPORT const CFStringRef kCFStringTransformLatinGreek; CF_EXPORT const CFStringRef kCFStringTransformToXMLHex; CF_EXPORT const CFStringRef kCFStringTransformToUnicodeName; #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) CF_EXPORT const CFStringRef kCFStringTransformStripDiacritics; #endif CF_EXPORT void CFStringAppend (CFMutableStringRef theString, CFStringRef appendedString); CF_EXPORT void CFStringAppendCharacters (CFMutableStringRef theString, const UniChar *chars, CFIndex numChars); CF_EXPORT void CFStringAppendCString (CFMutableStringRef theString, const char *cStr, CFStringEncoding encoding); CF_EXPORT void CFStringAppendFormat (CFMutableStringRef theString, CFDictionaryRef formatOptions, CFStringRef format, ...); CF_EXPORT void CFStringAppendFormatAndArguments (CFMutableStringRef theString, CFDictionaryRef formatOptions, CFStringRef format, va_list arguments); CF_EXPORT void CFStringAppendPascalString (CFMutableStringRef theString, ConstStr255Param pStr, CFStringEncoding encoding); CF_EXPORT void CFStringCapitalize (CFMutableStringRef theString, CFLocaleRef locale); CF_EXPORT CFMutableStringRef CFStringCreateMutable (CFAllocatorRef alloc, CFIndex maxLength); CF_EXPORT CFMutableStringRef CFStringCreateMutableCopy (CFAllocatorRef alloc, CFIndex maxLength, CFStringRef theString); CF_EXPORT CFMutableStringRef CFStringCreateMutableWithExternalCharactersNoCopy (CFAllocatorRef alloc, UniChar *chars, CFIndex numChars, CFIndex capacity, CFAllocatorRef externalCharactersAllocator); CF_EXPORT void CFStringDelete (CFMutableStringRef theString, CFRange range); CF_EXPORT void CFStringInsert (CFMutableStringRef str, CFIndex idx, CFStringRef insertedStr); CF_EXPORT void CFStringLowercase (CFMutableStringRef theString, CFLocaleRef locale); CF_EXPORT void CFStringPad (CFMutableStringRef theString, CFStringRef padString, CFIndex length, CFIndex indexIntoPad); CF_EXPORT void CFStringReplace (CFMutableStringRef theString, CFRange range, CFStringRef replacement); CF_EXPORT void CFStringReplaceAll (CFMutableStringRef theString, CFStringRef replacement); CF_EXPORT void CFStringSetExternalCharactersNoCopy (CFMutableStringRef theString, UniChar *chars, CFIndex length, CFIndex capacity); CF_EXPORT void CFStringTrim (CFMutableStringRef theString, CFStringRef trimString); CF_EXPORT void CFStringTrimWhitespace (CFMutableStringRef theString); CF_EXPORT void CFStringUppercase (CFMutableStringRef theString, CFLocaleRef locale); #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST) CF_EXPORT CFIndex CFStringFindAndReplace (CFMutableStringRef theString, CFStringRef stringToFind, CFStringRef replacementString, CFRange rangeToSearch, CFOptionFlags compareOptions); CF_EXPORT void CFStringNormalize (CFMutableStringRef theString, CFStringNormalizationForm theForm); #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST) CF_EXPORT Boolean CFStringTransform (CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse); #endif #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST) CF_EXPORT void CFStringFold (CFMutableStringRef theString, CFOptionFlags theFlags, CFLocaleRef theLocale); #endif /** \} */ /** \ingroup CFStringRef \name CFStringInlineBuffer \{ */ #define __kCFStringInlineBufferLength 64 struct CFStringInlineBuffer { UniChar buffer[__kCFStringInlineBufferLength]; CFStringRef theString; const UniChar *directBuffer; CFRange rangeToBuffer; CFIndex bufferedRangeStart; CFIndex bufferedRangeEnd; }; typedef struct CFStringInlineBuffer CFStringInlineBuffer; CF_INLINE void CFStringInitInlineBuffer (CFStringRef str, CFStringInlineBuffer *buf, CFRange range) { buf->theString = str; buf->rangeToBuffer = range; buf->directBuffer = CFStringGetCharactersPtr (str); buf->bufferedRangeStart = 0; buf->bufferedRangeEnd = 0; } CF_INLINE UniChar CFStringGetCharacterFromInlineBuffer (CFStringInlineBuffer *buf, CFIndex idx) { if (buf->directBuffer) { if (idx < 0 || idx >= buf->rangeToBuffer.length) return 0; return buf->directBuffer[idx + buf->rangeToBuffer.location]; } else if (idx >= buf->bufferedRangeEnd || idx < buf->bufferedRangeStart) { CFRange range; if (idx < 0 || idx >= buf->rangeToBuffer.length) return 0; /* Use 16 here so it's efficient to go backwards, too */ buf->bufferedRangeStart = idx - 16; if (buf->bufferedRangeStart < 0) buf->bufferedRangeStart = 0; buf->bufferedRangeEnd = buf->bufferedRangeStart + __kCFStringInlineBufferLength; if (buf->bufferedRangeEnd > buf->rangeToBuffer.length) buf->bufferedRangeEnd = buf->rangeToBuffer.length; range = CFRangeMake (buf->rangeToBuffer.location + buf->bufferedRangeStart, buf->bufferedRangeEnd - buf->bufferedRangeStart); CFStringGetCharacters (buf->theString, range, buf->buffer); } return buf->buffer[(idx - buf->bufferedRangeStart)]; } /** \} */ CF_EXTERN_C_END #endif /* __COREFOUNDATION_CFSTRING_H__ */