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