/* ****************************************************************************** * * Copyright (C) 1999-2010, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************/ /*---------------------------------------------------------------------------------- * * UCommonData An abstract interface for dealing with ICU Common Data Files. * ICU Common Data Files are a grouping of a number of individual * data items (resources, converters, tables, anything) into a * single file or dll. The combined format includes a table of * contents for locating the individual items by name. * * Two formats for the table of contents are supported, which is * why there is an abstract inteface involved. * * These functions are part of the ICU internal implementation, and * are not inteded to be used directly by applications. */ #ifndef __UCMNDATA_H__ #define __UCMNDATA_H__ #include "unicode/udata.h" #include "umapfile.h" #define COMMON_DATA_NAME U_ICUDATA_NAME typedef struct { uint16_t headerSize; uint8_t magic1; uint8_t magic2; } MappedData; typedef struct { MappedData dataHeader; UDataInfo info; } DataHeader; typedef struct { DataHeader hdr; char padding[8]; uint32_t count, reserved; /* const struct { const char *const name; const void *const data; } toc[1]; */ int fakeNameAndData[4]; /* TODO: Change this header type from */ /* pointerTOC to OffsetTOC. */ } ICU_Data_Header; typedef struct { uint32_t nameOffset; uint32_t dataOffset; } UDataOffsetTOCEntry; typedef struct { uint32_t count; UDataOffsetTOCEntry entry[2]; /* Actual size of array is from count. */ } UDataOffsetTOC; /** * Get the header size from a const DataHeader *udh. * Handles opposite-endian data. * * @internal */ U_CFUNC uint16_t udata_getHeaderSize(const DataHeader *udh); /** * Get the UDataInfo.size from a const UDataInfo *info. * Handles opposite-endian data. * * @internal */ U_CFUNC uint16_t udata_getInfoSize(const UDataInfo *info); /* * "Virtual" functions for data lookup. * To call one, given a UDataMemory *p, the code looks like this: * p->vFuncs.Lookup(p, tocEntryName, pErrorCode); * (I sure do wish this was written in C++, not C) */ typedef const DataHeader * (* LookupFn)(const UDataMemory *pData, const char *tocEntryName, int32_t *pLength, UErrorCode *pErrorCode); typedef uint32_t (* NumEntriesFn)(const UDataMemory *pData); typedef struct { LookupFn Lookup; NumEntriesFn NumEntries; } commonDataFuncs; /* * Functions to check whether a UDataMemory refers to memory containing * a recognizable header and table of contents a Common Data Format * * If a valid header and TOC are found, * set the CommonDataFuncs function dispatch vector in the UDataMemory * to point to the right functions for the TOC type. * otherwise * set an errorcode. */ U_CFUNC void udata_checkCommonData(UDataMemory *pData, UErrorCode *pErrorCode); #endif