]> git.saurik.com Git - apple/cf.git/blob - CFStringEncodingConverterExt.h
89bfd110271f4e74bffa6a9b5b0f3e204b8c76b4
[apple/cf.git] / CFStringEncodingConverterExt.h
1 /*
2 * Copyright (c) 2012 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-2011, 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