3 Copyright (C) 2010 Free Software Foundation, Inc.
5 Written by: Stefan Bidigaray
8 This file is part of CoreBase.
10 This library is free software; you can redistribute it and/or
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 2.1 of the License, or (at your option) any later version.
15 This library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public
21 License along with this library; see the file COPYING.LIB.
22 If not, see <http://www.gnu.org/licenses/> or write to the
23 Free Software Foundation, 51 Franklin Street, Fifth Floor,
24 Boston, MA 02110-1301, USA.
27 #ifndef __COREFOUNDATION_CFSTRING_H__
28 #define __COREFOUNDATION_CFSTRING_H__
32 #include "CFCharacterSet.h"
34 #include "CFDictionary.h"
41 /** \defgroup CFStringRef CFString Reference
42 \brief The CFString type defines opaque objects representing strings.
44 CFString is "toll-free bridged" to NSString.
52 typedef UInt32 CFStringEncoding
;
59 kCFCompareCaseInsensitive
= 1,
60 kCFCompareBackwards
= 4,
61 kCFCompareAnchored
= 8,
62 kCFCompareNonliteral
= 16,
63 kCFCompareLocalized
= 32,
64 kCFCompareNumerically
= 64,
65 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
66 kCFCompareDiacriticInsensitive
= 128,
67 kCFCompareWidthInsensitive
= 256,
68 kCFCompareForcedOrdering
= 512
70 } CFStringCompareFlags
;
72 enum CFStringBuiltInEncodings
74 kCFStringEncodingMacRoman
= 0,
75 kCFStringEncodingWindowsLatin1
= 0x0500,
76 kCFStringEncodingISOLatin1
= 0x0201,
77 kCFStringEncodingNextStepLatin
= 0x0B01,
78 kCFStringEncodingASCII
= 0x0600,
79 kCFStringEncodingUnicode
= 0x0100,
80 kCFStringEncodingUTF8
= 0x08000100,
81 kCFStringEncodingNonLossyASCII
= 0x0BFF,
82 #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
83 kCFStringEncodingUTF16
= 0x0100,
84 kCFStringEncodingUTF16BE
= 0x10000100,
85 kCFStringEncodingUTF16LE
= 0x14000100,
86 kCFStringEncodingUTF32
= 0x0c000100,
87 kCFStringEncodingUTF32BE
= 0x18000100,
88 kCFStringEncodingUTF32LE
= 0x1c000100
92 #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
93 # define kCFStringEncodingInvalidId (0xffffffffU)
97 \brief Creates a constant string object.
99 \note This macro will create the constant string at runtime.
101 /* The 'pure' attribute tells the compiler that this function will always
102 return the same result with the same input. If it has any skill, then
103 constant propagation passes will magically make sure that this function is
104 called as few times as possible. */
105 CF_EXPORT CFStringRef
106 __CFStringMakeConstantString (const char *str
) GS_PURE_FUNCTION
;
107 //#define CFSTR(x) __CFStringMakeConstantString("" x "")
109 #ifdef __CONSTANT_CFSTRINGS__
110 #define CFSTR(x) ((CFStringRef) __builtin___CFStringMakeConstantString ("" x ""))
112 #define CFSTR(x) __CFStringMakeConstantString("" x "")
115 /** \name Creating a CFString
119 CFStringCreateArrayBySeparatingStrings (CFAllocatorRef alloc
,
120 CFStringRef theString
, CFStringRef separatorString
);
122 CF_EXPORT CFStringRef
123 CFStringCreateByCombiningStrings (CFAllocatorRef alloc
, CFArrayRef theArray
,
124 CFStringRef separatorString
);
126 CF_EXPORT CFStringRef
127 CFStringCreateCopy (CFAllocatorRef alloc
, CFStringRef theString
);
129 CF_EXPORT CFStringRef
130 CFStringCreateFromExternalRepresentation (CFAllocatorRef alloc
, CFDataRef data
,
131 CFStringEncoding encoding
);
133 CF_EXPORT CFStringRef
134 CFStringCreateWithBytes (CFAllocatorRef alloc
, const UInt8
*bytes
,
135 CFIndex numBytes
, CFStringEncoding encoding
, Boolean isExternalRepresentation
);
137 CF_EXPORT CFStringRef
138 CFStringCreateWithCharacters (CFAllocatorRef alloc
, const UniChar
*chars
,
141 CF_EXPORT CFStringRef
142 CFStringCreateWithCharactersNoCopy (CFAllocatorRef alloc
, const UniChar
*chars
,
143 CFIndex numChars
, CFAllocatorRef contentsDeallocator
);
145 CF_EXPORT CFStringRef
146 CFStringCreateWithCString (CFAllocatorRef alloc
, const char *cStr
,
147 CFStringEncoding encoding
);
149 CF_EXPORT CFStringRef
150 CFStringCreateWithCStringNoCopy (CFAllocatorRef alloc
, const char *cStr
,
151 CFStringEncoding encoding
, CFAllocatorRef contentsDeallocator
);
153 CF_EXPORT CFStringRef
154 CFStringCreateWithFormat (CFAllocatorRef alloc
, CFDictionaryRef formatOptions
,
155 CFStringRef format
, ...);
157 CF_EXPORT CFStringRef
158 CFStringCreateWithFormatAndArguments (CFAllocatorRef alloc
,
159 CFDictionaryRef formatOptions
, CFStringRef format
, va_list arguments
);
161 CF_EXPORT CFStringRef
162 CFStringCreateWithSubstring (CFAllocatorRef alloc
, CFStringRef str
,
165 #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
166 CF_EXPORT CFStringRef
167 CFStringCreateWithFileSystemRepresentation (CFAllocatorRef alloc
,
171 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
172 CF_EXPORT CFStringRef
173 CFStringCreateWithBytesNoCopy (CFAllocatorRef alloc
, const UInt8
*bytes
,
174 CFIndex numBytes
, CFStringEncoding encoding
, Boolean isExternalReprentation
,
175 CFAllocatorRef contentsDeallocator
);
179 /** \name Searching CFStrings
183 CFStringCreateArrayWithFindResults (CFAllocatorRef alloc
, CFStringRef theString
,
184 CFStringRef stringToFind
, CFRange rangeToSearch
,
185 CFStringCompareFlags compareOptions
);
188 CFStringFind (CFStringRef theString
, CFStringRef stringToFind
,
189 CFStringCompareFlags compareOptions
);
192 CFStringFindWithOptions (CFStringRef theString
, CFStringRef stringToFind
,
193 CFRange rangeToSearch
, CFStringCompareFlags searchOptions
, CFRange
*result
);
196 CFStringFindWithOptionsAndLocale (CFStringRef theString
,CFStringRef stringToFind
,
197 CFRange rangeToSearch
, CFStringCompareFlags searchOptions
,
198 CFLocaleRef locale
, CFRange
*result
);
201 CFStringGetLineBounds (CFStringRef theString
, CFRange range
,
202 CFIndex
*lineBeginIndex
, CFIndex
*lineEndIndex
, CFIndex
*contentsEndIndex
);
204 #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
206 CFStringFindCharacterFromSet (CFStringRef theString
, CFCharacterSetRef theSet
,
207 CFRange rangeToSearch
, CFStringCompareFlags searchOptions
, CFRange
*result
);
210 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
212 CFStringGetParagraphBounds (CFStringRef string
, CFRange range
,
213 CFIndex
*parBeginIndex
, CFIndex
*parEndIndex
, CFIndex
*contentsEndIndex
);
217 /** \name Comparing String
220 CF_EXPORT CFComparisonResult
221 CFStringCompare (CFStringRef theString1
, CFStringRef theString2
,
222 CFStringCompareFlags compareOptions
);
224 CF_EXPORT CFComparisonResult
225 CFStringCompareWithOptions (CFStringRef theString1
, CFStringRef theString2
,
226 CFRange rangeToCOmpare
, CFStringCompareFlags compareOptions
);
229 CFStringHasPrefix (CFStringRef theString
, CFStringRef prefix
);
232 CFStringHasSuffix (CFStringRef theString
, CFStringRef suffix
);
234 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
235 CF_EXPORT CFComparisonResult
236 CFStringCompareWithOptionsAndLocale (CFStringRef theString1
,
237 CFStringRef theString2
, CFRange rangeToCOmpare
,
238 CFStringCompareFlags compareOptions
, CFLocaleRef locale
);
242 /** \name Accessing Characters
246 CFStringCreateExternalRepresentation (CFAllocatorRef alloc
,
247 CFStringRef theString
, CFStringEncoding encoding
, UInt8 lossByte
);
250 CFStringGetBytes (CFStringRef theString
, CFRange range
,
251 CFStringEncoding encoding
, UInt8 lossByte
, Boolean isExternalRepresentation
,
252 UInt8
*buffer
, CFIndex maxBufLen
, CFIndex
*usedBufLen
);
255 CFStringGetCharacterAtIndex (CFStringRef theString
, CFIndex idx
);
258 CFStringGetCharacters (CFStringRef theString
, CFRange range
, UniChar
*buffer
);
260 CF_EXPORT
const UniChar
*
261 CFStringGetCharactersPtr (CFStringRef theString
);
264 CFStringGetCString (CFStringRef theString
, char *buffer
, CFIndex bufferSize
,
265 CFStringEncoding encoding
);
267 CF_EXPORT
const char *
268 CFStringGetCStringPtr (CFStringRef theString
, CFStringEncoding encoding
);
271 CFStringGetLength (CFStringRef str
);
274 CFStringGetRangeOfComposedCharactersAtIndex (CFStringRef theString
,
277 #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST)
279 CFStringGetLongCharacterForSurrogatePair (UniChar surrogateHigh
,
280 UniChar surrogateLow
);
283 CFStringGetSurrogatePairForLongCharacter (UTF32Char character
,
284 UniChar
*surrogates
);
287 CFStringIsSurrogateHighCharacter (UniChar character
);
290 CFStringIsSurrogateLowCharacter (UniChar character
);
294 /** \name Working with Encodings
297 CF_EXPORT CFStringRef
298 CFStringConvertEncodingToIANACharSetName (CFStringEncoding encoding
);
300 CF_EXPORT
unsigned long
301 CFStringConvertEncodingToNSStringEncoding (CFStringEncoding encoding
);
304 CFStringConvertEncodingToWindowsCodepage (CFStringEncoding encoding
);
306 CF_EXPORT CFStringEncoding
307 CFStringConvertIANACharSetNameToEncoding (CFStringRef theString
);
309 CF_EXPORT CFStringEncoding
310 CFStringConvertNSStringEncodingToEncoding (unsigned long encoding
);
312 CF_EXPORT CFStringEncoding
313 CFStringConvertWindowsCodepageToEncoding (UInt32 codepage
);
315 CF_EXPORT CFStringEncoding
316 CFStringGetFastestEncoding (CFStringRef theString
);
318 CF_EXPORT
const CFStringEncoding
*
319 CFStringGetListOfAvailableEncodings (void);
322 CFStringGetMaximumSizeForEncoding (CFIndex length
, CFStringEncoding encoding
);
324 CF_EXPORT CFStringEncoding
325 CFStringGetMostCompatibleMacStringEncoding (CFStringEncoding encoding
);
327 CF_EXPORT CFStringRef
328 CFStringGetNameOfEncoding (CFStringEncoding encoding
);
330 CF_EXPORT CFStringEncoding
331 CFStringGetSmallestEncoding (CFStringRef theString
);
333 CF_EXPORT CFStringEncoding
334 CFStringGetSystemEncoding (void);
337 CFStringIsEncodingAvailable (CFStringEncoding encoding
);
339 #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
341 CFStringGetFileSystemRepresentation (CFStringRef string
, char *buffer
,
345 CFStringGetMaximumSizeOfFileSystemRepresentation (CFStringRef string
);
349 /** \name Getting Numeric Values
353 CFStringGetDoubleValue (CFStringRef str
);
356 CFStringGetIntValue (CFStringRef str
);
359 /** \name Getting String Properties
363 CFShow (CFTypeRef obj
);
366 CFShowStr (CFStringRef str
);
369 CFStringGetTypeID (void);
374 /** \name Pascal Strings
377 CF_EXPORT CFStringRef
378 CFStringCreateWithPascalString (CFAllocatorRef alloc
, ConstStr255Param pStr
,
379 CFStringEncoding encoding
);
381 CF_EXPORT CFStringRef
382 CFStringCreateWithPascalStringNoCopy (CFAllocatorRef alloc
,
383 ConstStr255Param pStr
, CFStringEncoding encoding
,
384 CFAllocatorRef contentsDeallocate
);
387 CFStringGetPascalString (CFStringRef theString
, StringPtr buffer
,
388 CFIndex bufferSize
, CFStringEncoding encoding
);
390 CF_EXPORT ConstStringPtr
391 CFStringGetPascalStringPtr (CFStringRef theString
, CFStringEncoding encoding
);
397 /** \defgroup CFMutableStringRef CFMutableString Reference
400 #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
403 kCFStringNormalizationFormD
= 0,
404 kCFStringNormalizationFormKD
= 1,
405 kCFStringNormalizationFormC
= 2,
406 kCFStringNormalizationFormKC
= 3
407 } CFStringNormalizationForm
;
410 #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
411 CF_EXPORT
const CFStringRef kCFStringTransformStripCombiningMarks
;
412 CF_EXPORT
const CFStringRef kCFStringTransformToLatin
;
413 CF_EXPORT
const CFStringRef kCFStringTransformFullwidthHalfwidth
;
414 CF_EXPORT
const CFStringRef kCFStringTransformLatinKatakana
;
415 CF_EXPORT
const CFStringRef kCFStringTransformLatinHiragana
;
416 CF_EXPORT
const CFStringRef kCFStringTransformHiraganaKatakana
;
417 CF_EXPORT
const CFStringRef kCFStringTransformMandarinLatin
;
418 CF_EXPORT
const CFStringRef kCFStringTransformLatinHangul
;
419 CF_EXPORT
const CFStringRef kCFStringTransformLatinArabic
;
420 CF_EXPORT
const CFStringRef kCFStringTransformLatinHebrew
;
421 CF_EXPORT
const CFStringRef kCFStringTransformLatinThai
;
422 CF_EXPORT
const CFStringRef kCFStringTransformLatinCyrillic
;
423 CF_EXPORT
const CFStringRef kCFStringTransformLatinGreek
;
424 CF_EXPORT
const CFStringRef kCFStringTransformToXMLHex
;
425 CF_EXPORT
const CFStringRef kCFStringTransformToUnicodeName
;
427 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
428 CF_EXPORT
const CFStringRef kCFStringTransformStripDiacritics
;
432 CFStringAppend (CFMutableStringRef theString
, CFStringRef appendedString
);
435 CFStringAppendCharacters (CFMutableStringRef theString
,
436 const UniChar
*chars
, CFIndex numChars
);
439 CFStringAppendCString (CFMutableStringRef theString
, const char *cStr
,
440 CFStringEncoding encoding
);
443 CFStringAppendFormat (CFMutableStringRef theString
,
444 CFDictionaryRef formatOptions
, CFStringRef format
, ...);
447 CFStringAppendFormatAndArguments (CFMutableStringRef theString
,
448 CFDictionaryRef formatOptions
, CFStringRef format
, va_list arguments
);
451 CFStringAppendPascalString (CFMutableStringRef theString
,
452 ConstStr255Param pStr
, CFStringEncoding encoding
);
455 CFStringCapitalize (CFMutableStringRef theString
, CFLocaleRef locale
);
457 CF_EXPORT CFMutableStringRef
458 CFStringCreateMutable (CFAllocatorRef alloc
, CFIndex maxLength
);
460 CF_EXPORT CFMutableStringRef
461 CFStringCreateMutableCopy (CFAllocatorRef alloc
, CFIndex maxLength
,
462 CFStringRef theString
);
464 CF_EXPORT CFMutableStringRef
465 CFStringCreateMutableWithExternalCharactersNoCopy (CFAllocatorRef alloc
,
466 UniChar
*chars
, CFIndex numChars
, CFIndex capacity
,
467 CFAllocatorRef externalCharactersAllocator
);
470 CFStringDelete (CFMutableStringRef theString
, CFRange range
);
473 CFStringInsert (CFMutableStringRef str
, CFIndex idx
, CFStringRef insertedStr
);
476 CFStringLowercase (CFMutableStringRef theString
, CFLocaleRef locale
);
479 CFStringPad (CFMutableStringRef theString
, CFStringRef padString
,
480 CFIndex length
, CFIndex indexIntoPad
);
483 CFStringReplace (CFMutableStringRef theString
, CFRange range
,
484 CFStringRef replacement
);
487 CFStringReplaceAll (CFMutableStringRef theString
, CFStringRef replacement
);
490 CFStringSetExternalCharactersNoCopy (CFMutableStringRef theString
,
491 UniChar
*chars
, CFIndex length
, CFIndex capacity
);
494 CFStringTrim (CFMutableStringRef theString
, CFStringRef trimString
);
497 CFStringTrimWhitespace (CFMutableStringRef theString
);
500 CFStringUppercase (CFMutableStringRef theString
, CFLocaleRef locale
);
502 #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
504 CFStringFindAndReplace (CFMutableStringRef theString
,
505 CFStringRef stringToFind
, CFStringRef replacementString
,
506 CFRange rangeToSearch
, CFOptionFlags compareOptions
);
509 CFStringNormalize (CFMutableStringRef theString
,
510 CFStringNormalizationForm theForm
);
513 #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
515 CFStringTransform (CFMutableStringRef string
, CFRange
*range
,
516 CFStringRef transform
, Boolean reverse
);
519 #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
521 CFStringFold (CFMutableStringRef theString
, CFOptionFlags theFlags
,
522 CFLocaleRef theLocale
);
528 /** \ingroup CFStringRef
529 \name CFStringInlineBuffer
532 #define __kCFStringInlineBufferLength 64
533 struct CFStringInlineBuffer
535 UniChar buffer
[__kCFStringInlineBufferLength
];
536 CFStringRef theString
;
537 const UniChar
*directBuffer
;
538 CFRange rangeToBuffer
;
539 CFIndex bufferedRangeStart
;
540 CFIndex bufferedRangeEnd
;
542 typedef struct CFStringInlineBuffer CFStringInlineBuffer
;
545 CFStringInitInlineBuffer (CFStringRef str
, CFStringInlineBuffer
*buf
,
548 buf
->theString
= str
;
549 buf
->rangeToBuffer
= range
;
550 buf
->directBuffer
= CFStringGetCharactersPtr (str
);
551 buf
->bufferedRangeStart
= 0;
552 buf
->bufferedRangeEnd
= 0;
556 CFStringGetCharacterFromInlineBuffer (CFStringInlineBuffer
*buf
, CFIndex idx
)
558 if (buf
->directBuffer
)
560 if (idx
< 0 || idx
>= buf
->rangeToBuffer
.length
)
562 return buf
->directBuffer
[idx
+ buf
->rangeToBuffer
.location
];
564 else if (idx
>= buf
->bufferedRangeEnd
|| idx
< buf
->bufferedRangeStart
)
568 if (idx
< 0 || idx
>= buf
->rangeToBuffer
.length
)
571 /* Use 16 here so it's efficient to go backwards, too */
572 buf
->bufferedRangeStart
= idx
- 16;
573 if (buf
->bufferedRangeStart
< 0)
574 buf
->bufferedRangeStart
= 0;
575 buf
->bufferedRangeEnd
=
576 buf
->bufferedRangeStart
+ __kCFStringInlineBufferLength
;
577 if (buf
->bufferedRangeEnd
> buf
->rangeToBuffer
.length
)
578 buf
->bufferedRangeEnd
= buf
->rangeToBuffer
.length
;
580 range
= CFRangeMake (buf
->rangeToBuffer
.location
+ buf
->bufferedRangeStart
,
581 buf
->bufferedRangeEnd
- buf
->bufferedRangeStart
);
583 CFStringGetCharacters (buf
->theString
, range
, buf
->buffer
);
586 return buf
->buffer
[(idx
- buf
->bufferedRangeStart
)];
592 #endif /* __COREFOUNDATION_CFSTRING_H__ */