10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
627f654740f2a26ad62a5c155af9199af9e69b889claireho*   Copyright (C) 1999-2010, International Business Machines
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   file name:  uinvchar.c
110596faeddefbf198de137d5e893708495ab1584cFredrik Roubert*   encoding:   UTF-8
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   tab size:   8 (not used)
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   indentation:2
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created on: 2004sep14
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   created by: Markus W. Scherer
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Functions for handling invariant characters, moved here from putil.c
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   for better modularization.
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "udataswp.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uassert.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uinvchar.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* invariant-character handling --------------------------------------------- */
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * These maps for ASCII to/from EBCDIC map invariant characters (see utypes.h)
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * appropriately for most EBCDIC codepages.
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * They currently also map most other ASCII graphic characters,
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * appropriately for codepages 37 and 1047.
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Exceptions: The characters for []^ have different codes in 37 & 1047.
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Both versions are mapped to ASCII.
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *    ASCII 37 1047
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [     5B BA   AD
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ]     5D BB   BD
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ^     5E B0   5F
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * There are no mappings for variant characters from Unicode to EBCDIC.
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Currently, C0 control codes are also included in these maps.
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Exceptions: S/390 Open Edition swaps LF and NEL codes compared with other
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * EBCDIC platforms; both codes (15 and 25) are mapped to ASCII LF (0A),
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * but there is no mapping for ASCII LF back to EBCDIC.
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *    ASCII EBCDIC S/390-OE
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * LF    0A     25       15
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NEL   85     15       25
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The maps below explicitly exclude the variant
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * control and graphical characters that are in ASCII-based
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * codepages at 0x80 and above.
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "No mapping" is expressed by mapping to a 00 byte.
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * These tables do not establish a converter or a codepage.
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint8_t asciiFromEbcdic[256]={
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x10, 0x11, 0x12, 0x13, 0x00, 0x0a, 0x08, 0x00, 0x18, 0x19, 0x00, 0x00, 0x1c, 0x1d, 0x1e, 0x1f,
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x17, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07,
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1a,
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x3c, 0x28, 0x2b, 0x7c,
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e,
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x2d, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x25, 0x5f, 0x3e, 0x3f,
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22,
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00,
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5d, 0x00, 0x5d, 0x00, 0x00,
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x5c, 0x00, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint8_t ebcdicFromAscii[256]={
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x40, 0x00, 0x7f, 0x00, 0x00, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x6d,
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x00, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x07,
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
109b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Same as asciiFromEbcdic[] except maps all letters to lowercase. */
110b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic const uint8_t lowercaseAsciiFromEbcdic[256]={
111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00, 0x01, 0x02, 0x03, 0x00, 0x09, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x10, 0x11, 0x12, 0x13, 0x00, 0x0a, 0x08, 0x00, 0x18, 0x19, 0x00, 0x00, 0x1c, 0x1d, 0x1e, 0x1f,
113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x17, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07,
114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x00, 0x1a,
115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
116b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x3c, 0x28, 0x2b, 0x7c,
117b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e,
118b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x2d, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x25, 0x5f, 0x3e, 0x3f,
119b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22,
120b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
121b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x00, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00,
124b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5d, 0x00, 0x5d, 0x00, 0x00,
125b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
126b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x7b, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x7d, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x7c, 0x00, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
130b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho};
131b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Bit sets indicating which characters of the ASCII repertoire
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (by ASCII/Unicode code) are "invariant".
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See utypes.h for more details.
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * As invariant are considered the characters of the ASCII repertoire except
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * for the following:
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 21  '!' <exclamation mark>
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 23  '#' <number sign>
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 24  '$' <dollar sign>
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 40  '@' <commercial at>
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 5b  '[' <left bracket>
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 5c  '\' <backslash>
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 5d  ']' <right bracket>
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 5e  '^' <circumflex>
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 60  '`' <grave accent>
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 7b  '{' <left brace>
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 7c  '|' <vertical line>
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 7d  '}' <right brace>
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 7e  '~' <tilde>
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const uint32_t invariantChars[4]={
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xfffffbff, /* 00..1f but not 0a */
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0xffffffe5, /* 20..3f but not 21 23 24 */
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x87fffffe, /* 40..5f but not 40 5b..5e */
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    0x87fffffe  /* 60..7f but not 60 7b..7e */
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * test unsigned types (or values known to be non-negative) for invariant characters,
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * tests ASCII-family character values
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCHAR_IS_INVARIANT(c) (((c)<=0x7f) && (invariantChars[(c)>>5]&((uint32_t)1<<((c)&0x1f)))!=0)
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test signed types for invariant characters, adds test for positive values */
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define SCHAR_IS_INVARIANT(c) ((0<=(c)) && UCHAR_IS_INVARIANT(c))
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_CHARSET_FAMILY==U_ASCII_FAMILY
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHAR_TO_UCHAR(c) c
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCHAR_TO_CHAR(c) c
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CHAR_TO_UCHAR(u) asciiFromEbcdic[u]
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define UCHAR_TO_CHAR(u) ebcdicFromAscii[u]
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   error U_CHARSET_FAMILY is not valid
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_charsToUChars(const char *cs, UChar *us, int32_t length) {
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar u;
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t c;
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Allow the entire ASCII repertoire to be mapped _to_ Unicode.
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * For EBCDIC systems, this works for characters with codes from
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * codepages 37 and 1047 or compatible.
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(length>0) {
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=(uint8_t)(*cs++);
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u=(UChar)CHAR_TO_UCHAR(c);
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U_ASSERT((u!=0 || c==0)); /* only invariant chars converted? */
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *us++=u;
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --length;
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI void U_EXPORT2
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruu_UCharsToChars(const UChar *us, char *cs, int32_t length) {
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar u;
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(length>0) {
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u=*us++;
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!UCHAR_IS_INVARIANT(u)) {
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            U_ASSERT(FALSE); /* Variant characters were used. These are not portable in ICU. */
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            u=0;
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *cs++=(char)UCHAR_TO_CHAR(u);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --length;
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_isInvariantString(const char *s, int32_t length) {
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t c;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(;;) {
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(length<0) {
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* NUL-terminated */
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c=(uint8_t)*s++;
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(c==0) {
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* count length */
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(length==0) {
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            --length;
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c=(uint8_t)*s++;
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(c==0) {
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue; /* NUL is invariant */
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* c!=0 now, one branch below checks c==0 for variant characters */
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * no assertions here because these functions are legitimately called
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * for strings with variant characters
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_CHARSET_FAMILY==U_ASCII_FAMILY
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!UCHAR_IS_INVARIANT(c)) {
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE; /* found a variant char */
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=CHAR_TO_UCHAR(c);
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(c==0 || !UCHAR_IS_INVARIANT(c)) {
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE; /* found a variant char */
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#   error U_CHARSET_FAMILY is not valid
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_isInvariantUString(const UChar *s, int32_t length) {
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar c;
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(;;) {
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(length<0) {
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* NUL-terminated */
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c=*s++;
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(c==0) {
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* count length */
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(length==0) {
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            --length;
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c=*s++;
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * no assertions here because these functions are legitimately called
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * for strings with variant characters
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!UCHAR_IS_INVARIANT(c)) {
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return FALSE; /* found a variant char */
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return TRUE;
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* UDataSwapFn implementations used in udataswp.c ------- */
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convert ASCII to EBCDIC and verify that all characters are invariant */
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_ebcdicFromAscii(const UDataSwapper *ds,
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     const void *inData, int32_t length, void *outData,
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     UErrorCode *pErrorCode) {
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint8_t *s;
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t *t;
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t c;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count;
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) {
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* setup and swapping */
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s=(const uint8_t *)inData;
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    t=(uint8_t *)outData;
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count=length;
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(count>0) {
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=*s++;
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!UCHAR_IS_INVARIANT(c)) {
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            udata_printError(ds, "uprv_ebcdicFromAscii() string[%d] contains a variant character in position %d\n",
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             length, length-count);
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *pErrorCode=U_INVALID_CHAR_FOUND;
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0;
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *t++=ebcdicFromAscii[c];
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --count;
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return length;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* this function only checks and copies ASCII strings without conversion */
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_copyAscii(const UDataSwapper *ds,
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               const void *inData, int32_t length, void *outData,
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru               UErrorCode *pErrorCode) {
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint8_t *s;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t c;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count;
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) {
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* setup and checking */
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s=(const uint8_t *)inData;
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count=length;
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(count>0) {
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=*s++;
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!UCHAR_IS_INVARIANT(c)) {
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            udata_printError(ds, "uprv_copyFromAscii() string[%d] contains a variant character in position %d\n",
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             length, length-count);
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *pErrorCode=U_INVALID_CHAR_FOUND;
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0;
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --count;
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(length>0 && inData!=outData) {
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_memcpy(outData, inData, length);
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return length;
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* convert EBCDIC to ASCII and verify that all characters are invariant */
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_asciiFromEbcdic(const UDataSwapper *ds,
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     const void *inData, int32_t length, void *outData,
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     UErrorCode *pErrorCode) {
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint8_t *s;
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t *t;
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t c;
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count;
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ds==NULL || inData==NULL || length<0 ||  (length>0 && outData==NULL)) {
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* setup and swapping */
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s=(const uint8_t *)inData;
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    t=(uint8_t *)outData;
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count=length;
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(count>0) {
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=*s++;
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(c!=0 && ((c=asciiFromEbcdic[c])==0 || !UCHAR_IS_INVARIANT(c))) {
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            udata_printError(ds, "uprv_asciiFromEbcdic() string[%d] contains a variant character in position %d\n",
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             length, length-count);
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *pErrorCode=U_INVALID_CHAR_FOUND;
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0;
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *t++=c;
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --count;
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return length;
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* this function only checks and copies EBCDIC strings without conversion */
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_copyEbcdic(const UDataSwapper *ds,
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                const void *inData, int32_t length, void *outData,
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                UErrorCode *pErrorCode) {
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const uint8_t *s;
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t c;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t count;
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) {
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(ds==NULL || inData==NULL || length<0 || (length>0 && outData==NULL)) {
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR;
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* setup and checking */
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s=(const uint8_t *)inData;
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count=length;
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(count>0) {
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=*s++;
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(c!=0 && ((c=asciiFromEbcdic[c])==0 || !UCHAR_IS_INVARIANT(c))) {
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            udata_printError(ds, "uprv_copyEbcdic() string[%] contains a variant character in position %d\n",
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             length, length-count);
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *pErrorCode=U_INVALID_CHAR_FOUND;
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0;
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --count;
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(length>0 && inData!=outData) {
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_memcpy(outData, inData, length);
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return length;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* compare invariant strings; variant characters compare less than others and unlike each other */
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_compareInvAscii(const UDataSwapper *ds,
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     const char *outString, int32_t outLength,
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                     const UChar *localString, int32_t localLength) {
4540596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    (void)ds;
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t minLength;
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 c1, c2;
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t c;
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(outString==NULL || outLength<-1 || localString==NULL || localLength<-1) {
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(outLength<0) {
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        outLength=(int32_t)uprv_strlen(outString);
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(localLength<0) {
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localLength=u_strlen(localString);
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    minLength= outLength<localLength ? outLength : localLength;
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(minLength>0) {
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=(uint8_t)*outString++;
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(UCHAR_IS_INVARIANT(c)) {
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c1=c;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c1=-1;
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c2=*localString++;
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!UCHAR_IS_INVARIANT(c2)) {
48250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            c2=-2;
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if((c1-=c2)!=0) {
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return c1;
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --minLength;
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* strings start with same prefix, compare lengths */
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return outLength-localLength;
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_CFUNC int32_t
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruuprv_compareInvEbcdic(const UDataSwapper *ds,
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      const char *outString, int32_t outLength,
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      const UChar *localString, int32_t localLength) {
5000596faeddefbf198de137d5e893708495ab1584cFredrik Roubert    (void)ds;
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t minLength;
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 c1, c2;
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint8_t c;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(outString==NULL || outLength<-1 || localString==NULL || localLength<-1) {
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(outLength<0) {
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        outLength=(int32_t)uprv_strlen(outString);
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(localLength<0) {
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        localLength=u_strlen(localString);
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    minLength= outLength<localLength ? outLength : localLength;
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(minLength>0) {
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=(uint8_t)*outString++;
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(c==0) {
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c1=0;
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if((c1=asciiFromEbcdic[c])!=0 && UCHAR_IS_INVARIANT(c1)) {
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /* c1 is set */
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            c1=-1;
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c2=*localString++;
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!UCHAR_IS_INVARIANT(c2)) {
53050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            c2=-2;
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if((c1-=c2)!=0) {
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return c1;
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --minLength;
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* strings start with same prefix, compare lengths */
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return outLength-localLength;
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
54350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
54450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI int32_t U_EXPORT2
54550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehouprv_compareInvEbcdicAsAscii(const char *s1, const char *s2) {
54650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t c1, c2;
54750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
54850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    for(;; ++s1, ++s2) {
54950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        c1=(uint8_t)*s1;
55050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        c2=(uint8_t)*s2;
55150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if(c1!=c2) {
55250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(c1!=0 && ((c1=asciiFromEbcdic[c1])==0 || !UCHAR_IS_INVARIANT(c1))) {
55350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                c1=-(int32_t)(uint8_t)*s1;
55450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
55550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if(c2!=0 && ((c2=asciiFromEbcdic[c2])==0 || !UCHAR_IS_INVARIANT(c2))) {
55650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                c2=-(int32_t)(uint8_t)*s2;
55750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
55850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return c1-c2;
55950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        } else if(c1==0) {
56050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return 0;
56150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
56250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
56350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
56427f654740f2a26ad62a5c155af9199af9e69b889claireho
565b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_CAPI char U_EXPORT2
566b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehouprv_ebcdicToLowercaseAscii(char c) {
567b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return (char)lowercaseAsciiFromEbcdic[(uint8_t)c];
568b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
56927f654740f2a26ad62a5c155af9199af9e69b889claireho
57027f654740f2a26ad62a5c155af9199af9e69b889clairehoU_INTERNAL uint8_t* U_EXPORT2
57127f654740f2a26ad62a5c155af9199af9e69b889clairehouprv_aestrncpy(uint8_t *dst, const uint8_t *src, int32_t n)
57227f654740f2a26ad62a5c155af9199af9e69b889claireho{
57327f654740f2a26ad62a5c155af9199af9e69b889claireho  uint8_t *orig_dst = dst;
57427f654740f2a26ad62a5c155af9199af9e69b889claireho
57527f654740f2a26ad62a5c155af9199af9e69b889claireho  if(n==-1) {
576ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    n = static_cast<int32_t>(uprv_strlen((const char*)src)+1); /* copy NUL */
57727f654740f2a26ad62a5c155af9199af9e69b889claireho  }
57827f654740f2a26ad62a5c155af9199af9e69b889claireho  /* copy non-null */
57927f654740f2a26ad62a5c155af9199af9e69b889claireho  while(*src && n>0) {
58027f654740f2a26ad62a5c155af9199af9e69b889claireho    *(dst++) = asciiFromEbcdic[*(src++)];
58127f654740f2a26ad62a5c155af9199af9e69b889claireho    n--;
58227f654740f2a26ad62a5c155af9199af9e69b889claireho  }
58327f654740f2a26ad62a5c155af9199af9e69b889claireho  /* pad */
58427f654740f2a26ad62a5c155af9199af9e69b889claireho  while(n>0) {
58527f654740f2a26ad62a5c155af9199af9e69b889claireho    *(dst++) = 0;
58627f654740f2a26ad62a5c155af9199af9e69b889claireho    n--;
58727f654740f2a26ad62a5c155af9199af9e69b889claireho  }
58827f654740f2a26ad62a5c155af9199af9e69b889claireho  return orig_dst;
58927f654740f2a26ad62a5c155af9199af9e69b889claireho}
59027f654740f2a26ad62a5c155af9199af9e69b889claireho
59127f654740f2a26ad62a5c155af9199af9e69b889clairehoU_INTERNAL uint8_t* U_EXPORT2
59227f654740f2a26ad62a5c155af9199af9e69b889clairehouprv_eastrncpy(uint8_t *dst, const uint8_t *src, int32_t n)
59327f654740f2a26ad62a5c155af9199af9e69b889claireho{
59427f654740f2a26ad62a5c155af9199af9e69b889claireho  uint8_t *orig_dst = dst;
59527f654740f2a26ad62a5c155af9199af9e69b889claireho
59627f654740f2a26ad62a5c155af9199af9e69b889claireho  if(n==-1) {
597ffdc27edd5503111189fc11165c5a11289a71f79Fredrik Roubert    n = static_cast<int32_t>(uprv_strlen((const char*)src)+1); /* copy NUL */
59827f654740f2a26ad62a5c155af9199af9e69b889claireho  }
59927f654740f2a26ad62a5c155af9199af9e69b889claireho  /* copy non-null */
60027f654740f2a26ad62a5c155af9199af9e69b889claireho  while(*src && n>0) {
60127f654740f2a26ad62a5c155af9199af9e69b889claireho    char ch = ebcdicFromAscii[*(src++)];
60227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(ch == 0) {
60327f654740f2a26ad62a5c155af9199af9e69b889claireho      ch = ebcdicFromAscii[0x3f]; /* questionmark (subchar) */
60427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
60527f654740f2a26ad62a5c155af9199af9e69b889claireho    *(dst++) = ch;
60627f654740f2a26ad62a5c155af9199af9e69b889claireho    n--;
60727f654740f2a26ad62a5c155af9199af9e69b889claireho  }
60827f654740f2a26ad62a5c155af9199af9e69b889claireho  /* pad */
60927f654740f2a26ad62a5c155af9199af9e69b889claireho  while(n>0) {
61027f654740f2a26ad62a5c155af9199af9e69b889claireho    *(dst++) = 0;
61127f654740f2a26ad62a5c155af9199af9e69b889claireho    n--;
61227f654740f2a26ad62a5c155af9199af9e69b889claireho  }
61327f654740f2a26ad62a5c155af9199af9e69b889claireho  return orig_dst;
61427f654740f2a26ad62a5c155af9199af9e69b889claireho}
61527f654740f2a26ad62a5c155af9199af9e69b889claireho
616