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