1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
// © 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 interface involved.
*
* These functions are part of the ICU internal implementation, and
* are not intended 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 {
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
|