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