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