]> git.saurik.com Git - apple/icu.git/blame_incremental - icuSources/tools/toolutil/package.h
ICU-66108.tar.gz
[apple/icu.git] / icuSources / tools / toolutil / package.h
... / ...
CommitLineData
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) 2005-2014, International Business Machines
7* Corporation and others. All Rights Reserved.
8*
9*******************************************************************************
10* file name: package.h
11* encoding: UTF-8
12* tab size: 8 (not used)
13* indentation:4
14*
15* created on: 2005aug25
16* created by: Markus W. Scherer
17*
18* Read, modify, and write ICU .dat data package files.
19*/
20
21#ifndef __PACKAGE_H__
22#define __PACKAGE_H__
23
24#include "unicode/utypes.h"
25
26#include <stdio.h>
27
28// .dat package file representation ---------------------------------------- ***
29
30#define STRING_STORE_SIZE 120000
31#define MAX_PKG_NAME_LENGTH 64
32
33typedef void CheckDependency(void *context, const char *itemName, const char *targetName);
34
35U_NAMESPACE_BEGIN
36
37struct Item {
38 char *name;
39 uint8_t *data;
40 int32_t length;
41 UBool isDataOwned;
42 char type;
43};
44
45class U_TOOLUTIL_API Package {
46public:
47 /*
48 * Constructor.
49 * Prepare this object for a new, empty package.
50 */
51 Package();
52
53 /* Destructor. */
54 ~Package();
55
56 /**
57 * Uses the prefix of the first entry of the package in readPackage(),
58 * rather than the package basename.
59 */
60 void setAutoPrefix() { doAutoPrefix=TRUE; }
61 /**
62 * Same as setAutoPrefix(), plus the prefix must end with the platform type letter.
63 */
64 void setAutoPrefixWithType() {
65 doAutoPrefix=TRUE;
66 prefixEndsWithType=TRUE;
67 }
68 void setPrefix(const char *p);
69
70 /*
71 * Read an existing .dat package file.
72 * The header and item name strings are swapped into this object,
73 * but the items are left unswapped.
74 */
75 void readPackage(const char *filename);
76 /*
77 * Write a .dat package file with the items in this object.
78 * Swap all pieces to the desired output platform properties.
79 * The package becomes unusable:
80 * The item names are swapped and sorted in the outCharset rather than the local one.
81 * Also, the items themselves are swapped in-place
82 */
83 void writePackage(const char *filename, char outType, const char *comment);
84
85 /*
86 * Return the input data type letter (l, b, or e).
87 */
88 char getInType();
89
90 // find the item in items[], return the non-negative index if found, else the binary-not of the insertion point
91 int32_t findItem(const char *name, int32_t length=-1) const;
92
93 /*
94 * Set internal state for following calls to findNextItem() which will return
95 * indexes for items whose names match the pattern.
96 */
97 void findItems(const char *pattern);
98 int32_t findNextItem();
99 /*
100 * Set the match mode for findItems() & findNextItem().
101 * @param mode 0=default
102 * MATCH_NOSLASH * does not match a '/'
103 */
104 void setMatchMode(uint32_t mode);
105
106 enum {
107 MATCH_NOSLASH=1
108 };
109
110 void addItem(const char *name);
111 void addItem(const char *name, uint8_t *data, int32_t length, UBool isDataOwned, char type);
112 void addFile(const char *filesPath, const char *name);
113 void addItems(const Package &listPkg);
114
115 void removeItem(int32_t itemIndex);
116 void removeItems(const char *pattern);
117 void removeItems(const Package &listPkg);
118
119 /* The extractItem() functions accept outputType=0 to mean "don't swap the item". */
120 void extractItem(const char *filesPath, int32_t itemIndex, char outType);
121 void extractItems(const char *filesPath, const char *pattern, char outType);
122 void extractItems(const char *filesPath, const Package &listPkg, char outType);
123
124 /* This variant extracts an item to a specific filename. */
125 void extractItem(const char *filesPath, const char *outName, int32_t itemIndex, char outType);
126
127 int32_t getItemCount() const;
128 const Item *getItem(int32_t idx) const;
129
130 /*
131 * Check dependencies and return TRUE if all dependencies are fulfilled.
132 */
133 UBool checkDependencies();
134
135 /*
136 * Enumerate all the dependencies and give the results to context and call CheckDependency callback
137 * @param context user context (will be passed to check function)
138 * @param check will be called with context and any missing items
139 */
140 void enumDependencies(void *context, CheckDependency check);
141
142private:
143 void enumDependencies(Item *pItem, void *context, CheckDependency check);
144
145 /**
146 * Default CheckDependency function used by checkDependencies()
147 */
148 static void checkDependency(void *context, const char *itemName, const char *targetName);
149
150 /*
151 * Allocate a string in inStrings or outStrings.
152 * The length does not include the terminating NUL.
153 */
154 char *allocString(UBool in, int32_t length);
155
156 void sortItems();
157
158 // data fields
159 char inPkgName[MAX_PKG_NAME_LENGTH];
160 char pkgPrefix[MAX_PKG_NAME_LENGTH];
161
162 uint8_t *inData;
163 uint8_t header[1024];
164 int32_t inLength, headerLength;
165 uint8_t inCharset;
166 UBool inIsBigEndian;
167 UBool doAutoPrefix;
168 UBool prefixEndsWithType;
169
170 int32_t itemCount;
171 int32_t itemMax;
172 Item *items;
173
174 int32_t inStringTop, outStringTop;
175 char inStrings[STRING_STORE_SIZE], outStrings[STRING_STORE_SIZE];
176
177 // match mode for findItems(pattern) and findNextItem()
178 uint32_t matchMode;
179
180 // state for findItems(pattern) and findNextItem()
181 const char *findPrefix, *findSuffix;
182 int32_t findPrefixLength, findSuffixLength;
183 int32_t findNextIndex;
184
185 // state for checkDependencies()
186 UBool isMissingItems;
187
188 /**
189 * Grow itemMax to new value
190 */
191 void setItemCapacity(int32_t max);
192
193 /**
194 * Grow itemMax to at least itemCount+1
195 */
196 void ensureItemCapacity();
197};
198
199U_NAMESPACE_END
200
201#endif
202
203