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