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