1/* 2 * Copyright (c) 2014 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-2013, Apple Inc. All rights reserved. 26*/ 27 28#if !defined(__COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__) 29#define __COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__ 1 30 31#include <CoreFoundation/CFStringEncodingConverter.h> 32 33CF_EXTERN_C_BEGIN 34 35#define MAX_DECOMPOSED_LENGTH (10) 36 37enum { 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 */ 47typedef CFIndex (*CFStringEncodingToBytesProc)(uint32_t flags, const UniChar *characters, CFIndex numChars, uint8_t *bytes, CFIndex maxByteLen, CFIndex *usedByteLen); 48typedef CFIndex (*CFStringEncodingToUnicodeProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes, UniChar *characters, CFIndex maxCharLen, CFIndex *usedCharLen); 49/* kCFStringEncodingConverterCheapEightBit */ 50typedef bool (*CFStringEncodingCheapEightBitToBytesProc)(uint32_t flags, UniChar character, uint8_t *byte); 51typedef bool (*CFStringEncodingCheapEightBitToUnicodeProc)(uint32_t flags, uint8_t byte, UniChar *character); 52/* kCFStringEncodingConverterStandardEightBit */ 53typedef uint16_t (*CFStringEncodingStandardEightBitToBytesProc)(uint32_t flags, const UniChar *characters, CFIndex numChars, uint8_t *byte); 54typedef uint16_t (*CFStringEncodingStandardEightBitToUnicodeProc)(uint32_t flags, uint8_t byte, UniChar *characters); 55/* kCFStringEncodingConverterCheapMultiByte */ 56typedef uint16_t (*CFStringEncodingCheapMultiByteToBytesProc)(uint32_t flags, UniChar character, uint8_t *bytes); 57typedef uint16_t (*CFStringEncodingCheapMultiByteToUnicodeProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes, UniChar *character); 58 59typedef CFIndex (*CFStringEncodingToBytesLenProc)(uint32_t flags, const UniChar *characters, CFIndex numChars); 60typedef CFIndex (*CFStringEncodingToUnicodeLenProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes); 61 62typedef CFIndex (*CFStringEncodingToBytesPrecomposeProc)(uint32_t flags, const UniChar *character, CFIndex numChars, uint8_t *bytes, CFIndex maxByteLen, CFIndex *usedByteLen); 63typedef bool (*CFStringEncodingIsValidCombiningCharacterProc)(UniChar character); 64 65typedef 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 80extern const CFStringEncodingConverter *CFStringEncodingGetConverter(uint32_t encoding); 81 82enum { 83 kCFStringEncodingGetConverterSelector = 0, 84 kCFStringEncodingIsDecomposableCharacterSelector = 1, 85 kCFStringEncodingDecomposeCharacterSelector = 2, 86 kCFStringEncodingIsValidLatin1CombiningCharacterSelector = 3, 87 kCFStringEncodingPrecomposeLatin1CharacterSelector = 4 88}; 89 90extern const void *CFStringEncodingGetAddressForSelector(uint32_t selector); 91 92#define BOOTSTRAPFUNC_NAME CFStringEncodingBootstrap 93typedef 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*/ 98extern bool CFStringEncodingIsValidCombiningCharacterForLatin1(UniChar character); 99extern UniChar CFStringEncodingPrecomposeLatinCharacter(const UniChar *character, CFIndex numChars, CFIndex *usedChars); 100 101/* Convenience functions for converter development */ 102typedef struct _CFStringEncodingUnicodeTo8BitCharMap { 103 UniChar _u; 104 uint8_t _c; 105 uint8_t :8; 106} CFStringEncodingUnicodeTo8BitCharMap; 107 108/* Binary searches CFStringEncodingUnicodeTo8BitCharMap */ 109CF_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 127CF_EXTERN_C_END 128 129#endif /* ! __COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__ */ 130 131