1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *******************************************************************************
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *   Copyright (C) 2003-2010, International Business Machines
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   Corporation and others.  All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *******************************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   file name:  ucm.h
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   encoding:   US-ASCII
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   tab size:   8 (not used)
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   indentation:4
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   created on: 2003jun20
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   created by: Markus W. Scherer
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   Definitions for the .ucm file parser and handler module ucm.c.
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef __UCM_H__
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define __UCM_H__
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucnvmbcs.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ucnv_ext.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "filestrm.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdio.h>
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_CONVERSION
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_BEGIN
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* constants for UCMapping.moveFlag */
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCM_MOVE_TO_EXT=1,
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCM_REMOVE_MAPPING=2
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Per-mapping data structure
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * u if uLen==1: Unicode code point
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   else index to uLen code points
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * b if bLen<=4: up to 4 bytes
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   else index to bLen bytes
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * uLen number of code points
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * bLen number of words containing left-justified bytes
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * bIsMultipleChars indicates that the bytes contain more than one sequence
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                  according to the state table
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * f flag for roundtrip (0), fallback (1), sub mapping (2), reverse fallback (3)
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *   same values as in the source file after |
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct UCMapping {
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 u;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    union {
53b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        uint32_t idx;
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint8_t bytes[4];
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } b;
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t uLen, bLen, f, moveFlag;
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} UCMapping;
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* constants for UCMTable.flagsType */
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCM_FLAGS_INITIAL,  /* no mappings parsed yet */
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCM_FLAGS_EXPLICIT, /* .ucm file has mappings with | fallback indicators */
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCM_FLAGS_IMPLICIT, /* .ucm file has mappings without | fallback indicators, later wins */
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCM_FLAGS_MIXED     /* both implicit and explicit */
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct UCMTable {
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCMapping *mappings;
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t mappingsCapacity, mappingsLength;
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 *codePoints;
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t codePointsCapacity, codePointsLength;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t *bytes;
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t bytesCapacity, bytesLength;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* index map for mapping by bytes first */
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t *reverseMap;
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t unicodeMask;
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t flagsType; /* UCM_FLAGS_INITIAL etc. */
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool isSorted;
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} UCMTable;
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MBCS_STATE_FLAG_DIRECT=1,
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MBCS_STATE_FLAG_SURROGATES,
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MBCS_STATE_FLAG_READY=16
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct UCMStates {
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t stateTable[MBCS_MAX_STATE_COUNT][256];
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t stateFlags[MBCS_MAX_STATE_COUNT],
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             stateOffsetSum[MBCS_MAX_STATE_COUNT];
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t countStates, minCharLength, maxCharLength, countToUCodeUnits;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int8_t conversionType, outputType;
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} UCMStates;
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef struct UCMFile {
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCMTable *base, *ext;
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCMStates states;
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    char baseName[UCNV_MAX_CONVERTER_NAME_LENGTH];
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} UCMFile;
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* simple accesses ---------------------------------------------------------- */
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCM_GET_CODE_POINTS(t, m) \
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (((m)->uLen==1) ? &(m)->u : (t)->codePoints+(m)->u)
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCM_GET_BYTES(t, m) \
114b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    (((m)->bLen<=4) ? (m)->b.bytes : (t)->bytes+(m)->b.idx)
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* APIs --------------------------------------------------------------------- */
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UCMFile * U_EXPORT2
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_open(void);
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_close(UCMFile *ucm);
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_parseHeaderLine(UCMFile *ucm,
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    char *line, char **pKey, char **pValue);
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* @return -1 illegal bytes  0 suitable for base table  1 needs to go into extension table */
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_mappingType(UCMStates *baseStates,
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UCMapping *m,
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UChar32 codePoints[UCNV_EXT_MAX_UCHARS],
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uint8_t bytes[UCNV_EXT_MAX_BYTES]);
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* add a mapping to the base or extension table as appropriate */
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_addMappingAuto(UCMFile *ucm, UBool forBase, UCMStates *baseStates,
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UCMapping *m,
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UChar32 codePoints[UCNV_EXT_MAX_UCHARS],
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   uint8_t bytes[UCNV_EXT_MAX_BYTES]);
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_addMappingFromLine(UCMFile *ucm, const char *line, UBool forBase, UCMStates *baseStates);
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UCMTable * U_EXPORT2
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_openTable(void);
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_closeTable(UCMTable *table);
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_resetTable(UCMTable *table);
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_sortTable(UCMTable *t);
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Remove mappings with their move flag set from the base table
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and move some of them (with UCM_MOVE_TO_EXT) to the extension table.
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_moveMappings(UCMTable *base, UCMTable *ext);
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Read a table from a .ucm file, from after the CHARMAP line to
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * including the END CHARMAP line.
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_readTable(UCMFile *ucm, FileStream* convFile,
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UBool forBase, UCMStates *baseStates,
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              UErrorCode *pErrorCode);
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Check the validity of mappings against a base table's states;
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * necessary for extension-only tables that were read before their base tables.
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_checkValidity(UCMTable *ext, UCMStates *baseStates);
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Check a base table against an extension table.
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set the moveTarget!=NULL if it is possible to move mappings from the base.
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is the case where base and extension tables are parsed from a single file
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (moveTarget==ext)
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or when delta file mappings are subtracted from a base table.
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * When a base table cannot be modified because a delta file is parsed in makeconv,
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * then set moveTarget=NULL.
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * if(intersectBase) then mappings that exist in the base table but not in
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the extension table are moved to moveTarget instead of showing an error.
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Special mode:
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If intersectBase==2 for a DBCS extension table, then SBCS mappings are
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * not moved out of the base unless their Unicode input requires it.
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This helps ucmkbase generate base tables for DBCS-only extension .cnv files.
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * For both tables in the same file, the extension table is automatically
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * built.
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * For separate files, the extension file can use a complete mapping table (.ucm file),
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * so that common mappings need not be stripped out manually.
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Sort both tables, and then for each mapping direction:
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If intersectBase is TRUE and the base table contains a mapping
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * that does not exist in the extension table, then this mapping is moved
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * to moveTarget.
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - otherwise -
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If the base table contains a mapping for which the input sequence is
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the same as the extension input, then
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - if the output is the same: remove the extension mapping
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - else: error
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * If the base table contains a mapping for which the input sequence is
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * a prefix of the extension input, then
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - if moveTarget!=NULL: move the base mapping to the moveTarget table
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * - else: error
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return FALSE in case of an irreparable error
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_checkBaseExt(UCMStates *baseStates, UCMTable *base, UCMTable *ext,
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 UCMTable *moveTarget, UBool intersectBase);
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_printTable(UCMTable *table, FILE *f, UBool byUnicode);
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_printMapping(UCMTable *table, UCMapping *m, FILE *f);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_addState(UCMStates *states, const char *s);
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
24050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoucm_processStates(UCMStates *states, UBool ignoreSISOCheck);
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_countChars(UCMStates *states,
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               const uint8_t *bytes, int32_t length);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int8_t U_EXPORT2
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_parseBytes(uint8_t bytes[UCNV_EXT_MAX_BYTES], const char *line, const char **ps);
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_parseMappingLine(UCMapping *m,
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     UChar32 codePoints[UCNV_EXT_MAX_UCHARS],
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     uint8_t bytes[UCNV_EXT_MAX_BYTES],
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     const char *line);
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_addMapping(UCMTable *table,
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UCMapping *m,
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UChar32 codePoints[UCNV_EXT_MAX_UCHARS],
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               uint8_t bytes[UCNV_EXT_MAX_BYTES]);
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* very makeconv-specific functions ----------------------------------------- */
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* finalize and optimize states after the toUnicode mappings are processed */
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_optimizeStates(UCMStates *states,
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   uint16_t **pUnicodeCodeUnits,
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   _MBCSToUFallback *toUFallbacks, int32_t countToUFallbacks,
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UBool verbose);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* moved here because it is used inside ucmstate.c */
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_findFallback(_MBCSToUFallback *toUFallbacks, int32_t countToUFallbacks,
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 uint32_t offset);
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* very rptp2ucm-specific functions ----------------------------------------- */
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Input: Separate tables with mappings from/to Unicode,
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * subchar and subchar1 (0 if none).
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * All mappings must have flag 0.
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Output: fromUTable will contain the union of mappings with the correct
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * precision flags, and be sorted.
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_mergeTables(UCMTable *fromUTable, UCMTable *toUTable,
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                const uint8_t *subchar, int32_t subcharLength,
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                uint8_t subchar1);
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruucm_separateMappings(UCMFile *ucm, UBool isSISO);
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CDECL_END
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
300