1 /*
2 *******************************************************************************
3 *
4 *   Copyright (C) 2000-2014, International Business Machines
5 *   Corporation and others.  All Rights Reserved.
6 *
7 *******************************************************************************
8 *
9 * File reslist.h
10 *
11 * Modification History:
12 *
13 *   Date        Name        Description
14 *   02/21/00    weiv        Creation.
15 *******************************************************************************
16 */
17 
18 #ifndef RESLIST_H
19 #define RESLIST_H
20 
21 #define KEY_SPACE_SIZE 65536
22 #define RESLIST_MAX_INT_VECTOR 2048
23 
24 #include "unicode/utypes.h"
25 #include "unicode/ures.h"
26 #include "unicode/ustring.h"
27 #include "uresdata.h"
28 #include "cmemory.h"
29 #include "cstring.h"
30 #include "unewdata.h"
31 #include "ustr.h"
32 
33 U_CDECL_BEGIN
34 
35 typedef struct KeyMapEntry {
36     int32_t oldpos, newpos;
37 } KeyMapEntry;
38 
39 /* Resource bundle root table */
40 struct SRBRoot {
41   struct SResource *fRoot;
42   char *fLocale;
43   int32_t fIndexLength;
44   int32_t fMaxTableLength;
45   UBool noFallback; /* see URES_ATT_NO_FALLBACK */
46   int8_t fStringsForm; /* default STRINGS_UTF16_V1 */
47   UBool fIsPoolBundle;
48 
49   char *fKeys;
50   KeyMapEntry *fKeyMap;
51   int32_t fKeysBottom, fKeysTop;
52   int32_t fKeysCapacity;
53   int32_t fKeysCount;
54   int32_t fLocalKeyLimit; /* key offset < limit fits into URES_TABLE */
55 
56   uint16_t *f16BitUnits;
57   int32_t f16BitUnitsCapacity;
58   int32_t f16BitUnitsLength;
59 
60   const char *fPoolBundleKeys;
61   int32_t fPoolBundleKeysLength;
62   int32_t fPoolBundleKeysCount;
63   int32_t fPoolChecksum;
64 };
65 
66 struct SRBRoot *bundle_open(const struct UString* comment, UBool isPoolBundle, UErrorCode *status);
67 void bundle_write(struct SRBRoot *bundle, const char *outputDir, const char *outputPkg, char *writtenFilename, int writtenFilenameLen, UErrorCode *status);
68 
69 /* write a java resource file */
70 void bundle_write_java(struct SRBRoot *bundle, const char *outputDir, const char* outputEnc, char *writtenFilename,
71                        int writtenFilenameLen, const char* packageName, const char* bundleName, UErrorCode *status);
72 
73 /* write a xml resource file */
74 /* commented by Jing*/
75 /* void bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc,
76                   char *writtenFilename, int writtenFilenameLen,UErrorCode *status); */
77 
78 /* added by Jing*/
79 void bundle_write_xml(struct SRBRoot *bundle, const char *outputDir,const char* outputEnc, const char* rbname,
80                   char *writtenFilename, int writtenFilenameLen, const char* language, const char* package, UErrorCode *status);
81 
82 void bundle_close(struct SRBRoot *bundle, UErrorCode *status);
83 void bundle_setlocale(struct SRBRoot *bundle, UChar *locale, UErrorCode *status);
84 int32_t bundle_addtag(struct SRBRoot *bundle, const char *tag, UErrorCode *status);
85 
86 const char *
87 bundle_getKeyBytes(struct SRBRoot *bundle, int32_t *pLength);
88 
89 int32_t
90 bundle_addKeyBytes(struct SRBRoot *bundle, const char *keyBytes, int32_t length, UErrorCode *status);
91 
92 void
93 bundle_compactKeys(struct SRBRoot *bundle, UErrorCode *status);
94 
95 /* Various resource types */
96 
97 /*
98  * Return a unique pointer to a dummy object,
99  * for use in non-error cases when no resource is to be added to the bundle.
100  * (NULL is used in error cases.)
101  */
102 struct SResource* res_none(void);
103 
104 struct SResTable {
105     uint32_t fCount;
106     int8_t fType;  /* determined by table_write16() for table_preWrite() & table_write() */
107     struct SResource *fFirst;
108     struct SRBRoot *fRoot;
109 };
110 
111 struct SResource* table_open(struct SRBRoot *bundle, const char *tag, const struct UString* comment, UErrorCode *status);
112 void table_add(struct SResource *table, struct SResource *res, int linenumber, UErrorCode *status);
113 
114 struct SResArray {
115     uint32_t fCount;
116     struct SResource *fFirst;
117     struct SResource *fLast;
118 };
119 
120 struct SResource* array_open(struct SRBRoot *bundle, const char *tag, const struct UString* comment, UErrorCode *status);
121 void array_add(struct SResource *array, struct SResource *res, UErrorCode *status);
122 
123 struct SResString {
124     struct SResource *fSame;  /* used for duplicates */
125     UChar *fChars;
126     int32_t fLength;
127     int32_t fSuffixOffset;  /* this string is a suffix of fSame at this offset */
128     int8_t fNumCharsForLength;
129 };
130 
131 struct SResource *string_open(struct SRBRoot *bundle, const char *tag, const UChar *value, int32_t len, const struct UString* comment, UErrorCode *status);
132 
133 struct SResource *alias_open(struct SRBRoot *bundle, const char *tag, UChar *value, int32_t len, const struct UString* comment, UErrorCode *status);
134 
135 struct SResIntVector {
136     uint32_t fCount;
137     uint32_t *fArray;
138 };
139 
140 struct SResource* intvector_open(struct SRBRoot *bundle, const char *tag,  const struct UString* comment, UErrorCode *status);
141 void intvector_add(struct SResource *intvector, int32_t value, UErrorCode *status);
142 
143 struct SResInt {
144     uint32_t fValue;
145 };
146 
147 struct SResource *int_open(struct SRBRoot *bundle, const char *tag, int32_t value, const struct UString* comment, UErrorCode *status);
148 
149 struct SResBinary {
150     uint32_t fLength;
151     uint8_t *fData;
152     char* fFileName; /* file name for binary or import binary tags if any */
153 };
154 
155 struct SResource *bin_open(struct SRBRoot *bundle, const char *tag, uint32_t length, uint8_t *data, const char* fileName, const struct UString* comment, UErrorCode *status);
156 
157 /* Resource place holder */
158 
159 struct SResource {
160     int8_t   fType;     /* nominal type: fRes (when != 0xffffffff) may use subtype */
161     UBool    fWritten;  /* res_write() can exit early */
162     uint32_t fRes;      /* resource item word; 0xffffffff if not known yet */
163     int32_t  fKey;      /* Index into bundle->fKeys; -1 if no key. */
164     int      line;      /* used internally to report duplicate keys in tables */
165     struct SResource *fNext; /*This is for internal chaining while building*/
166     struct UString fComment;
167     union {
168         struct SResTable fTable;
169         struct SResArray fArray;
170         struct SResString fString;
171         struct SResIntVector fIntVector;
172         struct SResInt fIntValue;
173         struct SResBinary fBinaryValue;
174     } u;
175 };
176 
177 const char *
178 res_getKeyString(const struct SRBRoot *bundle, const struct SResource *res, char temp[8]);
179 
180 void res_close(struct SResource *res);
181 
182 void setIncludeCopyright(UBool val);
183 UBool getIncludeCopyright(void);
184 
185 void setFormatVersion(int32_t formatVersion);
186 
187 void setUsePoolBundle(UBool use);
188 
189 /* in wrtxml.cpp */
190 uint32_t computeCRC(char *ptr, uint32_t len, uint32_t lastcrc);
191 
192 U_CDECL_END
193 #endif /* #ifndef RESLIST_H */
194