OLD | NEW |
1 /* | 1 /* |
2 ******************************************************************************* | 2 ******************************************************************************* |
3 * | 3 * |
4 * Copyright (C) 1999-2014, International Business Machines | 4 * Copyright (C) 1999-2015, International Business Machines |
5 * Corporation and others. All Rights Reserved. | 5 * Corporation and others. All Rights Reserved. |
6 * | 6 * |
7 ******************************************************************************* | 7 ******************************************************************************* |
8 * file name: package.cpp | 8 * file name: package.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: 2005aug25 | 13 * created on: 2005aug25 |
14 * created by: Markus W. Scherer | 14 * created by: Markus W. Scherer |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 } | 297 } |
298 } | 298 } |
299 *sep++=U_FILE_SEP_CHAR; // restore file separator character | 299 *sep++=U_FILE_SEP_CHAR; // restore file separator character |
300 } | 300 } |
301 } | 301 } |
302 | 302 |
303 static uint8_t * | 303 static uint8_t * |
304 readFile(const char *path, const char *name, int32_t &length, char &type) { | 304 readFile(const char *path, const char *name, int32_t &length, char &type) { |
305 char filename[1024]; | 305 char filename[1024]; |
306 FILE *file; | 306 FILE *file; |
307 uint8_t *data; | |
308 UErrorCode errorCode; | 307 UErrorCode errorCode; |
309 int32_t fileLength, typeEnum; | 308 int32_t fileLength, typeEnum; |
310 | 309 |
311 makeFullFilename(path, name, filename, (int32_t)sizeof(filename)); | 310 makeFullFilename(path, name, filename, (int32_t)sizeof(filename)); |
312 | 311 |
313 /* open the input file, get its length, allocate memory for it, read the fil
e */ | 312 /* open the input file, get its length, allocate memory for it, read the fil
e */ |
314 file=fopen(filename, "rb"); | 313 file=fopen(filename, "rb"); |
315 if(file==NULL) { | 314 if(file==NULL) { |
316 fprintf(stderr, "icupkg: unable to open input file \"%s\"\n", filename); | 315 fprintf(stderr, "icupkg: unable to open input file \"%s\"\n", filename); |
317 exit(U_FILE_ACCESS_ERROR); | 316 exit(U_FILE_ACCESS_ERROR); |
318 } | 317 } |
319 | 318 |
320 /* get the file length */ | 319 /* get the file length */ |
321 fileLength=getFileLength(file); | 320 fileLength=getFileLength(file); |
322 if(ferror(file) || fileLength<=0) { | 321 if(ferror(file) || fileLength<=0) { |
323 fprintf(stderr, "icupkg: empty input file \"%s\"\n", filename); | 322 fprintf(stderr, "icupkg: empty input file \"%s\"\n", filename); |
324 fclose(file); | 323 fclose(file); |
325 exit(U_FILE_ACCESS_ERROR); | 324 exit(U_FILE_ACCESS_ERROR); |
326 } | 325 } |
327 | 326 |
328 /* allocate the buffer, pad to multiple of 16 */ | 327 /* allocate the buffer, pad to multiple of 16 */ |
329 length=(fileLength+0xf)&~0xf; | 328 length=(fileLength+0xf)&~0xf; |
330 data=(uint8_t *)uprv_malloc(length); | 329 icu::LocalMemory<uint8_t> data((uint8_t *)uprv_malloc(length)); |
331 if(data==NULL) { | 330 if(data.isNull()) { |
332 fclose(file); | 331 fclose(file); |
333 fprintf(stderr, "icupkg: malloc error allocating %d bytes.\n", (int)leng
th); | 332 fprintf(stderr, "icupkg: malloc error allocating %d bytes.\n", (int)leng
th); |
334 exit(U_MEMORY_ALLOCATION_ERROR); | 333 exit(U_MEMORY_ALLOCATION_ERROR); |
335 } | 334 } |
336 | 335 |
337 /* read the file */ | 336 /* read the file */ |
338 if(fileLength!=(int32_t)fread(data, 1, fileLength, file)) { | 337 if(fileLength!=(int32_t)fread(data.getAlias(), 1, fileLength, file)) { |
339 fprintf(stderr, "icupkg: error reading \"%s\"\n", filename); | 338 fprintf(stderr, "icupkg: error reading \"%s\"\n", filename); |
340 fclose(file); | 339 fclose(file); |
341 free(data); | |
342 exit(U_FILE_ACCESS_ERROR); | 340 exit(U_FILE_ACCESS_ERROR); |
343 } | 341 } |
344 | 342 |
345 /* pad the file to a multiple of 16 using the usual padding byte */ | 343 /* pad the file to a multiple of 16 using the usual padding byte */ |
346 if(fileLength<length) { | 344 if(fileLength<length) { |
347 memset(data+fileLength, 0xaa, length-fileLength); | 345 memset(data.getAlias()+fileLength, 0xaa, length-fileLength); |
348 } | 346 } |
349 | 347 |
350 fclose(file); | 348 fclose(file); |
351 | 349 |
352 // minimum check for ICU-format data | 350 // minimum check for ICU-format data |
353 errorCode=U_ZERO_ERROR; | 351 errorCode=U_ZERO_ERROR; |
354 typeEnum=getTypeEnumForInputData(data, length, &errorCode); | 352 typeEnum=getTypeEnumForInputData(data.getAlias(), length, &errorCode); |
355 if(typeEnum<0 || U_FAILURE(errorCode)) { | 353 if(typeEnum<0 || U_FAILURE(errorCode)) { |
356 fprintf(stderr, "icupkg: not an ICU data file: \"%s\"\n", filename); | 354 fprintf(stderr, "icupkg: not an ICU data file: \"%s\"\n", filename); |
357 free(data); | |
358 #if !UCONFIG_NO_LEGACY_CONVERSION | 355 #if !UCONFIG_NO_LEGACY_CONVERSION |
359 exit(U_INVALID_FORMAT_ERROR); | 356 exit(U_INVALID_FORMAT_ERROR); |
360 #else | 357 #else |
361 fprintf(stderr, "U_INVALID_FORMAT_ERROR occurred but UCONFIG_NO_LEGACY_C
ONVERSION is on so this is expected.\n"); | 358 fprintf(stderr, "U_INVALID_FORMAT_ERROR occurred but UCONFIG_NO_LEGACY_C
ONVERSION is on so this is expected.\n"); |
362 exit(0); | 359 exit(0); |
363 #endif | 360 #endif |
364 } | 361 } |
365 type=makeTypeLetter(typeEnum); | 362 type=makeTypeLetter(typeEnum); |
366 | 363 |
367 return data; | 364 return data.orphan(); |
368 } | 365 } |
369 | 366 |
370 // .dat package file representation ---------------------------------------- *** | 367 // .dat package file representation ---------------------------------------- *** |
371 | 368 |
372 U_CDECL_BEGIN | 369 U_CDECL_BEGIN |
373 | 370 |
374 static int32_t U_CALLCONV | 371 static int32_t U_CALLCONV |
375 compareItems(const void * /*context*/, const void *left, const void *right) { | 372 compareItems(const void * /*context*/, const void *left, const void *right) { |
376 U_NAMESPACE_USE | 373 U_NAMESPACE_USE |
377 | 374 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 int32_t length=(headerLength+0xf)&~0xf; | 411 int32_t length=(headerLength+0xf)&~0xf; |
415 memset(header+headerLength, 0, length-headerLength); | 412 memset(header+headerLength, 0, length-headerLength); |
416 headerLength=length; | 413 headerLength=length; |
417 } | 414 } |
418 pHeader->dataHeader.headerSize=(uint16_t)headerLength; | 415 pHeader->dataHeader.headerSize=(uint16_t)headerLength; |
419 } | 416 } |
420 | 417 |
421 Package::~Package() { | 418 Package::~Package() { |
422 int32_t idx; | 419 int32_t idx; |
423 | 420 |
424 free(inData); | 421 uprv_free(inData); |
425 | 422 |
426 for(idx=0; idx<itemCount; ++idx) { | 423 for(idx=0; idx<itemCount; ++idx) { |
427 if(items[idx].isDataOwned) { | 424 if(items[idx].isDataOwned) { |
428 free(items[idx].data); | 425 uprv_free(items[idx].data); |
429 } | 426 } |
430 } | 427 } |
431 | 428 |
432 uprv_free((void*)items); | 429 uprv_free((void*)items); |
433 } | 430 } |
434 | 431 |
435 void | 432 void |
436 Package::setPrefix(const char *p) { | 433 Package::setPrefix(const char *p) { |
437 if(strlen(p)>=sizeof(pkgPrefix)) { | 434 if(strlen(p)>=sizeof(pkgPrefix)) { |
438 fprintf(stderr, "icupkg: --toc_prefix %s too long\n", p); | 435 fprintf(stderr, "icupkg: --toc_prefix %s too long\n", p); |
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 // reset this Item entry | 1040 // reset this Item entry |
1044 memset(items+idx, 0, sizeof(Item)); | 1041 memset(items+idx, 0, sizeof(Item)); |
1045 | 1042 |
1046 // copy the item's name | 1043 // copy the item's name |
1047 items[idx].name=allocString(TRUE, strlen(name)); | 1044 items[idx].name=allocString(TRUE, strlen(name)); |
1048 strcpy(items[idx].name, name); | 1045 strcpy(items[idx].name, name); |
1049 pathToTree(items[idx].name); | 1046 pathToTree(items[idx].name); |
1050 } else { | 1047 } else { |
1051 // same-name item found, replace it | 1048 // same-name item found, replace it |
1052 if(items[idx].isDataOwned) { | 1049 if(items[idx].isDataOwned) { |
1053 free(items[idx].data); | 1050 uprv_free(items[idx].data); |
1054 } | 1051 } |
1055 | 1052 |
1056 // keep the item's name since it is the same | 1053 // keep the item's name since it is the same |
1057 } | 1054 } |
1058 | 1055 |
1059 // set the item's data | 1056 // set the item's data |
1060 items[idx].data=data; | 1057 items[idx].data=data; |
1061 items[idx].length=length; | 1058 items[idx].length=length; |
1062 items[idx].isDataOwned=isDataOwned; | 1059 items[idx].isDataOwned=isDataOwned; |
1063 items[idx].type=type; | 1060 items[idx].type=type; |
(...skipping 18 matching lines...) Expand all Loading... |
1082 for(pItem=listPkg.items, i=0; i<listPkg.itemCount; ++pItem, ++i) { | 1079 for(pItem=listPkg.items, i=0; i<listPkg.itemCount; ++pItem, ++i) { |
1083 addItem(pItem->name, pItem->data, pItem->length, FALSE, pItem->type); | 1080 addItem(pItem->name, pItem->data, pItem->length, FALSE, pItem->type); |
1084 } | 1081 } |
1085 } | 1082 } |
1086 | 1083 |
1087 void | 1084 void |
1088 Package::removeItem(int32_t idx) { | 1085 Package::removeItem(int32_t idx) { |
1089 if(idx>=0) { | 1086 if(idx>=0) { |
1090 // remove the item | 1087 // remove the item |
1091 if(items[idx].isDataOwned) { | 1088 if(items[idx].isDataOwned) { |
1092 free(items[idx].data); | 1089 uprv_free(items[idx].data); |
1093 } | 1090 } |
1094 | 1091 |
1095 // move the following items up | 1092 // move the following items up |
1096 if((idx+1)<itemCount) { | 1093 if((idx+1)<itemCount) { |
1097 memmove(items+idx, items+idx+1, (itemCount-(idx+1))*sizeof(Item)); | 1094 memmove(items+idx, items+idx+1, (itemCount-(idx+1))*sizeof(Item)); |
1098 } | 1095 } |
1099 --itemCount; | 1096 --itemCount; |
1100 | 1097 |
1101 if(idx<=findNextIndex) { | 1098 if(idx<=findNextIndex) { |
1102 --findNextIndex; | 1099 --findNextIndex; |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1303 } | 1300 } |
1304 | 1301 |
1305 void Package::ensureItemCapacity() | 1302 void Package::ensureItemCapacity() |
1306 { | 1303 { |
1307 if((itemCount+1)>itemMax) { | 1304 if((itemCount+1)>itemMax) { |
1308 setItemCapacity(itemCount+kItemsChunk); | 1305 setItemCapacity(itemCount+kItemsChunk); |
1309 } | 1306 } |
1310 } | 1307 } |
1311 | 1308 |
1312 U_NAMESPACE_END | 1309 U_NAMESPACE_END |
OLD | NEW |