OLD | NEW |
1 /* | 1 /* |
2 ******************************************************************************* | 2 ******************************************************************************* |
3 * | 3 * |
4 * Copyright (C) 2009-2012, International Business Machines | 4 * Copyright (C) 2009-2014, International Business Machines |
5 * Corporation and others. All Rights Reserved. | 5 * Corporation and others. All Rights Reserved. |
6 * | 6 * |
7 ******************************************************************************* | 7 ******************************************************************************* |
8 * file name: gennorm2.cpp | 8 * file name: gennorm2.cpp |
9 * encoding: US-ASCII | 9 * encoding: US-ASCII |
10 * tab size: 8 (not used) | 10 * tab size: 8 (not used) |
11 * indentation:4 | 11 * indentation:4 |
12 * | 12 * |
13 * created on: 2009nov25 | 13 * created on: 2009nov25 |
14 * created by: Markus W. Scherer | 14 * created by: Markus W. Scherer |
(...skipping 16 matching lines...) Expand all Loading... |
31 #include "charstr.h" | 31 #include "charstr.h" |
32 #include "normalizer2impl.h" | 32 #include "normalizer2impl.h" |
33 #include "toolutil.h" | 33 #include "toolutil.h" |
34 #include "uoptions.h" | 34 #include "uoptions.h" |
35 #include "uparse.h" | 35 #include "uparse.h" |
36 | 36 |
37 #if UCONFIG_NO_NORMALIZATION | 37 #if UCONFIG_NO_NORMALIZATION |
38 #include "unewdata.h" | 38 #include "unewdata.h" |
39 #endif | 39 #endif |
40 | 40 |
41 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) | |
42 | |
43 U_NAMESPACE_BEGIN | 41 U_NAMESPACE_BEGIN |
44 | 42 |
45 UBool beVerbose=FALSE, haveCopyright=TRUE; | 43 UBool beVerbose=FALSE, haveCopyright=TRUE; |
46 | 44 |
47 U_DEFINE_LOCAL_OPEN_POINTER(LocalStdioFilePointer, FILE, fclose); | 45 U_DEFINE_LOCAL_OPEN_POINTER(LocalStdioFilePointer, FILE, fclose); |
48 | 46 |
49 #if !UCONFIG_NO_NORMALIZATION | 47 #if !UCONFIG_NO_NORMALIZATION |
50 void parseFile(FILE *f, Normalizer2DataBuilder &builder); | 48 void parseFile(FILE *f, Normalizer2DataBuilder &builder); |
51 #endif | 49 #endif |
52 | 50 |
53 /* -------------------------------------------------------------------------- */ | 51 /* -------------------------------------------------------------------------- */ |
54 | 52 |
55 enum { | 53 enum { |
56 HELP_H, | 54 HELP_H, |
57 HELP_QUESTION_MARK, | 55 HELP_QUESTION_MARK, |
58 VERBOSE, | 56 VERBOSE, |
59 COPYRIGHT, | 57 COPYRIGHT, |
60 SOURCEDIR, | 58 SOURCEDIR, |
61 OUTPUT_FILENAME, | 59 OUTPUT_FILENAME, |
62 UNICODE_VERSION, | 60 UNICODE_VERSION, |
| 61 WRITE_C_SOURCE, |
63 OPT_FAST | 62 OPT_FAST |
64 }; | 63 }; |
65 | 64 |
66 static UOption options[]={ | 65 static UOption options[]={ |
67 UOPTION_HELP_H, | 66 UOPTION_HELP_H, |
68 UOPTION_HELP_QUESTION_MARK, | 67 UOPTION_HELP_QUESTION_MARK, |
69 UOPTION_VERBOSE, | 68 UOPTION_VERBOSE, |
70 UOPTION_COPYRIGHT, | 69 UOPTION_COPYRIGHT, |
71 UOPTION_SOURCEDIR, | 70 UOPTION_SOURCEDIR, |
72 UOPTION_DEF("output", 'o', UOPT_REQUIRES_ARG), | 71 UOPTION_DEF("output", 'o', UOPT_REQUIRES_ARG), |
73 UOPTION_DEF("unicode", 'u', UOPT_REQUIRES_ARG), | 72 UOPTION_DEF("unicode", 'u', UOPT_REQUIRES_ARG), |
| 73 UOPTION_DEF("csource", '\1', UOPT_NO_ARG), |
74 UOPTION_DEF("fast", '\1', UOPT_NO_ARG) | 74 UOPTION_DEF("fast", '\1', UOPT_NO_ARG) |
75 }; | 75 }; |
76 | 76 |
77 extern "C" int | 77 extern "C" int |
78 main(int argc, char* argv[]) { | 78 main(int argc, char* argv[]) { |
79 U_MAIN_INIT_ARGS(argc, argv); | 79 U_MAIN_INIT_ARGS(argc, argv); |
80 | 80 |
81 /* preset then read command line options */ | 81 /* preset then read command line options */ |
82 options[SOURCEDIR].value=""; | 82 options[SOURCEDIR].value=""; |
83 argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[HELP_H]), option
s); | 83 argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[HELP_H]), option
s); |
(...skipping 11 matching lines...) Expand all Loading... |
95 options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur | 95 options[HELP_H].doesOccur || options[HELP_QUESTION_MARK].doesOccur |
96 ) { | 96 ) { |
97 /* | 97 /* |
98 * Broken into chunks because the C89 standard says the minimum | 98 * Broken into chunks because the C89 standard says the minimum |
99 * required supported string length is 509 bytes. | 99 * required supported string length is 509 bytes. |
100 */ | 100 */ |
101 fprintf(stderr, | 101 fprintf(stderr, |
102 "Usage: %s [-options] infiles+ -o outputfilename\n" | 102 "Usage: %s [-options] infiles+ -o outputfilename\n" |
103 "\n" | 103 "\n" |
104 "Reads the infiles with normalization data and\n" | 104 "Reads the infiles with normalization data and\n" |
105 "creates a binary file (outputfilename) with the data.\n" | 105 "creates a binary or C source file (outputfilename) with the data.\n
" |
106 "\n", | 106 "\n", |
107 argv[0]); | 107 argv[0]); |
108 fprintf(stderr, | 108 fprintf(stderr, |
109 "Options:\n" | 109 "Options:\n" |
110 "\t-h or -? or --help this usage text\n" | 110 "\t-h or -? or --help this usage text\n" |
111 "\t-v or --verbose verbose output\n" | 111 "\t-v or --verbose verbose output\n" |
112 "\t-c or --copyright include a copyright notice\n" | 112 "\t-c or --copyright include a copyright notice\n" |
113 "\t-u or --unicode Unicode version, followed by the version like
5.2.0\n"); | 113 "\t-u or --unicode Unicode version, followed by the version like
5.2.0\n"); |
114 fprintf(stderr, | 114 fprintf(stderr, |
115 "\t-s or --sourcedir source directory, followed by the path\n" | 115 "\t-s or --sourcedir source directory, followed by the path\n" |
116 "\t-o or --output output filename\n"); | 116 "\t-o or --output output filename\n" |
| 117 "\t --csource writes a C source file with initializers\n"); |
117 fprintf(stderr, | 118 fprintf(stderr, |
118 "\t --fast optimize the .nrm file for fast normalization
,\n" | 119 "\t --fast optimize the data for fast normalization,\n" |
119 "\t which might increase its size (Writes fully
decomposed\n" | 120 "\t which might increase its size (Writes fully
decomposed\n" |
120 "\t regular mappings instead of delta mappings.\n
" | 121 "\t regular mappings instead of delta mappings.\n
" |
121 "\t You should measure the runtime speed to make
sure that\n" | 122 "\t You should measure the runtime speed to make
sure that\n" |
122 "\t this is a good trade-off.)\n"); | 123 "\t this is a good trade-off.)\n"); |
123 return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; | 124 return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; |
124 } | 125 } |
125 | 126 |
126 beVerbose=options[VERBOSE].doesOccur; | 127 beVerbose=options[VERBOSE].doesOccur; |
127 haveCopyright=options[COPYRIGHT].doesOccur; | 128 haveCopyright=options[COPYRIGHT].doesOccur; |
128 | 129 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 LocalStdioFilePointer f(fopen(filename.data(), "r")); | 170 LocalStdioFilePointer f(fopen(filename.data(), "r")); |
170 if(f==NULL) { | 171 if(f==NULL) { |
171 fprintf(stderr, "gennorm2 error: unable to open %s\n", filename.data
()); | 172 fprintf(stderr, "gennorm2 error: unable to open %s\n", filename.data
()); |
172 exit(U_FILE_ACCESS_ERROR); | 173 exit(U_FILE_ACCESS_ERROR); |
173 } | 174 } |
174 builder->setOverrideHandling(Normalizer2DataBuilder::OVERRIDE_PREVIOUS); | 175 builder->setOverrideHandling(Normalizer2DataBuilder::OVERRIDE_PREVIOUS); |
175 parseFile(f.getAlias(), *builder); | 176 parseFile(f.getAlias(), *builder); |
176 filename.truncate(pathLength); | 177 filename.truncate(pathLength); |
177 } | 178 } |
178 | 179 |
179 builder->writeBinaryFile(options[OUTPUT_FILENAME].value); | 180 if(options[WRITE_C_SOURCE].doesOccur) { |
| 181 builder->writeCSourceFile(options[OUTPUT_FILENAME].value); |
| 182 } else { |
| 183 builder->writeBinaryFile(options[OUTPUT_FILENAME].value); |
| 184 } |
180 | 185 |
181 return errorCode.get(); | 186 return errorCode.get(); |
182 | 187 |
183 #endif | 188 #endif |
184 } | 189 } |
185 | 190 |
186 #if !UCONFIG_NO_NORMALIZATION | 191 #if !UCONFIG_NO_NORMALIZATION |
187 | 192 |
188 void parseFile(FILE *f, Normalizer2DataBuilder &builder) { | 193 void parseFile(FILE *f, Normalizer2DataBuilder &builder) { |
189 IcuToolErrorCode errorCode("gennorm2/parseFile()"); | 194 IcuToolErrorCode errorCode("gennorm2/parseFile()"); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 fprintf(stderr, "gennorm2 error: parsing remove-mapping %s\n", l
ine); | 237 fprintf(stderr, "gennorm2 error: parsing remove-mapping %s\n", l
ine); |
233 exit(U_PARSE_ERROR); | 238 exit(U_PARSE_ERROR); |
234 } | 239 } |
235 for(UChar32 c=(UChar32)startCP; c<=(UChar32)endCP; ++c) { | 240 for(UChar32 c=(UChar32)startCP; c<=(UChar32)endCP; ++c) { |
236 builder.removeMapping(c); | 241 builder.removeMapping(c); |
237 } | 242 } |
238 continue; | 243 continue; |
239 } | 244 } |
240 if(*delimiter=='=' || *delimiter=='>') { | 245 if(*delimiter=='=' || *delimiter=='>') { |
241 UChar uchars[Normalizer2Impl::MAPPING_LENGTH_MASK]; | 246 UChar uchars[Normalizer2Impl::MAPPING_LENGTH_MASK]; |
242 int32_t length=u_parseString(delimiter+1, uchars, LENGTHOF(uchars),
NULL, errorCode); | 247 int32_t length=u_parseString(delimiter+1, uchars, UPRV_LENGTHOF(ucha
rs), NULL, errorCode); |
243 if(errorCode.isFailure()) { | 248 if(errorCode.isFailure()) { |
244 fprintf(stderr, "gennorm2 error: parsing mapping string from %s\
n", line); | 249 fprintf(stderr, "gennorm2 error: parsing mapping string from %s\
n", line); |
245 exit(errorCode.reset()); | 250 exit(errorCode.reset()); |
246 } | 251 } |
247 UnicodeString mapping(FALSE, uchars, length); | 252 UnicodeString mapping(FALSE, uchars, length); |
248 if(*delimiter=='=') { | 253 if(*delimiter=='=') { |
249 if(rangeLength!=1) { | 254 if(rangeLength!=1) { |
250 fprintf(stderr, | 255 fprintf(stderr, |
251 "gennorm2 error: round-trip mapping for more than 1
code point on %s\n", | 256 "gennorm2 error: round-trip mapping for more than 1
code point on %s\n", |
252 line); | 257 line); |
(...skipping 17 matching lines...) Expand all Loading... |
270 U_NAMESPACE_END | 275 U_NAMESPACE_END |
271 | 276 |
272 /* | 277 /* |
273 * Hey, Emacs, please set the following: | 278 * Hey, Emacs, please set the following: |
274 * | 279 * |
275 * Local Variables: | 280 * Local Variables: |
276 * indent-tabs-mode: nil | 281 * indent-tabs-mode: nil |
277 * End: | 282 * End: |
278 * | 283 * |
279 */ | 284 */ |
OLD | NEW |