| /* |
| * Copyright (c) 2008-2009 Brent Fulgham <bfulgham@gmail.org>. All rights reserved. |
| * |
| * This source code is a modified version of the CoreFoundation sources released by Apple Inc. under |
| * the terms of the APSL version 2.0 (see below). |
| * |
| * For information about changes from the original Apple source release can be found by reviewing the |
| * source control system for the project at https://sourceforge.net/svn/?group_id=246198. |
| * |
| * The original license information is as follows: |
| * |
| * Copyright (c) 2008 Apple Inc. All rights reserved. |
| * |
| * @APPLE_LICENSE_HEADER_START@ |
| * |
| * This file contains Original Code and/or Modifications of Original Code |
| * as defined in and that are subject to the Apple Public Source License |
| * Version 2.0 (the 'License'). You may not use this file except in |
| * compliance with the License. Please obtain a copy of the License at |
| * http://www.opensource.apple.com/apsl/ and read it before using this |
| * file. |
| * |
| * The Original Code and all software distributed under the License are |
| * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
| * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
| * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. |
| * Please see the License for the specific language governing rights and |
| * limitations under the License. |
| * |
| * @APPLE_LICENSE_HEADER_END@ |
| */ |
| /* CFStringEncodingConverterExt.h |
| Copyright (c) 1998-2007, Apple Inc. All rights reserved. |
| */ |
| |
| #if !defined(__COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__) |
| #define __COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__ 1 |
| |
| #include <CoreFoundation/CFStringEncodingConverter.h> |
| |
| CF_EXTERN_C_BEGIN |
| |
| #define MAX_DECOMPOSED_LENGTH (10) |
| |
| enum { |
| kCFStringEncodingConverterStandard = 0, |
| kCFStringEncodingConverterCheapEightBit = 1, |
| kCFStringEncodingConverterStandardEightBit = 2, |
| kCFStringEncodingConverterCheapMultiByte = 3, |
| kCFStringEncodingConverterPlatformSpecific = 4 // Other fields are ignored |
| }; |
| |
| /* kCFStringEncodingConverterStandard */ |
| typedef CFIndex (*CFStringEncodingToBytesProc)(uint32_t flags, const UniChar *characters, CFIndex numChars, uint8_t *bytes, CFIndex maxByteLen, CFIndex *usedByteLen); |
| typedef CFIndex (*CFStringEncodingToUnicodeProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes, UniChar *characters, CFIndex maxCharLen, CFIndex *usedCharLen); |
| /* kCFStringEncodingConverterCheapEightBit */ |
| typedef bool (*CFStringEncodingCheapEightBitToBytesProc)(uint32_t flags, UniChar character, uint8_t *byte); |
| typedef bool (*CFStringEncodingCheapEightBitToUnicodeProc)(uint32_t flags, uint8_t byte, UniChar *character); |
| /* kCFStringEncodingConverterStandardEightBit */ |
| typedef uint16_t (*CFStringEncodingStandardEightBitToBytesProc)(uint32_t flags, const UniChar *characters, CFIndex numChars, uint8_t *byte); |
| typedef uint16_t (*CFStringEncodingStandardEightBitToUnicodeProc)(uint32_t flags, uint8_t byte, UniChar *characters); |
| /* kCFStringEncodingConverterCheapMultiByte */ |
| typedef uint16_t (*CFStringEncodingCheapMultiByteToBytesProc)(uint32_t flags, UniChar character, uint8_t *bytes); |
| typedef uint16_t (*CFStringEncodingCheapMultiByteToUnicodeProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes, UniChar *character); |
| |
| typedef CFIndex (*CFStringEncodingToBytesLenProc)(uint32_t flags, const UniChar *characters, CFIndex numChars); |
| typedef CFIndex (*CFStringEncodingToUnicodeLenProc)(uint32_t flags, const uint8_t *bytes, CFIndex numBytes); |
| |
| typedef CFIndex (*CFStringEncodingToBytesPrecomposeProc)(uint32_t flags, const UniChar *character, CFIndex numChars, uint8_t *bytes, CFIndex maxByteLen, CFIndex *usedByteLen); |
| typedef bool (*CFStringEncodingIsValidCombiningCharacterProc)(UniChar character); |
| |
| typedef struct { |
| void *toBytes; |
| void *toUnicode; |
| uint16_t maxBytesPerChar; |
| uint16_t maxDecomposedCharLen; |
| uint8_t encodingClass; |
| uint32_t :24; |
| CFStringEncodingToBytesLenProc toBytesLen; |
| CFStringEncodingToUnicodeLenProc toUnicodeLen; |
| CFStringEncodingToBytesFallbackProc toBytesFallback; |
| CFStringEncodingToUnicodeFallbackProc toUnicodeFallback; |
| CFStringEncodingToBytesPrecomposeProc toBytesPrecompose; |
| CFStringEncodingIsValidCombiningCharacterProc isValidCombiningChar; |
| } CFStringEncodingConverter; |
| |
| |
| extern const CFStringEncodingConverter *CFStringEncodingGetConverter(uint32_t encoding); |
| |
| enum { |
| kCFStringEncodingGetConverterSelector = 0, |
| kCFStringEncodingIsDecomposableCharacterSelector = 1, |
| kCFStringEncodingDecomposeCharacterSelector = 2, |
| kCFStringEncodingIsValidLatin1CombiningCharacterSelector = 3, |
| kCFStringEncodingPrecomposeLatin1CharacterSelector = 4 |
| }; |
| |
| extern const void *CFStringEncodingGetAddressForSelector(uint32_t selector); |
| |
| #define BOOTSTRAPFUNC_NAME CFStringEncodingBootstrap |
| typedef const CFStringEncodingConverter* (*CFStringEncodingBootstrapProc)(uint32_t encoding, const void *getSelector); |
| |
| extern uint32_t CFStringEncodingGetScriptCodeForEncoding(CFStringEncoding encoding); |
| |
| /* Latin precomposition */ |
| /* This function does not precompose recursively nor to U+01E0 and U+01E1. |
| */ |
| extern bool CFStringEncodingIsValidCombiningCharacterForLatin1(UniChar character); |
| extern UniChar CFStringEncodingPrecomposeLatinCharacter(const UniChar *character, CFIndex numChars, CFIndex *usedChars); |
| |
| /* Convenience functions for converter development */ |
| typedef struct _CFStringEncodingUnicodeTo8BitCharMap { |
| UniChar _u; |
| uint8_t _c; |
| uint8_t :8; |
| } CFStringEncodingUnicodeTo8BitCharMap; |
| |
| /* Binary searches CFStringEncodingUnicodeTo8BitCharMap */ |
| CF_INLINE bool CFStringEncodingUnicodeTo8BitEncoding(const CFStringEncodingUnicodeTo8BitCharMap *theTable, CFIndex numElem, UniChar character, uint8_t *ch) { |
| const CFStringEncodingUnicodeTo8BitCharMap *p, *q, *divider; |
| |
| if ((character < theTable[0]._u) || (character > theTable[numElem-1]._u)) { |
| return 0; |
| } |
| p = theTable; |
| q = p + (numElem-1); |
| while (p <= q) { |
| divider = p + ((q - p) >> 1); /* divide by 2 */ |
| if (character < divider->_u) { q = divider - 1; } |
| else if (character > divider->_u) { p = divider + 1; } |
| else { *ch = divider->_c; return 1; } |
| } |
| return 0; |
| } |
| |
| |
| CF_EXTERN_C_END |
| |
| #endif /* ! __COREFOUNDATION_CFSTRINGENCODINGCONVERETEREXT__ */ |
| |