Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(356)

Side by Side Diff: source/tools/makeconv/makeconv.cpp

Issue 1621843002: ICU 56 update step 1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@561
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/tools/makeconv/makeconv.c ('k') | source/tools/makeconv/makeconv.vcxproj » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ******************************************************************************* * 2 ******************************************************************************* *
3 * 3 *
4 * Copyright (C) 1998-2014, International Business Machines 4 * Copyright (C) 1998-2015, International Business Machines
5 * Corporation and others. All Rights Reserved. 5 * Corporation and others. All Rights Reserved.
6 * 6 *
7 ******************************************************************************* * 7 ******************************************************************************* *
8 * 8 *
9 * 9 *
10 * makeconv.c: 10 * makeconv.cpp:
11 * tool creating a binary (compressed) representation of the conversion mapping 11 * tool creating a binary (compressed) representation of the conversion mapping
12 * table (IBM NLTC ucmap format). 12 * table (IBM NLTC ucmap format).
13 * 13 *
14 * 05/04/2000 helena Added fallback mapping into the picture... 14 * 05/04/2000 helena Added fallback mapping into the picture...
15 * 06/29/2000 helena Major rewrite of the callback APIs. 15 * 06/29/2000 helena Major rewrite of the callback APIs.
16 */ 16 */
17 17
18 #include <stdio.h> 18 #include <stdio.h>
19 #include "unicode/putil.h" 19 #include "unicode/putil.h"
20 #include "unicode/ucnv_err.h" 20 #include "unicode/ucnv_err.h"
21 #include "charstr.h"
21 #include "ucnv_bld.h" 22 #include "ucnv_bld.h"
22 #include "ucnv_imp.h" 23 #include "ucnv_imp.h"
23 #include "ucnv_cnv.h" 24 #include "ucnv_cnv.h"
24 #include "cstring.h" 25 #include "cstring.h"
25 #include "cmemory.h" 26 #include "cmemory.h"
26 #include "uinvchar.h" 27 #include "uinvchar.h"
27 #include "filestrm.h" 28 #include "filestrm.h"
28 #include "toolutil.h" 29 #include "toolutil.h"
29 #include "uoptions.h" 30 #include "uoptions.h"
30 #include "unicode/udata.h" 31 #include "unicode/udata.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 data->extData=NULL; 64 data->extData=NULL;
64 } 65 }
65 ucm_close(data->ucm); 66 ucm_close(data->ucm);
66 data->ucm=NULL; 67 data->ucm=NULL;
67 } 68 }
68 } 69 }
69 70
70 /* 71 /*
71 * from ucnvstat.c - static prototypes of data-based converters 72 * from ucnvstat.c - static prototypes of data-based converters
72 */ 73 */
73 extern const UConverterStaticData * ucnv_converterStaticData[UCNV_NUMBER_OF_SUPP ORTED_CONVERTER_TYPES]; 74 U_CAPI const UConverterStaticData * ucnv_converterStaticData[UCNV_NUMBER_OF_SUPP ORTED_CONVERTER_TYPES];
74 75
75 /* 76 /*
76 * Global - verbosity 77 * Global - verbosity
77 */ 78 */
78 UBool VERBOSE = FALSE; 79 UBool VERBOSE = FALSE;
80 UBool QUIET = FALSE;
79 UBool SMALL = FALSE; 81 UBool SMALL = FALSE;
80 UBool IGNORE_SISO_CHECK = FALSE; 82 UBool IGNORE_SISO_CHECK = FALSE;
81 83
82 static void 84 static void
83 createConverter(ConvData *data, const char* converterName, UErrorCode *pErrorCod e); 85 createConverter(ConvData *data, const char* converterName, UErrorCode *pErrorCod e);
84 86
85 /* 87 /*
86 * Set up the UNewData and write the converter.. 88 * Set up the UNewData and write the converter..
87 */ 89 */
88 static void 90 static void
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 169
168 enum { 170 enum {
169 OPT_HELP_H, 171 OPT_HELP_H,
170 OPT_HELP_QUESTION_MARK, 172 OPT_HELP_QUESTION_MARK,
171 OPT_COPYRIGHT, 173 OPT_COPYRIGHT,
172 OPT_VERSION, 174 OPT_VERSION,
173 OPT_DESTDIR, 175 OPT_DESTDIR,
174 OPT_VERBOSE, 176 OPT_VERBOSE,
175 OPT_SMALL, 177 OPT_SMALL,
176 OPT_IGNORE_SISO_CHECK, 178 OPT_IGNORE_SISO_CHECK,
179 OPT_QUIET,
180
177 OPT_COUNT 181 OPT_COUNT
178 }; 182 };
179 183
180 static UOption options[]={ 184 static UOption options[]={
181 UOPTION_HELP_H, 185 UOPTION_HELP_H,
182 UOPTION_HELP_QUESTION_MARK, 186 UOPTION_HELP_QUESTION_MARK,
183 UOPTION_COPYRIGHT, 187 UOPTION_COPYRIGHT,
184 UOPTION_VERSION, 188 UOPTION_VERSION,
185 UOPTION_DESTDIR, 189 UOPTION_DESTDIR,
186 UOPTION_VERBOSE, 190 UOPTION_VERBOSE,
187 { "small", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 }, 191 { "small", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 },
188 { "ignore-siso-check", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 } 192 { "ignore-siso-check", NULL, NULL, NULL, '\1', UOPT_NO_ARG, 0 },
193 UOPTION_QUIET,
189 }; 194 };
190 195
191 int main(int argc, char* argv[]) 196 int main(int argc, char* argv[])
192 { 197 {
193 ConvData data; 198 ConvData data;
194 UErrorCode err = U_ZERO_ERROR, localError;
195 char outFileName[UCNV_MAX_FULL_FILE_NAME_LENGTH];
196 const char* destdir, *arg;
197 size_t destdirlen;
198 char* dot = NULL, *outBasename;
199 char cnvName[UCNV_MAX_FULL_FILE_NAME_LENGTH]; 199 char cnvName[UCNV_MAX_FULL_FILE_NAME_LENGTH];
200 char cnvNameWithPkg[UCNV_MAX_FULL_FILE_NAME_LENGTH];
201 UVersionInfo icuVersion;
202 UBool printFilename;
203
204 err = U_ZERO_ERROR;
205 200
206 U_MAIN_INIT_ARGS(argc, argv); 201 U_MAIN_INIT_ARGS(argc, argv);
207 202
208 /* Set up the ICU version number */ 203 /* Set up the ICU version number */
204 UVersionInfo icuVersion;
209 u_getVersion(icuVersion); 205 u_getVersion(icuVersion);
210 uprv_memcpy(&dataInfo.dataVersion, &icuVersion, sizeof(UVersionInfo)); 206 uprv_memcpy(&dataInfo.dataVersion, &icuVersion, sizeof(UVersionInfo));
211 207
212 /* preset then read command line options */ 208 /* preset then read command line options */
213 options[OPT_DESTDIR].value=u_getDataDirectory(); 209 options[OPT_DESTDIR].value=u_getDataDirectory();
214 argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options); 210 argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options);
215 211
216 /* error handling, printing usage message */ 212 /* error handling, printing usage message */
217 if(argc<0) { 213 if(argc<0) {
218 fprintf(stderr, 214 fprintf(stderr,
219 "error in command line argument \"%s\"\n", 215 "error in command line argument \"%s\"\n",
220 argv[-argc]); 216 argv[-argc]);
221 } else if(argc<2) { 217 } else if(argc<2) {
222 argc=-1; 218 argc=-1;
223 } 219 }
224 if(argc<0 || options[OPT_HELP_H].doesOccur || options[OPT_HELP_QUESTION_MARK ].doesOccur) { 220 if(argc<0 || options[OPT_HELP_H].doesOccur || options[OPT_HELP_QUESTION_MARK ].doesOccur) {
225 FILE *stdfile=argc<0 ? stderr : stdout; 221 FILE *stdfile=argc<0 ? stderr : stdout;
226 fprintf(stdfile, 222 fprintf(stdfile,
227 "usage: %s [-options] files...\n" 223 "usage: %s [-options] files...\n"
228 "\tread .ucm codepage mapping files and write .cnv files\n" 224 "\tread .ucm codepage mapping files and write .cnv files\n"
229 "options:\n" 225 "options:\n"
230 "\t-h or -? or --help this usage text\n" 226 "\t-h or -? or --help this usage text\n"
231 "\t-V or --version show a version message\n" 227 "\t-V or --version show a version message\n"
232 "\t-c or --copyright include a copyright notice\n" 228 "\t-c or --copyright include a copyright notice\n"
233 "\t-d or --destdir destination directory, followed by the path\n " 229 "\t-d or --destdir destination directory, followed by the path\n "
234 "\t-v or --verbose Turn on verbose output\n", 230 "\t-v or --verbose Turn on verbose output\n"
231 "\t-q or --quiet do not display warnings and progress\n",
235 argv[0]); 232 argv[0]);
236 fprintf(stdfile, 233 fprintf(stdfile,
237 "\t --small Generate smaller .cnv files. They will be\n" 234 "\t --small Generate smaller .cnv files. They will be\n"
238 "\t significantly smaller but may not be compatib le with\n" 235 "\t significantly smaller but may not be compatib le with\n"
239 "\t older versions of ICU and will require heap m emory\n" 236 "\t older versions of ICU and will require heap m emory\n"
240 "\t allocation when loaded.\n" 237 "\t allocation when loaded.\n"
241 "\t --ignore-siso-check Use SI/SO other than 0xf/0xe.\n "); 238 "\t --ignore-siso-check Use SI/SO other than 0xf/0xe.\n ");
242 return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; 239 return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
243 } 240 }
244 241
245 if(options[OPT_VERSION].doesOccur) { 242 if(options[OPT_VERSION].doesOccur) {
246 printf("makeconv version %u.%u, ICU tool to read .ucm codepage mapping f iles and write .cnv files\n", 243 printf("makeconv version %u.%u, ICU tool to read .ucm codepage mapping f iles and write .cnv files\n",
247 dataInfo.formatVersion[0], dataInfo.formatVersion[1]); 244 dataInfo.formatVersion[0], dataInfo.formatVersion[1]);
248 printf("%s\n", U_COPYRIGHT_STRING); 245 printf("%s\n", U_COPYRIGHT_STRING);
249 exit(0); 246 exit(0);
250 } 247 }
251 248
252 /* get the options values */ 249 /* get the options values */
253 haveCopyright = options[OPT_COPYRIGHT].doesOccur; 250 haveCopyright = options[OPT_COPYRIGHT].doesOccur;
254 destdir = options[OPT_DESTDIR].value; 251 const char *destdir = options[OPT_DESTDIR].value;
255 VERBOSE = options[OPT_VERBOSE].doesOccur; 252 VERBOSE = options[OPT_VERBOSE].doesOccur;
253 QUIET = options[OPT_QUIET].doesOccur;
256 SMALL = options[OPT_SMALL].doesOccur; 254 SMALL = options[OPT_SMALL].doesOccur;
257 255
258 if (options[OPT_IGNORE_SISO_CHECK].doesOccur) { 256 if (options[OPT_IGNORE_SISO_CHECK].doesOccur) {
259 IGNORE_SISO_CHECK = TRUE; 257 IGNORE_SISO_CHECK = TRUE;
260 } 258 }
261 259
260 icu::CharString outFileName;
261 UErrorCode err = U_ZERO_ERROR;
262 if (destdir != NULL && *destdir != 0) { 262 if (destdir != NULL && *destdir != 0) {
263 uprv_strcpy(outFileName, destdir); 263 outFileName.append(destdir, err).ensureEndsWithFileSeparator(err);
264 destdirlen = uprv_strlen(destdir); 264 if (U_FAILURE(err)) {
265 outBasename = outFileName + destdirlen; 265 return err;
266 if (*(outBasename - 1) != U_FILE_SEP_CHAR) {
267 *outBasename++ = U_FILE_SEP_CHAR;
268 ++destdirlen;
269 } 266 }
270 } else {
271 destdirlen = 0;
272 outBasename = outFileName;
273 } 267 }
268 int32_t outBasenameStart = outFileName.length();
274 269
275 #if DEBUG 270 #if DEBUG
276 { 271 {
277 int i; 272 int i;
278 printf("makeconv: processing %d files...\n", argc - 1); 273 printf("makeconv: processing %d files...\n", argc - 1);
279 for(i=1; i<argc; ++i) { 274 for(i=1; i<argc; ++i) {
280 printf("%s ", argv[i]); 275 printf("%s ", argv[i]);
281 } 276 }
282 printf("\n"); 277 printf("\n");
283 fflush(stdout); 278 fflush(stdout);
284 } 279 }
285 #endif 280 #endif
286 281
287 err = U_ZERO_ERROR; 282 UBool printFilename = (UBool) (argc > 2 || VERBOSE);
288 printFilename = (UBool) (argc > 2 || VERBOSE);
289 for (++argv; --argc; ++argv) 283 for (++argv; --argc; ++argv)
290 { 284 {
291 arg = getLongPathname(*argv); 285 UErrorCode localError = U_ZERO_ERROR;
292 286 const char *arg = getLongPathname(*argv);
293 /* Check for potential buffer overflow */
294 if(strlen(arg) >= UCNV_MAX_FULL_FILE_NAME_LENGTH)
295 {
296 fprintf(stderr, "%s\n", u_errorName(U_BUFFER_OVERFLOW_ERROR));
297 return U_BUFFER_OVERFLOW_ERROR;
298 }
299 287
300 /*produces the right destination path for display*/ 288 /*produces the right destination path for display*/
301 if (destdirlen != 0) 289 outFileName.truncate(outBasenameStart);
290 if (outBasenameStart != 0)
302 { 291 {
303 const char *basename;
304
305 /* find the last file sepator */ 292 /* find the last file sepator */
306 basename = findBasename(arg); 293 const char *basename = findBasename(arg);
307 uprv_strcpy(outBasename, basename); 294 outFileName.append(basename, localError);
308 } 295 }
309 else 296 else
310 { 297 {
311 uprv_strcpy(outFileName, arg); 298 outFileName.append(arg, localError);
299 }
300 if (U_FAILURE(localError)) {
301 return localError;
312 } 302 }
313 303
314 /*removes the extension if any is found*/ 304 /*removes the extension if any is found*/
315 dot = uprv_strrchr(outBasename, '.'); 305 int32_t lastDotIndex = outFileName.lastIndexOf('.');
316 if (dot) 306 if (lastDotIndex >= outBasenameStart) {
317 { 307 outFileName.truncate(lastDotIndex);
318 *dot = '\0';
319 } 308 }
320 309
321 /* the basename without extension is the converter name */ 310 /* the basename without extension is the converter name */
322 uprv_strcpy(cnvName, outBasename); 311 if ((outFileName.length() - outBasenameStart) >= UPRV_LENGTHOF(cnvName)) {
312 fprintf(stderr, "converter name %s too long\n", outFileName.data() + outBasenameStart);
313 return U_BUFFER_OVERFLOW_ERROR;
314 }
315 uprv_strcpy(cnvName, outFileName.data() + outBasenameStart);
323 316
324 /*Adds the target extension*/ 317 /*Adds the target extension*/
325 uprv_strcat(outBasename, CONVERTER_FILE_EXTENSION); 318 outFileName.append(CONVERTER_FILE_EXTENSION, localError);
319 if (U_FAILURE(localError)) {
320 return localError;
321 }
326 322
327 #if DEBUG 323 #if DEBUG
328 printf("makeconv: processing %s ...\n", arg); 324 printf("makeconv: processing %s ...\n", arg);
329 fflush(stdout); 325 fflush(stdout);
330 #endif 326 #endif
331 localError = U_ZERO_ERROR;
332 initConvData(&data); 327 initConvData(&data);
333 createConverter(&data, arg, &localError); 328 createConverter(&data, arg, &localError);
334 329
335 if (U_FAILURE(localError)) 330 if (U_FAILURE(localError))
336 { 331 {
337 /* if an error is found, print out an error msg and keep going */ 332 /* if an error is found, print out an error msg and keep going */
338 fprintf(stderr, "Error creating converter for \"%s\" file for \"%s\" (%s)\n", outFileName, arg, 333 fprintf(stderr, "Error creating converter for \"%s\" file for \"%s\" (%s)\n",
339 u_errorName(localError)); 334 outFileName.data(), arg, u_errorName(localError));
340 if(U_SUCCESS(err)) { 335 if(U_SUCCESS(err)) {
341 err = localError; 336 err = localError;
342 } 337 }
343 } 338 }
344 else 339 else
345 { 340 {
346 /* Insure the static data name matches the file name */ 341 /* Insure the static data name matches the file name */
347 /* Changed to ignore directory and only compare base name 342 /* Changed to ignore directory and only compare base name
348 LDH 1/2/08*/ 343 LDH 1/2/08*/
349 char *p; 344 char *p;
350 p = strrchr(cnvName, U_FILE_SEP_CHAR); /* Find last file separator * / 345 p = strrchr(cnvName, U_FILE_SEP_CHAR); /* Find last file separator * /
351 346
352 if(p == NULL) /* OK, try alternate */ 347 if(p == NULL) /* OK, try alternate */
353 { 348 {
354 p = strrchr(cnvName, U_FILE_ALT_SEP_CHAR); 349 p = strrchr(cnvName, U_FILE_ALT_SEP_CHAR);
355 if(p == NULL) 350 if(p == NULL)
356 { 351 {
357 p=cnvName; /* If no separators, no problem */ 352 p=cnvName; /* If no separators, no problem */
358 } 353 }
359 } 354 }
360 else 355 else
361 { 356 {
362 p++; /* If found separtor, don't include it in compare */ 357 p++; /* If found separator, don't include it in compare */
363 } 358 }
364 if(uprv_stricmp(p,data.staticData.name)) 359 if(uprv_stricmp(p,data.staticData.name) && !QUIET)
365 { 360 {
366 fprintf(stderr, "Warning: %s%s claims to be '%s'\n", 361 fprintf(stderr, "Warning: %s%s claims to be '%s'\n",
367 cnvName, CONVERTER_FILE_EXTENSION, 362 cnvName, CONVERTER_FILE_EXTENSION,
368 data.staticData.name); 363 data.staticData.name);
369 } 364 }
370 365
371 uprv_strcpy((char*)data.staticData.name, cnvName); 366 uprv_strcpy((char*)data.staticData.name, cnvName);
372 367
373 if(!uprv_isInvariantString((char*)data.staticData.name, -1)) { 368 if(!uprv_isInvariantString((char*)data.staticData.name, -1)) {
374 fprintf(stderr, 369 fprintf(stderr,
375 "Error: A converter name must contain only invariant charact ers.\n" 370 "Error: A converter name must contain only invariant charact ers.\n"
376 "%s is not a valid converter name.\n", 371 "%s is not a valid converter name.\n",
377 data.staticData.name); 372 data.staticData.name);
378 if(U_SUCCESS(err)) { 373 if(U_SUCCESS(err)) {
379 err = U_INVALID_TABLE_FORMAT; 374 err = U_INVALID_TABLE_FORMAT;
380 } 375 }
381 } 376 }
382 377
383 uprv_strcpy(cnvNameWithPkg, cnvName);
384
385 localError = U_ZERO_ERROR; 378 localError = U_ZERO_ERROR;
386 writeConverterData(&data, cnvNameWithPkg, destdir, &localError); 379 writeConverterData(&data, cnvName, destdir, &localError);
387 380
388 if(U_FAILURE(localError)) 381 if(U_FAILURE(localError))
389 { 382 {
390 /* if an error is found, print out an error msg and keep going*/ 383 /* if an error is found, print out an error msg and keep going*/
391 fprintf(stderr, "Error writing \"%s\" file for \"%s\" (%s)\n", o utFileName, arg, 384 fprintf(stderr, "Error writing \"%s\" file for \"%s\" (%s)\n", o utFileName.data(), arg,
392 u_errorName(localError)); 385 u_errorName(localError));
393 if(U_SUCCESS(err)) { 386 if(U_SUCCESS(err)) {
394 err = localError; 387 err = localError;
395 } 388 }
396 } 389 }
397 else if (printFilename) 390 else if (printFilename)
398 { 391 {
399 puts(outBasename); 392 puts(outFileName.data() + outBasenameStart);
400 } 393 }
401 } 394 }
402 fflush(stdout); 395 fflush(stdout);
403 fflush(stderr); 396 fflush(stderr);
404 397
405 cleanupConvData(&data); 398 cleanupConvData(&data);
406 } 399 }
407 400
408 return err; 401 return err;
409 } 402 }
(...skipping 12 matching lines...) Expand all
422 *pCCSID=(int32_t)uprv_strtoul(name, NULL, 10); 415 *pCCSID=(int32_t)uprv_strtoul(name, NULL, 10);
423 } else { 416 } else {
424 *pPlatform=UCNV_UNKNOWN; 417 *pPlatform=UCNV_UNKNOWN;
425 *pCCSID=0; 418 *pCCSID=0;
426 } 419 }
427 } 420 }
428 421
429 static void 422 static void
430 readHeader(ConvData *data, 423 readHeader(ConvData *data,
431 FileStream* convFile, 424 FileStream* convFile,
432 const char* converterName,
433 UErrorCode *pErrorCode) { 425 UErrorCode *pErrorCode) {
434 char line[1024]; 426 char line[1024];
435 char *s, *key, *value; 427 char *s, *key, *value;
436 const UConverterStaticData *prototype; 428 const UConverterStaticData *prototype;
437 UConverterStaticData *staticData; 429 UConverterStaticData *staticData;
438 430
439 if(U_FAILURE(*pErrorCode)) { 431 if(U_FAILURE(*pErrorCode)) {
440 return; 432 return;
441 } 433 }
442 434
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 } 562 }
571 563
572 data->ucm=ucm_open(); 564 data->ucm=ucm_open();
573 565
574 convFile=T_FileStream_open(converterName, "r"); 566 convFile=T_FileStream_open(converterName, "r");
575 if(convFile==NULL) { 567 if(convFile==NULL) {
576 *pErrorCode=U_FILE_ACCESS_ERROR; 568 *pErrorCode=U_FILE_ACCESS_ERROR;
577 return FALSE; 569 return FALSE;
578 } 570 }
579 571
580 readHeader(data, convFile, converterName, pErrorCode); 572 readHeader(data, convFile, pErrorCode);
581 if(U_FAILURE(*pErrorCode)) { 573 if(U_FAILURE(*pErrorCode)) {
582 return FALSE; 574 return FALSE;
583 } 575 }
584 576
585 if(data->ucm->baseName[0]==0) { 577 if(data->ucm->baseName[0]==0) {
586 dataIsBase=TRUE; 578 dataIsBase=TRUE;
587 baseStates=&data->ucm->states; 579 baseStates=&data->ucm->states;
588 ucm_processStates(baseStates, IGNORE_SISO_CHECK); 580 ucm_processStates(baseStates, IGNORE_SISO_CHECK);
589 } else { 581 } else {
590 dataIsBase=FALSE; 582 dataIsBase=FALSE;
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
847 } 839 }
848 840
849 /* 841 /*
850 * Hey, Emacs, please set the following: 842 * Hey, Emacs, please set the following:
851 * 843 *
852 * Local Variables: 844 * Local Variables:
853 * indent-tabs-mode: nil 845 * indent-tabs-mode: nil
854 * End: 846 * End:
855 * 847 *
856 */ 848 */
OLDNEW
« no previous file with comments | « source/tools/makeconv/makeconv.c ('k') | source/tools/makeconv/makeconv.vcxproj » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698