| // © 2016 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| /* |
| ****************************************************************************** |
| * |
| * Copyright (C) 1999-2011, 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; |
| /** |
| * Variable-length array declared with length 1 to disable bounds checkers. |
| * The actual array length is in the count field. |
| */ |
| UDataOffsetTOCEntry entry[1]; |
| } 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); |
| |
| U_CDECL_BEGIN |
| /* |
| * "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 * |
| (U_CALLCONV * LookupFn)(const UDataMemory *pData, |
| const char *tocEntryName, |
| int32_t *pLength, |
| UErrorCode *pErrorCode); |
| |
| typedef uint32_t |
| (U_CALLCONV * NumEntriesFn)(const UDataMemory *pData); |
| |
| U_CDECL_END |
| |
| 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 |