1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru****************************************************************************** 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho* Copyright (C) 1999-2011, International Business Machines 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************/ 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*---------------------------------------------------------------------------------- 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * UCommonData An abstract interface for dealing with ICU Common Data Files. 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ICU Common Data Files are a grouping of a number of individual 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * data items (resources, converters, tables, anything) into a 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * single file or dll. The combined format includes a table of 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * contents for locating the individual items by name. 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Two formats for the table of contents are supported, which is 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * why there is an abstract inteface involved. 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * These functions are part of the ICU internal implementation, and 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * are not inteded to be used directly by applications. 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __UCMNDATA_H__ 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __UCMNDATA_H__ 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/udata.h" 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "umapfile.h" 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define COMMON_DATA_NAME U_ICUDATA_NAME 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct { 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint16_t headerSize; 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint8_t magic1; 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint8_t magic2; 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} MappedData; 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct { 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru MappedData dataHeader; 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDataInfo info; 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} DataHeader; 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct { 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t nameOffset; 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t dataOffset; 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} UDataOffsetTOCEntry; 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct { 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t count; 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDataOffsetTOCEntry entry[2]; /* Actual size of array is from count. */ 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} UDataOffsetTOC; 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Get the header size from a const DataHeader *udh. 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Handles opposite-endian data. 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC uint16_t 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_getHeaderSize(const DataHeader *udh); 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/** 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Get the UDataInfo.size from a const UDataInfo *info. 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Handles opposite-endian data. 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @internal 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC uint16_t 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruudata_getInfoSize(const UDataInfo *info); 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 74b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_CDECL_BEGIN 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * "Virtual" functions for data lookup. 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * To call one, given a UDataMemory *p, the code looks like this: 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * p->vFuncs.Lookup(p, tocEntryName, pErrorCode); 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * (I sure do wish this was written in C++, not C) 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef const DataHeader * 83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho(U_CALLCONV * LookupFn)(const UDataMemory *pData, 84b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const char *tocEntryName, 85b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int32_t *pLength, 86b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho UErrorCode *pErrorCode); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef uint32_t 89b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho(U_CALLCONV * NumEntriesFn)(const UDataMemory *pData); 90b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 91b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoU_CDECL_END 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef struct { 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LookupFn Lookup; 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru NumEntriesFn NumEntries; 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} commonDataFuncs; 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Functions to check whether a UDataMemory refers to memory containing 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * a recognizable header and table of contents a Common Data Format 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * If a valid header and TOC are found, 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * set the CommonDataFuncs function dispatch vector in the UDataMemory 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * to point to the right functions for the TOC type. 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * otherwise 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * set an errorcode. 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 10927f654740f2a26ad62a5c155af9199af9e69b889clairehoU_CFUNC void udata_checkCommonData(UDataMemory *pData, UErrorCode *pErrorCode); 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 112