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