(root)/
gcc-13.2.0/
gcc/
testsuite/
objc-obj-c++-shared/
GNUStep/
CoreFoundation/
CFString.h
       1  /* CFString.h
       2     
       3     Copyright (C) 2010 Free Software Foundation, Inc.
       4     
       5     Written by: Stefan Bidigaray
       6     Date: January, 2010
       7     
       8     This file is part of CoreBase.
       9     
      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.
      14  
      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.
      19  
      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.
      25  */ 
      26  
      27  #ifndef __COREFOUNDATION_CFSTRING_H__
      28  #define __COREFOUNDATION_CFSTRING_H__
      29  
      30  #include "CFBase.h"
      31  #include "CFArray.h"
      32  #include "CFCharacterSet.h"
      33  #include "CFData.h"
      34  #include "CFDictionary.h"
      35  #include "CFLocale.h"
      36  
      37  #include <stdarg.h>
      38  
      39  CF_EXTERN_C_BEGIN
      40  
      41  /** \defgroup CFStringRef CFString Reference
      42      \brief The CFString type defines opaque objects representing strings.
      43  
      44      CFString is "toll-free bridged" to NSString.
      45  
      46      \{
      47   */
      48  
      49  /*
      50   * Data Types
      51   */
      52  typedef UInt32 CFStringEncoding;
      53  
      54  /*
      55   * Constants
      56   */
      57  typedef enum
      58  {
      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
      69  #endif
      70  } CFStringCompareFlags;
      71  
      72  enum CFStringBuiltInEncodings
      73  {
      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
      89  #endif
      90  };
      91  
      92  #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
      93  # define kCFStringEncodingInvalidId (0xffffffffU)
      94  #endif
      95  
      96  /** \def CFSTR(x)
      97      \brief Creates a constant string object.
      98      
      99      \note This macro will create the constant string at runtime.
     100   */
     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 "")
     108  
     109  #ifdef __CONSTANT_CFSTRINGS__
     110  #define CFSTR(x)  ((CFStringRef) __builtin___CFStringMakeConstantString ("" x ""))
     111  #else
     112  #define CFSTR(x)  __CFStringMakeConstantString("" x "")
     113  #endif
     114  
     115  /** \name Creating a CFString
     116      \{
     117   */
     118  CF_EXPORT CFArrayRef
     119  CFStringCreateArrayBySeparatingStrings (CFAllocatorRef alloc,
     120    CFStringRef theString, CFStringRef separatorString);
     121  
     122  CF_EXPORT CFStringRef
     123  CFStringCreateByCombiningStrings (CFAllocatorRef alloc, CFArrayRef theArray,
     124    CFStringRef separatorString);
     125  
     126  CF_EXPORT CFStringRef
     127  CFStringCreateCopy (CFAllocatorRef alloc, CFStringRef theString);
     128  
     129  CF_EXPORT CFStringRef
     130  CFStringCreateFromExternalRepresentation (CFAllocatorRef alloc, CFDataRef data,
     131    CFStringEncoding encoding);
     132  
     133  CF_EXPORT CFStringRef
     134  CFStringCreateWithBytes (CFAllocatorRef alloc, const UInt8 *bytes,
     135    CFIndex numBytes, CFStringEncoding encoding, Boolean isExternalRepresentation);
     136  
     137  CF_EXPORT CFStringRef
     138  CFStringCreateWithCharacters (CFAllocatorRef alloc, const UniChar *chars,
     139    CFIndex numChars);
     140  
     141  CF_EXPORT CFStringRef
     142  CFStringCreateWithCharactersNoCopy (CFAllocatorRef alloc, const UniChar *chars,
     143    CFIndex numChars, CFAllocatorRef contentsDeallocator);
     144  
     145  CF_EXPORT CFStringRef
     146  CFStringCreateWithCString (CFAllocatorRef alloc, const char *cStr,
     147    CFStringEncoding encoding);
     148  
     149  CF_EXPORT CFStringRef
     150  CFStringCreateWithCStringNoCopy (CFAllocatorRef alloc, const char *cStr,
     151    CFStringEncoding encoding, CFAllocatorRef contentsDeallocator);
     152  
     153  CF_EXPORT CFStringRef
     154  CFStringCreateWithFormat (CFAllocatorRef alloc, CFDictionaryRef formatOptions,
     155    CFStringRef format, ...);
     156  
     157  CF_EXPORT CFStringRef
     158  CFStringCreateWithFormatAndArguments (CFAllocatorRef alloc,
     159    CFDictionaryRef formatOptions, CFStringRef format, va_list arguments);
     160  
     161  CF_EXPORT CFStringRef
     162  CFStringCreateWithSubstring (CFAllocatorRef alloc, CFStringRef str,
     163    CFRange range);
     164  
     165  #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
     166  CF_EXPORT CFStringRef
     167  CFStringCreateWithFileSystemRepresentation (CFAllocatorRef alloc,
     168    const char *buffer);
     169  #endif
     170  
     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);
     176  #endif
     177  /** \} */
     178  
     179  /** \name Searching CFStrings
     180      \{
     181   */
     182  CF_EXPORT CFArrayRef
     183  CFStringCreateArrayWithFindResults (CFAllocatorRef alloc, CFStringRef theString,
     184    CFStringRef stringToFind, CFRange rangeToSearch,
     185    CFStringCompareFlags compareOptions);
     186  
     187  CF_EXPORT CFRange
     188  CFStringFind (CFStringRef theString, CFStringRef stringToFind,
     189    CFStringCompareFlags compareOptions);
     190  
     191  CF_EXPORT Boolean
     192  CFStringFindWithOptions (CFStringRef theString, CFStringRef stringToFind,
     193    CFRange rangeToSearch, CFStringCompareFlags searchOptions, CFRange *result);
     194  
     195  CF_EXPORT Boolean
     196  CFStringFindWithOptionsAndLocale (CFStringRef theString,CFStringRef stringToFind,
     197    CFRange rangeToSearch, CFStringCompareFlags searchOptions,
     198    CFLocaleRef locale, CFRange *result);
     199  
     200  CF_EXPORT void
     201  CFStringGetLineBounds (CFStringRef theString, CFRange range,
     202    CFIndex *lineBeginIndex, CFIndex *lineEndIndex, CFIndex *contentsEndIndex);
     203  
     204  #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
     205  CF_EXPORT Boolean
     206  CFStringFindCharacterFromSet (CFStringRef theString, CFCharacterSetRef theSet,
     207    CFRange rangeToSearch, CFStringCompareFlags searchOptions, CFRange *result);
     208  #endif
     209  
     210  #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
     211  CF_EXPORT void
     212  CFStringGetParagraphBounds (CFStringRef string, CFRange range,
     213    CFIndex *parBeginIndex, CFIndex *parEndIndex, CFIndex *contentsEndIndex);
     214  #endif
     215  /** \} */
     216  
     217  /** \name Comparing String
     218      \{
     219   */
     220  CF_EXPORT CFComparisonResult
     221  CFStringCompare (CFStringRef theString1, CFStringRef theString2,
     222    CFStringCompareFlags compareOptions);
     223  
     224  CF_EXPORT CFComparisonResult
     225  CFStringCompareWithOptions (CFStringRef theString1, CFStringRef theString2,
     226    CFRange rangeToCOmpare, CFStringCompareFlags compareOptions);
     227  
     228  CF_EXPORT Boolean
     229  CFStringHasPrefix (CFStringRef theString, CFStringRef prefix);
     230  
     231  CF_EXPORT Boolean
     232  CFStringHasSuffix (CFStringRef theString, CFStringRef suffix);
     233  
     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);
     239  #endif
     240  /** \} */
     241  
     242  /** \name Accessing Characters
     243      \{
     244   */
     245  CF_EXPORT CFDataRef
     246  CFStringCreateExternalRepresentation (CFAllocatorRef alloc,
     247    CFStringRef theString, CFStringEncoding encoding, UInt8 lossByte);
     248  
     249  CF_EXPORT CFIndex
     250  CFStringGetBytes (CFStringRef theString, CFRange range,
     251    CFStringEncoding encoding, UInt8 lossByte, Boolean isExternalRepresentation,
     252    UInt8 *buffer, CFIndex maxBufLen, CFIndex *usedBufLen);
     253  
     254  CF_EXPORT UniChar
     255  CFStringGetCharacterAtIndex (CFStringRef theString, CFIndex idx);
     256  
     257  CF_EXPORT void
     258  CFStringGetCharacters (CFStringRef theString, CFRange range, UniChar *buffer);
     259  
     260  CF_EXPORT const UniChar *
     261  CFStringGetCharactersPtr (CFStringRef theString);
     262  
     263  CF_EXPORT Boolean
     264  CFStringGetCString (CFStringRef theString, char *buffer, CFIndex bufferSize,
     265    CFStringEncoding encoding);
     266  
     267  CF_EXPORT const char *
     268  CFStringGetCStringPtr (CFStringRef theString, CFStringEncoding encoding);
     269  
     270  CF_EXPORT CFIndex
     271  CFStringGetLength (CFStringRef str);
     272  
     273  CF_EXPORT CFRange
     274  CFStringGetRangeOfComposedCharactersAtIndex (CFStringRef theString,
     275    CFIndex theIndex);
     276  
     277  #if OS_API_VERSION(MAC_OS_X_VERSION_10_6, GS_API_LATEST)
     278  CF_EXPORT UTF32Char
     279  CFStringGetLongCharacterForSurrogatePair (UniChar surrogateHigh,
     280    UniChar surrogateLow);
     281  
     282  CF_EXPORT Boolean
     283  CFStringGetSurrogatePairForLongCharacter (UTF32Char character,
     284    UniChar *surrogates);
     285  
     286  CF_EXPORT Boolean
     287  CFStringIsSurrogateHighCharacter (UniChar character);
     288  
     289  CF_EXPORT Boolean
     290  CFStringIsSurrogateLowCharacter (UniChar character);
     291  #endif
     292  /** \} */
     293  
     294  /** \name Working with Encodings
     295      \{
     296   */
     297  CF_EXPORT CFStringRef
     298  CFStringConvertEncodingToIANACharSetName (CFStringEncoding encoding);
     299  
     300  CF_EXPORT unsigned long
     301  CFStringConvertEncodingToNSStringEncoding (CFStringEncoding encoding);
     302  
     303  UInt32
     304  CFStringConvertEncodingToWindowsCodepage (CFStringEncoding encoding);
     305  
     306  CF_EXPORT CFStringEncoding
     307  CFStringConvertIANACharSetNameToEncoding (CFStringRef theString);
     308  
     309  CF_EXPORT CFStringEncoding
     310  CFStringConvertNSStringEncodingToEncoding (unsigned long encoding);
     311  
     312  CF_EXPORT CFStringEncoding
     313  CFStringConvertWindowsCodepageToEncoding (UInt32 codepage);
     314  
     315  CF_EXPORT CFStringEncoding
     316  CFStringGetFastestEncoding (CFStringRef theString);
     317  
     318  CF_EXPORT const CFStringEncoding *
     319  CFStringGetListOfAvailableEncodings (void);
     320  
     321  CF_EXPORT CFIndex
     322  CFStringGetMaximumSizeForEncoding (CFIndex length, CFStringEncoding encoding);
     323  
     324  CF_EXPORT CFStringEncoding
     325  CFStringGetMostCompatibleMacStringEncoding (CFStringEncoding encoding);
     326  
     327  CF_EXPORT CFStringRef
     328  CFStringGetNameOfEncoding (CFStringEncoding encoding);
     329  
     330  CF_EXPORT CFStringEncoding
     331  CFStringGetSmallestEncoding (CFStringRef theString);
     332  
     333  CF_EXPORT CFStringEncoding
     334  CFStringGetSystemEncoding (void);
     335  
     336  CF_EXPORT Boolean
     337  CFStringIsEncodingAvailable (CFStringEncoding encoding);
     338  
     339  #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
     340  CF_EXPORT Boolean
     341  CFStringGetFileSystemRepresentation (CFStringRef string, char *buffer,
     342    CFIndex maxBufLen);
     343  
     344  CF_EXPORT CFIndex
     345  CFStringGetMaximumSizeOfFileSystemRepresentation (CFStringRef string);
     346  #endif
     347  /** \} */
     348  
     349  /** \name Getting Numeric Values
     350      \{
     351   */
     352  CF_EXPORT double
     353  CFStringGetDoubleValue (CFStringRef str);
     354  
     355  CF_EXPORT SInt32
     356  CFStringGetIntValue (CFStringRef str);
     357  /** \} */
     358  
     359  /** \name Getting String Properties
     360      \{
     361   */
     362  CF_EXPORT void
     363  CFShow (CFTypeRef obj);
     364  
     365  CF_EXPORT void
     366  CFShowStr (CFStringRef str);
     367  
     368  CF_EXPORT CFTypeID
     369  CFStringGetTypeID (void);
     370  /** \} */
     371  
     372  
     373  
     374  /** \name Pascal Strings
     375      \{
     376   */
     377  CF_EXPORT CFStringRef
     378  CFStringCreateWithPascalString (CFAllocatorRef alloc, ConstStr255Param pStr,
     379    CFStringEncoding encoding);
     380  
     381  CF_EXPORT CFStringRef
     382  CFStringCreateWithPascalStringNoCopy (CFAllocatorRef alloc,
     383    ConstStr255Param pStr, CFStringEncoding encoding,
     384    CFAllocatorRef contentsDeallocate);
     385  
     386  CF_EXPORT Boolean
     387  CFStringGetPascalString (CFStringRef theString, StringPtr buffer,
     388    CFIndex bufferSize, CFStringEncoding encoding);
     389  
     390  CF_EXPORT ConstStringPtr
     391  CFStringGetPascalStringPtr (CFStringRef theString, CFStringEncoding encoding);
     392  /** \} */
     393  /** \} */
     394  
     395  
     396  
     397  /** \defgroup CFMutableStringRef CFMutableString Reference
     398   *  \{
     399   */
     400  #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
     401  typedef enum
     402  {
     403    kCFStringNormalizationFormD = 0,
     404    kCFStringNormalizationFormKD = 1,
     405    kCFStringNormalizationFormC = 2,
     406    kCFStringNormalizationFormKC = 3
     407  } CFStringNormalizationForm;
     408  #endif
     409  
     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;
     426  #endif
     427  #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
     428  CF_EXPORT const CFStringRef kCFStringTransformStripDiacritics;
     429  #endif
     430  
     431  CF_EXPORT void
     432  CFStringAppend (CFMutableStringRef theString, CFStringRef appendedString);
     433  
     434  CF_EXPORT void
     435  CFStringAppendCharacters (CFMutableStringRef theString,
     436    const UniChar *chars, CFIndex numChars);
     437  
     438  CF_EXPORT void
     439  CFStringAppendCString (CFMutableStringRef theString, const char *cStr,
     440    CFStringEncoding encoding);
     441  
     442  CF_EXPORT void
     443  CFStringAppendFormat (CFMutableStringRef theString,
     444    CFDictionaryRef formatOptions, CFStringRef format, ...);
     445  
     446  CF_EXPORT void
     447  CFStringAppendFormatAndArguments (CFMutableStringRef theString,
     448    CFDictionaryRef formatOptions, CFStringRef format, va_list arguments);
     449  
     450  CF_EXPORT void
     451  CFStringAppendPascalString (CFMutableStringRef theString,
     452    ConstStr255Param pStr, CFStringEncoding encoding);
     453  
     454  CF_EXPORT void
     455  CFStringCapitalize (CFMutableStringRef theString, CFLocaleRef locale);
     456  
     457  CF_EXPORT CFMutableStringRef
     458  CFStringCreateMutable (CFAllocatorRef alloc, CFIndex maxLength);
     459  
     460  CF_EXPORT CFMutableStringRef
     461  CFStringCreateMutableCopy (CFAllocatorRef alloc, CFIndex maxLength,
     462    CFStringRef theString);
     463  
     464  CF_EXPORT CFMutableStringRef
     465  CFStringCreateMutableWithExternalCharactersNoCopy (CFAllocatorRef alloc,
     466    UniChar *chars, CFIndex numChars, CFIndex capacity,
     467    CFAllocatorRef externalCharactersAllocator);
     468  
     469  CF_EXPORT void
     470  CFStringDelete (CFMutableStringRef theString, CFRange range);
     471  
     472  CF_EXPORT void
     473  CFStringInsert (CFMutableStringRef str, CFIndex idx, CFStringRef insertedStr);
     474  
     475  CF_EXPORT void
     476  CFStringLowercase (CFMutableStringRef theString, CFLocaleRef locale);
     477  
     478  CF_EXPORT void
     479  CFStringPad (CFMutableStringRef theString, CFStringRef padString,
     480    CFIndex length, CFIndex indexIntoPad);
     481  
     482  CF_EXPORT void
     483  CFStringReplace (CFMutableStringRef theString, CFRange range,
     484    CFStringRef replacement);
     485  
     486  CF_EXPORT void
     487  CFStringReplaceAll (CFMutableStringRef theString, CFStringRef replacement);
     488  
     489  CF_EXPORT void
     490  CFStringSetExternalCharactersNoCopy (CFMutableStringRef theString,
     491    UniChar *chars, CFIndex length, CFIndex capacity);
     492  
     493  CF_EXPORT void
     494  CFStringTrim (CFMutableStringRef theString, CFStringRef trimString);
     495  
     496  CF_EXPORT void
     497  CFStringTrimWhitespace (CFMutableStringRef theString);
     498  
     499  CF_EXPORT void
     500  CFStringUppercase (CFMutableStringRef theString, CFLocaleRef locale);
     501  
     502  #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
     503  CF_EXPORT CFIndex
     504  CFStringFindAndReplace (CFMutableStringRef theString,
     505    CFStringRef stringToFind, CFStringRef replacementString,
     506    CFRange rangeToSearch, CFOptionFlags compareOptions);
     507  
     508  CF_EXPORT void
     509  CFStringNormalize (CFMutableStringRef theString,
     510    CFStringNormalizationForm theForm);
     511  #endif
     512  
     513  #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
     514  CF_EXPORT Boolean
     515  CFStringTransform (CFMutableStringRef string, CFRange *range,
     516    CFStringRef transform, Boolean reverse);
     517  #endif
     518  
     519  #if OS_API_VERSION(MAC_OS_X_VERSION_10_5, GS_API_LATEST)
     520  CF_EXPORT void
     521  CFStringFold (CFMutableStringRef theString, CFOptionFlags theFlags,
     522    CFLocaleRef theLocale);
     523  #endif
     524  /** \} */
     525  
     526  
     527  
     528  /** \ingroup CFStringRef
     529      \name CFStringInlineBuffer
     530      \{
     531   */
     532  #define __kCFStringInlineBufferLength 64
     533  struct CFStringInlineBuffer
     534  {
     535    UniChar buffer[__kCFStringInlineBufferLength];
     536    CFStringRef theString;
     537    const UniChar *directBuffer;
     538    CFRange rangeToBuffer;
     539    CFIndex bufferedRangeStart;
     540    CFIndex bufferedRangeEnd;
     541  };
     542  typedef struct CFStringInlineBuffer CFStringInlineBuffer;
     543  
     544  CF_INLINE void
     545  CFStringInitInlineBuffer (CFStringRef str, CFStringInlineBuffer *buf,
     546    CFRange range)
     547  {
     548    buf->theString = str;
     549    buf->rangeToBuffer = range;
     550    buf->directBuffer = CFStringGetCharactersPtr (str);
     551    buf->bufferedRangeStart = 0;
     552    buf->bufferedRangeEnd = 0;
     553  }
     554  
     555  CF_INLINE UniChar
     556  CFStringGetCharacterFromInlineBuffer (CFStringInlineBuffer *buf, CFIndex idx)
     557  {
     558    if (buf->directBuffer)
     559      {
     560        if (idx < 0 || idx >= buf->rangeToBuffer.length)
     561          return 0;
     562        return buf->directBuffer[idx + buf->rangeToBuffer.location];
     563      }
     564    else if (idx >= buf->bufferedRangeEnd || idx < buf->bufferedRangeStart)
     565      {
     566        CFRange range;
     567        
     568        if (idx < 0 || idx >= buf->rangeToBuffer.length)
     569          return 0;
     570        
     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;
     579        
     580        range = CFRangeMake (buf->rangeToBuffer.location + buf->bufferedRangeStart,
     581          buf->bufferedRangeEnd - buf->bufferedRangeStart);
     582        
     583        CFStringGetCharacters (buf->theString, range, buf->buffer);
     584      }
     585    
     586    return buf->buffer[(idx - buf->bufferedRangeStart)];
     587  }
     588  /** \} */
     589  
     590  CF_EXTERN_C_END
     591  
     592  #endif /* __COREFOUNDATION_CFSTRING_H__ */
     593