1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Copyright (C) 2000-2010, International Business Machines
4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Corporation and others.  All Rights Reserved.
5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)**********************************************************************
6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   file name:  ucnv2022.c
7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   encoding:   US-ASCII
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   tab size:   8 (not used)
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   indentation:4
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   created on: 2000feb03
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   created by: Markus W. Scherer
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Change history:
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   06/29/2000  helena  Major rewrite of the callback APIs.
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   08/08/2000  Ram     Included support for ISO-2022-JP-2
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*                       Changed implementation of toUnicode
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*                       function
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   08/21/2000  Ram     Added support for ISO-2022-KR
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   08/29/2000  Ram     Seperated implementation of EBCDIC to
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*                       ucnvebdc.c
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   09/20/2000  Ram     Added support for ISO-2022-CN
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*                       Added implementations for getNextUChar()
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*                       for specific 2022 country variants.
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   10/31/2000  Ram     Implemented offsets logic functions
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h"
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_CONVERSION && !UCONFIG_NO_LEGACY_CONVERSION
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/ucnv.h"
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/uset.h"
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/ucnv_err.h"
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/ucnv_cb.h"
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "ucnv_imp.h"
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "ucnv_bld.h"
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "ucnv_cnv.h"
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "ucnvmbcs.h"
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cstring.h"
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "cmemory.h"
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * I am disabling the generic ISO-2022 converter after proposing to do so on
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the icu mailing list two days ago.
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Reasons:
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 1. It does not fully support the ISO-2022/ECMA-35 specification with all of
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    its designation sequences, single shifts with return to the previous state,
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    switch-with-no-return to UTF-16BE or similar, etc.
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    This is unlike the language-specific variants like ISO-2022-JP which
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    require a much smaller repertoire of ISO-2022 features.
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    These variants continue to be supported.
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 2. I believe that no one is really using the generic ISO-2022 converter
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    but rather always one of the language-specific variants.
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    Note that ICU's generic ISO-2022 converter has always output one escape
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    sequence followed by UTF-8 for the whole stream.
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 3. Switching between subcharsets is extremely slow, because each time
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    the previous converter is closed and a new one opened,
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    without any kind of caching, least-recently-used list, etc.
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 4. The code is currently buggy, and given the above it does not seem
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    reasonable to spend the time on maintenance.
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 5. ISO-2022 subcharsets should normally be used with 7-bit byte encodings.
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    This means, for example, that when ISO-8859-7 is designated, the following
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    ISO-2022 bytes 00..7f should be interpreted as ISO-8859-7 bytes 80..ff.
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    The ICU ISO-2022 converter does not handle this - and has no information
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    about which subconverter would have to be shifted vs. which is designed
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    for 7-bit ISO-2022.
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Markus Scherer 2003-dec-03
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char SHIFT_IN_STR[]  = "\x0F";
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char SHIFT_OUT_STR[] = "\x0E";
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define CR      0x0D
82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define LF      0x0A
83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define H_TAB   0x09
84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define V_TAB   0x0B
85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define SPACE   0x20
86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)enum {
88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    HWKANA_START=0xff61,
89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    HWKANA_END=0xff9f
90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 94-character sets with native byte values A1..FE are encoded in ISO 2022
94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * as bytes 21..7E. (Subtract 0x80.)
95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 96-character sets with native byte values A0..FF are encoded in ISO 2022
96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * as bytes 20..7F. (Subtract 0x80.)
97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Do not encode C1 control codes with native bytes 80..9F
98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * as bytes 00..1F (C0 control codes).
99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)enum {
101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    GR94_START=0xa1,
102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    GR94_END=0xfe,
103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    GR96_START=0xa0,
104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    GR96_END=0xff
105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * ISO 2022 control codes must not be converted from Unicode
109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * because they would mess up the byte stream.
110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The bit mask 0x0800c000 has bits set at bit positions 0xe, 0xf, 0x1b
111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * corresponding to SO, SI, and ESC.
112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define IS_2022_CONTROL(c) (((c)<0x20) && (((uint32_t)1<<(c))&0x0800c000)!=0)
114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* for ISO-2022-JP and -CN implementations */
116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)typedef enum  {
117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* shared values */
118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        INVALID_STATE=-1,
119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ASCII = 0,
120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        SS2_STATE=0x10,
122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        SS3_STATE,
123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* JP */
125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ISO8859_1 = 1 ,
126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ISO8859_7 = 2 ,
127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        JISX201  = 3,
128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        JISX208 = 4,
129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        JISX212 = 5,
130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        GB2312  =6,
131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        KSC5601 =7,
132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        HWKANA_7BIT=8,    /* Halfwidth Katakana 7 bit */
133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* CN */
135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* the first few enum constants must keep their values because they correspond to myConverterArray[] */
136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        GB2312_1=1,
137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ISO_IR_165=2,
138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643=3,
139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /*
141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * these are used in StateEnum and ISO2022State variables,
142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * but CNS_11643 must be used to index into myConverterArray[]
143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         */
144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_0=0x20,
145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_1,
146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_2,
147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_3,
148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_4,
149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_5,
150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_6,
151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_7
152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} StateEnum;
153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* is the StateEnum charset value for a DBCS charset? */
155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define IS_JP_DBCS(cs) (JISX208<=(cs) && (cs)<=KSC5601)
156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define CSM(cs) ((uint16_t)1<<(cs))
158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Each of these charset masks (with index x) contains a bit for a charset in exact correspondence
161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * to whether that charset is used in the corresponding version x of ISO_2022,locale=ja,version=x
162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Note: The converter uses some leniency:
164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * - The escape sequence ESC ( I for half-width 7-bit Katakana is recognized in
165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   all versions, not just JIS7 and JIS8.
166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * - ICU does not distinguish between different versions of JIS X 0208.
167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)enum { MAX_JA_VERSION=4 };
169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const uint16_t jpCharsetMasks[MAX_JA_VERSION+1]={
170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT),
171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212),
172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212)|CSM(GB2312)|CSM(KSC5601)|CSM(ISO8859_1)|CSM(ISO8859_7),
173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212)|CSM(GB2312)|CSM(KSC5601)|CSM(ISO8859_1)|CSM(ISO8859_7),
174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    CSM(ASCII)|CSM(JISX201)|CSM(JISX208)|CSM(HWKANA_7BIT)|CSM(JISX212)|CSM(GB2312)|CSM(KSC5601)|CSM(ISO8859_1)|CSM(ISO8859_7)
175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)typedef enum {
178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ASCII1=0,
179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        LATIN1,
180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        SBCS,
181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        DBCS,
182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        MBCS,
183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        HWKANA
184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}Cnv2022Type;
185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)typedef struct ISO2022State {
187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int8_t cs[4];       /* charset number for SI (G0)/SO (G1)/SS2 (G2)/SS3 (G3) */
188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int8_t g;           /* 0..3 for G0..G3 (SI/SO/SS2/SS3) */
189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int8_t prevG;       /* g before single shift (SS2 or SS3) */
190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} ISO2022State;
191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define UCNV_OPTIONS_VERSION_MASK 0xf
193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define UCNV_2022_MAX_CONVERTERS 10
194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)typedef struct{
196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterSharedData *myConverterArray[UCNV_2022_MAX_CONVERTERS];
197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter *currentConverter;
198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Cnv2022Type currentType;
199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO2022State toU2022State, fromU2022State;
200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t key;
201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t version;
202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool isFirstBuffer;
204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool isEmptySegment;
206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char name[30];
207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char locale[3];
208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}UConverterDataISO2022;
209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* Protos */
211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* ISO-2022 ----------------------------------------------------------------- */
212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*Forward declaration */
214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CFUNC void
215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucnv_fromUnicode_UTF8(UConverterFromUnicodeArgs * args,
216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                      UErrorCode * err);
217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_CFUNC void
218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)ucnv_fromUnicode_UTF8_OFFSETS_LOGIC(UConverterFromUnicodeArgs * args,
219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    UErrorCode * err);
220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define ESC_2022 0x1B /*ESC*/
222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)typedef enum
224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        INVALID_2022 = -1, /*Doesn't correspond to a valid iso 2022 escape sequence*/
226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        VALID_NON_TERMINAL_2022 = 0, /*so far corresponds to a valid iso 2022 escape sequence*/
227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        VALID_TERMINAL_2022 = 1, /*corresponds to a valid iso 2022 escape sequence*/
228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        VALID_MAYBE_TERMINAL_2022 = 2 /*so far matches one iso 2022 escape sequence, but by adding more characters might match another escape sequence*/
229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} UCNV_TableStates_2022;
230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* The way these state transition arrays work is:
233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* ex : ESC$B is the sequence for JISX208
234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      a) First Iteration: char is ESC
235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*          i) Get the value of ESC from normalize_esq_chars_2022[] with int value of ESC as index
236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*             int x = normalize_esq_chars_2022[27] which is equal to 1
237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*         ii) Search for this value in escSeqStateTable_Key_2022[]
238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*             value of x is stored at escSeqStateTable_Key_2022[0]
239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*        iii) Save this index as offset
240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*         iv) Get state of this sequence from escSeqStateTable_Value_2022[]
241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*             escSeqStateTable_Value_2022[offset], which is VALID_NON_TERMINAL_2022
242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*     b) Switch on this state and continue to next char
243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*          i) Get the value of $ from normalize_esq_chars_2022[] with int value of $ as index
244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*             which is normalize_esq_chars_2022[36] == 4
245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*         ii) x is currently 1(from above)
246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*               x<<=5 -- x is now 32
247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*               x+=normalize_esq_chars_2022[36]
248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*               now x is 36
249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*        iii) Search for this value in escSeqStateTable_Key_2022[]
250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*             value of x is stored at escSeqStateTable_Key_2022[2], so offset is 2
251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*         iv) Get state of this sequence from escSeqStateTable_Value_2022[]
252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*             escSeqStateTable_Value_2022[offset], which is VALID_NON_TERMINAL_2022
253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*     c) Switch on this state and continue to next char
254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*        i)  Get the value of B from normalize_esq_chars_2022[] with int value of B as index
255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*        ii) x is currently 36 (from above)
256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*            x<<=5 -- x is now 1152
257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*            x+=normalize_esq_chars_2022[66]
258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*            now x is 1161
259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       iii) Search for this value in escSeqStateTable_Key_2022[]
260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*            value of x is stored at escSeqStateTable_Key_2022[21], so offset is 21
261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*        iv) Get state of this sequence from escSeqStateTable_Value_2022[21]
262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*            escSeqStateTable_Value_2022[offset], which is VALID_TERMINAL_2022
263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*         v) Get the converter name form escSeqStateTable_Result_2022[21] which is JISX208
264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*Below are the 3 arrays depicting a state transition table*/
268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const int8_t normalize_esq_chars_2022[256] = {
269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*       0      1       2       3       4      5       6        7       8       9           */
270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,1      ,0      ,0
274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,4      ,7      ,29      ,0
275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,2     ,24     ,26     ,27     ,0      ,3      ,23     ,6      ,0      ,0
276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,5      ,8      ,9      ,10     ,11     ,12
278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,13    ,14     ,15     ,16     ,17     ,18     ,19     ,20     ,25     ,28
279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,21     ,0      ,0      ,0      ,0      ,0      ,0      ,0
280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,22    ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0      ,0
296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ,0     ,0      ,0      ,0      ,0      ,0
297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * When the generic ISO-2022 converter is completely removed, not just disabled
302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * per #ifdef, then the following state table and the associated tables that are
303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * dimensioned with MAX_STATES_2022 should be trimmed.
304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Especially, VALID_MAYBE_TERMINAL_2022 will not be used any more, and all of
306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the associated escape sequences starting with ESC ( B should be removed.
307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This includes the ones with key values 1097 and all of the ones above 1000000.
308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * For the latter, the tables can simply be truncated.
310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * For the former, since the tables must be kept parallel, it is probably best
311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * to simply duplicate an adjacent table cell, parallel in all tables.
312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * It may make sense to restructure the tables, especially by using small search
314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * tables for the variants instead of indexing them parallel to the table here.
315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define MAX_STATES_2022 74
319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const int32_t escSeqStateTable_Key_2022[MAX_STATES_2022] = {
320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*   0           1           2           3           4           5           6           7           8           9           */
321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     1          ,34         ,36         ,39         ,55         ,57         ,60         ,61         ,1093       ,1096
323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,1097       ,1098       ,1099       ,1100       ,1101       ,1102       ,1103       ,1104       ,1105       ,1106
324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,1109       ,1154       ,1157       ,1160       ,1161       ,1176       ,1178       ,1179       ,1254       ,1257
325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,1768       ,1773       ,1957       ,35105      ,36933      ,36936      ,36937      ,36938      ,36939      ,36940
326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,36942      ,36943      ,36944      ,36945      ,36946      ,36947      ,36948      ,37640      ,37642      ,37644
327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,37646      ,37711      ,37744      ,37745      ,37746      ,37747      ,37748      ,40133      ,40136      ,40138
328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,40139      ,40140      ,40141      ,1123363    ,35947624   ,35947625   ,35947626   ,35947627   ,35947629   ,35947630
329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,35947631   ,35947635   ,35947636   ,35947638
330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char* const escSeqStateTable_Result_2022[MAX_STATES_2022] = {
335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) /*  0                      1                        2                      3                   4                   5                        6                      7                       8                       9    */
336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     NULL                   ,NULL                   ,NULL                   ,NULL               ,NULL               ,NULL                   ,NULL                   ,NULL                   ,"latin1"               ,"latin1"
338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,"latin1"               ,"ibm-865"              ,"ibm-865"              ,"ibm-865"          ,"ibm-865"          ,"ibm-865"              ,"ibm-865"              ,"JISX0201"             ,"JISX0201"             ,"latin1"
339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,"latin1"               ,NULL                   ,"JISX-208"             ,"ibm-5478"         ,"JISX-208"         ,NULL                   ,NULL                   ,NULL                   ,NULL                   ,"UTF8"
340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,"ISO-8859-1"           ,"ISO-8859-7"           ,"JIS-X-208"            ,NULL               ,"ibm-955"          ,"ibm-367"              ,"ibm-952"              ,"ibm-949"              ,"JISX-212"             ,"ibm-1383"
341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,"ibm-952"              ,"ibm-964"              ,"ibm-964"              ,"ibm-964"          ,"ibm-964"          ,"ibm-964"              ,"ibm-964"              ,"ibm-5478"         ,"ibm-949"              ,"ISO-IR-165"
342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,"CNS-11643-1992,1"     ,"CNS-11643-1992,2"     ,"CNS-11643-1992,3"     ,"CNS-11643-1992,4" ,"CNS-11643-1992,5" ,"CNS-11643-1992,6"     ,"CNS-11643-1992,7"     ,"UTF16_PlatformEndian" ,"UTF16_PlatformEndian" ,"UTF16_PlatformEndian"
343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,"UTF16_PlatformEndian" ,"UTF16_PlatformEndian" ,"UTF16_PlatformEndian" ,NULL               ,"latin1"           ,"ibm-912"              ,"ibm-913"              ,"ibm-914"              ,"ibm-813"              ,"ibm-1089"
344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,"ibm-920"              ,"ibm-915"              ,"ibm-915"              ,"latin1"
345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const int8_t escSeqStateTable_Value_2022[MAX_STATES_2022] = {
350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*          0                           1                         2                             3                           4                           5                               6                        7                          8                           9       */
351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     VALID_NON_TERMINAL_2022    ,VALID_NON_TERMINAL_2022    ,VALID_NON_TERMINAL_2022    ,VALID_NON_TERMINAL_2022     ,VALID_NON_TERMINAL_2022   ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_NON_TERMINAL_2022    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022
352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,VALID_MAYBE_TERMINAL_2022  ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022
353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,VALID_TERMINAL_2022        ,VALID_NON_TERMINAL_2022    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_NON_TERMINAL_2022    ,VALID_NON_TERMINAL_2022    ,VALID_NON_TERMINAL_2022    ,VALID_NON_TERMINAL_2022    ,VALID_TERMINAL_2022
354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_NON_TERMINAL_2022    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022
355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022
356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022
357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_NON_TERMINAL_2022    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022
358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022        ,VALID_TERMINAL_2022
359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* Type def for refactoring changeState_2022 code*/
363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)typedef enum{
364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO_2022=0,
366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO_2022_JP=1,
368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO_2022_KR=2,
369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO_2022_CN=3
370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)} Variant2022;
371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*********** ISO 2022 Converter Protos ***********/
373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode);
375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) _ISO2022Close(UConverter *converter);
378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO2022Reset(UConverter *converter, UConverterResetChoice choice);
381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char*
383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO2022getName(const UConverter* cnv);
384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err);
387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static UConverter *
389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO_2022_SafeClone(const UConverter *cnv, void *stackBuffer, int32_t *pBufferSize, UErrorCode *status);
390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC(UConverterToUnicodeArgs* args, UErrorCode* err);
394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*const UConverterSharedData _ISO2022Data;*/
397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterSharedData _ISO2022JPData;
398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterSharedData _ISO2022KRData;
399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterSharedData _ISO2022CNData;
400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*************** Converter implementations ******************/
402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* The purpose of this function is to get around gcc compiler warnings. */
404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE void
405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)fromUWriteUInt8(UConverter *cnv,
406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 const char *bytes, int32_t length,
407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 uint8_t **target, const char *targetLimit,
408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 int32_t **offsets,
409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 int32_t sourceIndex,
410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 UErrorCode *pErrorCode)
411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char *targetChars = (char *)*target;
413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ucnv_fromUWriteBytes(cnv, bytes, length, &targetChars, targetLimit,
414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         offsets, sourceIndex, pErrorCode);
415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *target = (uint8_t*)targetChars;
416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE void
420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)setInitialStateToUnicodeKR(UConverter* converter, UConverterDataISO2022 *myConverterData){
421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(myConverterData->version == 1) {
422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverter *cnv = myConverterData->currentConverter;
423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->toUnicodeStatus=0;     /* offset */
425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->mode=0;                /* state */
426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->toULength=0;           /* byteIndex */
427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE void
431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)setInitialStateFromUnicodeKR(UConverter* converter,UConverterDataISO2022 *myConverterData){
432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   /* in ISO-2022-KR the designator sequence appears only once
433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * in a file so we append it only once
434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    */
435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if( converter->charErrorBufferLength==0){
436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        converter->charErrorBufferLength = 4;
438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        converter->charErrorBuffer[0] = 0x1b;
439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        converter->charErrorBuffer[1] = 0x24;
440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        converter->charErrorBuffer[2] = 0x29;
441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        converter->charErrorBuffer[3] = 0x43;
442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(myConverterData->version == 1) {
444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverter *cnv = myConverterData->currentConverter;
445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->fromUChar32=0;
447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->fromUnicodeStatus=1;   /* prevLength */
448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO2022Open(UConverter *cnv, UConverterLoadArgs *pArgs, UErrorCode *errorCode){
453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char myLocale[6]={' ',' ',' ',' ',' ',' '};
455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    cnv->extraInfo = uprv_malloc (sizeof (UConverterDataISO2022));
457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(cnv->extraInfo != NULL) {
458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverterNamePieces stackPieces;
459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverterLoadArgs stackArgs={ (int32_t)sizeof(UConverterLoadArgs) };
460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) cnv->extraInfo;
461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        uint32_t version;
462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        stackArgs.onlyTestIsLoadable = pArgs->onlyTestIsLoadable;
464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        uprv_memset(myConverterData, 0, sizeof(UConverterDataISO2022));
466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        myConverterData->currentType = ASCII1;
467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->fromUnicodeStatus =FALSE;
468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(pArgs->locale){
469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            uprv_strncpy(myLocale, pArgs->locale, sizeof(myLocale));
470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        version = pArgs->options & UCNV_OPTIONS_VERSION_MASK;
472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        myConverterData->version = version;
473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(myLocale[0]=='j' && (myLocale[1]=='a'|| myLocale[1]=='p') &&
474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            (myLocale[2]=='_' || myLocale[2]=='\0'))
475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        {
476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            size_t len=0;
477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* open the required converters and cache them */
478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(version>MAX_JA_VERSION) {
479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* prevent indexing beyond jpCharsetMasks[] */
480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->version = version = 0;
481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(jpCharsetMasks[version]&CSM(ISO8859_7)) {
483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->myConverterArray[ISO8859_7] =
484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ucnv_loadSharedData("ISO8859_7", &stackPieces, &stackArgs, errorCode);
485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->myConverterArray[JISX208] =
487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ucnv_loadSharedData("Shift-JIS", &stackPieces, &stackArgs, errorCode);
488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(jpCharsetMasks[version]&CSM(JISX212)) {
489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->myConverterArray[JISX212] =
490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ucnv_loadSharedData("jisx-212", &stackPieces, &stackArgs, errorCode);
491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(jpCharsetMasks[version]&CSM(GB2312)) {
493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->myConverterArray[GB2312] =
494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ucnv_loadSharedData("noop-gb2312_gl", &stackPieces, &stackArgs, errorCode);   /* gb_2312_80-1 */
495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(jpCharsetMasks[version]&CSM(KSC5601)) {
497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->myConverterArray[KSC5601] =
498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ucnv_loadSharedData("ksc_5601", &stackPieces, &stackArgs, errorCode);
499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* set the function pointers to appropriate funtions */
502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv->sharedData=(UConverterSharedData*)(&_ISO2022JPData);
503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            uprv_strcpy(myConverterData->locale,"ja");
504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            (void)uprv_strcpy(myConverterData->name,"ISO_2022,locale=ja,version=");
506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            len = uprv_strlen(myConverterData->name);
507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->name[len]=(char)(myConverterData->version+(int)'0');
508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->name[len+1]='\0';
509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else if(myLocale[0]=='k' && (myLocale[1]=='o'|| myLocale[1]=='r') &&
511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            (myLocale[2]=='_' || myLocale[2]=='\0'))
512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        {
513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            const char *cnvName;
514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(version==1) {
515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnvName="icu-internal-25546";
516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnvName="ksc_5601";
518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->version=version=0;
519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(pArgs->onlyTestIsLoadable) {
521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ucnv_canCreateConverter(cnvName, errorCode);  /* errorCode carries result */
522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                uprv_free(cnv->extraInfo);
523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnv->extraInfo=NULL;
524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                return;
525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->currentConverter=ucnv_open(cnvName, errorCode);
527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if (U_FAILURE(*errorCode)) {
528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    _ISO2022Close(cnv);
529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    return;
530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(version==1) {
533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    (void)uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=1");
534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    uprv_memcpy(cnv->subChars, myConverterData->currentConverter->subChars, 4);
535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    cnv->subCharLen = myConverterData->currentConverter->subCharLen;
536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }else{
537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    (void)uprv_strcpy(myConverterData->name,"ISO_2022,locale=ko,version=0");
538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* initialize the state variables */
541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                setInitialStateToUnicodeKR(cnv, myConverterData);
542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                setInitialStateFromUnicodeKR(cnv, myConverterData);
543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* set the function pointers to appropriate funtions */
545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnv->sharedData=(UConverterSharedData*)&_ISO2022KRData;
546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                uprv_strcpy(myConverterData->locale,"ko");
547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else if(((myLocale[0]=='z' && myLocale[1]=='h') || (myLocale[0]=='c'&& myLocale[1]=='n'))&&
550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            (myLocale[2]=='_' || myLocale[2]=='\0'))
551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        {
552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* open the required converters and cache them */
554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->myConverterArray[GB2312_1] =
555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ucnv_loadSharedData("noop-gb2312_gl", &stackPieces, &stackArgs, errorCode);
556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(version==1) {
557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->myConverterArray[ISO_IR_165] =
558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ucnv_loadSharedData("noop-iso-ir-165", &stackPieces, &stackArgs, errorCode);
559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->myConverterArray[CNS_11643] =
561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ucnv_loadSharedData("noop-cns-11643", &stackPieces, &stackArgs, errorCode);
562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* set the function pointers to appropriate funtions */
565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv->sharedData=(UConverterSharedData*)&_ISO2022CNData;
566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            uprv_strcpy(myConverterData->locale,"cn");
567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if (version==0){
569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->version = 0;
570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                (void)uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=0");
571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }else if (version==1){
572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->version = 1;
573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                (void)uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=1");
574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }else {
575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->version = 2;
576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                (void)uprv_strcpy(myConverterData->name,"ISO_2022,locale=zh,version=2");
577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else{
580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->isFirstBuffer = TRUE;
582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* append the UTF-8 escape sequence */
584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv->charErrorBufferLength = 3;
585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv->charErrorBuffer[0] = 0x1b;
586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv->charErrorBuffer[1] = 0x25;
587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv->charErrorBuffer[2] = 0x42;
588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv->sharedData=(UConverterSharedData*)&_ISO2022Data;
590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* initialize the state variables */
591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            uprv_strcpy(myConverterData->name,"ISO_2022");
592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#else
593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *errorCode = U_UNSUPPORTED_ERROR;
594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return;
595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->maxBytesPerUChar=cnv->sharedData->staticData->maxBytesPerChar;
599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(U_FAILURE(*errorCode) || pArgs->onlyTestIsLoadable) {
601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            _ISO2022Close(cnv);
602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else {
604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        *errorCode = U_MEMORY_ALLOCATION_ERROR;
605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO2022Close(UConverter *converter) {
611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022* myData =(UConverterDataISO2022 *) (converter->extraInfo);
612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterSharedData **array = myData->myConverterArray;
613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t i;
614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if (converter->extraInfo != NULL) {
616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /*close the array of converter pointers and free the memory*/
617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        for (i=0; i<UCNV_2022_MAX_CONVERTERS; i++) {
618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(array[i]!=NULL) {
619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ucnv_unloadSharedDataIfReady(array[i]);
620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ucnv_close(myData->currentConverter);
624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(!converter->isExtraLocal){
626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            uprv_free (converter->extraInfo);
627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            converter->extraInfo = NULL;
628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO2022Reset(UConverter *converter, UConverterResetChoice choice) {
634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) (converter->extraInfo);
635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(choice<=UCNV_RESET_TO_UNICODE) {
636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        uprv_memset(&myConverterData->toU2022State, 0, sizeof(ISO2022State));
637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        myConverterData->key = 0;
638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        myConverterData->isEmptySegment = FALSE;
639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(choice!=UCNV_RESET_TO_UNICODE) {
641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        uprv_memset(&myConverterData->fromU2022State, 0, sizeof(ISO2022State));
642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(myConverterData->locale[0] == 0){
645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(choice<=UCNV_RESET_TO_UNICODE) {
646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->isFirstBuffer = TRUE;
647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->key = 0;
648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if (converter->mode == UCNV_SO){
649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ucnv_close (myConverterData->currentConverter);
650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->currentConverter=NULL;
651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            converter->mode = UCNV_SI;
653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(choice!=UCNV_RESET_TO_UNICODE) {
655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* re-append UTF-8 escape sequence */
656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            converter->charErrorBufferLength = 3;
657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            converter->charErrorBuffer[0] = 0x1b;
658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            converter->charErrorBuffer[1] = 0x28;
659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            converter->charErrorBuffer[2] = 0x42;
660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    else
663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    {
665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* reset the state variables */
666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(myConverterData->locale[0] == 'k'){
667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(choice<=UCNV_RESET_TO_UNICODE) {
668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                setInitialStateToUnicodeKR(converter, myConverterData);
669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(choice!=UCNV_RESET_TO_UNICODE) {
671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                setInitialStateFromUnicodeKR(converter, myConverterData);
672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
677f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char*
678f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO2022getName(const UConverter* cnv){
679f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(cnv->extraInfo){
680f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverterDataISO2022* myData= (UConverterDataISO2022*)cnv->extraInfo;
681f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return myData->name;
682f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
683f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return NULL;
684f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
685f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
686f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
687f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*************** to unicode *******************/
688f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/****************************************************************************
689f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Recognized escape sequences are
690f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>(B  ASCII
691f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>.A  ISO-8859-1
692f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>.F  ISO-8859-7
693f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>(J  JISX-201
694f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>(I  JISX-201
695f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>$B  JISX-208
696f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>$@  JISX-208
697f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>$(D JISX-212
698f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>$A  GB2312
699f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ESC>$(C KSC5601
700f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
701f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const int8_t nextStateToUnicodeJP[MAX_STATES_2022]= {
702f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*      0                1               2               3               4               5               6               7               8               9    */
703f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    INVALID_STATE   ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,SS2_STATE      ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
704f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,ASCII          ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,JISX201        ,HWKANA_7BIT    ,JISX201        ,INVALID_STATE
705f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,JISX208        ,GB2312         ,JISX208        ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
706f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,ISO8859_1      ,ISO8859_7      ,JISX208        ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,KSC5601        ,JISX212        ,INVALID_STATE
707f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
708f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
709f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
710f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
711f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
712f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
713f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*************** to unicode *******************/
714f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const int8_t nextStateToUnicodeCN[MAX_STATES_2022]= {
715f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*      0                1               2               3               4               5               6               7               8               9    */
716f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,SS2_STATE      ,SS3_STATE      ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
717f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
718f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
719f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
720f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,GB2312_1       ,INVALID_STATE  ,ISO_IR_165
721f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,CNS_11643_1    ,CNS_11643_2    ,CNS_11643_3    ,CNS_11643_4    ,CNS_11643_5    ,CNS_11643_6    ,CNS_11643_7    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
722f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
723f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE  ,INVALID_STATE
724f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
725f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
726f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
727f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static UCNV_TableStates_2022
728f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getKey_2022(char c,int32_t* key,int32_t* offset){
729f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t togo;
730f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t low = 0;
731f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t hi = MAX_STATES_2022;
732f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t oldmid=0;
733f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
734f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    togo = normalize_esq_chars_2022[(uint8_t)c];
735f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(togo == 0) {
736f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* not a valid character anywhere in an escape sequence */
737f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        *key = 0;
738f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        *offset = 0;
739f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return INVALID_2022;
740f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
741f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    togo = (*key << 5) + togo;
742f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
743f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while (hi != low)  /*binary search*/{
744f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
745f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        register int32_t mid = (hi+low) >> 1; /*Finds median*/
746f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
747f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if (mid == oldmid)
748f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
749f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
750f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if (escSeqStateTable_Key_2022[mid] > togo){
751f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            hi = mid;
752f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
753f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else if (escSeqStateTable_Key_2022[mid] < togo){
754f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            low = mid;
755f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
756f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else /*we found it*/{
757f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *key = togo;
758f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *offset = mid;
759f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return (UCNV_TableStates_2022)escSeqStateTable_Value_2022[mid];
760f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
761f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        oldmid = mid;
762f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
763f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
764f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
765f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *key = 0;
766f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *offset = 0;
767f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return INVALID_2022;
768f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
769f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
770f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*runs through a state machine to determine the escape sequence - codepage correspondance
771f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
772f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
773f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)changeState_2022(UConverter* _this,
774f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                const char** source,
775f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                const char* sourceLimit,
776f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                Variant2022 var,
777f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                UErrorCode* err){
778f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_TableStates_2022 value;
779f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022* myData2022 = ((UConverterDataISO2022*)_this->extraInfo);
780f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t key = myData2022->key;
781f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t offset = 0;
782f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int8_t initialToULength = _this->toULength;
783f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char c;
784f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
785f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    value = VALID_NON_TERMINAL_2022;
786f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while (*source < sourceLimit) {
787f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        c = *(*source)++;
788f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        _this->toUBytes[_this->toULength++]=(uint8_t)c;
789f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        value = getKey_2022(c,(int32_t *) &key, &offset);
790f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
791f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        switch (value){
792f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
793f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        case VALID_NON_TERMINAL_2022 :
794f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* continue with the loop */
795f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
796f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
797f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        case VALID_TERMINAL_2022:
798f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            key = 0;
799f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            goto DONE;
800f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
801f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        case INVALID_2022:
802f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            goto DONE;
803f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
804f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        case VALID_MAYBE_TERMINAL_2022:
805f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
806f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* ESC ( B is ambiguous only for ISO_2022 itself */
807f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(var == ISO_2022) {
808f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* discard toUBytes[] for ESC ( B because this sequence is correct and complete */
809f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                _this->toULength = 0;
810f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
811f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* TODO need to indicate that ESC ( B was seen; if failure, then need to replay from source or from MBCS-style replay */
812f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
813f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* continue with the loop */
814f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                value = VALID_NON_TERMINAL_2022;
815f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
816f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else
817f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
818f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            {
819f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* not ISO_2022 itself, finish here */
820f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                value = VALID_TERMINAL_2022;
821f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                key = 0;
822f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                goto DONE;
823f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
824f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
825f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
826f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
827f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)DONE:
828f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    myData2022->key = key;
829f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
830f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if (value == VALID_NON_TERMINAL_2022) {
831f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* indicate that the escape sequence is incomplete: key!=0 */
832f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return;
833f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if (value == INVALID_2022 ) {
834f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        *err = U_ILLEGAL_ESCAPE_SEQUENCE;
835f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else /* value == VALID_TERMINAL_2022 */ {
836f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        switch(var){
837f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
838f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        case ISO_2022:
839f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        {
840f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            const char *chosenConverterName = escSeqStateTable_Result_2022[offset];
841f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(chosenConverterName == NULL) {
842f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* SS2 or SS3 */
843f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
844f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                _this->toUCallbackReason = UCNV_UNASSIGNED;
845f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                return;
846f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
847f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
848f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            _this->mode = UCNV_SI;
849f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ucnv_close(myData2022->currentConverter);
850f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myData2022->currentConverter = myUConverter = ucnv_open(chosenConverterName, err);
851f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(U_SUCCESS(*err)) {
852f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myUConverter->fromCharErrorBehaviour = UCNV_TO_U_CALLBACK_STOP;
853f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                _this->mode = UCNV_SO;
854f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
855f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
856f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
857f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
858f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        case ISO_2022_JP:
859f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            {
860f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                StateEnum tempState=(StateEnum)nextStateToUnicodeJP[offset];
861f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                switch(tempState) {
862f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case INVALID_STATE:
863f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
864f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
865f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case SS2_STATE:
866f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(myData2022->toU2022State.cs[2]!=0) {
867f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(myData2022->toU2022State.g<2) {
868f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            myData2022->toU2022State.prevG=myData2022->toU2022State.g;
869f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
870f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        myData2022->toU2022State.g=2;
871f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
872f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* illegal to have SS2 before a matching designator */
873f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_ILLEGAL_ESCAPE_SEQUENCE;
874f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
875f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
876f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* case SS3_STATE: not used in ISO-2022-JP-x */
877f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ISO8859_1:
878f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ISO8859_7:
879f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if((jpCharsetMasks[myData2022->version] & CSM(tempState)) == 0) {
880f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
881f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
882f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* G2 charset for SS2 */
883f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        myData2022->toU2022State.cs[2]=(int8_t)tempState;
884f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
885f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
886f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                default:
887f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if((jpCharsetMasks[myData2022->version] & CSM(tempState)) == 0) {
888f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
889f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
890f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* G0 charset */
891f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        myData2022->toU2022State.cs[0]=(int8_t)tempState;
892f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
893f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
894f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
895f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
896f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
897f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        case ISO_2022_CN:
898f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            {
899f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                StateEnum tempState=(StateEnum)nextStateToUnicodeCN[offset];
900f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                switch(tempState) {
901f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case INVALID_STATE:
902f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
903f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
904f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case SS2_STATE:
905f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(myData2022->toU2022State.cs[2]!=0) {
906f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(myData2022->toU2022State.g<2) {
907f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            myData2022->toU2022State.prevG=myData2022->toU2022State.g;
908f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
909f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        myData2022->toU2022State.g=2;
910f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
911f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* illegal to have SS2 before a matching designator */
912f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_ILLEGAL_ESCAPE_SEQUENCE;
913f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
914f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
915f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case SS3_STATE:
916f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(myData2022->toU2022State.cs[3]!=0) {
917f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(myData2022->toU2022State.g<2) {
918f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            myData2022->toU2022State.prevG=myData2022->toU2022State.g;
919f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
920f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        myData2022->toU2022State.g=3;
921f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
922f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* illegal to have SS3 before a matching designator */
923f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_ILLEGAL_ESCAPE_SEQUENCE;
924f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
925f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
926f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ISO_IR_165:
927f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(myData2022->version==0) {
928f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
929f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        break;
930f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
931f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /*fall through*/
932f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case GB2312_1:
933f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /*fall through*/
934f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case CNS_11643_1:
935f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData2022->toU2022State.cs[1]=(int8_t)tempState;
936f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
937f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case CNS_11643_2:
938f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData2022->toU2022State.cs[2]=(int8_t)tempState;
939f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
940f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                default:
941f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* other CNS 11643 planes */
942f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(myData2022->version==0) {
943f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
944f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
945f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                       myData2022->toU2022State.cs[3]=(int8_t)tempState;
946f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
947f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
948f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
949f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
950f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
951f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        case ISO_2022_KR:
952f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(offset==0x30){
953f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* nothing to be done, just accept this one escape sequence */
954f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
955f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *err = U_UNSUPPORTED_ESCAPE_SEQUENCE;
956f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
957f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
958f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
959f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        default:
960f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *err = U_ILLEGAL_ESCAPE_SEQUENCE;
961f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
962f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
963f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
964f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(U_SUCCESS(*err)) {
965f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        _this->toULength = 0;
966f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(*err==U_ILLEGAL_ESCAPE_SEQUENCE) {
967f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(_this->toULength>1) {
968f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*
969f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * Ticket 5691: consistent illegal sequences:
970f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * - We include at least the first byte (ESC) in the illegal sequence.
971f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * - If any of the non-initial bytes could be the start of a character,
972f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             *   we stop the illegal sequence before the first one of those.
973f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             *   In escape sequences, all following bytes are "printable", that is,
974f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             *   unless they are completely illegal (>7f in SBCS, outside 21..7e in DBCS),
975f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             *   they are valid single/lead bytes.
976f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             *   For simplicity, we always only report the initial ESC byte as the
977f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             *   illegal sequence and back out all other bytes we looked at.
978f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             */
979f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* Back out some bytes. */
980f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int8_t backOutDistance=_this->toULength-1;
981f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int8_t bytesFromThisBuffer=_this->toULength-initialToULength;
982f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(backOutDistance<=bytesFromThisBuffer) {
983f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* same as initialToULength<=1 */
984f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *source-=backOutDistance;
985f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
986f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* Back out bytes from the previous buffer: Need to replay them. */
987f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                _this->preToULength=(int8_t)(bytesFromThisBuffer-backOutDistance);
988f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* same as -(initialToULength-1) */
989f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* preToULength is negative! */
990f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                uprv_memcpy(_this->preToU, _this->toUBytes+1, -_this->preToULength);
991f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *source-=bytesFromThisBuffer;
992f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
993f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            _this->toULength=1;
994f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
995f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(*err==U_UNSUPPORTED_ESCAPE_SEQUENCE) {
996f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        _this->toUCallbackReason = UCNV_UNASSIGNED;
997f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
998f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
999f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1000f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*Checks the characters of the buffer against valid 2022 escape sequences
1001f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*if the match we return a pointer to the initial start of the sequence otherwise
1002f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*we return sourceLimit
1003f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
1004f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*for 2022 looks ahead in the stream
1005f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *to determine the longest possible convertible
1006f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *data stream
1007f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1008f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE const char*
1009f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getEndOfBuffer_2022(const char** source,
1010f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                   const char* sourceLimit,
1011f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                   UBool flush){
1012f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1013f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char* mySource = *source;
1014f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1015f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
1016f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if (*source >= sourceLimit)
1017f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return sourceLimit;
1018f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1019f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    do{
1020f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1021f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if (*mySource == ESC_2022){
1022f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int8_t i;
1023f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int32_t key = 0;
1024f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int32_t offset;
1025f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            UCNV_TableStates_2022 value = VALID_NON_TERMINAL_2022;
1026f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1027f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* Kludge: I could not
1028f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            * figure out the reason for validating an escape sequence
1029f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            * twice - once here and once in changeState_2022().
1030f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            * is it possible to have an ESC character in a ISO2022
1031f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            * byte stream which is valid in a code page? Is it legal?
1032f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            */
1033f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            for (i=0;
1034f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            (mySource+i < sourceLimit)&&(value == VALID_NON_TERMINAL_2022);
1035f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            i++) {
1036f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                value =  getKey_2022(*(mySource+i), &key, &offset);
1037f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1038f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if (value > 0 || *mySource==ESC_2022)
1039f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                return mySource;
1040f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1041f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if ((value == VALID_NON_TERMINAL_2022)&&(!flush) )
1042f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                return sourceLimit;
1043f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1044f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }while (++mySource < sourceLimit);
1045f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1046f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return sourceLimit;
1047f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#else
1048f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while(mySource < sourceLimit && *mySource != ESC_2022) {
1049f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ++mySource;
1050f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1051f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return mySource;
1052f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
1053f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1054f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1055f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1056f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* This inline function replicates code in _MBCSFromUChar32() function in ucnvmbcs.c
1057f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * any future change in _MBCSFromUChar32() function should be reflected here.
1058f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @return number of bytes in *value; negative number if fallback; 0 if no mapping
1059f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1060f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE int32_t
1061f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)MBCS_FROM_UCHAR32_ISO2022(UConverterSharedData* sharedData,
1062f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                         UChar32 c,
1063f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                         uint32_t* value,
1064f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                         UBool useFallback,
1065f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                         int outputType)
1066f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
1067f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const int32_t *cx;
1068f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const uint16_t *table;
1069f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t stage2Entry;
1070f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t myValue;
1071f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t length;
1072f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const uint8_t *p;
1073f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*
1074f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * TODO(markus): Use and require new, faster MBCS conversion table structures.
1075f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Use internal version of ucnv_open() that verifies that the new structures are available,
1076f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * else U_INTERNAL_PROGRAM_ERROR.
1077f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1078f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* BMP-only codepages are stored without stage 1 entries for supplementary code points */
1079f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(c<0x10000 || (sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) {
1080f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        table=sharedData->mbcs.fromUnicodeTable;
1081f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        stage2Entry=MBCS_STAGE_2_FROM_U(table, c);
1082f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* get the bytes and the length for the output */
1083f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(outputType==MBCS_OUTPUT_2){
1084f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myValue=MBCS_VALUE_2_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c);
1085f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(myValue<=0xff) {
1086f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                length=1;
1087f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
1088f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                length=2;
1089f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1090f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else /* outputType==MBCS_OUTPUT_3 */ {
1091f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            p=MBCS_POINTER_3_FROM_STAGE_2(sharedData->mbcs.fromUnicodeBytes, stage2Entry, c);
1092f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myValue=((uint32_t)*p<<16)|((uint32_t)p[1]<<8)|p[2];
1093f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(myValue<=0xff) {
1094f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                length=1;
1095f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else if(myValue<=0xffff) {
1096f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                length=2;
1097f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
1098f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                length=3;
1099f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* is this code point assigned, or do we use fallbacks? */
1102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if((stage2Entry&(1<<(16+(c&0xf))))!=0) {
1103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* assigned */
1104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *value=myValue;
1105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return length;
1106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else if(FROM_U_USE_FALLBACK(useFallback, c) && myValue!=0) {
1107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*
1108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * We allow a 0 byte output if the "assigned" bit is set for this entry.
1109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * There is no way with this data structure for fallback output
1110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * to be a zero byte.
1111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             */
1112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *value=myValue;
1113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return -length;
1114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    cx=sharedData->mbcs.extIndexes;
1118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(cx!=NULL) {
1119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return ucnv_extSimpleMatchFromU(cx, c, value, useFallback);
1120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* unassigned */
1123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return 0;
1124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* This inline function replicates code in _MBCSSingleFromUChar32() function in ucnvmbcs.c
1127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * any future change in _MBCSSingleFromUChar32() function should be reflected here.
1128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @param retval pointer to output byte
1129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @return 1 roundtrip byte  0 no mapping  -1 fallback byte
1130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE int32_t
1132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)MBCS_SINGLE_FROM_UCHAR32(UConverterSharedData* sharedData,
1133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UChar32 c,
1134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       uint32_t* retval,
1135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                       UBool useFallback)
1136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
1137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const uint16_t *table;
1138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t value;
1139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* BMP-only codepages are stored without stage 1 entries for supplementary code points */
1140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(c>=0x10000 && !(sharedData->mbcs.unicodeMask&UCNV_HAS_SUPPLEMENTARY)) {
1141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 0;
1142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* convert the Unicode code point in c into codepage bytes (same as in _MBCSFromUnicodeWithOffsets) */
1144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    table=sharedData->mbcs.fromUnicodeTable;
1145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* get the byte for the output */
1146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    value=MBCS_SINGLE_RESULT_FROM_U(table, (uint16_t *)sharedData->mbcs.fromUnicodeBytes, c);
1147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* is this code point assigned, or do we use fallbacks? */
1148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *retval=(uint32_t)(value&0xff);
1149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(value>=0xf00) {
1150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 1;  /* roundtrip */
1151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(useFallback ? value>=0x800 : value>=0xc00) {
1152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return -1;  /* fallback taken */
1153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else {
1154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 0;  /* no mapping */
1155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
1159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Check that the result is a 2-byte value with each byte in the range A1..FE
1160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * (strict EUC DBCS) before accepting it and subtracting 0x80 from each byte
1161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * to move it to the ISO 2022 range 21..7E.
1162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Return 0 if out of range.
1163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE uint32_t
1165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_2022FromGR94DBCS(uint32_t value) {
1166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if( (uint16_t)(value - 0xa1a1) <= (0xfefe - 0xa1a1) &&
1167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        (uint8_t)(value - 0xa1) <= (0xfe - 0xa1)
1168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ) {
1169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return value - 0x8080;  /* shift down to 21..7e byte range */
1170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else {
1171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 0;  /* not valid for ISO 2022 */
1172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if 0 /* 5691: Call sites now check for validity. They can just += 0x8080 after that. */
1176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
1177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This method does the reverse of _2022FromGR94DBCS(). Given the 2022 code point, it returns the
1178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 2 byte value that is in the range A1..FE for each byte. Otherwise it returns the 2022 code point
1179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * unchanged.
1180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE uint32_t
1182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_2022ToGR94DBCS(uint32_t value) {
1183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t returnValue = value + 0x8080;
1184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if( (uint16_t)(returnValue - 0xa1a1) <= (0xfefe - 0xa1a1) &&
1185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        (uint8_t)(returnValue - 0xa1) <= (0xfe - 0xa1)) {
1186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return returnValue;
1187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else {
1188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return value;
1189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
1192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
1194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**********************************************************************************
1196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*  ISO-2022 Converter
1197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
1198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
1199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
1200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
1202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC(UConverterToUnicodeArgs* args,
1203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                                           UErrorCode* err){
1204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char* mySourceLimit, *realSourceLimit;
1205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char* sourceStart;
1206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UChar* myTargetStart;
1207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter* saveThis;
1208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022* myData;
1209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int8_t length;
1210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    saveThis = args->converter;
1212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    myData=((UConverterDataISO2022*)(saveThis->extraInfo));
1213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    realSourceLimit = args->sourceLimit;
1215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while (args->source < realSourceLimit) {
1216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(myData->key == 0) { /* are we in the middle of an escape sequence? */
1217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*Find the end of the buffer e.g : Next Escape Seq | end of Buffer*/
1218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            mySourceLimit = getEndOfBuffer_2022(&(args->source), realSourceLimit, args->flush);
1219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(args->source < mySourceLimit) {
1221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(myData->currentConverter==NULL) {
1222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->currentConverter = ucnv_open("ASCII",err);
1223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(U_FAILURE(*err)){
1224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        return;
1225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->currentConverter->fromCharErrorBehaviour = UCNV_TO_U_CALLBACK_STOP;
1228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    saveThis->mode = UCNV_SO;
1229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* convert to before the ESC or until the end of the buffer */
1232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myData->isFirstBuffer=FALSE;
1233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                sourceStart = args->source;
1234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myTargetStart = args->target;
1235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                args->converter = myData->currentConverter;
1236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ucnv_toUnicode(args->converter,
1237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    &args->target,
1238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->targetLimit,
1239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    &args->source,
1240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    mySourceLimit,
1241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->offsets,
1242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    (UBool)(args->flush && mySourceLimit == realSourceLimit),
1243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    err);
1244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                args->converter = saveThis;
1245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if (*err == U_BUFFER_OVERFLOW_ERROR) {
1247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* move the overflow buffer */
1248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    length = saveThis->UCharErrorBufferLength = myData->currentConverter->UCharErrorBufferLength;
1249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->currentConverter->UCharErrorBufferLength = 0;
1250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(length > 0) {
1251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        uprv_memcpy(saveThis->UCharErrorBuffer,
1252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    myData->currentConverter->UCharErrorBuffer,
1253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    length*U_SIZEOF_UCHAR);
1254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    return;
1256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*
1259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * At least one of:
1260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * -Error while converting
1261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * -Done with entire buffer
1262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * -Need to write offsets or update the current offset
1263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 *  (leave that up to the code in ucnv.c)
1264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 *
1265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * or else we just stopped at an ESC byte and continue with changeState_2022()
1266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
1267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if (U_FAILURE(*err) ||
1268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    (args->source == realSourceLimit) ||
1269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    (args->offsets != NULL && (args->target != myTargetStart || args->source != sourceStart) ||
1270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    (mySourceLimit < realSourceLimit && myData->currentConverter->toULength > 0))
1271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ) {
1272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* copy partial or error input for truncated detection and error handling */
1273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(U_FAILURE(*err)) {
1274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        length = saveThis->invalidCharLength = myData->currentConverter->invalidCharLength;
1275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(length > 0) {
1276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            uprv_memcpy(saveThis->invalidCharBuffer, myData->currentConverter->invalidCharBuffer, length);
1277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
1278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
1279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        length = saveThis->toULength = myData->currentConverter->toULength;
1280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(length > 0) {
1281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            uprv_memcpy(saveThis->toUBytes, myData->currentConverter->toUBytes, length);
1282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(args->source < mySourceLimit) {
1283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                *err = U_TRUNCATED_CHAR_FOUND; /* truncated input before ESC */
1284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
1285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
1286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    return;
1288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sourceStart = args->source;
1293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        changeState_2022(args->converter,
1294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               &(args->source),
1295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               realSourceLimit,
1296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               ISO_2022,
1297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               err);
1298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if (U_FAILURE(*err) || (args->source != sourceStart && args->offsets != NULL)) {
1299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* let the ucnv.c code update its current offset */
1300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return;
1301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
1306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
1308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * To Unicode Callback helper function
1309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
1311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)toUnicodeCallback(UConverter *cnv,
1312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                  const uint32_t sourceChar, const uint32_t targetUniChar,
1313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                  UErrorCode* err){
1314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(sourceChar>0xff){
1315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->toUBytes[0] = (uint8_t)(sourceChar>>8);
1316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->toUBytes[1] = (uint8_t)sourceChar;
1317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->toULength = 2;
1318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    else{
1320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->toUBytes[0] =(char) sourceChar;
1321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnv->toULength = 1;
1322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(targetUniChar == (missingCharMarker-1/*0xfffe*/)){
1325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        *err = U_INVALID_CHAR_FOUND;
1326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    else{
1328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        *err = U_ILLEGAL_CHAR_FOUND;
1329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**************************************ISO-2022-JP*************************************************/
1333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/************************************** IMPORTANT **************************************************
1335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* The UConverter_fromUnicode_ISO2022_JP converter does not use ucnv_fromUnicode() functions for SBCS,DBCS and
1336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* MBCS; instead, the values are obtained directly by calling _MBCSFromUChar32().
1337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* The converter iterates over each Unicode codepoint
1338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* to obtain the equivalent codepoints from the codepages supported. Since the source buffer is
1339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* processed one char at a time it would make sense to reduce the extra processing a canned converter
1340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* would do as far as possible.
1341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
1342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* If the implementation of these macros or structure of sharedData struct change in the future, make
1343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* sure that ISO-2022 is also changed.
1344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)***************************************************************************************************
1345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
1346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/***************************************************************************************************
1348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Rules for ISO-2022-jp encoding
1349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* (i)   Escape sequences must be fully contained within a line they should not
1350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       span new lines or CRs
1351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* (ii)  If the last character on a line is represented by two bytes then an ASCII or
1352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       JIS-Roman character escape sequence should follow before the line terminates
1353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* (iii) If the first character on the line is represented by two bytes then a two
1354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       byte character escape sequence should precede it
1355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* (iv)  If no escape sequence is encountered then the characters are ASCII
1356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* (v)   Latin(ISO-8859-1) and Greek(ISO-8859-7) characters must be designated to G2,
1357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       and invoked with SS2 (ESC N).
1358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* (vi)  If there is any G0 designation in text, there must be a switch to
1359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       ASCII or to JIS X 0201-Roman before a space character (but not
1360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       necessarily before "ESC 4/14 2/0" or "ESC N ' '") or control
1361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       characters such as tab or CRLF.
1362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* (vi)  Supported encodings:
1363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*          ASCII, JISX201, JISX208, JISX212, GB2312, KSC5601, ISO-8859-1,ISO-8859-7
1364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
1365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*  source : RFC-1554
1366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
1367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*          JISX201, JISX208,JISX212 : new .cnv data files created
1368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*          KSC5601 : alias to ibm-949 mapping table
1369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*          GB2312 : alias to ibm-1386 mapping table
1370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*          ISO-8859-1 : Algorithmic implemented as LATIN1 case
1371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*          ISO-8859-7 : alisas to ibm-9409 mapping table
1372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
1373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* preference order of JP charsets */
1375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const StateEnum jpCharsetPref[]={
1376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ASCII,
1377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    JISX201,
1378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO8859_1,
1379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO8859_7,
1380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    JISX208,
1381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    JISX212,
1382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    GB2312,
1383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    KSC5601,
1384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    HWKANA_7BIT
1385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
1386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
1388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The escape sequences must be in order of the enum constants like JISX201  = 3,
1389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * not in order of jpCharsetPref[]!
1390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char escSeqChars[][6] ={
1392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x28\x42",         /* <ESC>(B  ASCII       */
1393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x2E\x41",         /* <ESC>.A  ISO-8859-1  */
1394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x2E\x46",         /* <ESC>.F  ISO-8859-7  */
1395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x28\x4A",         /* <ESC>(J  JISX-201    */
1396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x24\x42",         /* <ESC>$B  JISX-208    */
1397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x24\x28\x44",     /* <ESC>$(D JISX-212    */
1398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x24\x41",         /* <ESC>$A  GB2312      */
1399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x24\x28\x43",     /* <ESC>$(C KSC5601     */
1400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "\x1B\x28\x49"          /* <ESC>(I  HWKANA_7BIT */
1401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
1403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static  const int8_t escSeqCharsLen[] ={
1404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3, /* length of <ESC>(B  ASCII       */
1405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3, /* length of <ESC>.A  ISO-8859-1  */
1406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3, /* length of <ESC>.F  ISO-8859-7  */
1407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3, /* length of <ESC>(J  JISX-201    */
1408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3, /* length of <ESC>$B  JISX-208    */
1409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    4, /* length of <ESC>$(D JISX-212    */
1410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3, /* length of <ESC>$A  GB2312      */
1411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    4, /* length of <ESC>$(C KSC5601     */
1412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3  /* length of <ESC>(I  HWKANA_7BIT */
1413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
1414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
1416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* The iteration over various code pages works this way:
1417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* i)   Get the currentState from myConverterData->currentState
1418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* ii)  Check if the character is mapped to a valid character in the currentState
1419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      Yes ->  a) set the initIterState to currentState
1420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       b) remain in this state until an invalid character is found
1421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      No  ->  a) go to the next code page and find the character
1422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* iii) Before changing the state increment the current state check if the current state
1423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      is equal to the intitIteration state
1424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      Yes ->  A character that cannot be represented in any of the supported encodings
1425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       break and return a U_INVALID_CHARACTER error
1426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      No  ->  Continue and find the character in next code page
1427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
1428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
1429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* TODO: Implement a priority technique where the users are allowed to set the priority of code pages
1430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
1431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* Map 00..7F to Unicode according to JIS X 0201. */
1433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE uint32_t
1434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)jisx201ToU(uint32_t value) {
1435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(value < 0x5c) {
1436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return value;
1437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(value == 0x5c) {
1438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 0xa5;
1439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(value == 0x7e) {
1440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 0x203e;
1441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else /* value <= 0x7f */ {
1442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return value;
1443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* Map Unicode to 00..7F according to JIS X 0201. Return U+FFFE if unmappable. */
1447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE uint32_t
1448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)jisx201FromU(uint32_t value) {
1449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(value<=0x7f) {
1450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(value!=0x5c && value!=0x7e) {
1451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return value;
1452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(value==0xa5) {
1454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 0x5c;
1455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(value==0x203e) {
1456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 0x7e;
1457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return 0xfffe;
1459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
1462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Take a valid Shift-JIS byte pair, check that it is in the range corresponding
1463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * to JIS X 0208, and convert it to a pair of 21..7E bytes.
1464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Return 0 if the byte pair is out of range.
1465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE uint32_t
1467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_2022FromSJIS(uint32_t value) {
1468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint8_t trail;
1469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(value > 0xEFFC) {
1471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return 0;  /* beyond JIS X 0208 */
1472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    trail = (uint8_t)value;
1475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    value &= 0xff00;  /* lead byte */
1477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(value <= 0x9f00) {
1478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        value -= 0x7000;
1479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else /* 0xe000 <= value <= 0xef00 */ {
1480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        value -= 0xb000;
1481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    value <<= 1;
1483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(trail <= 0x9e) {
1485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        value -= 0x100;
1486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(trail <= 0x7e) {
1487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            value |= trail - 0x1f;
1488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else {
1489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            value |= trail - 0x20;
1490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else /* trail <= 0xfc */ {
1492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        value |= trail - 0x7e;
1493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return value;
1495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
1498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Convert a pair of JIS X 0208 21..7E bytes to Shift-JIS.
1499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * If either byte is outside 21..7E make sure that the result is not valid
1500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * for Shift-JIS so that the converter catches it.
1501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Some invalid byte values already turn into equally invalid Shift-JIS
1502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * byte values and need not be tested explicitly.
1503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static U_INLINE void
1505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_2022ToSJIS(uint8_t c1, uint8_t c2, char bytes[2]) {
1506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(c1&1) {
1507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ++c1;
1508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(c2 <= 0x5f) {
1509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            c2 += 0x1f;
1510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else if(c2 <= 0x7e) {
1511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            c2 += 0x20;
1512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else {
1513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            c2 = 0;  /* invalid */
1514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else {
1516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if((uint8_t)(c2-0x21) <= ((0x7e)-0x21)) {
1517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            c2 += 0x7e;
1518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else {
1519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            c2 = 0;  /* invalid */
1520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    c1 >>= 1;
1523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(c1 <= 0x2f) {
1524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        c1 += 0x70;
1525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(c1 <= 0x3f) {
1526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        c1 += 0xb0;
1527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else {
1528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        c1 = 0;  /* invalid */
1529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    bytes[0] = (char)c1;
1531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    bytes[1] = (char)c2;
1532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
1533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
1535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * JIS X 0208 has fallbacks from Unicode half-width Katakana to full-width (DBCS)
1536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Katakana.
1537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Now that we use a Shift-JIS table for JIS X 0208 we need to hardcode these fallbacks
1538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * because Shift-JIS roundtrips half-width Katakana to single bytes.
1539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * These were the only fallbacks in ICU's jisx-208.ucm file.
1540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
1541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const uint16_t hwkana_fb[HWKANA_END - HWKANA_START + 1] = {
1542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2123,  /* U+FF61 */
1543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2156,
1544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2157,
1545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2122,
1546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2126,
1547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2572,
1548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2521,
1549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2523,
1550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2525,
1551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2527,
1552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2529,
1553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2563,
1554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2565,
1555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2567,
1556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2543,
1557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x213C,  /* U+FF70 */
1558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2522,
1559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2524,
1560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2526,
1561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2528,
1562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x252A,
1563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x252B,
1564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x252D,
1565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x252F,
1566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2531,
1567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2533,
1568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2535,
1569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2537,
1570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2539,
1571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x253B,
1572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x253D,
1573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x253F,  /* U+FF80 */
1574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2541,
1575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2544,
1576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2546,
1577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2548,
1578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x254A,
1579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x254B,
1580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x254C,
1581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x254D,
1582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x254E,
1583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x254F,
1584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2552,
1585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2555,
1586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2558,
1587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x255B,
1588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x255E,
1589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x255F,  /* U+FF90 */
1590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2560,
1591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2561,
1592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2562,
1593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2564,
1594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2566,
1595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2568,
1596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2569,
1597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x256A,
1598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x256B,
1599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x256C,
1600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x256D,
1601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x256F,
1602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x2573,
1603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x212B,
1604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0x212C   /* U+FF9F */
1605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
1606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
1608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err) {
1609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter *cnv = args->converter;
1610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022 *converterData;
1611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO2022State *pFromU2022State;
1612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint8_t *target = (uint8_t *) args->target;
1613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const uint8_t *targetLimit = (const uint8_t *) args->targetLimit;
1614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UChar* source = args->source;
1615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UChar* sourceLimit = args->sourceLimit;
1616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t* offsets = args->offsets;
1617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UChar32 sourceChar;
1618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char buffer[8];
1619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t len, outLen;
1620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int8_t choices[10];
1621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t choiceCount;
1622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t targetValue = 0;
1623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool useFallback;
1624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t i;
1626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int8_t cs, g;
1627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* set up the state */
1629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    converterData     = (UConverterDataISO2022*)cnv->extraInfo;
1630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    pFromU2022State   = &converterData->fromU2022State;
1631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    choiceCount = 0;
1633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* check if the last codepoint of previous buffer was a lead surrogate*/
1635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if((sourceChar = cnv->fromUChar32)!=0 && target< targetLimit) {
1636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto getTrail;
1637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
1638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while(source < sourceLimit) {
1640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(target < targetLimit) {
1641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sourceChar  = *(source++);
1643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*check if the char is a First surrogate*/
1644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(UTF_IS_SURROGATE(sourceChar)) {
1645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(UTF_IS_SURROGATE_FIRST(sourceChar)) {
1646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getTrail:
1647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /*look ahead to find the trail surrogate*/
1648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(source < sourceLimit) {
1649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* test the following code unit */
1650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        UChar trail=(UChar) *source;
1651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(UTF_IS_SECOND_SURROGATE(trail)) {
1652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            source++;
1653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            sourceChar=UTF16_GET_PAIR_VALUE(sourceChar, trail);
1654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            cnv->fromUChar32=0x00;
1655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* convert this supplementary code point */
1656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* exit this condition tree */
1657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else {
1658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* this is an unmatched lead code unit (1st surrogate) */
1659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* callback(illegal) */
1660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            *err=U_ILLEGAL_CHAR_FOUND;
1661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            cnv->fromUChar32=sourceChar;
1662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            break;
1663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
1664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
1665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* no more input */
1666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cnv->fromUChar32=sourceChar;
1667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        break;
1668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
1670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* this is an unmatched trail code unit (2nd surrogate) */
1671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* callback(illegal) */
1672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err=U_ILLEGAL_CHAR_FOUND;
1673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    cnv->fromUChar32=sourceChar;
1674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1677f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1678f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* do not convert SO/SI/ESC */
1679f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(IS_2022_CONTROL(sourceChar)) {
1680f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* callback(illegal) */
1681f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *err=U_ILLEGAL_CHAR_FOUND;
1682f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnv->fromUChar32=sourceChar;
1683f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
1684f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1685f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1686f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* do the conversion */
1687f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1688f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(choiceCount == 0) {
1689f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                uint16_t csm;
1690f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1691f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*
1692f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * The csm variable keeps track of which charsets are allowed
1693f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * and not used yet while building the choices[].
1694f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
1695f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                csm = jpCharsetMasks[converterData->version];
1696f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                choiceCount = 0;
1697f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1698f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* JIS7/8: try single-byte half-width Katakana before JISX208 */
1699f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(converterData->version == 3 || converterData->version == 4) {
1700f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    choices[choiceCount++] = (int8_t)HWKANA_7BIT;
1701f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1702f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* Do not try single-byte half-width Katakana for other versions. */
1703f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                csm &= ~CSM(HWKANA_7BIT);
1704f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1705f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* try the current G0 charset */
1706f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                choices[choiceCount++] = cs = pFromU2022State->cs[0];
1707f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                csm &= ~CSM(cs);
1708f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1709f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* try the current G2 charset */
1710f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if((cs = pFromU2022State->cs[2]) != 0) {
1711f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    choices[choiceCount++] = cs;
1712f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    csm &= ~CSM(cs);
1713f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1714f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1715f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* try all the other possible charsets */
1716f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                for(i = 0; i < LENGTHOF(jpCharsetPref); ++i) {
1717f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    cs = (int8_t)jpCharsetPref[i];
1718f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(CSM(cs) & csm) {
1719f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        choices[choiceCount++] = cs;
1720f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        csm &= ~CSM(cs);
1721f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1722f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1723f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1724f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1725f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cs = g = 0;
1726f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*
1727f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * len==0: no mapping found yet
1728f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * len<0: found a fallback result: continue looking for a roundtrip but no further fallbacks
1729f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * len>0: found a roundtrip result, done
1730f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             */
1731f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            len = 0;
1732f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*
1733f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * We will turn off useFallback after finding a fallback,
1734f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * but we still get fallbacks from PUA code points as usual.
1735f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * Therefore, we will also need to check that we don't overwrite
1736f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * an early fallback with a later one.
1737f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             */
1738f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            useFallback = cnv->useFallback;
1739f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1740f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            for(i = 0; i < choiceCount && len <= 0; ++i) {
1741f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                uint32_t value;
1742f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                int32_t len2;
1743f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                int8_t cs0 = choices[i];
1744f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                switch(cs0) {
1745f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ASCII:
1746f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(sourceChar <= 0x7f) {
1747f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetValue = (uint32_t)sourceChar;
1748f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        len = 1;
1749f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cs = cs0;
1750f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        g = 0;
1751f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1752f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1753f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ISO8859_1:
1754f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(GR96_START <= sourceChar && sourceChar <= GR96_END) {
1755f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetValue = (uint32_t)sourceChar - 0x80;
1756f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        len = 1;
1757f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cs = cs0;
1758f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        g = 2;
1759f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1760f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1761f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case HWKANA_7BIT:
1762f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if((uint32_t)(sourceChar - HWKANA_START) <= (HWKANA_END - HWKANA_START)) {
1763f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(converterData->version==3) {
1764f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* JIS7: use G1 (SO) */
1765f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* Shift U+FF61..U+FF9F to bytes 21..5F. */
1766f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            targetValue = (uint32_t)(sourceChar - (HWKANA_START - 0x21));
1767f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            len = 1;
1768f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            pFromU2022State->cs[1] = cs = cs0; /* do not output an escape sequence */
1769f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            g = 1;
1770f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else if(converterData->version==4) {
1771f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* JIS8: use 8-bit bytes with any single-byte charset, see escape sequence output below */
1772f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* Shift U+FF61..U+FF9F to bytes A1..DF. */
1773f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            targetValue = (uint32_t)(sourceChar - (HWKANA_START - 0xa1));
1774f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            len = 1;
1775f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1776f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            cs = pFromU2022State->cs[0];
1777f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(IS_JP_DBCS(cs)) {
1778f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                /* switch from a DBCS charset to JISX201 */
1779f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                cs = (int8_t)JISX201;
1780f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
1781f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* else stay in the current G0 charset */
1782f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            g = 0;
1783f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
1784f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* else do not use HWKANA_7BIT with other versions */
1785f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1786f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1787f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case JISX201:
1788f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* G0 SBCS */
1789f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    value = jisx201FromU(sourceChar);
1790f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(value <= 0x7f) {
1791f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetValue = value;
1792f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        len = 1;
1793f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cs = cs0;
1794f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        g = 0;
1795f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        useFallback = FALSE;
1796f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1797f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1798f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case JISX208:
1799f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* G0 DBCS from Shift-JIS table */
1800f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    len2 = MBCS_FROM_UCHAR32_ISO2022(
1801f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                converterData->myConverterArray[cs0],
1802f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                sourceChar, &value,
1803f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                useFallback, MBCS_OUTPUT_2);
1804f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(len2 == 2 || (len2 == -2 && len == 0)) {  /* only accept DBCS: abs(len)==2 */
1805f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        value = _2022FromSJIS(value);
1806f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(value != 0) {
1807f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            targetValue = value;
1808f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            len = len2;
1809f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            cs = cs0;
1810f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            g = 0;
1811f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            useFallback = FALSE;
1812f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
1813f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else if(len == 0 && useFallback &&
1814f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                              (uint32_t)(sourceChar - HWKANA_START) <= (HWKANA_END - HWKANA_START)) {
1815f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetValue = hwkana_fb[sourceChar - HWKANA_START];
1816f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        len = -2;
1817f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cs = cs0;
1818f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        g = 0;
1819f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        useFallback = FALSE;
1820f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1821f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1822f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ISO8859_7:
1823f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* G0 SBCS forced to 7-bit output */
1824f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    len2 = MBCS_SINGLE_FROM_UCHAR32(
1825f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                converterData->myConverterArray[cs0],
1826f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                sourceChar, &value,
1827f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                useFallback);
1828f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(len2 != 0 && !(len2 < 0 && len != 0) && GR96_START <= value && value <= GR96_END) {
1829f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetValue = value - 0x80;
1830f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        len = len2;
1831f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cs = cs0;
1832f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        g = 2;
1833f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        useFallback = FALSE;
1834f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1835f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1836f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                default:
1837f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* G0 DBCS */
1838f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    len2 = MBCS_FROM_UCHAR32_ISO2022(
1839f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                converterData->myConverterArray[cs0],
1840f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                sourceChar, &value,
1841f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                useFallback, MBCS_OUTPUT_2);
1842f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(len2 == 2 || (len2 == -2 && len == 0)) {  /* only accept DBCS: abs(len)==2 */
1843f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(cs0 == KSC5601) {
1844f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /*
1845f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                             * Check for valid bytes for the encoding scheme.
1846f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                             * This is necessary because the sub-converter (windows-949)
1847f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                             * has a broader encoding scheme than is valid for 2022.
1848f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                             */
1849f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            value = _2022FromGR94DBCS(value);
1850f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(value == 0) {
1851f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                break;
1852f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
1853f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
1854f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetValue = value;
1855f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        len = len2;
1856f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cs = cs0;
1857f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        g = 0;
1858f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        useFallback = FALSE;
1859f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1860f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1861f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1862f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1863f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1864f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(len != 0) {
1865f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(len < 0) {
1866f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    len = -len;  /* fallback */
1867f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1868f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                outLen = 0; /* count output bytes */
1869f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1870f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* write SI if necessary (only for JIS7) */
1871f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(pFromU2022State->g == 1 && g == 0) {
1872f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[outLen++] = UCNV_SI;
1873f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pFromU2022State->g = 0;
1874f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1875f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1876f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* write the designation sequence if necessary */
1877f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(cs != pFromU2022State->cs[g]) {
1878f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    int32_t escLen = escSeqCharsLen[cs];
1879f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    uprv_memcpy(buffer + outLen, escSeqChars[cs], escLen);
1880f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    outLen += escLen;
1881f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pFromU2022State->cs[g] = cs;
1882f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1883f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* invalidate the choices[] */
1884f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    choiceCount = 0;
1885f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1886f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1887f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* write the shift sequence if necessary */
1888f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(g != pFromU2022State->g) {
1889f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    switch(g) {
1890f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* case 0 handled before writing escapes */
1891f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    case 1:
1892f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        buffer[outLen++] = UCNV_SO;
1893f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        pFromU2022State->g = 1;
1894f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        break;
1895f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    default: /* case 2 */
1896f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        buffer[outLen++] = 0x1b;
1897f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        buffer[outLen++] = 0x4e;
1898f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        break;
1899f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* no case 3: no SS3 in ISO-2022-JP-x */
1900f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
1901f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1902f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1903f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* write the output bytes */
1904f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(len == 1) {
1905f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[outLen++] = (char)targetValue;
1906f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else /* len == 2 */ {
1907f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[outLen++] = (char)(targetValue >> 8);
1908f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[outLen++] = (char)targetValue;
1909f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1910f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
1911f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*
1912f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * if we cannot find the character after checking all codepages
1913f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * then this is an error
1914f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
1915f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *err = U_INVALID_CHAR_FOUND;
1916f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnv->fromUChar32=sourceChar;
1917f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
1918f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1919f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1920f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(sourceChar == CR || sourceChar == LF) {
1921f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* reset the G2 state at the end of a line (conversion got us into ASCII or JISX201 already) */
1922f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                pFromU2022State->cs[2] = 0;
1923f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                choiceCount = 0;
1924f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1925f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1926f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* output outLen>0 bytes in buffer[] */
1927f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(outLen == 1) {
1928f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *target++ = buffer[0];
1929f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(offsets) {
1930f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *offsets++ = (int32_t)(source - args->source - 1); /* -1: known to be ASCII */
1931f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1932f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else if(outLen == 2 && (target + 2) <= targetLimit) {
1933f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *target++ = buffer[0];
1934f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *target++ = buffer[1];
1935f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(offsets) {
1936f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    int32_t sourceIndex = (int32_t)(source - args->source - U16_LENGTH(sourceChar));
1937f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *offsets++ = sourceIndex;
1938f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *offsets++ = sourceIndex;
1939f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1940f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
1941f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                fromUWriteUInt8(
1942f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    cnv,
1943f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer, outLen,
1944f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    &target, (const char *)targetLimit,
1945f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    &offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)),
1946f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    err);
1947f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(U_FAILURE(*err)) {
1948f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
1949f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
1950f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
1951f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } /* end if(myTargetIndex<myTargetLength) */
1952f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else{
1953f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *err =U_BUFFER_OVERFLOW_ERROR;
1954f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
1955f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1956f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1957f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }/* end while(mySourceIndex<mySourceLength) */
1958f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1959f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*
1960f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the end of the input stream and detection of truncated input
1961f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * are handled by the framework, but for ISO-2022-JP conversion
1962f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * we need to be in ASCII mode at the very end
1963f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
1964f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * conditions:
1965f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   successful
1966f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   in SO mode or not in ASCII mode
1967f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   end of input and no truncated input
1968f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
1969f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if( U_SUCCESS(*err) &&
1970f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        (pFromU2022State->g!=0 || pFromU2022State->cs[0]!=ASCII) &&
1971f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        args->flush && source>=sourceLimit && cnv->fromUChar32==0
1972f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ) {
1973f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        int32_t sourceIndex;
1974f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1975f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        outLen = 0;
1976f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1977f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(pFromU2022State->g != 0) {
1978f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            buffer[outLen++] = UCNV_SI;
1979f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            pFromU2022State->g = 0;
1980f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1981f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1982f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(pFromU2022State->cs[0] != ASCII) {
1983f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int32_t escLen = escSeqCharsLen[ASCII];
1984f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            uprv_memcpy(buffer + outLen, escSeqChars[ASCII], escLen);
1985f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            outLen += escLen;
1986f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            pFromU2022State->cs[0] = (int8_t)ASCII;
1987f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
1988f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
1989f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* get the source index of the last input character */
1990f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /*
1991f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * TODO this would be simpler and more reliable if we used a pair
1992f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * of sourceIndex/prevSourceIndex like in ucnvmbcs.c
1993f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * so that we could simply use the prevSourceIndex here;
1994f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * this code gives an incorrect result for the rare case of an unmatched
1995f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * trail surrogate that is alone in the last buffer of the text stream
1996f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         */
1997f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sourceIndex=(int32_t)(source-args->source);
1998f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(sourceIndex>0) {
1999f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            --sourceIndex;
2000f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if( U16_IS_TRAIL(args->source[sourceIndex]) &&
2001f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                (sourceIndex==0 || U16_IS_LEAD(args->source[sourceIndex-1]))
2002f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ) {
2003f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                --sourceIndex;
2004f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2005f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else {
2006f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sourceIndex=-1;
2007f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2008f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2009f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        fromUWriteUInt8(
2010f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv,
2011f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            buffer, outLen,
2012f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            &target, (const char *)targetLimit,
2013f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            &offsets, sourceIndex,
2014f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            err);
2015f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2016f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2017f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*save the state and return */
2018f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->source = source;
2019f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->target = (char*)target;
2020f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
2021f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2022f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*************** to unicode *******************/
2023f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2024f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
2025f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC(UConverterToUnicodeArgs *args,
2026f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                               UErrorCode* err){
2027f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char tempBuf[2];
2028f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char *mySource = (char *) args->source;
2029f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UChar *myTarget = args->target;
2030f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char *mySourceLimit = args->sourceLimit;
2031f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t targetUniChar = 0x0000;
2032f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t mySourceChar = 0x0000;
2033f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t tmpSourceChar = 0x0000;
2034f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022* myData;
2035f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO2022State *pToU2022State;
2036f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    StateEnum cs;
2037f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2038f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    myData=(UConverterDataISO2022*)(args->converter->extraInfo);
2039f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    pToU2022State = &myData->toU2022State;
2040f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2041f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(myData->key != 0) {
2042f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* continue with a partial escape sequence */
2043f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto escape;
2044f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(args->converter->toULength == 1 && mySource < mySourceLimit && myTarget < args->targetLimit) {
2045f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* continue with a partial double-byte character */
2046f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        mySourceChar = args->converter->toUBytes[0];
2047f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        args->converter->toULength = 0;
2048f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cs = (StateEnum)pToU2022State->cs[pToU2022State->g];
2049f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        targetUniChar = missingCharMarker;
2050f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto getTrailByte;
2051f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2052f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2053f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while(mySource < mySourceLimit){
2054f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2055f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        targetUniChar =missingCharMarker;
2056f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2057f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(myTarget < args->targetLimit){
2058f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2059f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            mySourceChar= (unsigned char) *mySource++;
2060f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2061f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            switch(mySourceChar) {
2062f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case UCNV_SI:
2063f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(myData->version==3) {
2064f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pToU2022State->g=0;
2065f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    continue;
2066f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
2067f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* only JIS7 uses SI/SO, not ISO-2022-JP-x */
2068f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = FALSE;	/* reset this, we have a different error */
2069f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2070f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2071f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2072f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case UCNV_SO:
2073f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(myData->version==3) {
2074f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* JIS7: switch to G1 half-width Katakana */
2075f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pToU2022State->cs[1] = (int8_t)HWKANA_7BIT;
2076f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pToU2022State->g=1;
2077f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    continue;
2078f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
2079f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* only JIS7 uses SI/SO, not ISO-2022-JP-x */
2080f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = FALSE;	/* reset this, we have a different error */
2081f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2082f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2083f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2084f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case ESC_2022:
2085f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                mySource--;
2086f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)escape:
2087f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                {
2088f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    const char * mySourceBefore = mySource;
2089f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    int8_t toULengthBefore = args->converter->toULength;
2090f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2091f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    changeState_2022(args->converter,&(mySource),
2092f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        mySourceLimit, ISO_2022_JP,err);
2093f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2094f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* If in ISO-2022-JP only and we successully completed an escape sequence, but previous segment was empty, create an error */
2095f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(myData->version==0 && myData->key==0 && U_SUCCESS(*err) && myData->isEmptySegment) {
2096f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_ILLEGAL_ESCAPE_SEQUENCE;
2097f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->toUCallbackReason = UCNV_IRREGULAR;
2098f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->toULength = (int8_t)(toULengthBefore + (mySource - mySourceBefore));
2099f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* invalid or illegal escape sequence */
2103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(U_FAILURE(*err)){
2104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->target = myTarget;
2105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->source = mySource;
2106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = FALSE;	/* Reset to avoid future spurious errors */
2107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    return;
2108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* If we successfully completed an escape sequence, we begin a new segment, empty so far */
2110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(myData->key==0) {
2111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = TRUE;
2112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                continue;
2114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* ISO-2022-JP does not use single-byte (C1) SS2 and SS3 */
2116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case CR:
2118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*falls through*/
2119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case LF:
2120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* automatically reset to single-byte mode */
2121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if((StateEnum)pToU2022State->cs[0] != ASCII && (StateEnum)pToU2022State->cs[0] != JISX201) {
2122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pToU2022State->cs[0] = (int8_t)ASCII;
2123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                pToU2022State->cs[2] = 0;
2125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                pToU2022State->g = 0;
2126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* falls through */
2127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            default:
2128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* convert one or two bytes */
2129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myData->isEmptySegment = FALSE;
2130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cs = (StateEnum)pToU2022State->cs[pToU2022State->g];
2131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if( (uint8_t)(mySourceChar - 0xa1) <= (0xdf - 0xa1) && myData->version==4 &&
2132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    !IS_JP_DBCS(cs)
2133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ) {
2134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* 8-bit halfwidth katakana in any single-byte mode for JIS8 */
2135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    targetUniChar = mySourceChar + (HWKANA_START - 0xa1);
2136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* return from a single-shift state to the previous one */
2138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(pToU2022State->g >= 2) {
2139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        pToU2022State->g=pToU2022State->prevG;
2140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else switch(cs) {
2142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ASCII:
2143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(mySourceChar <= 0x7f) {
2144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetUniChar = mySourceChar;
2145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ISO8859_1:
2148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(mySourceChar <= 0x7f) {
2149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetUniChar = mySourceChar + 0x80;
2150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* return from a single-shift state to the previous one */
2152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pToU2022State->g=pToU2022State->prevG;
2153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case ISO8859_7:
2155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(mySourceChar <= 0x7f) {
2156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* convert mySourceChar+0x80 to use a normal 8-bit table */
2157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetUniChar =
2158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            _MBCS_SINGLE_SIMPLE_GET_NEXT_BMP(
2159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                myData->myConverterArray[cs],
2160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                mySourceChar + 0x80);
2161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* return from a single-shift state to the previous one */
2163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pToU2022State->g=pToU2022State->prevG;
2164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case JISX201:
2166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(mySourceChar <= 0x7f) {
2167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetUniChar = jisx201ToU(mySourceChar);
2168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                case HWKANA_7BIT:
2171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if((uint8_t)(mySourceChar - 0x21) <= (0x5f - 0x21)) {
2172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* 7-bit halfwidth Katakana */
2173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetUniChar = mySourceChar + (HWKANA_START - 0x21);
2174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                default:
2177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* G0 DBCS */
2178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(mySource < mySourceLimit) {
2179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        int leadIsOk, trailIsOk;
2180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        uint8_t trailByte;
2181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getTrailByte:
2182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        trailByte = (uint8_t)*mySource;
2183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /*
2184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * Ticket 5691: consistent illegal sequences:
2185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * - We include at least the first byte in the illegal sequence.
2186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * - If any of the non-initial bytes could be the start of a character,
2187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         *   we stop the illegal sequence before the first one of those.
2188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         *
2189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * In ISO-2022 DBCS, if the second byte is in the 21..7e range or is
2190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * an ESC/SO/SI, we report only the first byte as the illegal sequence.
2191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * Otherwise we convert or report the pair of bytes.
2192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         */
2193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        leadIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21);
2194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        trailIsOk = (uint8_t)(trailByte - 0x21) <= (0x7e - 0x21);
2195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if (leadIsOk && trailIsOk) {
2196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            ++mySource;
2197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            tmpSourceChar = (mySourceChar << 8) | trailByte;
2198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(cs == JISX208) {
2199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                _2022ToSJIS((uint8_t)mySourceChar, trailByte, tempBuf);
2200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                mySourceChar = tmpSourceChar;
2201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            } else {
2202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                /* Copy before we modify tmpSourceChar so toUnicodeCallback() sees the correct bytes. */
2203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                mySourceChar = tmpSourceChar;
2204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                if (cs == KSC5601) {
2205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    tmpSourceChar += 0x8080;  /* = _2022ToGR94DBCS(tmpSourceChar) */
2206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                }
2207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBuf[0] = (char)(tmpSourceChar >> 8);
2208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBuf[1] = (char)(tmpSourceChar);
2209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
2210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            targetUniChar = ucnv_MBCSSimpleGetNextUChar(myData->myConverterArray[cs], tempBuf, 2, FALSE);
2211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else if (!(trailIsOk || IS_2022_CONTROL(trailByte))) {
2212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* report a pair of illegal bytes if the second byte is not a DBCS starter */
2213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            ++mySource;
2214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* add another bit so that the code below writes 2 bytes in case of error */
2215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            mySourceChar = 0x10000 | (mySourceChar << 8) | trailByte;
2216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
2217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
2218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->toUBytes[0] = (uint8_t)mySourceChar;
2219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->toULength = 1;
2220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        goto endloop;
2221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }  /* End of inner switch */
2223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
2224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }  /* End of outer switch */
2225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(targetUniChar < (missingCharMarker-1/*0xfffe*/)){
2226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(args->offsets){
2227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
2228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *(myTarget++)=(UChar)targetUniChar;
2230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            else if(targetUniChar > missingCharMarker){
2232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* disassemble the surrogate pair and write to output*/
2233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                targetUniChar-=0x0010000;
2234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *myTarget = (UChar)(0xd800+(UChar)(targetUniChar>>10));
2235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(args->offsets){
2236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
2237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ++myTarget;
2239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(myTarget< args->targetLimit){
2240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *myTarget = (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff));
2241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(args->offsets){
2242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
2243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ++myTarget;
2245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }else{
2246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]=
2247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff));
2248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            else{
2252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* Call the callback function*/
2253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                toUnicodeCallback(args->converter,mySourceChar,targetUniChar,err);
2254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
2255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else{    /* goes with "if(myTarget < args->targetLimit)"  way up near top of function */
2258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *err =U_BUFFER_OVERFLOW_ERROR;
2259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
2260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)endloop:
2263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->target = myTarget;
2264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->source = mySource;
2265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
2266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/***************************************************************
2269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Rules for ISO-2022-KR encoding
2270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   i) The KSC5601 designator sequence should appear only once in a file,
2271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      at the begining of a line before any KSC5601 characters. This usually
2272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      means that it appears by itself on the first line of the file
2273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*  ii) There are only 2 shifting sequences SO to shift into double byte mode
2274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      and SI to shift into single byte mode
2275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
2276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
2277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterFromUnicodeArgs* args, UErrorCode* err){
2278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter* saveConv = args->converter;
2280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022 *myConverterData=(UConverterDataISO2022*)saveConv->extraInfo;
2281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->converter=myConverterData->currentConverter;
2282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    myConverterData->currentConverter->fromUChar32 = saveConv->fromUChar32;
2284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ucnv_MBCSFromUnicodeWithOffsets(args,err);
2285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    saveConv->fromUChar32 = myConverterData->currentConverter->fromUChar32;
2286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(*err == U_BUFFER_OVERFLOW_ERROR) {
2288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(myConverterData->currentConverter->charErrorBufferLength > 0) {
2289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            uprv_memcpy(
2290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                saveConv->charErrorBuffer,
2291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->currentConverter->charErrorBuffer,
2292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->currentConverter->charErrorBufferLength);
2293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        saveConv->charErrorBufferLength = myConverterData->currentConverter->charErrorBufferLength;
2295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        myConverterData->currentConverter->charErrorBufferLength = 0;
2296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->converter=saveConv;
2298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
2299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
2301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err){
2302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UChar *source = args->source;
2304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UChar *sourceLimit = args->sourceLimit;
2305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    unsigned char *target = (unsigned char *) args->target;
2306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    unsigned char *targetLimit = (unsigned char *) args->targetLimit;
2307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t* offsets = args->offsets;
2308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t targetByteUnit = 0x0000;
2309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UChar32 sourceChar = 0x0000;
2310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool isTargetByteDBCS;
2311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool oldIsTargetByteDBCS;
2312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022 *converterData;
2313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterSharedData* sharedData;
2314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool useFallback;
2315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t length =0;
2316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    converterData=(UConverterDataISO2022*)args->converter->extraInfo;
2318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* if the version is 1 then the user is requesting
2319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * conversion with ibm-25546 pass the arguments to
2320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * MBCS converter and return
2321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
2322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(converterData->version==1){
2323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(args,err);
2324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return;
2325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* initialize data */
2328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sharedData = converterData->currentConverter->sharedData;
2329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    useFallback = args->converter->useFallback;
2330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    isTargetByteDBCS=(UBool)args->converter->fromUnicodeStatus;
2331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    oldIsTargetByteDBCS = isTargetByteDBCS;
2332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    isTargetByteDBCS   = (UBool) args->converter->fromUnicodeStatus;
2334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if((sourceChar = args->converter->fromUChar32)!=0 && target <targetLimit) {
2335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto getTrail;
2336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while(source < sourceLimit){
2338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        targetByteUnit = missingCharMarker;
2340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(target < (unsigned char*) args->targetLimit){
2342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sourceChar = *source++;
2343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* do not convert SO/SI/ESC */
2345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(IS_2022_CONTROL(sourceChar)) {
2346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* callback(illegal) */
2347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *err=U_ILLEGAL_CHAR_FOUND;
2348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                args->converter->fromUChar32=sourceChar;
2349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
2350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            length = MBCS_FROM_UCHAR32_ISO2022(sharedData,sourceChar,&targetByteUnit,useFallback,MBCS_OUTPUT_2);
2353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(length < 0) {
2354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                length = -length;  /* fallback */
2355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* only DBCS or SBCS characters are expected*/
2357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* DB characters with high bit set to 1 are expected */
2358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if( length > 2 || length==0 ||
2359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                (length == 1 && targetByteUnit > 0x7f) ||
2360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                (length == 2 &&
2361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ((uint16_t)(targetByteUnit - 0xa1a1) > (0xfefe - 0xa1a1) ||
2362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    (uint8_t)(targetByteUnit - 0xa1) > (0xfe - 0xa1)))
2363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ) {
2364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                targetByteUnit=missingCharMarker;
2365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if (targetByteUnit != missingCharMarker){
2367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                oldIsTargetByteDBCS = isTargetByteDBCS;
2369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                isTargetByteDBCS = (UBool)(targetByteUnit>0x00FF);
2370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                  /* append the shift sequence */
2371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if (oldIsTargetByteDBCS != isTargetByteDBCS ){
2372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if (isTargetByteDBCS)
2374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *target++ = UCNV_SO;
2375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    else
2376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *target++ = UCNV_SI;
2377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(offsets)
2378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *(offsets++) = (int32_t)(source - args->source-1);
2379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* write the targetUniChar  to target */
2381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(targetByteUnit <= 0x00FF){
2382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if( target < targetLimit){
2383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *(target++) = (unsigned char) targetByteUnit;
2384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(offsets){
2385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            *(offsets++) = (int32_t)(source - args->source-1);
2386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
2387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }else{
2389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit);
2390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_BUFFER_OVERFLOW_ERROR;
2391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }else{
2393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(target < targetLimit){
2394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *(target++) =(unsigned char) ((targetByteUnit>>8) -0x80);
2395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(offsets){
2396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            *(offsets++) = (int32_t)(source - args->source-1);
2397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
2398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(target < targetLimit){
2399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            *(target++) =(unsigned char) (targetByteUnit -0x80);
2400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(offsets){
2401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                *(offsets++) = (int32_t)(source - args->source-1);
2402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
2403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }else{
2404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit -0x80);
2405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            *err = U_BUFFER_OVERFLOW_ERROR;
2406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
2407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }else{
2408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) ((targetByteUnit>>8) -0x80);
2409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->charErrorBuffer[args->converter->charErrorBufferLength++] = (unsigned char) (targetByteUnit-0x80);
2410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_BUFFER_OVERFLOW_ERROR;
2411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            else{
2416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* oops.. the code point is unassingned
2417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * set the error and reason
2418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
2419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*check if the char is a First surrogate*/
2421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(UTF_IS_SURROGATE(sourceChar)) {
2422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(UTF_IS_SURROGATE_FIRST(sourceChar)) {
2423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getTrail:
2424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /*look ahead to find the trail surrogate*/
2425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(source <  sourceLimit) {
2426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* test the following code unit */
2427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            UChar trail=(UChar) *source;
2428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(UTF_IS_SECOND_SURROGATE(trail)) {
2429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                source++;
2430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                sourceChar=UTF16_GET_PAIR_VALUE(sourceChar, trail);
2431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                *err = U_INVALID_CHAR_FOUND;
2432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                /* convert this surrogate code point */
2433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                /* exit this condition tree */
2434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            } else {
2435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                /* this is an unmatched lead code unit (1st surrogate) */
2436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                /* callback(illegal) */
2437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                *err=U_ILLEGAL_CHAR_FOUND;
2438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
2439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else {
2440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* no more input */
2441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            *err = U_ZERO_ERROR;
2442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
2443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
2444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* this is an unmatched trail code unit (2nd surrogate) */
2445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* callback(illegal) */
2446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err=U_ILLEGAL_CHAR_FOUND;
2447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
2449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* callback(unassigned) for a BMP code point */
2450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err = U_INVALID_CHAR_FOUND;
2451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                args->converter->fromUChar32=sourceChar;
2454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
2455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } /* end if(myTargetIndex<myTargetLength) */
2457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else{
2458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *err =U_BUFFER_OVERFLOW_ERROR;
2459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
2460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }/* end while(mySourceIndex<mySourceLength) */
2463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*
2465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the end of the input stream and detection of truncated input
2466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * are handled by the framework, but for ISO-2022-KR conversion
2467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * we need to be in ASCII mode at the very end
2468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
2469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * conditions:
2470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   successful
2471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   not in ASCII mode
2472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   end of input and no truncated input
2473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
2474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if( U_SUCCESS(*err) &&
2475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        isTargetByteDBCS &&
2476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        args->flush && source>=sourceLimit && args->converter->fromUChar32==0
2477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ) {
2478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        int32_t sourceIndex;
2479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* we are switching to ASCII */
2481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        isTargetByteDBCS=FALSE;
2482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* get the source index of the last input character */
2484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /*
2485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * TODO this would be simpler and more reliable if we used a pair
2486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * of sourceIndex/prevSourceIndex like in ucnvmbcs.c
2487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * so that we could simply use the prevSourceIndex here;
2488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * this code gives an incorrect result for the rare case of an unmatched
2489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * trail surrogate that is alone in the last buffer of the text stream
2490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         */
2491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sourceIndex=(int32_t)(source-args->source);
2492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(sourceIndex>0) {
2493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            --sourceIndex;
2494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if( U16_IS_TRAIL(args->source[sourceIndex]) &&
2495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                (sourceIndex==0 || U16_IS_LEAD(args->source[sourceIndex-1]))
2496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ) {
2497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                --sourceIndex;
2498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else {
2500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sourceIndex=-1;
2501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        fromUWriteUInt8(
2504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            args->converter,
2505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            SHIFT_IN_STR, 1,
2506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            &target, (const char *)targetLimit,
2507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            &offsets, sourceIndex,
2508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            err);
2509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*save the state and return */
2512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->source = source;
2513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->target = (char*)target;
2514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->converter->fromUnicodeStatus = (uint32_t)isTargetByteDBCS;
2515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
2516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/************************ To Unicode ***************************************/
2518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
2520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(UConverterToUnicodeArgs *args,
2521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                                            UErrorCode* err){
2522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char const* sourceStart;
2523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022* myData=(UConverterDataISO2022*)(args->converter->extraInfo);
2524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterToUnicodeArgs subArgs;
2526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t minArgsSize;
2527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* set up the subconverter arguments */
2529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(args->size<sizeof(UConverterToUnicodeArgs)) {
2530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        minArgsSize = args->size;
2531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else {
2532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        minArgsSize = (int32_t)sizeof(UConverterToUnicodeArgs);
2533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uprv_memcpy(&subArgs, args, minArgsSize);
2536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    subArgs.size = (uint16_t)minArgsSize;
2537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    subArgs.converter = myData->currentConverter;
2538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* remember the original start of the input for offsets */
2540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sourceStart = args->source;
2541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(myData->key != 0) {
2543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* continue with a partial escape sequence */
2544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto escape;
2545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while(U_SUCCESS(*err) && args->source < args->sourceLimit) {
2548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /*Find the end of the buffer e.g : Next Escape Seq | end of Buffer*/
2549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        subArgs.source = args->source;
2550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        subArgs.sourceLimit = getEndOfBuffer_2022(&(args->source), args->sourceLimit, args->flush);
2551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(subArgs.source != subArgs.sourceLimit) {
2552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*
2553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * get the current partial byte sequence
2554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             *
2555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * it needs to be moved between the public and the subconverter
2556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * so that the conversion framework, which only sees the public
2557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * converter, can handle truncated and illegal input etc.
2558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             */
2559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(args->converter->toULength > 0) {
2560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                uprv_memcpy(subArgs.converter->toUBytes, args->converter->toUBytes, args->converter->toULength);
2561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            subArgs.converter->toULength = args->converter->toULength;
2563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*
2565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * Convert up to the end of the input, or to before the next escape character.
2566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * Does not handle conversion extensions because the preToU[] state etc.
2567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * is not copied.
2568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             */
2569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ucnv_MBCSToUnicodeWithOffsets(&subArgs, err);
2570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(args->offsets != NULL && sourceStart != args->source) {
2572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* update offsets to base them on the actual start of the input */
2573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                int32_t *offsets = args->offsets;
2574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                UChar *target = args->target;
2575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                int32_t delta = (int32_t)(args->source - sourceStart);
2576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                while(target < subArgs.target) {
2577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(*offsets >= 0) {
2578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *offsets += delta;
2579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ++offsets;
2581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ++target;
2582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            args->source = subArgs.source;
2585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            args->target = subArgs.target;
2586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            args->offsets = subArgs.offsets;
2587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* copy input/error/overflow buffers */
2589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(subArgs.converter->toULength > 0) {
2590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                uprv_memcpy(args->converter->toUBytes, subArgs.converter->toUBytes, subArgs.converter->toULength);
2591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            args->converter->toULength = subArgs.converter->toULength;
2593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(*err == U_BUFFER_OVERFLOW_ERROR) {
2595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(subArgs.converter->UCharErrorBufferLength > 0) {
2596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    uprv_memcpy(args->converter->UCharErrorBuffer, subArgs.converter->UCharErrorBuffer,
2597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                subArgs.converter->UCharErrorBufferLength);
2598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                args->converter->UCharErrorBufferLength=subArgs.converter->UCharErrorBufferLength;
2600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                subArgs.converter->UCharErrorBufferLength = 0;
2601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if (U_FAILURE(*err) || (args->source == args->sourceLimit)) {
2605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return;
2606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)escape:
2609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        changeState_2022(args->converter,
2610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               &(args->source),
2611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               args->sourceLimit,
2612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               ISO_2022_KR,
2613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)               err);
2614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
2616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
2618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC(UConverterToUnicodeArgs *args,
2619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                                            UErrorCode* err){
2620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char tempBuf[2];
2621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char *mySource = ( char *) args->source;
2622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UChar *myTarget = args->target;
2623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char *mySourceLimit = args->sourceLimit;
2624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UChar32 targetUniChar = 0x0000;
2625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UChar mySourceChar = 0x0000;
2626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022* myData;
2627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterSharedData* sharedData ;
2628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool useFallback;
2629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    myData=(UConverterDataISO2022*)(args->converter->extraInfo);
2631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(myData->version==1){
2632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC_IBM(args,err);
2633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return;
2634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* initialize state */
2637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sharedData = myData->currentConverter->sharedData;
2638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    useFallback = args->converter->useFallback;
2639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(myData->key != 0) {
2641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* continue with a partial escape sequence */
2642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto escape;
2643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(args->converter->toULength == 1 && mySource < mySourceLimit && myTarget < args->targetLimit) {
2644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* continue with a partial double-byte character */
2645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        mySourceChar = args->converter->toUBytes[0];
2646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        args->converter->toULength = 0;
2647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto getTrailByte;
2648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while(mySource< mySourceLimit){
2651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(myTarget < args->targetLimit){
2653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            mySourceChar= (unsigned char) *mySource++;
2655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(mySourceChar==UCNV_SI){
2657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myData->toU2022State.g = 0;
2658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if (myData->isEmptySegment) {
2659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = FALSE;	/* we are handling it, reset to avoid future spurious errors */
2660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err = U_ILLEGAL_ESCAPE_SEQUENCE;
2661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->toUCallbackReason = UCNV_IRREGULAR;
2662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->toUBytes[0] = (uint8_t)mySourceChar;
2663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->toULength = 1;
2664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->target = myTarget;
2665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->source = mySource;
2666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    return;
2667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*consume the source */
2669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                continue;
2670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }else if(mySourceChar==UCNV_SO){
2671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myData->toU2022State.g = 1;
2672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myData->isEmptySegment = TRUE;	/* Begin a new segment, empty so far */
2673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*consume the source */
2674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                continue;
2675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }else if(mySourceChar==ESC_2022){
2676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                mySource--;
2677f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)escape:
2678f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myData->isEmptySegment = FALSE;	/* Any invalid ESC sequences will be detected separately, so just reset this */
2679f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                changeState_2022(args->converter,&(mySource),
2680f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                mySourceLimit, ISO_2022_KR, err);
2681f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(U_FAILURE(*err)){
2682f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->target = myTarget;
2683f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->source = mySource;
2684f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    return;
2685f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2686f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                continue;
2687f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2688f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2689f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myData->isEmptySegment = FALSE;	/* Any invalid char errors will be detected separately, so just reset this */
2690f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(myData->toU2022State.g == 1) {
2691f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(mySource < mySourceLimit) {
2692f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    int leadIsOk, trailIsOk;
2693f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    uint8_t trailByte;
2694f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getTrailByte:
2695f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    targetUniChar = missingCharMarker;
2696f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    trailByte = (uint8_t)*mySource;
2697f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /*
2698f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     * Ticket 5691: consistent illegal sequences:
2699f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     * - We include at least the first byte in the illegal sequence.
2700f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     * - If any of the non-initial bytes could be the start of a character,
2701f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     *   we stop the illegal sequence before the first one of those.
2702f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     *
2703f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     * In ISO-2022 DBCS, if the second byte is in the 21..7e range or is
2704f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     * an ESC/SO/SI, we report only the first byte as the illegal sequence.
2705f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     * Otherwise we convert or report the pair of bytes.
2706f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     */
2707f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    leadIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21);
2708f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    trailIsOk = (uint8_t)(trailByte - 0x21) <= (0x7e - 0x21);
2709f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if (leadIsOk && trailIsOk) {
2710f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        ++mySource;
2711f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        tempBuf[0] = (char)(mySourceChar + 0x80);
2712f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        tempBuf[1] = (char)(trailByte + 0x80);
2713f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetUniChar = ucnv_MBCSSimpleGetNextUChar(sharedData, tempBuf, 2, useFallback);
2714f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        mySourceChar = (mySourceChar << 8) | trailByte;
2715f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else if (!(trailIsOk || IS_2022_CONTROL(trailByte))) {
2716f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* report a pair of illegal bytes if the second byte is not a DBCS starter */
2717f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        ++mySource;
2718f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* add another bit so that the code below writes 2 bytes in case of error */
2719f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        mySourceChar = 0x10000 | (mySourceChar << 8) | trailByte;
2720f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2721f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
2722f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->toUBytes[0] = (uint8_t)mySourceChar;
2723f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->toULength = 1;
2724f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2725f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2726f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2727f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            else if(mySourceChar <= 0x7f) {
2728f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                targetUniChar = ucnv_MBCSSimpleGetNextUChar(sharedData, mySource - 1, 1, useFallback);
2729f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
2730f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                targetUniChar = 0xffff;
2731f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2732f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(targetUniChar < 0xfffe){
2733f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(args->offsets) {
2734f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
2735f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2736f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *(myTarget++)=(UChar)targetUniChar;
2737f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2738f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            else {
2739f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* Call the callback function*/
2740f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                toUnicodeCallback(args->converter,mySourceChar,targetUniChar,err);
2741f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
2742f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2743f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2744f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else{
2745f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *err =U_BUFFER_OVERFLOW_ERROR;
2746f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
2747f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
2748f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2749f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->target = myTarget;
2750f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->source = mySource;
2751f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
2752f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2753f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*************************** END ISO2022-KR *********************************/
2754f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2755f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*************************** ISO-2022-CN *********************************
2756f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2757f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Rules for ISO-2022-CN Encoding:
2758f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* i)   The designator sequence must appear once on a line before any instance
2759f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      of character set it designates.
2760f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* ii)  If two lines contain characters from the same character set, both lines
2761f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      must include the designator sequence.
2762f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* iii) Once the designator sequence is known, a shifting sequence has to be found
2763f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      to invoke the  shifting
2764f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* iv)  All lines start in ASCII and end in ASCII.
2765f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* v)   Four shifting sequences are employed for this purpose:
2766f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2767f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      Sequcence   ASCII Eq    Charsets
2768f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ----------  -------    ---------
2769f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      SI           <SI>        US-ASCII
2770f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      SO           <SO>        CNS-11643-1992 Plane 1, GB2312, ISO-IR-165
2771f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      SS2          <ESC>N      CNS-11643-1992 Plane 2
2772f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      SS3          <ESC>O      CNS-11643-1992 Planes 3-7
2773f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2774f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* vi)
2775f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      SOdesignator  : ESC "$" ")" finalchar_for_SO
2776f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      SS2designator : ESC "$" "*" finalchar_for_SS2
2777f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      SS3designator : ESC "$" "+" finalchar_for_SS3
2778f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2779f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ ) A       Indicates the bytes following SO are Chinese
2780f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       characters as defined in GB 2312-80, until
2781f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       another SOdesignation appears
2782f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2783f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2784f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ ) E       Indicates the bytes following SO are as defined
2785f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       in ISO-IR-165 (for details, see section 2.1),
2786f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       until another SOdesignation appears
2787f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2788f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ ) G       Indicates the bytes following SO are as defined
2789f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       in CNS 11643-plane-1, until another
2790f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       SOdesignation appears
2791f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2792f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ * H       Indicates the two bytes immediately following
2793f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       SS2 is a Chinese character as defined in CNS
2794f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       11643-plane-2, until another SS2designation
2795f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       appears
2796f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       (Meaning <ESC>N must preceed every 2 byte
2797f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*        sequence.)
2798f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2799f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ + I       Indicates the immediate two bytes following SS3
2800f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       is a Chinese character as defined in CNS
2801f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       11643-plane-3, until another SS3designation
2802f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       appears
2803f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       (Meaning <ESC>O must preceed every 2 byte
2804f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*        sequence.)
2805f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2806f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ + J       Indicates the immediate two bytes following SS3
2807f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       is a Chinese character as defined in CNS
2808f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       11643-plane-4, until another SS3designation
2809f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       appears
2810f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       (In English: <ESC>O must preceed every 2 byte
2811f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*        sequence.)
2812f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2813f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ + K       Indicates the immediate two bytes following SS3
2814f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       is a Chinese character as defined in CNS
2815f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       11643-plane-5, until another SS3designation
2816f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       appears
2817f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2818f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ + L       Indicates the immediate two bytes following SS3
2819f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       is a Chinese character as defined in CNS
2820f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       11643-plane-6, until another SS3designation
2821f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       appears
2822f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2823f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*      ESC $ + M       Indicates the immediate two bytes following SS3
2824f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       is a Chinese character as defined in CNS
2825f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       11643-plane-7, until another SS3designation
2826f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       appears
2827f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2828f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       As in ISO-2022-CN, each line starts in ASCII, and ends in ASCII, and
2829f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       has its own designation information before any Chinese characters
2830f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*       appear
2831f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
2832f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
2833f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2834f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/* The following are defined this way to make the strings truely readonly */
2835f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char GB_2312_80_STR[] = "\x1B\x24\x29\x41";
2836f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char ISO_IR_165_STR[] = "\x1B\x24\x29\x45";
2837f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char CNS_11643_1992_Plane_1_STR[] = "\x1B\x24\x29\x47";
2838f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char CNS_11643_1992_Plane_2_STR[] = "\x1B\x24\x2A\x48";
2839f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char CNS_11643_1992_Plane_3_STR[] = "\x1B\x24\x2B\x49";
2840f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char CNS_11643_1992_Plane_4_STR[] = "\x1B\x24\x2B\x4A";
2841f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char CNS_11643_1992_Plane_5_STR[] = "\x1B\x24\x2B\x4B";
2842f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char CNS_11643_1992_Plane_6_STR[] = "\x1B\x24\x2B\x4C";
2843f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char CNS_11643_1992_Plane_7_STR[] = "\x1B\x24\x2B\x4D";
2844f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2845f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/********************** ISO2022-CN Data **************************/
2846f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const char* const escSeqCharsCN[10] ={
2847f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        SHIFT_IN_STR,           /* ASCII */
2848f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        GB_2312_80_STR,
2849f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        ISO_IR_165_STR,
2850f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_1992_Plane_1_STR,
2851f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_1992_Plane_2_STR,
2852f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_1992_Plane_3_STR,
2853f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_1992_Plane_4_STR,
2854f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_1992_Plane_5_STR,
2855f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_1992_Plane_6_STR,
2856f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        CNS_11643_1992_Plane_7_STR
2857f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
2858f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2859f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
2860f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args, UErrorCode* err){
2861f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter *cnv = args->converter;
2862f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022 *converterData;
2863f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO2022State *pFromU2022State;
2864f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint8_t *target = (uint8_t *) args->target;
2865f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const uint8_t *targetLimit = (const uint8_t *) args->targetLimit;
2866f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UChar* source = args->source;
2867f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const UChar* sourceLimit = args->sourceLimit;
2868f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t* offsets = args->offsets;
2869f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UChar32 sourceChar;
2870f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char buffer[8];
2871f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t len;
2872f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int8_t choices[3];
2873f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t choiceCount;
2874f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t targetValue = 0;
2875f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool useFallback;
2876f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2877f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* set up the state */
2878f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    converterData     = (UConverterDataISO2022*)cnv->extraInfo;
2879f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    pFromU2022State   = &converterData->fromU2022State;
2880f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2881f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    choiceCount = 0;
2882f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2883f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* check if the last codepoint of previous buffer was a lead surrogate*/
2884f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if((sourceChar = cnv->fromUChar32)!=0 && target< targetLimit) {
2885f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto getTrail;
2886f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
2887f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2888f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while( source < sourceLimit){
2889f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(target < targetLimit){
2890f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2891f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sourceChar  = *(source++);
2892f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*check if the char is a First surrogate*/
2893f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             if(UTF_IS_SURROGATE(sourceChar)) {
2894f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(UTF_IS_SURROGATE_FIRST(sourceChar)) {
2895f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getTrail:
2896f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /*look ahead to find the trail surrogate*/
2897f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(source < sourceLimit) {
2898f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* test the following code unit */
2899f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        UChar trail=(UChar) *source;
2900f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(UTF_IS_SECOND_SURROGATE(trail)) {
2901f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            source++;
2902f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            sourceChar=UTF16_GET_PAIR_VALUE(sourceChar, trail);
2903f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            cnv->fromUChar32=0x00;
2904f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* convert this supplementary code point */
2905f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* exit this condition tree */
2906f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else {
2907f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* this is an unmatched lead code unit (1st surrogate) */
2908f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* callback(illegal) */
2909f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            *err=U_ILLEGAL_CHAR_FOUND;
2910f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            cnv->fromUChar32=sourceChar;
2911f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            break;
2912f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
2913f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
2914f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* no more input */
2915f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cnv->fromUChar32=sourceChar;
2916f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        break;
2917f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2918f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
2919f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* this is an unmatched trail code unit (2nd surrogate) */
2920f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* callback(illegal) */
2921f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err=U_ILLEGAL_CHAR_FOUND;
2922f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    cnv->fromUChar32=sourceChar;
2923f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2924f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2925f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2926f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2927f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* do the conversion */
2928f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(sourceChar <= 0x007f ){
2929f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* do not convert SO/SI/ESC */
2930f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(IS_2022_CONTROL(sourceChar)) {
2931f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* callback(illegal) */
2932f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err=U_ILLEGAL_CHAR_FOUND;
2933f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    cnv->fromUChar32=sourceChar;
2934f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
2935f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2936f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2937f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* US-ASCII */
2938f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(pFromU2022State->g == 0) {
2939f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[0] = (char)sourceChar;
2940f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    len = 1;
2941f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
2942f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[0] = UCNV_SI;
2943f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[1] = (char)sourceChar;
2944f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    len = 2;
2945f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pFromU2022State->g = 0;
2946f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    choiceCount = 0;
2947f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2948f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(sourceChar == CR || sourceChar == LF) {
2949f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* reset the state at the end of a line */
2950f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    uprv_memset(pFromU2022State, 0, sizeof(ISO2022State));
2951f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    choiceCount = 0;
2952f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
2953f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
2954f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            else{
2955f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* convert U+0080..U+10ffff */
2956f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                int32_t i;
2957f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                int8_t cs, g;
2958f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2959f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(choiceCount == 0) {
2960f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* try the current SO/G1 converter first */
2961f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    choices[0] = pFromU2022State->cs[1];
2962f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2963f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* default to GB2312_1 if none is designated yet */
2964f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(choices[0] == 0) {
2965f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        choices[0] = GB2312_1;
2966f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
2967f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2968f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(converterData->version == 0) {
2969f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* ISO-2022-CN */
2970f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2971f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* try the other SO/G1 converter; a CNS_11643_1 lookup may result in any plane */
2972f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(choices[0] == GB2312_1) {
2973f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choices[1] = (int8_t)CNS_11643_1;
2974f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else {
2975f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choices[1] = (int8_t)GB2312_1;
2976f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
2977f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2978f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        choiceCount = 2;
2979f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else if (converterData->version == 1) {
2980f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* ISO-2022-CN-EXT */
2981f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2982f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /* try one of the other converters */
2983f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        switch(choices[0]) {
2984f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        case GB2312_1:
2985f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choices[1] = (int8_t)CNS_11643_1;
2986f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choices[2] = (int8_t)ISO_IR_165;
2987f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            break;
2988f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        case ISO_IR_165:
2989f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choices[1] = (int8_t)GB2312_1;
2990f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choices[2] = (int8_t)CNS_11643_1;
2991f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            break;
2992f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        default: /* CNS_11643_x */
2993f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choices[1] = (int8_t)GB2312_1;
2994f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choices[2] = (int8_t)ISO_IR_165;
2995f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            break;
2996f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
2997f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
2998f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        choiceCount = 3;
2999f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
3000f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        choices[0] = (int8_t)CNS_11643_1;
3001f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        choices[1] = (int8_t)GB2312_1;
3002f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
3003f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3004f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3005f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cs = g = 0;
3006f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*
3007f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * len==0: no mapping found yet
3008f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * len<0: found a fallback result: continue looking for a roundtrip but no further fallbacks
3009f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * len>0: found a roundtrip result, done
3010f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
3011f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                len = 0;
3012f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*
3013f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * We will turn off useFallback after finding a fallback,
3014f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * but we still get fallbacks from PUA code points as usual.
3015f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * Therefore, we will also need to check that we don't overwrite
3016f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * an early fallback with a later one.
3017f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
3018f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                useFallback = cnv->useFallback;
3019f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3020f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                for(i = 0; i < choiceCount && len <= 0; ++i) {
3021f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    int8_t cs0 = choices[i];
3022f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(cs0 > 0) {
3023f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        uint32_t value;
3024f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        int32_t len2;
3025f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(cs0 >= CNS_11643_0) {
3026f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            len2 = MBCS_FROM_UCHAR32_ISO2022(
3027f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        converterData->myConverterArray[CNS_11643],
3028f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        sourceChar,
3029f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        &value,
3030f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        useFallback,
3031f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        MBCS_OUTPUT_3);
3032f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(len2 == 3 || (len2 == -3 && len == 0)) {
3033f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                targetValue = value;
3034f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                cs = (int8_t)(CNS_11643_0 + (value >> 16) - 0x80);
3035f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                if(len2 >= 0) {
3036f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    len = 2;
3037f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                } else {
3038f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    len = -2;
3039f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    useFallback = FALSE;
3040f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                }
3041f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                if(cs == CNS_11643_1) {
3042f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    g = 1;
3043f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                } else if(cs == CNS_11643_2) {
3044f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    g = 2;
3045f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                } else /* plane 3..7 */ if(converterData->version == 1) {
3046f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    g = 3;
3047f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                } else {
3048f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    /* ISO-2022-CN (without -EXT) does not support plane 3..7 */
3049f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    len = 0;
3050f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                }
3051f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
3052f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else {
3053f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* GB2312_1 or ISO-IR-165 */
3054f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            len2 = MBCS_FROM_UCHAR32_ISO2022(
3055f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        converterData->myConverterArray[cs0],
3056f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        sourceChar,
3057f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        &value,
3058f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        useFallback,
3059f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        MBCS_OUTPUT_2);
3060f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(len2 == 2 || (len2 == -2 && len == 0)) {
3061f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                targetValue = value;
3062f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                len = len2;
3063f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                cs = cs0;
3064f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                g = 1;
3065f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                useFallback = FALSE;
3066f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
3067f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
3068f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
3069f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3070f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3071f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(len != 0) {
3072f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    len = 0; /* count output bytes; it must have been abs(len) == 2 */
3073f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3074f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* write the designation sequence if necessary */
3075f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(cs != pFromU2022State->cs[g]) {
3076f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(cs < CNS_11643) {
3077f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            uprv_memcpy(buffer, escSeqCharsCN[cs], 4);
3078f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else {
3079f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            uprv_memcpy(buffer, escSeqCharsCN[CNS_11643 + (cs - CNS_11643_1)], 4);
3080f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
3081f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        len = 4;
3082f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        pFromU2022State->cs[g] = cs;
3083f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(g == 1) {
3084f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* changing the SO/G1 charset invalidates the choices[] */
3085f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            choiceCount = 0;
3086f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
3087f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
3088f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3089f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* write the shift sequence if necessary */
3090f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(g != pFromU2022State->g) {
3091f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        switch(g) {
3092f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        case 1:
3093f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            buffer[len++] = UCNV_SO;
3094f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3095f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* set the new state only if it is the locking shift SO/G1, not for SS2 or SS3 */
3096f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            pFromU2022State->g = 1;
3097f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            break;
3098f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        case 2:
3099f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            buffer[len++] = 0x1b;
3100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            buffer[len++] = 0x4e;
3101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            break;
3102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        default: /* case 3 */
3103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            buffer[len++] = 0x1b;
3104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            buffer[len++] = 0x4f;
3105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            break;
3106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
3107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
3108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* write the two output bytes */
3110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[len++] = (char)(targetValue >> 8);
3111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer[len++] = (char)targetValue;
3112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
3113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* if we cannot find the character after checking all codepages
3114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     * then this is an error
3115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                     */
3116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err = U_INVALID_CHAR_FOUND;
3117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    cnv->fromUChar32=sourceChar;
3118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
3119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* output len>0 bytes in buffer[] */
3123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(len == 1) {
3124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *target++ = buffer[0];
3125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(offsets) {
3126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *offsets++ = (int32_t)(source - args->source - 1); /* -1: known to be ASCII */
3127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else if(len == 2 && (target + 2) <= targetLimit) {
3129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *target++ = buffer[0];
3130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *target++ = buffer[1];
3131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(offsets) {
3132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    int32_t sourceIndex = (int32_t)(source - args->source - U16_LENGTH(sourceChar));
3133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *offsets++ = sourceIndex;
3134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *offsets++ = sourceIndex;
3135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
3137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                fromUWriteUInt8(
3138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    cnv,
3139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    buffer, len,
3140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    &target, (const char *)targetLimit,
3141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    &offsets, (int32_t)(source - args->source - U16_LENGTH(sourceChar)),
3142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    err);
3143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(U_FAILURE(*err)) {
3144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
3145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } /* end if(myTargetIndex<myTargetLength) */
3148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else{
3149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *err =U_BUFFER_OVERFLOW_ERROR;
3150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
3151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }/* end while(mySourceIndex<mySourceLength) */
3154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*
3156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * the end of the input stream and detection of truncated input
3157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * are handled by the framework, but for ISO-2022-CN conversion
3158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * we need to be in ASCII mode at the very end
3159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
3160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * conditions:
3161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   successful
3162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   not in ASCII mode
3163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *   end of input and no truncated input
3164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
3165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if( U_SUCCESS(*err) &&
3166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        pFromU2022State->g!=0 &&
3167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        args->flush && source>=sourceLimit && cnv->fromUChar32==0
3168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ) {
3169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        int32_t sourceIndex;
3170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* we are switching to ASCII */
3172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        pFromU2022State->g=0;
3173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* get the source index of the last input character */
3175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /*
3176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * TODO this would be simpler and more reliable if we used a pair
3177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * of sourceIndex/prevSourceIndex like in ucnvmbcs.c
3178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * so that we could simply use the prevSourceIndex here;
3179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * this code gives an incorrect result for the rare case of an unmatched
3180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         * trail surrogate that is alone in the last buffer of the text stream
3181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)         */
3182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sourceIndex=(int32_t)(source-args->source);
3183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(sourceIndex>0) {
3184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            --sourceIndex;
3185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if( U16_IS_TRAIL(args->source[sourceIndex]) &&
3186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                (sourceIndex==0 || U16_IS_LEAD(args->source[sourceIndex-1]))
3187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ) {
3188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                --sourceIndex;
3189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else {
3191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sourceIndex=-1;
3192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        fromUWriteUInt8(
3195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv,
3196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            SHIFT_IN_STR, 1,
3197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            &target, (const char *)targetLimit,
3198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            &offsets, sourceIndex,
3199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            err);
3200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*save the state and return */
3203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->source = source;
3204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->target = (char*)target;
3205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
3206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
3209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args,
3210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                               UErrorCode* err){
3211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char tempBuf[3];
3212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char *mySource = (char *) args->source;
3213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UChar *myTarget = args->target;
3214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    const char *mySourceLimit = args->sourceLimit;
3215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t targetUniChar = 0x0000;
3216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uint32_t mySourceChar = 0x0000;
3217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022* myData;
3218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO2022State *pToU2022State;
3219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    myData=(UConverterDataISO2022*)(args->converter->extraInfo);
3221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    pToU2022State = &myData->toU2022State;
3222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(myData->key != 0) {
3224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* continue with a partial escape sequence */
3225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto escape;
3226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    } else if(args->converter->toULength == 1 && mySource < mySourceLimit && myTarget < args->targetLimit) {
3227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* continue with a partial double-byte character */
3228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        mySourceChar = args->converter->toUBytes[0];
3229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        args->converter->toULength = 0;
3230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        targetUniChar = missingCharMarker;
3231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        goto getTrailByte;
3232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    while(mySource < mySourceLimit){
3235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        targetUniChar =missingCharMarker;
3237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(myTarget < args->targetLimit){
3239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            mySourceChar= (unsigned char) *mySource++;
3241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            switch(mySourceChar){
3243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case UCNV_SI:
3244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                pToU2022State->g=0;
3245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if (myData->isEmptySegment) {
3246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = FALSE;	/* we are handling it, reset to avoid future spurious errors */
3247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *err = U_ILLEGAL_ESCAPE_SEQUENCE;
3248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->toUCallbackReason = UCNV_IRREGULAR;
3249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->toUBytes[0] = mySourceChar;
3250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->toULength = 1;
3251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->target = myTarget;
3252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->source = mySource;
3253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    return;
3254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                continue;
3256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case UCNV_SO:
3258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(pToU2022State->cs[1] != 0) {
3259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    pToU2022State->g=1;
3260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = TRUE;	/* Begin a new segment, empty so far */
3261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    continue;
3262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                } else {
3263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* illegal to have SO before a matching designator */
3264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = FALSE;	/* Handling a different error, reset this to avoid future spurious errs */
3265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    break;
3266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case ESC_2022:
3269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                mySource--;
3270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)escape:
3271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                {
3272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    const char * mySourceBefore = mySource;
3273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    int8_t toULengthBefore = args->converter->toULength;
3274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    changeState_2022(args->converter,&(mySource),
3276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        mySourceLimit, ISO_2022_CN,err);
3277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* After SO there must be at least one character before a designator (designator error handled separately) */
3279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(myData->key==0 && U_SUCCESS(*err) && myData->isEmptySegment) {
3280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        *err = U_ILLEGAL_ESCAPE_SEQUENCE;
3281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->toUCallbackReason = UCNV_IRREGULAR;
3282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->toULength = (int8_t)(toULengthBefore + (mySource - mySourceBefore));
3283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
3284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* invalid or illegal escape sequence */
3287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(U_FAILURE(*err)){
3288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->target = myTarget;
3289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->source = mySource;
3290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    myData->isEmptySegment = FALSE;	/* Reset to avoid future spurious errors */
3291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    return;
3292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                continue;
3294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* ISO-2022-CN does not use single-byte (C1) SS2 and SS3 */
3296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case CR:
3298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*falls through*/
3299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            case LF:
3300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                uprv_memset(pToU2022State, 0, sizeof(ISO2022State));
3301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* falls through */
3302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            default:
3303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* convert one or two bytes */
3304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myData->isEmptySegment = FALSE;
3305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(pToU2022State->g != 0) {
3306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(mySource < mySourceLimit) {
3307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        UConverterSharedData *cnv;
3308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        StateEnum tempState;
3309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        int32_t tempBufLen;
3310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        int leadIsOk, trailIsOk;
3311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        uint8_t trailByte;
3312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)getTrailByte:
3313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        trailByte = (uint8_t)*mySource;
3314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        /*
3315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * Ticket 5691: consistent illegal sequences:
3316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * - We include at least the first byte in the illegal sequence.
3317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * - If any of the non-initial bytes could be the start of a character,
3318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         *   we stop the illegal sequence before the first one of those.
3319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         *
3320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * In ISO-2022 DBCS, if the second byte is in the 21..7e range or is
3321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * an ESC/SO/SI, we report only the first byte as the illegal sequence.
3322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         * Otherwise we convert or report the pair of bytes.
3323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         */
3324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        leadIsOk = (uint8_t)(mySourceChar - 0x21) <= (0x7e - 0x21);
3325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        trailIsOk = (uint8_t)(trailByte - 0x21) <= (0x7e - 0x21);
3326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if (leadIsOk && trailIsOk) {
3327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            ++mySource;
3328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            tempState = (StateEnum)pToU2022State->cs[pToU2022State->g];
3329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            if(tempState >= CNS_11643_0) {
3330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                cnv = myData->myConverterArray[CNS_11643];
3331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBuf[0] = (char) (0x80+(tempState-CNS_11643_0));
3332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBuf[1] = (char) (mySourceChar);
3333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBuf[2] = (char) trailByte;
3334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBufLen = 3;
3335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }else{
3337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                cnv = myData->myConverterArray[tempState];
3338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBuf[0] = (char) (mySourceChar);
3339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBuf[1] = (char) trailByte;
3340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                tempBufLen = 2;
3341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            }
3342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            targetUniChar = ucnv_MBCSSimpleGetNextUChar(cnv, tempBuf, tempBufLen, FALSE);
3343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            mySourceChar = (mySourceChar << 8) | trailByte;
3344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        } else if (!(trailIsOk || IS_2022_CONTROL(trailByte))) {
3345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* report a pair of illegal bytes if the second byte is not a DBCS starter */
3346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            ++mySource;
3347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* add another bit so that the code below writes 2 bytes in case of error */
3348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            mySourceChar = 0x10000 | (mySourceChar << 8) | trailByte;
3349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
3350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        if(pToU2022State->g>=2) {
3351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            /* return from a single-shift state to the previous one */
3352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            pToU2022State->g=pToU2022State->prevG;
3353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        }
3354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    } else {
3355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->toUBytes[0] = (uint8_t)mySourceChar;
3356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->converter->toULength = 1;
3357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        goto endloop;
3358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
3359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                else{
3361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(mySourceChar <= 0x7f) {
3362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        targetUniChar = (UChar) mySourceChar;
3363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
3364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
3366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(targetUniChar < (missingCharMarker-1/*0xfffe*/)){
3368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(args->offsets){
3369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
3370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *(myTarget++)=(UChar)targetUniChar;
3372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            else if(targetUniChar > missingCharMarker){
3374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* disassemble the surrogate pair and write to output*/
3375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                targetUniChar-=0x0010000;
3376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *myTarget = (UChar)(0xd800+(UChar)(targetUniChar>>10));
3377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(args->offsets){
3378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
3379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ++myTarget;
3381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(myTarget< args->targetLimit){
3382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *myTarget = (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff));
3383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    if(args->offsets){
3384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        args->offsets[myTarget - args->target] = (int32_t)(mySource - args->source - (mySourceChar <= 0xff ? 1 : 2));
3385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    }
3386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    ++myTarget;
3387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }else{
3388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->UCharErrorBuffer[args->converter->UCharErrorBufferLength++]=
3389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                    (UChar)(0xdc00+(UChar)(targetUniChar&0x3ff));
3390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            else{
3394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* Call the callback function*/
3395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                toUnicodeCallback(args->converter,mySourceChar,targetUniChar,err);
3396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                break;
3397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        else{
3400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *err =U_BUFFER_OVERFLOW_ERROR;
3401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
3402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)endloop:
3405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->target = myTarget;
3406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    args->source = mySource;
3407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
3408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
3410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO_2022_WriteSub(UConverterFromUnicodeArgs *args, int32_t offsetIndex, UErrorCode *err) {
3411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter *cnv = args->converter;
3412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022 *myConverterData=(UConverterDataISO2022 *) cnv->extraInfo;
3413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ISO2022State *pFromU2022State=&myConverterData->fromU2022State;
3414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char *p, *subchar;
3415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    char buffer[8];
3416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t length;
3417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    subchar=(char *)cnv->subChars;
3419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    length=cnv->subCharLen; /* assume length==1 for most variants */
3420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    p = buffer;
3422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    switch(myConverterData->locale[0]){
3423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    case 'j':
3424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        {
3425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int8_t cs;
3426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(pFromU2022State->g == 1) {
3428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* JIS7: switch from G1 to G0 */
3429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                pFromU2022State->g = 0;
3430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *p++ = UCNV_SI;
3431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cs = pFromU2022State->cs[0];
3434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(cs != ASCII && cs != JISX201) {
3435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* not in ASCII or JIS X 0201: switch to ASCII */
3436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                pFromU2022State->cs[0] = (int8_t)ASCII;
3437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *p++ = '\x1b';
3438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *p++ = '\x28';
3439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *p++ = '\x42';
3440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *p++ = subchar[0];
3443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
3444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    case 'c':
3446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(pFromU2022State->g != 0) {
3447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* not in ASCII mode: switch to ASCII */
3448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            pFromU2022State->g = 0;
3449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            *p++ = UCNV_SI;
3450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        *p++ = subchar[0];
3452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        break;
3453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    case 'k':
3454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(myConverterData->version == 0) {
3455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(length == 1) {
3456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if((UBool)args->converter->fromUnicodeStatus) {
3457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* in DBCS mode: switch to SBCS */
3458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->fromUnicodeStatus = 0;
3459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *p++ = UCNV_SI;
3460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *p++ = subchar[0];
3462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else /* length == 2*/ {
3463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(!(UBool)args->converter->fromUnicodeStatus) {
3464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    /* in SBCS mode: switch to DBCS */
3465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    args->converter->fromUnicodeStatus = 1;
3466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    *p++ = UCNV_SO;
3467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *p++ = subchar[0];
3469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                *p++ = subchar[1];
3470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            break;
3472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else {
3473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* save the subconverter's substitution string */
3474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            uint8_t *currentSubChars = myConverterData->currentConverter->subChars;
3475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int8_t currentSubCharLen = myConverterData->currentConverter->subCharLen;
3476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* set our substitution string into the subconverter */
3478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->currentConverter->subChars = (uint8_t *)subchar;
3479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->currentConverter->subCharLen = (int8_t)length;
3480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* let the subconverter write the subchar, set/retrieve fromUChar32 state */
3482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            args->converter = myConverterData->currentConverter;
3483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->currentConverter->fromUChar32 = cnv->fromUChar32;
3484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ucnv_cbFromUWriteSub(args, 0, err);
3485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            cnv->fromUChar32 = myConverterData->currentConverter->fromUChar32;
3486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            args->converter = cnv;
3487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* restore the subconverter's substitution string */
3489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->currentConverter->subChars = currentSubChars;
3490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            myConverterData->currentConverter->subCharLen = currentSubCharLen;
3491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if(*err == U_BUFFER_OVERFLOW_ERROR) {
3493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                if(myConverterData->currentConverter->charErrorBufferLength > 0) {
3494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    uprv_memcpy(
3495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cnv->charErrorBuffer,
3496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        myConverterData->currentConverter->charErrorBuffer,
3497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        myConverterData->currentConverter->charErrorBufferLength);
3498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                }
3499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnv->charErrorBufferLength = myConverterData->currentConverter->charErrorBufferLength;
3500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                myConverterData->currentConverter->charErrorBufferLength = 0;
3501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return;
3503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    default:
3505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* not expected */
3506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        break;
3507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ucnv_cbFromUWriteBytes(args,
3509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                           buffer, (int32_t)(p - buffer),
3510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                           offsetIndex, err);
3511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
3512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
3514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Structure for cloning an ISO 2022 converter into a single memory block.
3515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * ucnv_safeClone() of the converter will align the entire cloneStruct,
3516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and then ucnv_safeClone() of the sub-converter may additionally align
3517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * currentConverter inside the cloneStruct, for which we need the deadSpace
3518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * after currentConverter.
3519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This is because UAlignedMemory may be larger than the actually
3520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * necessary alignment size for the platform.
3521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The other cloneStruct fields will not be moved around,
3522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * and are aligned properly with cloneStruct's alignment.
3523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
3524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)struct cloneStruct
3525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
3526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter cnv;
3527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter currentConverter;
3528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UAlignedMemory deadSpace;
3529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022 mydata;
3530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static UConverter *
3534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO_2022_SafeClone(
3535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            const UConverter *cnv,
3536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            void *stackBuffer,
3537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            int32_t *pBufferSize,
3538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            UErrorCode *status)
3539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
3540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    struct cloneStruct * localClone;
3541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022 *cnvData;
3542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t i, size;
3543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if (*pBufferSize == 0) { /* 'preflighting' request - set needed size into *pBufferSize */
3545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        *pBufferSize = (int32_t)sizeof(struct cloneStruct);
3546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return NULL;
3547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    cnvData = (UConverterDataISO2022 *)cnv->extraInfo;
3550f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    localClone = (struct cloneStruct *)stackBuffer;
3551f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3552f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* ucnv.c/ucnv_safeClone() copied the main UConverter already */
3553f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3554f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    uprv_memcpy(&localClone->mydata, cnvData, sizeof(UConverterDataISO2022));
3555f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    localClone->cnv.extraInfo = &localClone->mydata; /* set pointer to extra data */
3556f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    localClone->cnv.isExtraLocal = TRUE;
3557f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3558f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* share the subconverters */
3559f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3560f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if(cnvData->currentConverter != NULL) {
3561f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        size = (int32_t)(sizeof(UConverter) + sizeof(UAlignedMemory)); /* include size of padding */
3562f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        localClone->mydata.currentConverter =
3563f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ucnv_safeClone(cnvData->currentConverter,
3564f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            &localClone->currentConverter,
3565f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            &size, status);
3566f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(U_FAILURE(*status)) {
3567f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            return NULL;
3568f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3569f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3570f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3571f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    for(i=0; i<UCNV_2022_MAX_CONVERTERS; ++i) {
3572f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(cnvData->myConverterArray[i] != NULL) {
3573f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ucnv_incrementRefCount(cnvData->myConverterArray[i]);
3574f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3575f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3576f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3577f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    return &localClone->cnv;
3578f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
3579f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3580f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static void
3581f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)_ISO_2022_GetUnicodeSet(const UConverter *cnv,
3582f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    const USetAdder *sa,
3583f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    UConverterUnicodeSet which,
3584f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                    UErrorCode *pErrorCode)
3585f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles){
3586f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    int32_t i;
3587f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverterDataISO2022* cnvData;
3588f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3589f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if (U_FAILURE(*pErrorCode)) {
3590f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return;
3591f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3592f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
3593f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    if (cnv->sharedData == &_ISO2022Data) {
3594f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* We use UTF-8 in this case */
3595f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sa->addRange(sa->set, 0, 0xd7FF);
3596f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sa->addRange(sa->set, 0xE000, 0x10FFFF);
3597f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        return;
3598f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3599f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
3600f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3601f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    cnvData = (UConverterDataISO2022*)cnv->extraInfo;
3602f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3603f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* open a set and initialize it with code points that are algorithmically round-tripped */
3604f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    switch(cnvData->locale[0]){
3605f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    case 'j':
3606f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* include JIS X 0201 which is hardcoded */
3607f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sa->add(sa->set, 0xa5);
3608f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sa->add(sa->set, 0x203e);
3609f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(jpCharsetMasks[cnvData->version]&CSM(ISO8859_1)) {
3610f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* include Latin-1 for some variants of JP */
3611f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sa->addRange(sa->set, 0, 0xff);
3612f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        } else {
3613f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* include ASCII for JP */
3614f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sa->addRange(sa->set, 0, 0x7f);
3615f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3616f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(cnvData->version==3 || cnvData->version==4 || which==UCNV_ROUNDTRIP_AND_FALLBACK_SET) {
3617f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /*
3618f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * Do not test (jpCharsetMasks[cnvData->version]&CSM(HWKANA_7BIT))!=0
3619f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * because the bit is on for all JP versions although only versions 3 & 4 (JIS7 & JIS8)
3620f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * use half-width Katakana.
3621f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * This is because all ISO-2022-JP variants are lenient in that they accept (in toUnicode)
3622f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * half-width Katakana via the ESC ( I sequence.
3623f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * However, we only emit (fromUnicode) half-width Katakana according to the
3624f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * definition of each variant.
3625f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             *
3626f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * When including fallbacks,
3627f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * we need to include half-width Katakana Unicode code points for all JP variants because
3628f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             * JIS X 0208 has hardcoded fallbacks for them (which map to full-width Katakana).
3629f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)             */
3630f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            /* include half-width Katakana for JP */
3631f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            sa->addRange(sa->set, HWKANA_START, HWKANA_END);
3632f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3633f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        break;
3634f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    case 'c':
3635f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    case 'z':
3636f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* include ASCII for CN */
3637f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        sa->addRange(sa->set, 0, 0x7f);
3638f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        break;
3639f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    case 'k':
3640f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* there is only one converter for KR, and it is not in the myConverterArray[] */
3641f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        cnvData->currentConverter->sharedData->impl->getUnicodeSet(
3642f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnvData->currentConverter, sa, which, pErrorCode);
3643f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        /* the loop over myConverterArray[] will simply not find another converter */
3644f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        break;
3645f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    default:
3646f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        break;
3647f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3648f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3649f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if 0  /* Replaced by ucnv_MBCSGetFilteredUnicodeSetForUnicode() until we implement ucnv_getUnicodeSet() with reverse fallbacks. */
3650f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if( (cnvData->locale[0]=='c' || cnvData->locale[0]=='z') &&
3651f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnvData->version==0 && i==CNS_11643
3652f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ) {
3653f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /* special handling for non-EXT ISO-2022-CN: add only code points for CNS planes 1 and 2 */
3654f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                ucnv_MBCSGetUnicodeSetForBytes(
3655f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        cnvData->myConverterArray[i],
3656f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        sa, UCNV_ROUNDTRIP_SET,
3657f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        0, 0x81, 0x82,
3658f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                        pErrorCode);
3659f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3660f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
3661f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3662f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    for (i=0; i<UCNV_2022_MAX_CONVERTERS; i++) {
3663f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        UConverterSetFilter filter;
3664f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        if(cnvData->myConverterArray[i]!=NULL) {
3665f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            if( (cnvData->locale[0]=='c' || cnvData->locale[0]=='z') &&
3666f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                cnvData->version==0 && i==CNS_11643
3667f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ) {
3668f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*
3669f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * Version-specific for CN:
3670f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * CN version 0 does not map CNS planes 3..7 although
3671f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * they are all available in the CNS conversion table;
3672f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * CN version 1 (-EXT) does map them all.
3673f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * The two versions create different Unicode sets.
3674f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
3675f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                filter=UCNV_SET_FILTER_2022_CN;
3676f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else if(cnvData->locale[0]=='j' && i==JISX208) {
3677f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*
3678f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * Only add code points that map to Shift-JIS codes
3679f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * corresponding to JIS X 0208.
3680f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
3681f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                filter=UCNV_SET_FILTER_SJIS;
3682f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else if(i==KSC5601) {
3683f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                /*
3684f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * Some of the KSC 5601 tables (convrtrs.txt has this aliases on multiple tables)
3685f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 * are broader than GR94.
3686f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 */
3687f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                filter=UCNV_SET_FILTER_GR94DBCS;
3688f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            } else {
3689f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                filter=UCNV_SET_FILTER_NONE;
3690f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            }
3691f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)            ucnv_MBCSGetFilteredUnicodeSetForUnicode(cnvData->myConverterArray[i], sa, which, filter, pErrorCode);
3692f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        }
3693f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }
3694f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3695f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /*
3696f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * ISO 2022 converters must not convert SO/SI/ESC despite what
3697f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * sub-converters do by themselves.
3698f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Remove these characters from the set.
3699f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
3700f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sa->remove(sa->set, 0x0e);
3701f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sa->remove(sa->set, 0x0f);
3702f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sa->remove(sa->set, 0x1b);
3703f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3704f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /* ISO 2022 converters do not convert C1 controls either */
3705f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sa->removeRange(sa->set, 0x80, 0x9f);
3706f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)}
3707f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3708f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterImpl _ISO2022Impl={
3709f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_ISO_2022,
3710f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3711f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3712f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3713f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3714f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Open,
3715f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Close,
3716f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Reset,
3717f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3718f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifdef U_ENABLE_GENERIC_ISO_2022
3719f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC,
3720f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    T_UConverter_toUnicode_ISO_2022_OFFSETS_LOGIC,
3721f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ucnv_fromUnicode_UTF8,
3722f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ucnv_fromUnicode_UTF8_OFFSETS_LOGIC,
3723f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#else
3724f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3725f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3726f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3727f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3728f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif
3729f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3730f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3731f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3732f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022getName,
3733f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_WriteSub,
3734f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_SafeClone,
3735f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_GetUnicodeSet
3736f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3737f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterStaticData _ISO2022StaticData={
3738f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sizeof(UConverterStaticData),
3739f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "ISO_2022",
3740f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    2022,
3741f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_IBM,
3742f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_ISO_2022,
3743f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    1,
3744f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3, /* max 3 bytes per UChar from UTF-8 (4 bytes from surrogate _pair_) */
3745f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    { 0x1a, 0, 0, 0 },
3746f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    1,
3747f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3748f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3749f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3750f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3751f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */
3752f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3753f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)const UConverterSharedData _ISO2022Data={
3754f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sizeof(UConverterSharedData),
3755f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ~((uint32_t) 0),
3756f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3757f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3758f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    &_ISO2022StaticData,
3759f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3760f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    &_ISO2022Impl,
3761f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0
3762f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3763f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3764f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*************JP****************/
3765f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterImpl _ISO2022JPImpl={
3766f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_ISO_2022,
3767f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3768f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3769f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3770f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3771f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Open,
3772f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Close,
3773f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Reset,
3774f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3775f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC,
3776f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_toUnicode_ISO_2022_JP_OFFSETS_LOGIC,
3777f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC,
3778f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_fromUnicode_ISO_2022_JP_OFFSETS_LOGIC,
3779f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3780f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3781f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3782f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022getName,
3783f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_WriteSub,
3784f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_SafeClone,
3785f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_GetUnicodeSet
3786f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3787f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterStaticData _ISO2022JPStaticData={
3788f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sizeof(UConverterStaticData),
3789f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "ISO_2022_JP",
3790f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3791f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_IBM,
3792f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_ISO_2022,
3793f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    1,
3794f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    6, /* max 6 bytes per UChar: 4-byte escape sequence + DBCS */
3795f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    { 0x1a, 0, 0, 0 },
3796f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    1,
3797f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3798f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3799f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3800f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3801f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */
3802f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3803f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterSharedData _ISO2022JPData={
3804f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sizeof(UConverterSharedData),
3805f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ~((uint32_t) 0),
3806f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3807f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3808f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    &_ISO2022JPStaticData,
3809f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3810f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    &_ISO2022JPImpl,
3811f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0
3812f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3813f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3814f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/************* KR ***************/
3815f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterImpl _ISO2022KRImpl={
3816f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_ISO_2022,
3817f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3818f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3819f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3820f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3821f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Open,
3822f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Close,
3823f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Reset,
3824f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3825f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC,
3826f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_toUnicode_ISO_2022_KR_OFFSETS_LOGIC,
3827f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC,
3828f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_fromUnicode_ISO_2022_KR_OFFSETS_LOGIC,
3829f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3830f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3831f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3832f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022getName,
3833f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_WriteSub,
3834f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_SafeClone,
3835f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_GetUnicodeSet
3836f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3837f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterStaticData _ISO2022KRStaticData={
3838f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sizeof(UConverterStaticData),
3839f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "ISO_2022_KR",
3840f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3841f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_IBM,
3842f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_ISO_2022,
3843f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    1,
3844f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    3, /* max 3 bytes per UChar: SO+DBCS */
3845f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    { 0x1a, 0, 0, 0 },
3846f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    1,
3847f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3848f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3849f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3850f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3851f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */
3852f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3853f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterSharedData _ISO2022KRData={
3854f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sizeof(UConverterSharedData),
3855f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ~((uint32_t) 0),
3856f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3857f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3858f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    &_ISO2022KRStaticData,
3859f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3860f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    &_ISO2022KRImpl,
3861f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0
3862f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3863f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3864f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*************** CN ***************/
3865f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterImpl _ISO2022CNImpl={
3866f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3867f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_ISO_2022,
3868f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3869f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3870f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3871f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3872f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Open,
3873f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Close,
3874f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022Reset,
3875f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3876f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC,
3877f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC,
3878f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC,
3879f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC,
3880f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3881f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3882f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3883f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO2022getName,
3884f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_WriteSub,
3885f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_SafeClone,
3886f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    _ISO_2022_GetUnicodeSet
3887f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3888f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterStaticData _ISO2022CNStaticData={
3889f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sizeof(UConverterStaticData),
3890f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    "ISO_2022_CN",
3891f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3892f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_IBM,
3893f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UCNV_ISO_2022,
3894f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    1,
3895f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    8, /* max 8 bytes per UChar: 4-byte CNS designator + 2 bytes for SS2/SS3 + DBCS */
3896f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    { 0x1a, 0, 0, 0 },
3897f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    1,
3898f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3899f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3900f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3901f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0,
3902f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } /* reserved */
3903f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3904f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)static const UConverterSharedData _ISO2022CNData={
3905f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    sizeof(UConverterSharedData),
3906f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    ~((uint32_t) 0),
3907f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3908f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NULL,
3909f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    &_ISO2022CNStaticData,
3910f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    FALSE,
3911f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    &_ISO2022CNImpl,
3912f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    0
3913f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
3914f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3915f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3916f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
3917f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif /* #if !UCONFIG_NO_LEGACY_CONVERSION */
3918