1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Copyright (C) 1998-2010, International Business Machines 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File genrb.c 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History: 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Date Name Description 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 05/25/99 stephen Creation. 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 5/10/01 Ram removed ustdio dependency 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "genrb.h" 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uclean.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "ucmndata.h" /* TODO: for reading the pool bundle */ 2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Protos */ 2527f654740f2a26ad62a5c155af9199af9e69b889clairehovoid processFile(const char *filename, const char* cp, const char *inputDir, const char *outputDir, const char *packageName, UErrorCode *status); 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char *make_res_filename(const char *filename, const char *outputDir, 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *packageName, UErrorCode *status); 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* File suffixes */ 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define RES_SUFFIX ".res" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define COL_SUFFIX ".col" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char theCurrentFileName[2048]; 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst char *gCurrentFileName = theCurrentFileName; 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef XP_MAC_CONSOLE 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <console.h> 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HELP1, 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru HELP2, 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru VERBOSE, 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru QUIET, 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru VERSION, 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru SOURCEDIR, 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru DESTDIR, 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ENCODING, 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ICUDATADIR, 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru WRITE_JAVA, 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru COPYRIGHT, 52c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* PACKAGE_NAME, This option is deprecated and should not be used ever. */ 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru BUNDLE_NAME, 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru WRITE_XLIFF, 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru STRICT, 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru NO_BINARY_COLLATION, 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*added by Jing*/ 58c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru LANGUAGE, 5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho NO_COLLATION_RULES, 6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FORMAT_VERSION, 6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho WRITE_POOL_BUNDLE, 6227f654740f2a26ad62a5c155af9199af9e69b889claireho USE_POOL_BUNDLE, 6327f654740f2a26ad62a5c155af9199af9e69b889claireho INCLUDE_UNIHAN_COLL 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOption options[]={ 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_HELP_H, 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_HELP_QUESTION_MARK, 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_VERBOSE, 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_QUIET, 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_VERSION, 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_SOURCEDIR, 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_DESTDIR, 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_ENCODING, 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_ICUDATADIR, 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_WRITE_JAVA, 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_COPYRIGHT, 78c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* UOPTION_PACKAGE_NAME, This option is deprecated and should not be used ever. */ 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_BUNDLE_NAME, 8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UOPTION_DEF("write-xliff", 'x', UOPT_OPTIONAL_ARG), 8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UOPTION_DEF("strict", 'k', UOPT_NO_ARG), /* 14 */ 8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UOPTION_DEF("noBinaryCollation", 'C', UOPT_NO_ARG),/* 15 */ 8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UOPTION_DEF("language", 'l', UOPT_REQUIRES_ARG), /* 16 */ 8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UOPTION_DEF("omitCollationRules", 'R', UOPT_NO_ARG),/* 17 */ 8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UOPTION_DEF("formatVersion", '\x01', UOPT_REQUIRES_ARG),/* 18 */ 8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UOPTION_DEF("writePoolBundle", '\x01', UOPT_NO_ARG),/* 19 */ 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UOPTION_DEF("usePoolBundle", '\x01', UOPT_OPTIONAL_ARG),/* 20 */ 8827f654740f2a26ad62a5c155af9199af9e69b889claireho UOPTION_DEF("includeUnihanColl", '\x01', UOPT_NO_ARG),/* 21 */ /* temporary, don't display in usage info */ 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }; 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool write_java = FALSE; 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool write_xliff = FALSE; 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* outputEnc =""; 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* gPackageName=NULL; 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* bundleName=NULL; 9650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic struct SRBRoot *newPoolBundle = NULL; 9727f654740f2a26ad62a5c155af9199af9e69b889claireho UBool gIncludeUnihanColl = FALSE; 9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* TODO: separate header file for ResFile? */ 10050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehotypedef struct ResFile { 10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uint8_t *fBytes; 10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const int32_t *fIndexes; 10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *fKeys; 10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t fKeysLength; 10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t fKeysCount; 10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t fChecksum; 10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} ResFile; 10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic ResFile poolBundle = { NULL }; 11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*added by Jing*/ 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* language = NULL; 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char* xliffOutputFileName = NULL; 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumain(int argc, 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char* argv[]) 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *arg = NULL; 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *outputDir = NULL; /* NULL = no output directory, use current */ 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *inputDir = NULL; 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *encoding = ""; 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int i; 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru U_MAIN_INIT_ARGS(argc, argv); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru argc = u_parseArgs(argc, argv, (int32_t)(sizeof(options)/sizeof(options[0])), options); 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* error handling, printing usage message */ 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(argc<0) { 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "%s: error in command line argument \"%s\"\n", argv[0], argv[-argc]); 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if(argc<2) { 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru argc = -1; 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(options[WRITE_POOL_BUNDLE].doesOccur && options[USE_POOL_BUNDLE].doesOccur) { 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "%s: cannot combine --writePoolBundle and --usePoolBundle\n", argv[0]); 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho argc = -1; 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(options[FORMAT_VERSION].doesOccur) { 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *s = options[FORMAT_VERSION].value; 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(uprv_strlen(s) != 1 || (s[0] != '1' && s[0] != '2')) { 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "%s: unsupported --formatVersion %s\n", argv[0], s); 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho argc = -1; 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(s[0] == '1' && 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (options[WRITE_POOL_BUNDLE].doesOccur || options[USE_POOL_BUNDLE].doesOccur) 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ) { 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "%s: cannot combine --formatVersion 1 with --writePoolBundle or --usePoolBundle\n", argv[0]); 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho argc = -1; 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho setFormatVersion(s[0] - '0'); 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[VERSION].doesOccur) { 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%s version %s (ICU version %s).\n" 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%s\n", 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru argv[0], GENRB_VERSION, U_ICU_VERSION, U_COPYRIGHT_STRING); 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return U_ZERO_ERROR; 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(argc<0 || options[HELP1].doesOccur || options[HELP2].doesOccur) { 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Broken into chunks because the C89 standard says the minimum 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * required supported string length is 509 bytes. 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Usage: %s [OPTIONS] [FILES]\n" 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\tReads the list of resource bundle source files and creates\n" 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\tbinary version of reosurce bundles (.res files)\n", 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru argv[0]); 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "Options:\n" 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-h or -? or --help this usage text\n" 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-q or --quiet do not display warnings\n" 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-v or --verbose print extra information when processing files\n" 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-V or --version prints out version number and exits\n" 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-c or --copyright include copyright notice\n"); 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-e or --encoding encoding of source files\n" 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-d of --destdir destination directory, followed by the path, defaults to %s\n" 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-s or --sourcedir source directory for files followed by path, defaults to %s\n" 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-i or --icudatadir directory for locating any needed intermediate data files,\n" 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t followed by path, defaults to %s\n", 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_getDataDirectory(), u_getDataDirectory(), u_getDataDirectory()); 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-j or --write-java write a Java ListResourceBundle for ICU4J, followed by optional encoding\n" 188c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t defaults to ASCII and \\uXXXX format.\n"); 189c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* This option is deprecated and should not be used ever. 190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-p or --package-name For ICU4J: package name for writing the ListResourceBundle for ICU4J,\n" 191c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t defaults to com.ibm.icu.impl.data\n"); */ 192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-b or --bundle-name bundle name for writing the ListResourceBundle for ICU4J,\n" 194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t defaults to LocaleElements\n" 195c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t-x or --write-xliff write an XLIFF file for the resource bundle. Followed by\n" 196c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t an optional output file name.\n" 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "\t-k or --strict use pedantic parsing of syntax\n" 198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*added by Jing*/ 199c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t-l or --language for XLIFF: language code compliant with BCP 47.\n"); 200c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru fprintf(stderr, 201c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t-C or --noBinaryCollation do not generate binary collation image;\n" 202c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t makes .res file smaller but collator instantiation much slower;\n" 203c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t maintains ability to get tailoring rules\n" 204c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t-R or --omitCollationRules do not include collation (tailoring) rules;\n" 205c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t makes .res file smaller and maintains collator instantiation speed\n" 206c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru "\t but tailoring rules will not be available (they are rarely used)\n"); 20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, 20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "\t --formatVersion write a .res file compatible with the requested formatVersion (single digit);\n" 20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "\t for example, --formatVersion 1\n"); 21050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, 21150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "\t --writePoolBundle write a pool.res file with all of the keys of all input bundles\n" 21250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "\t --usePoolBundle [path-to-pool.res] point to keys from the pool.res keys pool bundle if they are available there;\n" 21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "\t makes .res files smaller but dependent on the pool bundle\n" 21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho "\t (--writePoolBundle and --usePoolBundle cannot be combined)\n"); 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return argc < 0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[VERBOSE].doesOccur) { 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setVerbose(TRUE); 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[QUIET].doesOccur) { 224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setShowWarning(FALSE); 225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[STRICT].doesOccur) { 227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setStrict(TRUE); 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[COPYRIGHT].doesOccur){ 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru setIncludeCopyright(TRUE); 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[SOURCEDIR].doesOccur) { 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inputDir = options[SOURCEDIR].value; 235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[DESTDIR].doesOccur) { 238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outputDir = options[DESTDIR].value; 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 240c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru /* This option is deprecated and should never be used. 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[PACKAGE_NAME].doesOccur) { 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gPackageName = options[PACKAGE_NAME].value; 243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(!strcmp(gPackageName, "ICUDATA")) 244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gPackageName = U_ICUDATA_NAME; 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(gPackageName[0] == 0) 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru gPackageName = NULL; 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 251c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru }*/ 252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[ENCODING].doesOccur) { 254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru encoding = options[ENCODING].value; 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[ICUDATADIR].doesOccur) { 258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_setDataDirectory(options[ICUDATADIR].value); 259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Initialize ICU */ 261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_init(&status); 262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(status) && status != U_FILE_ACCESS_ERROR) { 263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Note: u_init() will try to open ICU property data. 264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * failures here are expected when building ICU from scratch. 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ignore them. 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "%s: can not initialize ICU. status = %s\n", 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru argv[0], u_errorName(status)); 269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru exit(1); 270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[WRITE_JAVA].doesOccur) { 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru write_java = TRUE; 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outputEnc = options[WRITE_JAVA].value; 275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[BUNDLE_NAME].doesOccur) { 278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundleName = options[BUNDLE_NAME].value; 279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[WRITE_XLIFF].doesOccur) { 282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru write_xliff = TRUE; 283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[WRITE_XLIFF].value != NULL){ 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru xliffOutputFileName = options[WRITE_XLIFF].value; 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 288c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru initParser(options[NO_BINARY_COLLATION].doesOccur, options[NO_COLLATION_RULES].doesOccur); 289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*added by Jing*/ 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[LANGUAGE].doesOccur) { 292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru language = options[LANGUAGE].value; 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(options[WRITE_POOL_BUNDLE].doesOccur) { 29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho newPoolBundle = bundle_open(NULL, TRUE, &status); 29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(status)) { 29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "unable to create an empty bundle for the pool keys: %s\n", u_errorName(status)); 29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return status; 30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 30150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *poolResName = "pool.res"; 30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char *nameWithoutSuffix = uprv_malloc(uprv_strlen(poolResName) + 1); 30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (nameWithoutSuffix == NULL) { 30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "out of memory error\n"); 30550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return U_MEMORY_ALLOCATION_ERROR; 30650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 30750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcpy(nameWithoutSuffix, poolResName); 30850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *uprv_strrchr(nameWithoutSuffix, '.') = 0; 30950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho newPoolBundle->fLocale = nameWithoutSuffix; 31050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 31150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 31250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 31350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(options[USE_POOL_BUNDLE].doesOccur) { 31450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *poolResName = "pool.res"; 31550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho FileStream *poolFile; 31650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t poolFileSize; 31750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t indexLength; 31850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 31950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * TODO: Consolidate inputDir/filename handling from main() and processFile() 32050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * into a common function, and use it here as well. 32150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Try to create toolutil functions for dealing with dir/filenames and 32250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * loading ICU data files without udata_open(). 32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Share code with icupkg? 32450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Also, make_res_filename() seems to be unused. Review and remove. 32550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 32650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (options[USE_POOL_BUNDLE].value!=NULL) { 32750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcpy(theCurrentFileName, options[USE_POOL_BUNDLE].value); 32850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(theCurrentFileName, U_FILE_SEP_STRING); 32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if (inputDir) { 33050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcpy(theCurrentFileName, inputDir); 33150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(theCurrentFileName, U_FILE_SEP_STRING); 33250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 33350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *theCurrentFileName = 0; 33450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 33550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_strcat(theCurrentFileName, poolResName); 33650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho poolFile = T_FileStream_open(theCurrentFileName, "rb"); 33750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (poolFile == NULL) { 33850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "unable to open pool bundle file %s\n", theCurrentFileName); 33950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 1; 34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 34150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho poolFileSize = T_FileStream_size(poolFile); 34250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (poolFileSize < 32) { 34350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "the pool bundle file %s is too small\n", theCurrentFileName); 34450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 1; 34550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 34650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho poolBundle.fBytes = (uint8_t *)uprv_malloc((poolFileSize + 15) & ~15); 34750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (poolFileSize > 0 && poolBundle.fBytes == NULL) { 34850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "unable to allocate memory for the pool bundle file %s\n", theCurrentFileName); 34950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return U_MEMORY_ALLOCATION_ERROR; 35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 35150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UDataSwapper *ds; 35250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const DataHeader *header; 35350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t bytesRead = T_FileStream_read(poolFile, poolBundle.fBytes, poolFileSize); 35450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t keysBottom; 35550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (bytesRead != poolFileSize) { 35650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "unable to read the pool bundle file %s\n", theCurrentFileName); 35750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 1; 35850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 35950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* 36050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Swap the pool bundle so that a single checked-in file can be used. 36150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * The swapper functions also test that the data looks like 36250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * a well-formed .res file. 36350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 36450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ds = udata_openSwapperForInputData(poolBundle.fBytes, bytesRead, 36550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho U_IS_BIG_ENDIAN, U_CHARSET_FAMILY, &status); 36650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 36750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "udata_openSwapperForInputData(pool bundle %s) failed: %s\n", 36850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho theCurrentFileName, u_errorName(status)); 36950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return status; 37050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 37150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ures_swap(ds, poolBundle.fBytes, bytesRead, poolBundle.fBytes, &status); 37250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho udata_closeSwapper(ds); 37350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_FAILURE(status)) { 37450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "ures_swap(pool bundle %s) failed: %s\n", 37550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho theCurrentFileName, u_errorName(status)); 37650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return status; 37750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 37850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho header = (const DataHeader *)poolBundle.fBytes; 37950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (header->info.formatVersion[0]!=2) { 38050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "invalid format of pool bundle file %s\n", theCurrentFileName); 38150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return U_INVALID_FORMAT_ERROR; 38250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 38350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho poolBundle.fKeys = (const char *)header + header->dataHeader.headerSize; 38450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho poolBundle.fIndexes = (const int32_t *)poolBundle.fKeys + 1; 38550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho indexLength = poolBundle.fIndexes[URES_INDEX_LENGTH] & 0xff; 38650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (indexLength <= URES_INDEX_POOL_CHECKSUM) { 38750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "insufficient indexes[] in pool bundle file %s\n", theCurrentFileName); 38850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return U_INVALID_FORMAT_ERROR; 38950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 39050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho keysBottom = (1 + indexLength) * 4; 39150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho poolBundle.fKeys += keysBottom; 39250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho poolBundle.fKeysLength = (poolBundle.fIndexes[URES_INDEX_KEYS_TOP] * 4) - keysBottom; 39350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho poolBundle.fChecksum = poolBundle.fIndexes[URES_INDEX_POOL_CHECKSUM]; 39450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 39550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for (i = 0; i < poolBundle.fKeysLength; ++i) { 39650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (poolBundle.fKeys[i] == 0) { 39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ++poolBundle.fKeysCount; 39850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 39950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 40050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho T_FileStream_close(poolFile); 40150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho setUsePoolBundle(TRUE); 40250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 40350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 40427f654740f2a26ad62a5c155af9199af9e69b889claireho if(options[INCLUDE_UNIHAN_COLL].doesOccur) { 40527f654740f2a26ad62a5c155af9199af9e69b889claireho gIncludeUnihanColl = TRUE; 40627f654740f2a26ad62a5c155af9199af9e69b889claireho } 40727f654740f2a26ad62a5c155af9199af9e69b889claireho 40850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if((argc-1)!=1) { 40927f654740f2a26ad62a5c155af9199af9e69b889claireho printf("genrb number of files: %d\n", argc - 1); 41050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* generate the binary files */ 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 1; i < argc; ++i) { 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru status = U_ZERO_ERROR; 414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru arg = getLongPathname(argv[i]); 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (inputDir) { 417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(theCurrentFileName, inputDir); 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(theCurrentFileName, U_FILE_SEP_STRING); 419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *theCurrentFileName = 0; 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(theCurrentFileName, arg); 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (isVerbose()) { 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("Processing file \"%s\"\n", theCurrentFileName); 426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru processFile(arg, encoding, inputDir, outputDir, gPackageName, &status); 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 43050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_free(poolBundle.fBytes); 43150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 43250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(options[WRITE_POOL_BUNDLE].doesOccur) { 43350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho char outputFileName[256]; 43450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bundle_write(newPoolBundle, outputDir, NULL, outputFileName, sizeof(outputFileName), &status); 43550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bundle_close(newPoolBundle, &status); 43650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(status)) { 43750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "unable to write the pool bundle: %s\n", u_errorName(status)); 43850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 43950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 44050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Dont return warnings as a failure */ 44250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (U_SUCCESS(status)) { 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return status; 447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Process a file */ 45027f654740f2a26ad62a5c155af9199af9e69b889clairehovoid 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruprocessFile(const char *filename, const char *cp, const char *inputDir, const char *outputDir, const char *packageName, UErrorCode *status) { 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /*FileStream *in = NULL;*/ 453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru struct SRBRoot *data = NULL; 454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UCHARBUF *ucbuf = NULL; 455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *rbname = NULL; 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *openFileName = NULL; 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *inputDirBuf = NULL; 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char outputFileName[256]; 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dirlen = 0; 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t filelen = 0; 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 46427f654740f2a26ad62a5c155af9199af9e69b889claireho 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (status==NULL || U_FAILURE(*status)) { 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(filename==NULL){ 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status=U_ILLEGAL_ARGUMENT_ERROR; 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return; 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru filelen = (int32_t)uprv_strlen(filename); 473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(inputDir == NULL) { 475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *filenameBegin = uprv_strrchr(filename, U_FILE_SEP_CHAR); 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru openFileName = (char *) uprv_malloc(dirlen + filelen + 2); 477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru openFileName[0] = '\0'; 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (filenameBegin != NULL) { 479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * When a filename ../../../data/root.txt is specified, 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * we presume that the input directory is ../../../data 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is very important when the resource file includes 483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * another file, like UCARules.txt or thaidict.brk. 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t filenameSize = (int32_t)(filenameBegin - filename + 1); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inputDirBuf = uprv_strncpy((char *)uprv_malloc(filenameSize), filename, filenameSize); 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(inputDirBuf == NULL) { 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inputDirBuf[filenameSize - 1] = 0; 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inputDir = inputDirBuf; 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dirlen = (int32_t)uprv_strlen(inputDir); 497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dirlen = (int32_t)uprv_strlen(inputDir); 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(inputDir[dirlen-1] != U_FILE_SEP_CHAR) { 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru openFileName = (char *) uprv_malloc(dirlen + filelen + 2); 503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(openFileName == NULL) { 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru openFileName[0] = '\0'; 511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * append the input dir to openFileName if the first char in 513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * filename is not file seperation char and the last char input directory is not '.'. 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This is to support : 515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * genrb -s. /home/icu/data 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * genrb -s. icu/data 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The user cannot mix notations like 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * genrb -s. /icu/data --- the absolute path specified. -s redundant 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * user should use 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * genrb -s. icu/data --- start from CWD and look in icu/data dir 521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if( (filename[0] != U_FILE_SEP_CHAR) && (inputDir[dirlen-1] !='.')){ 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(openFileName, inputDir); 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru openFileName[dirlen] = U_FILE_SEP_CHAR; 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru openFileName[dirlen + 1] = '\0'; 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru openFileName = (char *) uprv_malloc(dirlen + filelen + 1); 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* test for NULL */ 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(openFileName == NULL) { 532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(openFileName, inputDir); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(openFileName, filename); 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucbuf = ucbuf_open(openFileName, &cp,getShowWarning(),TRUE, status); 544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(*status == U_FILE_ACCESS_ERROR) { 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "couldn't open file %s\n", openFileName == NULL ? filename : openFileName); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (ucbuf == NULL || U_FAILURE(*status)) { 550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "An error occured processing file %s. Error: %s\n", openFileName == NULL ? filename : openFileName,u_errorName(*status)); 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* auto detected popular encodings? */ 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (cp!=NULL && isVerbose()) { 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru printf("autodetected encoding %s\n", cp); 556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Parse the data into an SRBRoot */ 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru data = parse(ucbuf, inputDir, outputDir, status); 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (data == NULL || U_FAILURE(*status)) { 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "couldn't parse the file %s. Error:%s\n", filename,u_errorName(*status)); 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 56450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(options[WRITE_POOL_BUNDLE].doesOccur) { 56550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t newKeysLength; 56650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const char *newKeys, *newKeysLimit; 56750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bundle_compactKeys(data, status); 56850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho newKeys = bundle_getKeyBytes(data, &newKeysLength); 56950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho bundle_addKeyBytes(newPoolBundle, newKeys, newKeysLength, status); 57050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(U_FAILURE(*status)) { 57150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "bundle_compactKeys(%s) or bundle_getKeyBytes() failed: %s\n", 57250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho filename, u_errorName(*status)); 57350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho goto finish; 57450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 57550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* count the number of just-added key strings */ 57650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(newKeysLimit = newKeys + newKeysLength; newKeys < newKeysLimit; ++newKeys) { 57750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(*newKeys == 0) { 57850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ++newPoolBundle->fKeysCount; 57950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 58050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 58150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 58250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 58350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(options[USE_POOL_BUNDLE].doesOccur) { 58450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data->fPoolBundleKeys = poolBundle.fKeys; 58550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data->fPoolBundleKeysLength = poolBundle.fKeysLength; 58650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data->fPoolBundleKeysCount = poolBundle.fKeysCount; 58750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho data->fPoolChecksum = poolBundle.fChecksum; 58850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Determine the target rb filename */ 591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru rbname = make_res_filename(filename, outputDir, packageName, status); 592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_FAILURE(*status)) { 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "couldn't make the res fileName for bundle %s. Error:%s\n", filename,u_errorName(*status)); 594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(write_java== TRUE){ 597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundle_write_java(data,outputDir,outputEnc, outputFileName, sizeof(outputFileName),packageName,bundleName,status); 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else if(write_xliff ==TRUE){ 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundle_write_xml(data,outputDir,outputEnc, filename, outputFileName, sizeof(outputFileName),language, xliffOutputFileName,status); 600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru }else{ 601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Write the data to the file */ 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundle_write(data, outputDir, packageName, outputFileName, sizeof(outputFileName), status); 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*status)) { 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, "couldn't write bundle %s. Error:%s\n", outputFileName,u_errorName(*status)); 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bundle_close(data, status); 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufinish: 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (inputDirBuf != NULL) { 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(inputDirBuf); 613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (openFileName != NULL) { 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(openFileName); 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(ucbuf) { 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ucbuf_close(ucbuf); 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (rbname) { 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(rbname); 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Generate the target .res file name from the input file name */ 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic char* 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumake_res_filename(const char *filename, 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *outputDir, 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *packageName, 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode *status) { 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *basename; 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *dirname; 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char *resName; 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t pkgLen = 0; /* length of package prefix */ 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (U_FAILURE(*status)) { 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(packageName != NULL) 645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pkgLen = (int32_t)(1 + uprv_strlen(packageName)); 647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* setup */ 650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru basename = dirname = resName = 0; 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* determine basename, and compiled file names */ 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru basename = (char*) uprv_malloc(sizeof(char) * (uprv_strlen(filename) + 1)); 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(basename == 0) { 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru get_basename(basename, filename); 660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru dirname = (char*) uprv_malloc(sizeof(char) * (uprv_strlen(filename) + 1)); 662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(dirname == 0) { 663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru get_dirname(dirname, filename); 668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (outputDir == NULL) { 670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* output in same dir as .txt */ 671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resName = (char*) uprv_malloc(sizeof(char) * (uprv_strlen(dirname) 672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + pkgLen 673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + uprv_strlen(basename) 674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru + uprv_strlen(RES_SUFFIX) + 8)); 675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(resName == 0) { 676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(resName, dirname); 681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(packageName != NULL) 683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(resName, packageName); 685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(resName, "_"); 686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(resName, basename); 689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t dirlen = (int32_t)uprv_strlen(outputDir); 692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t basenamelen = (int32_t)uprv_strlen(basename); 693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resName = (char*) uprv_malloc(sizeof(char) * (dirlen + pkgLen + basenamelen + 8)); 695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (resName == NULL) { 697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_MEMORY_ALLOCATION_ERROR; 698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru goto finish; 699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcpy(resName, outputDir); 702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(outputDir[dirlen] != U_FILE_SEP_CHAR) { 704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resName[dirlen] = U_FILE_SEP_CHAR; 705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru resName[dirlen + 1] = '\0'; 706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(packageName != NULL) 709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(resName, packageName); 711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(resName, "_"); 712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_strcat(resName, basename); 715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufinish: 718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(basename); 719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(dirname); 720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return resName; 722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables: 726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil 727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End: 728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 729