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