CFString.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:32k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.      File:       CFString.h
  3.  
  4.      Contains:   CoreFoundation strings
  5.  
  6.      Version:    Technology: Mac OS X
  7.                  Release:    QuickTime 6.0.2
  8.  
  9.      Copyright:  (c) 1999-2001 by Apple Computer, Inc., all rights reserved
  10.  
  11.      Bugs?:      For bug reports, consult the following page on
  12.                  the World Wide Web:
  13.  
  14.                      http://developer.apple.com/bugreporter/
  15.  
  16. */
  17. #ifndef __CFSTRING__
  18. #define __CFSTRING__
  19. #ifndef __CFBASE__
  20. #include "CFBase.h"
  21. #endif
  22. #ifndef __CFARRAY__
  23. #include "CFArray.h"
  24. #endif
  25. #ifndef __CFDATA__
  26. #include "CFData.h"
  27. #endif
  28. #ifndef __CFDICTIONARY__
  29. #include "CFDictionary.h"
  30. #endif
  31. #include "stdarg.h"
  32. #if PRAGMA_ONCE
  33. #pragma once
  34. #endif
  35. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38. #if PRAGMA_IMPORT
  39. #pragma import on
  40. #endif
  41. #if PRAGMA_STRUCT_ALIGN
  42.     #pragma options align=mac68k
  43. #elif PRAGMA_STRUCT_PACKPUSH
  44.     #pragma pack(push, 2)
  45. #elif PRAGMA_STRUCT_PACK
  46.     #pragma pack(2)
  47. #endif
  48. /*
  49. Please note: CFStrings are conceptually an array of Unicode characters.
  50. However, in general, how a CFString stores this array is an implementation
  51. detail. For instance, CFString might choose to use an array of 8-bit characters;
  52. to store its contents; or it might use multiple blocks of memory; or whatever.
  53. Furthermore, the implementation might change depending on the default
  54. system encoding, the user's language, the OS, or even a given release.
  55. What this means is that you should use the following advanced functions with care:
  56.   CFStringGetPascalStringPtr()
  57.   CFStringGetCStringPtr()
  58.   CFStringGetCharactersPtr()
  59. These functions either return the desired pointer quickly, in constant time, or they
  60. return NULL, which indicates you should use some of the other function, as shown 
  61. in this example: 
  62.     Str255 buffer;
  63.     StringPtr ptr = CFStringGetPascalStringPtr(str, encoding);
  64.     if (ptr == NULL) {
  65.     if (CFStringGetPascalString(str, buffer, 256, encoding)) ptr = buffer;
  66.     }
  67. Note that CFStringGetPascalString call might still return NULL --- but that will happen 
  68. in two circumstances only: The conversion from the UniChar contents of CFString
  69. to the specified encoding fails, or the buffer is too small. 
  70. If you need a copy of the buffer in the above example, you might consider simply
  71. calling CFStringGetPascalString() in all cases --- CFStringGetPascalStringPtr()
  72. is simply an optimization.
  73. In addition, the following functions, which create immutable CFStrings from developer
  74. supplied buffers without copying the buffers, might have to actually copy
  75. under certain circumstances (If they do copy, the buffer will be dealt by the
  76. "contentsDeallocator" argument.):
  77.   CFStringCreateWithPascalStringNoCopy()
  78.   CFStringCreateWithCStringNoCopy()
  79.   CFStringCreateWithCharactersNoCopy()
  80. You should of course never depend on the backing store of these CFStrings being
  81. what you provided, and in other no circumstance should you change the contents
  82. of that buffer (given that would break the invariant about the CFString being immutable).
  83. Having said all this, there are actually ways to create a CFString where the backing store
  84. is external, and can be manipulated by the developer or CFString itself:
  85.   CFStringCreateMutableWithExternalCharactersNoCopy()
  86.   CFStringSetExternalCharactersNoCopy()
  87. A "contentsAllocator" is used to realloc or free the backing store by CFString.
  88. kCFAllocatorNull can be provided to assure CFString will never realloc or free the buffer.
  89. Developer can call CFStringSetExternalCharactersNoCopy() to update
  90. CFString's idea of what's going on, if the buffer is changed externally. In these
  91. strings, CFStringGetCharactersPtr() is guaranteed to return the external buffer.
  92. These functions are here to allow wrapping a buffer of UniChar characters in a CFString,
  93. allowing the buffer to passed into CFString functions and also manipulated via CFString
  94. mutation functions. In general, developers should not use this technique for all strings,
  95. as it prevents CFString from using certain optimizations.
  96. */
  97. /*
  98.     CFStringRef and CFMutableStringRef are defined in CFBase.h
  99. */
  100. /* Identifier for character encoding; the values are the same as Text Encoding Converter TextEncoding.
  101. */
  102. typedef UInt32                          CFStringEncoding;
  103. /* Platform-independent built-in encodings; always available on all platforms.
  104. */
  105. enum {
  106.     kCFStringEncodingInvalidId  = -1L,
  107.     kCFStringEncodingMacRoman   = 0L,
  108.     kCFStringEncodingWindowsLatin1 = 0x0500,                    /* ANSI codepage 1252 */
  109.     kCFStringEncodingISOLatin1  = 0x0201,                       /* ISO 8850 1 */
  110.     kCFStringEncodingNextStepLatin = 0x0B01,                    /* NextStep encoding*/
  111.     kCFStringEncodingASCII      = 0x0600,                       /* 0..127 */
  112.     kCFStringEncodingUnicode    = 0x0100,                       /* kTextEncodingUnicodeDefault  + kTextEncodingDefaultFormat (aka kUnicode16BitFormat) */
  113.     kCFStringEncodingUTF8       = 0x08000100,                   /* kTextEncodingUnicodeDefault + kUnicodeUTF8Format */
  114.     kCFStringEncodingNonLossyASCII = 0x0BFF                     /* 7bit Unicode variants used by YellowBox & Java */
  115. };
  116. /* CFString type ID
  117. */
  118. EXTERN_API_C( CFTypeID )
  119. CFStringGetTypeID               (void);
  120. /* Macro to allow creation of compile-time constant strings; the argument should be a constant string. This will work for now but we need something better.
  121. */
  122. #define CFSTR(cStr)  __CFStringMakeConstantString(cStr "")
  123. /*** Immutable string creation functions ***/
  124. /* Functions to create basic immutable strings. The provided allocator is used for all memory activity in these functions.
  125. */
  126. /* These functions copy the provided buffer into CFString's internal storage.
  127. */
  128. EXTERN_API_C( CFStringRef )
  129. CFStringCreateWithPascalString  (CFAllocatorRef         alloc,
  130.                                  ConstStringPtr         pStr,
  131.                                  CFStringEncoding       encoding);
  132. EXTERN_API_C( CFStringRef )
  133. CFStringCreateWithCString       (CFAllocatorRef         alloc,
  134.                                  const char *           cStr,
  135.                                  CFStringEncoding       encoding);
  136. EXTERN_API_C( CFStringRef )
  137. CFStringCreateWithCharacters    (CFAllocatorRef         alloc,
  138.                                  const UniChar *        chars,
  139.                                  CFIndex                numChars);
  140. /* These functions try not to copy the provided buffer. The buffer will be 
  141. deallocated with the provided contentsDeallocator when it's no longer needed;
  142. to not free the buffer, specify kCFAllocatorNull here. As usual, NULL means
  143. default allocator.
  144. NOTE: Do not count on these buffers as being used by the string; 
  145. in some cases the CFString might free the buffer and use something else
  146. (for instance if it decides to always use Unicode encoding internally). 
  147. In addition, some encodings are not used internally; in
  148. those cases CFString might also dump the provided buffer and use its own.
  149. */
  150. EXTERN_API_C( CFStringRef )
  151. CFStringCreateWithPascalStringNoCopy (CFAllocatorRef    alloc,
  152.                                  ConstStringPtr         pStr,
  153.                                  CFStringEncoding       encoding,
  154.                                  CFAllocatorRef         contentsDeallocator);
  155. EXTERN_API_C( CFStringRef )
  156. CFStringCreateWithCStringNoCopy (CFAllocatorRef         alloc,
  157.                                  const char *           cStr,
  158.                                  CFStringEncoding       encoding,
  159.                                  CFAllocatorRef         contentsDeallocator);
  160. EXTERN_API_C( CFStringRef )
  161. CFStringCreateWithCharactersNoCopy (CFAllocatorRef      alloc,
  162.                                  const UniChar *        chars,
  163.                                  CFIndex                numChars,
  164.                                  CFAllocatorRef         contentsDeallocator);
  165. /* Create copies of part or all of the string.
  166. */
  167. EXTERN_API_C( CFStringRef )
  168. CFStringCreateWithSubstring     (CFAllocatorRef         alloc,
  169.                                  CFStringRef            str,
  170.                                  CFRange                range);
  171. EXTERN_API_C( CFStringRef )
  172. CFStringCreateCopy              (CFAllocatorRef         alloc,
  173.                                  CFStringRef            theString);
  174. /* These functions create a CFString from the provided printf-format and arguments.
  175. */
  176. EXTERN_API_C( CFStringRef )
  177. CFStringCreateWithFormat        (CFAllocatorRef         alloc,
  178.                                  CFDictionaryRef        formatOptions,
  179.                                  CFStringRef            format,
  180.                                  ...);
  181. EXTERN_API_C( CFStringRef )
  182. CFStringCreateWithFormatAndArguments (CFAllocatorRef    alloc,
  183.                                  CFDictionaryRef        formatOptions,
  184.                                  CFStringRef            format,
  185.                                  va_list                arguments);
  186. /* Functions to create mutable strings. "maxLength", if not 0, is a hard bound on the length of the string. If 0, there is no limit on the length.
  187. */
  188. EXTERN_API_C( CFMutableStringRef )
  189. CFStringCreateMutable           (CFAllocatorRef         alloc,
  190.                                  CFIndex                maxLength);
  191. EXTERN_API_C( CFMutableStringRef )
  192. CFStringCreateMutableCopy       (CFAllocatorRef         alloc,
  193.                                  CFIndex                maxLength,
  194.                                  CFStringRef            theString);
  195. /* This function creates a mutable string that has a developer supplied and directly editable backing store.
  196. The string will be manipulated within the provided buffer (if any) until it outgrows capacity; then the
  197. externalCharactersAllocator will be consulted for more memory. When the CFString is deallocated, the
  198. buffer will be freed with the externalCharactersAllocator. Provide kCFAllocatorNull here to prevent the buffer
  199. from ever being reallocated or deallocated by CFString. See comments at top of this file for more info.
  200. */
  201. EXTERN_API_C( CFMutableStringRef )
  202. CFStringCreateMutableWithExternalCharactersNoCopy (CFAllocatorRef  alloc,
  203.                                  UniChar *              chars,
  204.                                  CFIndex                numChars,
  205.                                  CFIndex                capacity,
  206.                                  CFAllocatorRef         externalCharactersAllocator);
  207. /*** Basic accessors for the contents ***/
  208. /* Number of 16-bit Unicode characters in the string.
  209. */
  210. EXTERN_API_C( CFIndex )
  211. CFStringGetLength               (CFStringRef            theString);
  212. /* Extracting the contents of the string. For obtaining multiple characters, calling
  213. CFStringGetCharacters() is more efficient than multiple calls to CFStringGetCharacterAtIndex().
  214. If the length of the string is not known (so you can't use a fixed size buffer for CFStringGetCharacters()),
  215. another method is to use is CFStringGetCharacterFromInlineBuffer() (see further below).
  216. */
  217. EXTERN_API_C( UniChar )
  218. CFStringGetCharacterAtIndex     (CFStringRef            theString,
  219.                                  CFIndex                idx);
  220. EXTERN_API_C( void )
  221. CFStringGetCharacters           (CFStringRef            theString,
  222.                                  CFRange                range,
  223.                                  UniChar *              buffer);
  224. /*** Conversion to other encodings ***/
  225. /* These two convert into the provided buffer; they return FALSE if conversion isn't possible
  226. (due to conversion error, or not enough space in the provided buffer). 
  227. These functions do zero-terminate or put the length byte; the provided bufferSize should include
  228. space for this (so pass 256 for Str255). More sophisticated usages can go through CFStringGetBytes().
  229. */
  230. EXTERN_API_C( Boolean )
  231. CFStringGetPascalString         (CFStringRef            theString,
  232.                                  StringPtr              buffer,
  233.                                  CFIndex                bufferSize,
  234.                                  CFStringEncoding       encoding);
  235. EXTERN_API_C( Boolean )
  236. CFStringGetCString              (CFStringRef            theString,
  237.                                  char *                 buffer,
  238.                                  CFIndex                bufferSize,
  239.                                  CFStringEncoding       encoding);
  240. /* These functions attempt to return in O(1) time the desired format for the string.
  241. Note that although this means a pointer to the internal structure is being returned,
  242. this can't always be counted on. Please see note at the top of the file for more
  243. details.
  244. */
  245. EXTERN_API_C( ConstStringPtr )
  246. CFStringGetPascalStringPtr      (CFStringRef            theString,
  247.                                  CFStringEncoding       encoding);
  248. /* Be prepared for NULL */
  249. EXTERN_API_C( const char *)
  250. CFStringGetCStringPtr           (CFStringRef            theString,
  251.                                  CFStringEncoding       encoding);
  252. /* Be prepared for NULL */
  253. EXTERN_API_C( const UniChar *)
  254. CFStringGetCharactersPtr        (CFStringRef            theString);
  255. /* Be prepared for NULL */
  256. /* The primitive conversion routine; allows you to convert a string piece at a time
  257.    into a fixed size buffer. Returns number of characters converted. 
  258.    Characters that cannot be converted to the specified encoding are represented
  259.    with the byte specified by lossByte; if lossByte is 0, then lossy conversion
  260.    is not allowed and conversion stops, returning partial results.
  261.    Pass buffer==NULL if you don't care about the converted string (but just the convertability,
  262.    or number of bytes required, indicated by usedBufLen). 
  263.    maxBufLength indicates the maximum number of bytes to generate; it is consulted even
  264.    if buffer is NULL, so pass in INT_MAX if you want to find out the maximum number of bytes.
  265.    Does not zero-terminate. If you want to create Pascal or C string, allow one extra byte at start or end. 
  266.    Setting isExternalRepresentation causes any extra bytes that would allow 
  267.    the data to be made persistent to be included; for instance, the Unicode BOM.
  268. */
  269. EXTERN_API_C( CFIndex )
  270. CFStringGetBytes                (CFStringRef            theString,
  271.                                  CFRange                range,
  272.                                  CFStringEncoding       encoding,
  273.                                  UInt8                  lossByte,
  274.                                  Boolean                isExternalRepresentation,
  275.                                  UInt8 *                buffer,
  276.                                  CFIndex                maxBufLen,
  277.                                  CFIndex *              usedBufLen);
  278. /* This one goes the other way by creating a CFString from a bag of bytes. 
  279. This is much like CFStringCreateWithPascalString or CFStringCreateWithCString, 
  280. except the length is supplied explicitly. In addition, you can specify whether 
  281. the data is an external format --- that is, whether to pay attention to the 
  282. BOM character (if any) and do byte swapping if necessary
  283. */
  284. EXTERN_API_C( CFStringRef )
  285. CFStringCreateWithBytes         (CFAllocatorRef         alloc,
  286.                                  const UInt8 *          bytes,
  287.                                  CFIndex                numBytes,
  288.                                  CFStringEncoding       encoding,
  289.                                  Boolean                isExternalRepresentation);
  290. /* Convenience functions String <-> Data. These generate "external" formats, that is, formats that
  291.    can be written out to disk. For instance, if the encoding is Unicode, CFStringCreateFromExternalRepresentation()
  292.    pays attention to the BOM character (if any) and does byte swapping if necessary.
  293.    Similarly CFStringCreateExternalRepresentation() will always include a BOM character if the encoding is
  294.    Unicode. See above for description of lossByte.
  295. */
  296. EXTERN_API_C( CFStringRef )
  297. CFStringCreateFromExternalRepresentation (CFAllocatorRef  alloc,
  298.                                  CFDataRef              data,
  299.                                  CFStringEncoding       encoding);
  300. /* May return NULL on conversion error */
  301. EXTERN_API_C( CFDataRef )
  302. CFStringCreateExternalRepresentation (CFAllocatorRef    alloc,
  303.                                  CFStringRef            theString,
  304.                                  CFStringEncoding       encoding,
  305.                                  UInt8                  lossByte);
  306. /* May return NULL on conversion error */
  307. /* Hints about the contents of a string
  308. */
  309. EXTERN_API_C( CFStringEncoding )
  310. CFStringGetSmallestEncoding     (CFStringRef            theString);
  311. /* Result in O(n) time max */
  312. EXTERN_API_C( CFStringEncoding )
  313. CFStringGetFastestEncoding      (CFStringRef            theString);
  314. /* Result in O(1) time max */
  315. /* General encoding info
  316. */
  317. EXTERN_API_C( CFStringEncoding )
  318. CFStringGetSystemEncoding       (void);
  319. /* The default encoding for the system; untagged 8-bit characters are usually in this encoding */
  320. EXTERN_API_C( CFIndex )
  321. CFStringGetMaximumSizeForEncoding (CFIndex              length,
  322.                                  CFStringEncoding       encoding);
  323. /* Max bytes a string of specified length (in UniChars) will take up if encoded */
  324. /*** Comparison functions. ***/
  325. enum {
  326.                                                                 /* Flags used in all find and compare operations */
  327.     kCFCompareCaseInsensitive   = 1,
  328.     kCFCompareBackwards         = 4,                            /* Starting from the end of the string */
  329.     kCFCompareAnchored          = 8,                            /* Only at the specified starting point */
  330.     kCFCompareNonliteral        = 16,                           /* If specified, loose equivalence is performed (o-umlaut == o, umlaut) */
  331.     kCFCompareLocalized         = 32,                           /* User's default locale is used for the comparisons */
  332.     kCFCompareNumerically       = 64                            /* Numeric comparison is used; that is, Foo2.txt < Foo7.txt < Foo25.txt */
  333. };
  334. /* The main comparison routine; compares specified range of the string to another.
  335.    locale == NULL indicates canonical locale
  336. */
  337. EXTERN_API_C( CFComparisonResult )
  338. CFStringCompareWithOptions      (CFStringRef            string1,
  339.                                  CFStringRef            string2,
  340.                                  CFRange                rangeToCompare,
  341.                                  CFOptionFlags          compareOptions);
  342. /* Comparison convenience suitable for passing as sorting functions.
  343. */
  344. EXTERN_API_C( CFComparisonResult )
  345. CFStringCompare                 (CFStringRef            string1,
  346.                                  CFStringRef            string2,
  347.                                  CFOptionFlags          compareOptions);
  348. /* Find routines; CFStringFindWithOptions() returns the found range in the CFRange * argument;  You can pass NULL for simple discovery check.
  349.    CFStringCreateArrayWithFindResults() returns an array of CFRange pointers, or NULL if there are no matches.
  350. */
  351. EXTERN_API_C( Boolean )
  352. CFStringFindWithOptions         (CFStringRef            theString,
  353.                                  CFStringRef            stringToFind,
  354.                                  CFRange                rangeToSearch,
  355.                                  CFOptionFlags          searchOptions,
  356.                                  CFRange *              result);
  357. EXTERN_API_C( CFArrayRef )
  358. CFStringCreateArrayWithFindResults (CFAllocatorRef      alloc,
  359.                                  CFStringRef            theString,
  360.                                  CFStringRef            stringToFind,
  361.                                  CFRange                rangeToSearch,
  362.                                  CFOptionFlags          compareOptions);
  363. /* Find conveniences
  364. */
  365. EXTERN_API_C( CFRange )
  366. CFStringFind                    (CFStringRef            theString,
  367.                                  CFStringRef            stringToFind,
  368.                                  CFOptionFlags          compareOptions);
  369. EXTERN_API_C( Boolean )
  370. CFStringHasPrefix               (CFStringRef            theString,
  371.                                  CFStringRef            prefix);
  372. EXTERN_API_C( Boolean )
  373. CFStringHasSuffix               (CFStringRef            theString,
  374.                                  CFStringRef            suffix);
  375. /* Find range of bounds of the line(s) that span the indicated range (startIndex, numChars),
  376.    taking into account various possible line separator sequences (CR, CRLF, LF, and Unicode LS, PS).
  377.    All return values are "optional" (provide NULL if you don't want them)
  378.      lineStartIndex: index of first character in line
  379.      lineEndIndex: index of first character of the next line (including terminating line separator characters)
  380.      contentsEndIndex: index of the first line separator character
  381.    Thus, lineEndIndex - lineStartIndex is the number of chars in the line, including the line separators
  382.          contentsEndIndex - lineStartIndex is the number of chars in the line w/out the line separators
  383. */
  384. EXTERN_API_C( void )
  385. CFStringGetLineBounds           (CFStringRef            theString,
  386.                                  CFRange                range,
  387.                                  CFIndex *              lineBeginIndex,
  388.                                  CFIndex *              lineEndIndex,
  389.                                  CFIndex *              contentsEndIndex);
  390. /*** Exploding and joining strings with a separator string ***/
  391. EXTERN_API_C( CFStringRef )
  392. CFStringCreateByCombiningStrings (CFAllocatorRef        alloc,
  393.                                  CFArrayRef             theArray,
  394.                                  CFStringRef            separatorString);
  395. /* Empty array returns empty string; one element array returns the element */
  396. EXTERN_API_C( CFArrayRef )
  397. CFStringCreateArrayBySeparatingStrings (CFAllocatorRef  alloc,
  398.                                  CFStringRef            theString,
  399.                                  CFStringRef            separatorString);
  400. /* No separators in the string returns array with that string; string == sep returns two empty strings */
  401. /*** Parsing non-localized numbers from strings ***/
  402. EXTERN_API_C( SInt32 )
  403. CFStringGetIntValue             (CFStringRef            str);
  404. /* Skips whitespace; returns 0 on error, MAX or -MAX on overflow */
  405. EXTERN_API_C( double )
  406. CFStringGetDoubleValue          (CFStringRef            str);
  407. /* Skips whitespace; returns 0.0 on error */
  408. /*** MutableString functions ***/
  409. /* CFStringAppend("abcdef", "xxxxx") -> "abcdefxxxxx"
  410.    CFStringDelete("abcdef", 2, 3) -> "abf"
  411.    CFStringReplace("abcdef", 2, 3, "xxxxx") -> "abxxxxxf"
  412.    CFStringReplaceAll("abcdef", "xxxxx") -> "xxxxx"
  413. */
  414. EXTERN_API_C( void )
  415. CFStringAppend                  (CFMutableStringRef     theString,
  416.                                  CFStringRef            appendedString);
  417. EXTERN_API_C( void )
  418. CFStringAppendCharacters        (CFMutableStringRef     theString,
  419.                                  const UniChar *        chars,
  420.                                  CFIndex                numChars);
  421. EXTERN_API_C( void )
  422. CFStringAppendPascalString      (CFMutableStringRef     theString,
  423.                                  ConstStringPtr         pStr,
  424.                                  CFStringEncoding       encoding);
  425. EXTERN_API_C( void )
  426. CFStringAppendCString           (CFMutableStringRef     theString,
  427.                                  const char *           cStr,
  428.                                  CFStringEncoding       encoding);
  429. EXTERN_API_C( void )
  430. CFStringAppendFormat            (CFMutableStringRef     theString,
  431.                                  CFDictionaryRef        formatOptions,
  432.                                  CFStringRef            format,
  433.                                  ...);
  434. EXTERN_API_C( void )
  435. CFStringAppendFormatAndArguments (CFMutableStringRef    theString,
  436.                                  CFDictionaryRef        formatOptions,
  437.                                  CFStringRef            format,
  438.                                  va_list                arguments);
  439. EXTERN_API_C( void )
  440. CFStringInsert                  (CFMutableStringRef     str,
  441.                                  CFIndex                idx,
  442.                                  CFStringRef            insertedStr);
  443. EXTERN_API_C( void )
  444. CFStringDelete                  (CFMutableStringRef     theString,
  445.                                  CFRange                range);
  446. EXTERN_API_C( void )
  447. CFStringReplace                 (CFMutableStringRef     theString,
  448.                                  CFRange                range,
  449.                                  CFStringRef            replacement);
  450. EXTERN_API_C( void )
  451. CFStringReplaceAll              (CFMutableStringRef     theString,
  452.                                  CFStringRef            replacement);
  453. /* Replaces whole string */
  454. /* This function will make the contents of a mutable CFString point directly at the specified UniChar array.
  455. it works only with CFStrings created with CFStringCreateMutableWithExternalCharactersNoCopy().
  456. This function does not free the previous buffer.
  457. The string will be manipulated within the provided buffer (if any) until it outgrows capacity; then the
  458. externalCharactersAllocator will be consulted for more memory.
  459. See comments at the top of this file for more info.
  460. */
  461. EXTERN_API_C( void )
  462. CFStringSetExternalCharactersNoCopy (CFMutableStringRef  theString,
  463.                                  UniChar *              chars,
  464.                                  CFIndex                length,
  465.                                  CFIndex                capacity);
  466. /* Works only on specially created mutable strings! */
  467. /* CFStringPad() will pad or cut down a string to the specified size.
  468.    The pad string is used as the fill string; indexIntoPad specifies which character to start with.
  469.      CFStringPad("abc", " ", 9, 0) ->  "abc      "
  470.      CFStringPad("abc", ". ", 9, 1) -> "abc . . ."
  471.      CFStringPad("abcdef", ?, 3, ?) -> "abc"
  472.      CFStringTrim() will trim the specified string from both ends of the string.
  473.      CFStringTrimWhitespace() will do the same with white space characters (tab, newline, etc)
  474.      CFStringTrim("  abc ", " ") -> "abc"
  475.      CFStringTrim("* * * *abc * ", "* ") -> "*abc "
  476. */
  477. EXTERN_API_C( void )
  478. CFStringPad                     (CFMutableStringRef     theString,
  479.                                  CFStringRef            padString,
  480.                                  CFIndex                length,
  481.                                  CFIndex                indexIntoPad);
  482. EXTERN_API_C( void )
  483. CFStringTrim                    (CFMutableStringRef     theString,
  484.                                  CFStringRef            trimString);
  485. EXTERN_API_C( void )
  486. CFStringTrimWhitespace          (CFMutableStringRef     theString);
  487. EXTERN_API_C( void )
  488. CFStringLowercase               (CFMutableStringRef     theString,
  489.                                  const void *           localeTBD);
  490. EXTERN_API_C( void )
  491. CFStringUppercase               (CFMutableStringRef     theString,
  492.                                  const void *           localeTBD);
  493. EXTERN_API_C( void )
  494. CFStringCapitalize              (CFMutableStringRef     theString,
  495.                                  const void *           localeTBD);
  496. /* This returns availability of the encoding on the system
  497. */
  498. EXTERN_API_C( Boolean )
  499. CFStringIsEncodingAvailable     (CFStringEncoding       encoding);
  500. /* This function returns list of available encodings.  The returned list is terminated with kCFStringEncodingInvalidId and owned by the system.
  501. */
  502. EXTERN_API_C( const CFStringEncoding *)
  503. CFStringGetListOfAvailableEncodings (void);
  504. /* Returns name of the encoding
  505. */
  506. EXTERN_API_C( CFStringRef )
  507. CFStringGetNameOfEncoding       (CFStringEncoding       encoding);
  508. /* ID mapping functions from/to YellowBox NSStringEncoding.  Returns kCFStringEncodingInvalidId if no mapping exists.
  509. */
  510. EXTERN_API_C( UInt32 )
  511. CFStringConvertEncodingToNSStringEncoding (CFStringEncoding  encoding);
  512. EXTERN_API_C( CFStringEncoding )
  513. CFStringConvertNSStringEncodingToEncoding (UInt32       encoding);
  514. /* ID mapping functions from/to Microsoft Windows codepage (covers both OEM & ANSI).  Returns kCFStringEncodingInvalidId if no mapping exists.
  515. */
  516. EXTERN_API_C( UInt32 )
  517. CFStringConvertEncodingToWindowsCodepage (CFStringEncoding  encoding);
  518. EXTERN_API_C( CFStringEncoding )
  519. CFStringConvertWindowsCodepageToEncoding (UInt32        codepage);
  520. /* ID mapping functions from/to IANA registery charset names.  Returns kCFStringEncodingInvalidId if no mapping exists.
  521. */
  522. EXTERN_API_C( CFStringEncoding )
  523. CFStringConvertIANACharSetNameToEncoding (CFStringRef   theString);
  524. EXTERN_API_C( CFStringRef )
  525. CFStringConvertEncodingToIANACharSetName (CFStringEncoding  encoding);
  526. /* The next two functions allow "fast" access to the contents of a string, 
  527.    assuming you are doing sequential or localized accesses. To use, call
  528.    CFStringInitInlineBuffer() with a CFStringInlineBuffer (on the stack, say),
  529.    and a range in the string to look at. Then call CFStringGetCharacterFromInlineBuffer()
  530.    as many times as you want, with a index into that range (relative to the start
  531.    of that range). These are INLINE functions and will end up calling CFString only 
  532.    once in a while, to fill a buffer.  
  533. */
  534. #define __kCFStringInlineBufferLength 64
  535. typedef struct {
  536.     UniChar buffer[__kCFStringInlineBufferLength];
  537.     CFStringRef theString;
  538.     const UniChar *directBuffer;
  539.     CFRange rangeToBuffer;        /* Range in string to buffer */
  540.     CFIndex bufferedRangeStart;     /* Start of range currently buffered (relative to rangeToBuffer.location) */
  541.     CFIndex bufferedRangeEnd;      /* bufferedRangeStart + number of chars actually buffered */
  542. } CFStringInlineBuffer;
  543. #if defined(CF_INLINE)
  544. CF_INLINE void CFStringInitInlineBuffer(CFStringRef str, CFStringInlineBuffer *buf, CFRange range) {
  545.     buf->theString = str;
  546.     buf->rangeToBuffer = range;
  547.     buf->directBuffer = CFStringGetCharactersPtr(str);
  548.     buf->bufferedRangeStart = buf->bufferedRangeEnd = 0;
  549. }
  550. CF_INLINE UniChar CFStringGetCharacterFromInlineBuffer(CFStringInlineBuffer *buf, CFIndex idx) {
  551.     if (buf->directBuffer) return buf->directBuffer[idx + buf->rangeToBuffer.location];
  552.     if (idx >= buf->bufferedRangeEnd || idx < buf->bufferedRangeStart) {
  553.  if (idx < 0 || idx > buf->rangeToBuffer.length) return 0;
  554.   if ((buf->bufferedRangeStart = idx - 4) < 0) buf->bufferedRangeStart = 0;
  555.   buf->bufferedRangeEnd = buf->bufferedRangeStart + __kCFStringInlineBufferLength;
  556.    if (buf->bufferedRangeEnd > buf->rangeToBuffer.length) buf->bufferedRangeEnd = buf->rangeToBuffer.length;
  557.   CFStringGetCharacters(buf->theString, CFRangeMake(buf->rangeToBuffer.location + buf->bufferedRangeStart, buf->bufferedRangeEnd - buf->bufferedRangeStart), buf->buffer);
  558.     }
  559.     return buf->buffer[idx - buf->bufferedRangeStart];
  560. }
  561. #else
  562. /* If INLINE functions are not available, we do somewhat less powerful macros that work similarly (except be aware that the buf argument ise evaluated multiple times).
  563. */
  564. #define CFStringInitInlineBuffer(str, buf, range) 
  565.     {(buf)->theString = str; (buf)->rangeToBuffer = range; (buf)->directBuffer = CFStringGetCharactersPtr(str);}
  566. #define CFStringGetCharacterFromInlineBuffer(buf, idx) 
  567.     ((buf)->directBuffer ? (buf)->directBuffer[(idx) + (buf)->rangeToBuffer.location] : CFStringGetCharacterAtIndex((buf)->theString, (idx) + (buf)->rangeToBuffer.location))
  568. #endif /* CF_INLINE */
  569. /* Rest of the stuff in this file is private and should not be used directly
  570. */
  571. /* For debugging only
  572.    Use CFShow() to printf the description of any CFType;
  573.    Use CFShowStr() to printf detailed info about a CFString
  574. */
  575. EXTERN_API_C( void )
  576. CFShow                          (CFTypeRef              obj);
  577. EXTERN_API_C( void )
  578. CFShowStr                       (CFStringRef            str);
  579. /* This function is private and should not be used directly
  580. */
  581. EXTERN_API_C( CFStringRef )
  582. __CFStringMakeConstantString    (const char *           cStr);
  583. /* Private; do not use */
  584. #if PRAGMA_STRUCT_ALIGN
  585.     #pragma options align=reset
  586. #elif PRAGMA_STRUCT_PACKPUSH
  587.     #pragma pack(pop)
  588. #elif PRAGMA_STRUCT_PACK
  589.     #pragma pack()
  590. #endif
  591. #ifdef PRAGMA_IMPORT_OFF
  592. #pragma import off
  593. #elif PRAGMA_IMPORT
  594. #pragma import reset
  595. #endif
  596. #ifdef __cplusplus
  597. }
  598. #endif
  599. #endif /* __CFSTRING__ */