blob: 15c1a6c4537447ccf1e239a31b7331de71cb5de8 [file] [log] [blame]
// © 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