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