164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// Copyright (C) 2016 and later: Unicode, Inc. and others.
264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
6fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*   Copyright (C) 2003-2014, International Business Machines
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   file name:  udataswp.h
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   encoding:   US-ASCII
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   tab size:   8 (not used)
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   indentation:4
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created on: 2003jun05
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created by: Markus W. Scherer
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Definitions for ICU data transformations for different platforms,
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   changing between big- and little-endian data and/or between
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   charset families (ASCII<->EBCDIC).
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __UDATASWP_H__
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __UDATASWP_H__
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdarg.h>
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* forward declaration */
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CDECL_BEGIN
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct UDataSwapper;
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct UDataSwapper UDataSwapper;
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Function type for data transformation.
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Transforms data, or just returns the length of the data if
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the input length is -1.
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Swap functions assume that their data pointers are aligned properly.
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Quick implementation outline:
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * (best to copy and adapt and existing swapper implementation)
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * check that the data looks like the expected format
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * if(length<0) {
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   preflight:
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   never dereference outData
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   read inData and determine the data size
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   assume that inData is long enough for this
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * } else {
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   outData can be NULL if length==0
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   inData==outData (in-place swapping) possible but not required!
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   verify that length>=(actual size)
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   if there is a chance that not every byte up to size is reached
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *     due to padding etc.:
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   if(inData!=outData) {
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *     memcpy(outData, inData, actual size);
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   }
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   swap contents
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * }
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * return actual size
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Further implementation notes:
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * - read integers from inData before swapping them
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   because in-place swapping can make them unreadable
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * - compareInvChars compares a local Unicode string with already-swapped
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   output charset strings
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param ds Pointer to UDataSwapper containing global data about the
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           transformation and function pointers for handling primitive
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *           types.
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param inData Pointer to the input data to be transformed or examined.
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param length Length of the data, counting bytes. May be -1 for preflighting.
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *               If length>=0, then transform the data.
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *               If length==-1, then only determine the length of the data.
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *               The length cannot be determined from the data itself for all
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *               types of data (e.g., not for simple arrays of integers).
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param outData Pointer to the output data buffer.
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *                If length>=0 (transformation), then the output buffer must
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *                have a capacity of at least length.
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *                If length==-1, then outData will not be used and can be NULL.
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param pErrorCode ICU UErrorCode parameter, must not be NULL and must
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *                   fulfill U_SUCCESS on input.
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The actual length of the data.
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see UDataSwapper
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef int32_t U_CALLCONV
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDataSwapFn(const UDataSwapper *ds,
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const void *inData, int32_t length, void *outData,
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UErrorCode *pErrorCode);
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert one uint16_t from input to platform endianness.
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef uint16_t U_CALLCONV
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDataReadUInt16(uint16_t x);
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert one uint32_t from input to platform endianness.
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef uint32_t U_CALLCONV
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDataReadUInt32(uint32_t x);
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert one uint16_t from platform to input endianness.
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef void U_CALLCONV
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDataWriteUInt16(uint16_t *p, uint16_t x);
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert one uint32_t from platform to input endianness.
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef void U_CALLCONV
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDataWriteUInt32(uint32_t *p, uint32_t x);
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Compare invariant-character strings, one in the output data and the
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * other one caller-provided in Unicode.
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * An output data string is compared because strings are usually swapped
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * before the rest of the data, to allow for sorting of string tables
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * according to the output charset.
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * You can use -1 for the length parameters of NUL-terminated strings as usual.
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Returns Unicode code point order for invariant characters.
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef int32_t U_CALLCONV
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDataCompareInvChars(const UDataSwapper *ds,
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const char *outString, int32_t outLength,
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const UChar *localString, int32_t localLength);
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Function for message output when an error occurs during data swapping.
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * A format string and variable number of arguments are passed
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * like for vprintf().
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param context A function-specific context pointer.
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param fmt The format string.
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param args The arguments for format string inserts.
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef void U_CALLCONV
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDataPrintError(void *context, const char *fmt, va_list args);
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct UDataSwapper {
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Input endianness. @internal ICU 2.8 */
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool inIsBigEndian;
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Input charset family. @see U_CHARSET_FAMILY @internal ICU 2.8 */
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t inCharset;
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Output endianness. @internal ICU 2.8 */
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UBool outIsBigEndian;
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Output charset family. @see U_CHARSET_FAMILY @internal ICU 2.8 */
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uint8_t outCharset;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* basic functions for reading data values */
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Convert one uint16_t from input to platform endianness. @internal ICU 2.8 */
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataReadUInt16 *readUInt16;
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Convert one uint32_t from input to platform endianness. @internal ICU 2.8 */
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataReadUInt32 *readUInt32;
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Compare an invariant-character output string with a local one. @internal ICU 2.8 */
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataCompareInvChars *compareInvChars;
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* basic functions for writing data values */
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Convert one uint16_t from platform to input endianness. @internal ICU 2.8 */
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataWriteUInt16 *writeUInt16;
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Convert one uint32_t from platform to input endianness. @internal ICU 2.8 */
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataWriteUInt32 *writeUInt32;
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* basic functions for data transformations */
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Transform an array of 16-bit integers. @internal ICU 2.8 */
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataSwapFn *swapArray16;
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Transform an array of 32-bit integers. @internal ICU 2.8 */
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataSwapFn *swapArray32;
183fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    /** Transform an array of 64-bit integers. @internal ICU 53 */
184fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UDataSwapFn *swapArray64;
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Transform an invariant-character string. @internal ICU 2.8 */
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataSwapFn *swapInvChars;
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /**
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Function for message output when an error occurs during data swapping.
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * Can be NULL.
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     * @internal ICU 2.8
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     */
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UDataPrintError *printError;
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /** Context pointer for printError. @internal ICU 2.8 */
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void *printErrorContext;
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CDECL_END
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UDataSwapper * U_EXPORT2
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_openSwapper(UBool inIsBigEndian, uint8_t inCharset,
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  UBool outIsBigEndian, uint8_t outCharset,
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  UErrorCode *pErrorCode);
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Open a UDataSwapper for the given input data and the specified output
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * characteristics.
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Values of -1 for any of the characteristics mean the local platform's
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * characteristics.
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @see udata_swap
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UDataSwapper * U_EXPORT2
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_openSwapperForInputData(const void *data, int32_t length,
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              UBool outIsBigEndian, uint8_t outCharset,
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                              UErrorCode *pErrorCode);
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_closeSwapper(UDataSwapper *ds);
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Read the beginning of an ICU data piece, recognize magic bytes,
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * swap the structure.
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set a U_UNSUPPORTED_ERROR if it does not look like an ICU data piece.
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The size of the data header, in bytes.
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_swapDataHeader(const UDataSwapper *ds,
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const void *inData, int32_t length, void *outData,
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     UErrorCode *pErrorCode);
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert one int16_t from input to platform endianness.
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int16_t U_EXPORT2
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_readInt16(const UDataSwapper *ds, int16_t x);
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert one int32_t from input to platform endianness.
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_readInt32(const UDataSwapper *ds, int32_t x);
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Swap a block of invariant, NUL-terminated strings, but not padding
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * bytes after the last string.
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_swapInvStringBlock(const UDataSwapper *ds,
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         const void *inData, int32_t length, void *outData,
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         UErrorCode *pErrorCode);
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_printError(const UDataSwapper *ds,
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 const char *fmt,
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 ...);
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* internal exports from putil.c -------------------------------------------- */
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* declared here to keep them out of the public putil.h */
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Swap invariant char * strings ASCII->EBCDIC.
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprv_ebcdicFromAscii(const UDataSwapper *ds,
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const void *inData, int32_t length, void *outData,
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     UErrorCode *pErrorCode);
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copy invariant ASCII char * strings and verify they are invariant.
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprv_copyAscii(const UDataSwapper *ds,
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               const void *inData, int32_t length, void *outData,
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UErrorCode *pErrorCode);
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Swap invariant char * strings EBCDIC->ASCII.
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprv_asciiFromEbcdic(const UDataSwapper *ds,
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const void *inData, int32_t length, void *outData,
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     UErrorCode *pErrorCode);
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Copy invariant EBCDIC char * strings and verify they are invariant.
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprv_copyEbcdic(const UDataSwapper *ds,
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                const void *inData, int32_t length, void *outData,
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UErrorCode *pErrorCode);
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Compare ASCII invariant char * with Unicode invariant UChar *
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprv_compareInvAscii(const UDataSwapper *ds,
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const char *outString, int32_t outLength,
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                     const UChar *localString, int32_t localLength);
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Compare EBCDIC invariant char * with Unicode invariant UChar *
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprv_compareInvEbcdic(const UDataSwapper *ds,
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      const char *outString, int32_t outLength,
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      const UChar *localString, int32_t localLength);
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
32364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert/**
32464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert * \def uprv_compareInvWithUChar
32564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert * Compare an invariant-character strings with a UChar string
32664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert * @internal
32764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert */
32864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert#if U_CHARSET_FAMILY==U_ASCII_FAMILY
32964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert#   define uprv_compareInvWithUChar uprv_compareInvAscii
33064339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert#elif U_CHARSET_FAMILY==U_EBCDIC_FAMILY
33164339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert#   define uprv_compareInvWithUChar uprv_compareInvEbcdic
33264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert#else
33364339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert#   error Unknown charset family!
33464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert#endif
33564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert
33664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* material... -------------------------------------------------------------- */
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* udata.h */
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Public API function in udata.c
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Same as udata_openChoice() but automatically swaps the data.
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * isAcceptable, if not NULL, may accept data with endianness and charset family
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * different from the current platform's properties.
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * If the data is acceptable and the platform properties do not match, then
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the swap function is called to swap an allocated version of the data.
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Preflighting may or may not be performed depending on whether the size of
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the loaded data item is known.
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param isAcceptable Same as for udata_openChoice(). May be NULL.
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal ICU 2.8
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UDataMemory * U_EXPORT2
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_openSwap(const char *path, const char *type, const char *name,
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UDataMemoryIsAcceptable *isAcceptable, void *isAcceptableContext,
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UDataSwapFn *swap,
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UDataPrintError *printError, void *printErrorContext,
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UErrorCode *pErrorCode);
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
368