/ include / CoreFoundation / CFStringEncodingConverterExt.h
CFStringEncodingConverterExt.h
  1  /*
  2   * Copyright (c) 2015 Apple Inc. All rights reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   *
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   *
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   *
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  /*	CFStringEncodingConverterExt.h
 25  	Copyright (c) 1998-2014, Apple Inc. All rights reserved.
 26  */
 27  
 28  #if !defined(__COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__)
 29  #define __COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__ 1
 30  
 31  #include <CoreFoundation/CFStringEncodingConverter.h>
 32  
 33  CF_EXTERN_C_BEGIN
 34  
 35  #define MAX_DECOMPOSED_LENGTH (10)
 36  
 37  enum {
 38      kCFStringEncodingConverterStandard = 0,
 39      kCFStringEncodingConverterCheapEightBit = 1,
 40      kCFStringEncodingConverterStandardEightBit = 2,
 41      kCFStringEncodingConverterCheapMultiByte = 3,
 42      kCFStringEncodingConverterPlatformSpecific = 4, // Other fields are ignored
 43      kCFStringEncodingConverterICU = 5 // Other fields are ignored
 44  };
 45  
 46  /* kCFStringEncodingConverterStandard */
 47  typedef CFIndex (*CFStringEncodingToBytesProc)(uint32_t flags, const UniChar *characters, CFIndex numChars, uint8_t *bytes, CFIndex maxByteLen, CFIndex *usedByteLen);
 48  typedef CFIndex (*CFStringEncodingToUnicodeProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes, UniChar *characters, CFIndex maxCharLen, CFIndex *usedCharLen);
 49  /* kCFStringEncodingConverterCheapEightBit */
 50  typedef bool (*CFStringEncodingCheapEightBitToBytesProc)(uint32_t flags, UniChar character, uint8_t *byte);
 51  typedef bool (*CFStringEncodingCheapEightBitToUnicodeProc)(uint32_t flags, uint8_t byte, UniChar *character);
 52  /* kCFStringEncodingConverterStandardEightBit */
 53  typedef uint16_t (*CFStringEncodingStandardEightBitToBytesProc)(uint32_t flags, const UniChar *characters, CFIndex numChars, uint8_t *byte);
 54  typedef uint16_t (*CFStringEncodingStandardEightBitToUnicodeProc)(uint32_t flags, uint8_t byte, UniChar *characters);
 55  /* kCFStringEncodingConverterCheapMultiByte */
 56  typedef uint16_t (*CFStringEncodingCheapMultiByteToBytesProc)(uint32_t flags, UniChar character, uint8_t *bytes);
 57  typedef uint16_t (*CFStringEncodingCheapMultiByteToUnicodeProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes, UniChar *character);
 58  
 59  typedef CFIndex (*CFStringEncodingToBytesLenProc)(uint32_t flags, const UniChar *characters, CFIndex numChars);
 60  typedef CFIndex (*CFStringEncodingToUnicodeLenProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes);
 61  
 62  typedef CFIndex (*CFStringEncodingToBytesPrecomposeProc)(uint32_t flags, const UniChar *character, CFIndex numChars, uint8_t *bytes, CFIndex maxByteLen, CFIndex *usedByteLen);
 63  typedef bool (*CFStringEncodingIsValidCombiningCharacterProc)(UniChar character);
 64  
 65  typedef struct {
 66      void *toBytes;
 67      void *toUnicode;
 68      uint16_t maxBytesPerChar;
 69      uint16_t maxDecomposedCharLen;
 70      uint8_t encodingClass;
 71      uint32_t :24;
 72      CFStringEncodingToBytesLenProc toBytesLen;
 73      CFStringEncodingToUnicodeLenProc toUnicodeLen;
 74      CFStringEncodingToBytesFallbackProc toBytesFallback;
 75      CFStringEncodingToUnicodeFallbackProc toUnicodeFallback;
 76      CFStringEncodingToBytesPrecomposeProc toBytesPrecompose;
 77      CFStringEncodingIsValidCombiningCharacterProc isValidCombiningChar;
 78  } CFStringEncodingConverter;
 79  
 80  extern const CFStringEncodingConverter *CFStringEncodingGetConverter(uint32_t encoding);
 81  
 82  enum {
 83      kCFStringEncodingGetConverterSelector = 0,
 84      kCFStringEncodingIsDecomposableCharacterSelector = 1,
 85      kCFStringEncodingDecomposeCharacterSelector = 2,
 86      kCFStringEncodingIsValidLatin1CombiningCharacterSelector = 3,
 87      kCFStringEncodingPrecomposeLatin1CharacterSelector = 4
 88  };
 89  
 90  extern const void *CFStringEncodingGetAddressForSelector(uint32_t selector);
 91  
 92  #define BOOTSTRAPFUNC_NAME	CFStringEncodingBootstrap
 93  typedef const CFStringEncodingConverter* (*CFStringEncodingBootstrapProc)(uint32_t encoding, const void *getSelector);
 94  
 95  /* Latin precomposition */
 96  /* This function does not precompose recursively nor to U+01E0 and U+01E1.
 97  */
 98  extern bool CFStringEncodingIsValidCombiningCharacterForLatin1(UniChar character);
 99  extern UniChar CFStringEncodingPrecomposeLatinCharacter(const UniChar *character, CFIndex numChars, CFIndex *usedChars);
100  
101  /* Convenience functions for converter development */
102  typedef struct _CFStringEncodingUnicodeTo8BitCharMap {
103      UniChar _u;
104      uint8_t _c;
105      uint8_t :8;
106  } CFStringEncodingUnicodeTo8BitCharMap;
107  
108  /* Binary searches CFStringEncodingUnicodeTo8BitCharMap */
109  CF_INLINE bool CFStringEncodingUnicodeTo8BitEncoding(const CFStringEncodingUnicodeTo8BitCharMap *theTable, CFIndex numElem, UniChar character, uint8_t *ch) {
110      const CFStringEncodingUnicodeTo8BitCharMap *p, *q, *divider;
111  
112      if ((character < theTable[0]._u) || (character > theTable[numElem-1]._u)) {
113          return 0;
114      }
115      p = theTable;
116      q = p + (numElem-1);
117      while (p <= q) {
118          divider = p + ((q - p) >> 1);	/* divide by 2 */
119          if (character < divider->_u) { q = divider - 1; }
120          else if (character > divider->_u) { p = divider + 1; }
121          else { *ch = divider->_c; return 1; }
122      }
123      return 0;
124  }
125  
126  
127  CF_EXTERN_C_END
128  
129  #endif /* ! __COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__ */
130