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