1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 4c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* Copyright (C) 1999-2015, International Business Machines 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************* 8c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert* file name: derb.cpp 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* encoding: US-ASCII 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* tab size: 8 (not used) 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* indentation:4 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created on: 2000sep6 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* created by: Vladimir Weinstein as an ICU workshop example 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* maintained by: Yves Arrouye <yves@realnames.com> 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/ 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 18c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/stringpiece.h" 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ucnv.h" 20c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "unicode/unistr.h" 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h" 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/putil.h" 2359d709d503bab6e2b61931737e662dd293b40578ccornelius#include "unicode/ustdio.h" 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 25c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert#include "charstr.h" 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uresimp.h" 27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h" 28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h" 29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "uoptions.h" 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "toolutil.h" 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "ustrfmt.h" 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3359d709d503bab6e2b61931737e662dd293b40578ccornelius#if !UCONFIG_NO_FORMATTING 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 3559d709d503bab6e2b61931737e662dd293b40578ccornelius#define DERB_VERSION "1.1" 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define DERB_DEFAULT_TRUNC 80 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const int32_t indentsize = 4; 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic int32_t truncsize = DERB_DEFAULT_TRUNC; 418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Corneliusstatic UBool opt_truncate = FALSE; 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *getEncodingName(const char *encoding); 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void reportError(const char *pname, UErrorCode *status, const char *when); 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar *quotedString(const UChar *string); 46c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent, const char *pname, UErrorCode *status); 47c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printString(UFILE *out, const UChar *str, int32_t len); 48c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printCString(UFILE *out, const char *str, int32_t len); 49c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printIndent(UFILE *out, int32_t indent); 50c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printHex(UFILE *out, uint8_t what); 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UOption options[]={ 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_HELP_H, 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UOPTION_HELP_QUESTION_MARK, 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2 */ UOPTION_ENCODING, 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 3 */ { "to-stdout", NULL, NULL, NULL, 'c', UOPT_NO_ARG, 0 } , 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 4 */ { "truncate", NULL, NULL, NULL, 't', UOPT_OPTIONAL_ARG, 0 }, 58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 5 */ UOPTION_VERBOSE, 59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 6 */ UOPTION_DESTDIR, 60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 7 */ UOPTION_SOURCEDIR, 61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 8 */ { "bom", NULL, NULL, NULL, 0, UOPT_NO_ARG, 0 }, 62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 9 */ UOPTION_ICUDATADIR, 63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 10 */ UOPTION_VERSION, 6459d709d503bab6e2b61931737e662dd293b40578ccornelius/* 11 */ { "suppressAliases", NULL, NULL, NULL, 'A', UOPT_NO_ARG, 0 }, 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}; 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool verbose = FALSE; 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UBool suppressAliases = FALSE; 6959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UFILE *ustderr = NULL; 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruextern int 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querumain(int argc, char* argv[]) { 73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *encoding = NULL; 74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *outputDir = NULL; /* NULL = no output directory, use current */ 75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *inputDir = "."; 76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int tostdout = 0; 77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int prbom = 0; 78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *pname; 80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *bundle = NULL; 82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char* arg; 85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* Get the name of tool. */ 87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pname = uprv_strrchr(*argv, U_FILE_SEP_CHAR); 88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR 89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!pname) { 90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pname = uprv_strrchr(*argv, U_FILE_ALT_SEP_CHAR); 91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!pname) { 94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pname = *argv; 95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++pname; 97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* error handling, printing usage message */ 100c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options); 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* error handling, printing usage message */ 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(argc<0) { 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%s: error in command line argument \"%s\"\n", pname, 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru argv[-argc]); 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(argc<0 || options[0].doesOccur || options[1].doesOccur) { 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(argc < 0 ? stderr : stdout, 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%csage: %s [ -h, -?, --help ] [ -V, --version ]\n" 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " [ -v, --verbose ] [ -e, --encoding encoding ] [ --bom ]\n" 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " [ -t, --truncate [ size ] ]\n" 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " [ -s, --sourcedir source ] [ -d, --destdir destination ]\n" 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " [ -i, --icudatadir directory ] [ -c, --to-stdout ]\n" 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " [ -A, --suppressAliases]\n" 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru " bundle ...\n", argc < 0 ? 'u' : 'U', 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pname); 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[10].doesOccur) { 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru fprintf(stderr, 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%s version %s (ICU version %s).\n" 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru "%s\n", 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru pname, DERB_VERSION, U_ICU_VERSION, U_COPYRIGHT_STRING); 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return U_ZERO_ERROR; 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[2].doesOccur) { 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru encoding = options[2].value; 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options[3].doesOccur) { 13359d709d503bab6e2b61931737e662dd293b40578ccornelius if(options[2].doesOccur) { 13459d709d503bab6e2b61931737e662dd293b40578ccornelius fprintf(stderr, "%s: Error: don't specify an encoding (-e) when writing to stdout (-c).\n", pname); 13559d709d503bab6e2b61931737e662dd293b40578ccornelius return 3; 13659d709d503bab6e2b61931737e662dd293b40578ccornelius } 13759d709d503bab6e2b61931737e662dd293b40578ccornelius tostdout = 1; 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[4].doesOccur) { 1418393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius opt_truncate = TRUE; 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[4].value != NULL) { 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru truncsize = atoi(options[4].value); /* user defined printable size */ 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru truncsize = DERB_DEFAULT_TRUNC; /* we'll use default omitting size */ 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 1488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius opt_truncate = FALSE; 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[5].doesOccur) { 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru verbose = TRUE; 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options[6].doesOccur) { 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru outputDir = options[6].value; 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(options[7].doesOccur) { 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru inputDir = options[7].value; /* we'll use users resources */ 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options[8].doesOccur) { 164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru prbom = 1; 165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options[9].doesOccur) { 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru u_setDataDirectory(options[9].value); 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (options[11].doesOccur) { 172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru suppressAliases = TRUE; 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17559d709d503bab6e2b61931737e662dd293b40578ccornelius fflush(stderr); // use ustderr now. 17659d709d503bab6e2b61931737e662dd293b40578ccornelius ustderr = u_finit(stderr, NULL, NULL); 177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (i = 1; i < argc; ++i) { 179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar sp[] = { 0x0020 }; /* " " */ 180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru arg = getLongPathname(argv[i]); 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (verbose) { 18459d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(ustderr, "processing bundle \"%s\"\n", argv[i]); 185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 187c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert icu::CharString locale; 188c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UErrorCode status = U_ZERO_ERROR; 189c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert { 190c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const char *p = findBasename(arg); 191c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const char *q = uprv_strrchr(p, '.'); 192c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (q == NULL) { 193c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert locale.append(p, status); 194c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } else { 195c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert locale.append(p, (int32_t)(q - p), status); 196c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 198c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (U_FAILURE(status)) { 199c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return status; 200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 202c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert icu::CharString infile; 203c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const char *thename = NULL; 204c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert UBool fromICUData = !uprv_strcmp(inputDir, "-"); 205c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (!fromICUData) { 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UBool absfilename = *arg == U_FILE_SEP_CHAR; 207103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if U_PLATFORM_HAS_WIN32_API 208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!absfilename) { 209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru absfilename = (uprv_strlen(arg) > 2 && isalpha(arg[0]) 210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru && arg[1] == ':' && arg[2] == U_FILE_SEP_CHAR); 211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (absfilename) { 214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru thename = arg; 215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 216c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert const char *q = uprv_strrchr(arg, U_FILE_SEP_CHAR); 217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR 218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (q == NULL) { 219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru q = uprv_strrchr(arg, U_FILE_ALT_SEP_CHAR); 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif 222c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert infile.append(inputDir, status); 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(q != NULL) { 224c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert infile.appendPathPart(icu::StringPiece(arg, (int32_t)(q - arg)), status); 225c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 226c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (U_FAILURE(status)) { 227c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return status; 228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 229c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert thename = infile.data(); 230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (thename) { 233c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert bundle = ures_openDirect(thename, locale.data(), &status); 234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 235c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert bundle = ures_open(fromICUData ? 0 : inputDir, locale.data(), &status); 236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 237c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (U_SUCCESS(status)) { 23859d709d503bab6e2b61931737e662dd293b40578ccornelius UFILE *out = NULL; 239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *filename = 0; 241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *ext = 0; 242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 243c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (locale.isEmpty() || !tostdout) { 244c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert filename = findBasename(arg); 245c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ext = uprv_strrchr(filename, '.'); 246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!ext) { 247c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert ext = uprv_strchr(filename, 0); 248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (tostdout) { 25259d709d503bab6e2b61931737e662dd293b40578ccornelius out = u_get_stdout(); 253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 254c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert icu::CharString thefile; 255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (outputDir) { 256c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert thefile.append(outputDir, status); 257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 258c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert thefile.appendPathPart(filename, status); 259c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (*ext) { 260c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert thefile.truncate(thefile.length() - (int32_t)uprv_strlen(ext)); 261c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert } 262c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert thefile.append(".txt", status); 263c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (U_FAILURE(status)) { 264c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert return status; 265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 267c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert out = u_fopen(thefile.data(), "w", NULL, encoding); 268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!out) { 269c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert u_fprintf(ustderr, "%s: couldn't create %s\n", pname, thefile.data()); 27059d709d503bab6e2b61931737e662dd293b40578ccornelius u_fclose(ustderr); 27159d709d503bab6e2b61931737e662dd293b40578ccornelius return 4; 272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 27559d709d503bab6e2b61931737e662dd293b40578ccornelius // now, set the callback. 27659d709d503bab6e2b61931737e662dd293b40578ccornelius ucnv_setFromUCallBack(u_fgetConverter(out), UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_C, 0, 0, &status); 27759d709d503bab6e2b61931737e662dd293b40578ccornelius if (U_FAILURE(status)) { 27859d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(ustderr, "%s: couldn't configure converter for encoding\n", pname); 27959d709d503bab6e2b61931737e662dd293b40578ccornelius u_fclose(ustderr); 28059d709d503bab6e2b61931737e662dd293b40578ccornelius if(!tostdout) { 28159d709d503bab6e2b61931737e662dd293b40578ccornelius u_fclose(out); 28259d709d503bab6e2b61931737e662dd293b40578ccornelius } 28359d709d503bab6e2b61931737e662dd293b40578ccornelius return 3; 284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 28659d709d503bab6e2b61931737e662dd293b40578ccornelius if (prbom) { /* XXX: Should be done only for UTFs */ 28759d709d503bab6e2b61931737e662dd293b40578ccornelius u_fputc(0xFEFF, out); 28859d709d503bab6e2b61931737e662dd293b40578ccornelius } 28959d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(out, "// -*- Coding: %s; -*-\n//\n", encoding ? encoding : getEncodingName(ucnv_getDefaultName())); 29059d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(out, "// This file was dumped by derb(8) from "); 291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (thename) { 29259d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(out, "%s", thename); 293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else if (fromICUData) { 294c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert u_fprintf(out, "the ICU internal %s locale", locale.data()); 295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 29759d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(out, "\n// derb(8) by Vladimir Weinstein and Yves Arrouye\n\n"); 298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 299c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert if (!locale.isEmpty()) { 300c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert u_fprintf(out, "%s", locale.data()); 301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 302c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert u_fprintf(out, "%.*s%.*S", (int32_t)(ext - filename), filename, UPRV_LENGTHOF(sp), sp); 303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 304c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printOutBundle(out, bundle, 0, pname, &status); 305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 30659d709d503bab6e2b61931737e662dd293b40578ccornelius if (!tostdout) { 30759d709d503bab6e2b61931737e662dd293b40578ccornelius u_fclose(out); 308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru else { 311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportError(pname, &status, "opening resource file"); 312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(bundle); 315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return 0; 318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic UChar *quotedString(const UChar *string) { 321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int len = u_strlen(string); 322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int alen = len; 323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar *sp; 324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *newstr, *np; 325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (sp = string; *sp; ++sp) { 327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (*sp) { 328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case '\n': 329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0022: 330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ++alen; 331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 335c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert newstr = (UChar *) uprv_malloc((1 + alen) * U_SIZEOF_UCHAR); 336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for (sp = string, np = newstr; *sp; ++sp) { 337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch (*sp) { 338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case '\n': 339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *np++ = 0x005C; 340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *np++ = 0x006E; 341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru case 0x0022: 344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *np++ = 0x005C; 345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *np++ = *sp; 348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *np = 0; 352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return newstr; 354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 357c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printString(UFILE *out, const UChar *str, int32_t len) { 35859d709d503bab6e2b61931737e662dd293b40578ccornelius u_file_write(str, len, out); 359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 361c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printCString(UFILE *out, const char *str, int32_t len) { 36259d709d503bab6e2b61931737e662dd293b40578ccornelius if(len==-1) { 36359d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(out, "%s", str); 36459d709d503bab6e2b61931737e662dd293b40578ccornelius } else { 36559d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(out, "%.*s", len, str); 36659d709d503bab6e2b61931737e662dd293b40578ccornelius } 367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 369c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printIndent(UFILE *out, int32_t indent) { 370c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert icu::UnicodeString inchar(indent, 0x20, indent); 371c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, inchar.getBuffer(), indent); 372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 374c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printHex(UFILE *out, uint8_t what) { 375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const char map[] = "0123456789ABCDEF"; 376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar hex[2]; 377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hex[0] = map[what >> 4]; 379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru hex[1] = map[what & 0xf]; 380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 381c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, hex, 2); 382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 384c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printOutAlias(UFILE *out, UResourceBundle *parent, Resource r, const char *key, int32_t indent, const char *pname, UErrorCode *status) { 385c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert static const UChar cr[] = { 0xA }; // LF 386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0; 38750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho const UChar* thestr = res_getAlias(&(parent->fResData), r, &len); 388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar *string = quotedString(thestr); 3898393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if(opt_truncate && len > truncsize) { 390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char msg[128]; 391c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(msg, "// WARNING: this resource, size %li is truncated to %li\n", 393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (long)len, (long)truncsize/2); 394c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, msg, -1); 395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = truncsize; 396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(*status)) { 398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar openStr[] = { 0x003A, 0x0061, 0x006C, 0x0069, 0x0061, 0x0073, 0x0020, 0x007B, 0x0020, 0x0022 }; /* ":alias { \"" */ 399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar closeStr[] = { 0x0022, 0x0020, 0x007D, 0x0020 }; /* "\" } " */ 400c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(key != NULL) { 402c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, key, -1); 403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 404c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, openStr, UPRV_LENGTHOF(openStr)); 405c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, string, len); 406c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, closeStr, UPRV_LENGTHOF(closeStr)); 407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(verbose) { 408c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, " // ALIAS", -1); 409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 410c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, cr, UPRV_LENGTHOF(cr)); 411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportError(pname, status, "getting binary value"); 413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru uprv_free(string); 415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 417c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubertstatic void printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent, const char *pname, UErrorCode *status) 418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{ 419c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert static const UChar cr[] = { 0xA }; // LF 420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* int32_t noOfElements = ures_getSize(resource);*/ 422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t i = 0; 423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *key = ures_getKey(resource); 424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru switch(ures_getType(resource)) { 42650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case URES_STRING : 427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len=0; 429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const UChar* thestr = ures_getString(resource, &len, status); 430c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru UChar *string = quotedString(thestr); 431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* TODO: String truncation */ 4338393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if(opt_truncate && len > truncsize) { 434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char msg[128]; 435c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(msg, "// WARNING: this resource, size %li is truncated to %li\n", 437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (long)len, (long)(truncsize/2)); 438c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, msg, -1); 439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = truncsize/2; 440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 441c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(key != NULL) { 443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar openStr[] = { 0x0020, 0x007B, 0x0020, 0x0022 }; /* " { \"" */ 444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar closeStr[] = { 0x0022, 0x0020, 0x007D }; /* "\" }" */ 445c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, key, (int32_t)uprv_strlen(key)); 446c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, openStr, UPRV_LENGTHOF(openStr)); 447c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, string, len); 448c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, closeStr, UPRV_LENGTHOF(closeStr)); 449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar openStr[] = { 0x0022 }; /* "\"" */ 451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar closeStr[] = { 0x0022, 0x002C }; /* "\"," */ 452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 453c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, openStr, UPRV_LENGTHOF(openStr)); 454c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, string, (int32_t)(u_strlen(string))); 455c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, closeStr, UPRV_LENGTHOF(closeStr)); 456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(verbose) { 459c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, "// STRING", -1); 460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 461c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, cr, UPRV_LENGTHOF(cr)); 462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_free(string); 464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 46750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case URES_INT : 468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar openStr[] = { 0x003A, 0x0069, 0x006E, 0x0074, 0x0020, 0x007B, 0x0020 }; /* ":int { " */ 470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar closeStr[] = { 0x0020, 0x007D }; /* " }" */ 471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar num[20]; 472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 473c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(key != NULL) { 475c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, key, -1); 476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 477c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, openStr, UPRV_LENGTHOF(openStr)); 478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_itou(num, 20, ures_getInt(resource, status), 10, 0); 479c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, num, u_strlen(num)); 480c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, closeStr, UPRV_LENGTHOF(closeStr)); 481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(verbose) { 483c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, "// INT", -1); 484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 485c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, cr, UPRV_LENGTHOF(cr)); 486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 48850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case URES_BINARY : 489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0; 491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int8_t *data = (const int8_t *)ures_getBinary(resource, &len, status); 4928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius if(opt_truncate && len > truncsize) { 493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru char msg[128]; 494c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru sprintf(msg, "// WARNING: this resource, size %li is truncated to %li\n", 496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru (long)len, (long)(truncsize/2)); 497c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, msg, -1); 498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru len = truncsize; 499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(*status)) { 501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar openStr[] = { 0x003A, 0x0062, 0x0069, 0x006E, 0x0061, 0x0072, 0x0079, 0x0020, 0x007B, 0x0020 }; /* ":binary { " */ 502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar closeStr[] = { 0x0020, 0x007D, 0x0020 }; /* " } " */ 503c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(key != NULL) { 505c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, key, -1); 506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 507c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, openStr, UPRV_LENGTHOF(openStr)); 508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i<len; i++) { 509c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printHex(out, *data++); 510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 511c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, closeStr, UPRV_LENGTHOF(closeStr)); 512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(verbose) { 513c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, " // BINARY", -1); 514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 515c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, cr, UPRV_LENGTHOF(cr)); 516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportError(pname, status, "getting binary value"); 518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 52150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case URES_INT_VECTOR : 522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t len = 0; 524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const int32_t *data = ures_getIntVector(resource, &len, status); 525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(*status)) { 526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar openStr[] = { 0x003A, 0x0069, 0x006E, 0x0074, 0x0076, 0x0065, 0x0063, 0x0074, 0x006F, 0x0072, 0x0020, 0x007B, 0x0020 }; /* ":intvector { " */ 527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar closeStr[] = { 0x0020, 0x007D, 0x0020 }; /* " } " */ 528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UChar num[20]; 529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 530c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(key != NULL) { 532c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, key, -1); 533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 534c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, openStr, UPRV_LENGTHOF(openStr)); 535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru for(i = 0; i < len - 1; i++) { 536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t numLen = uprv_itou(num, 20, data[i], 10, 0); 537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru num[numLen++] = 0x002C; /* ',' */ 538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru num[numLen++] = 0x0020; /* ' ' */ 539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru num[numLen] = 0; 540c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, num, u_strlen(num)); 541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(len > 0) { 543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uprv_itou(num, 20, data[len - 1], 10, 0); 544c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, num, u_strlen(num)); 545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 546c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, closeStr, UPRV_LENGTHOF(closeStr)); 547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(verbose) { 548c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, "// INTVECTOR", -1); 549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 550c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, cr, UPRV_LENGTHOF(cr)); 551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportError(pname, status, "getting int vector"); 553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 55650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case URES_TABLE : 55750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho case URES_ARRAY : 558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru { 559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar openStr[] = { 0x007B }; /* "{" */ 560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru static const UChar closeStr[] = { 0x007D, '\n' }; /* "}\n" */ 561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UResourceBundle *t = NULL; 563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_resetIterator(resource); 564c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(key != NULL) { 566c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, key, -1); 567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 568c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, openStr, UPRV_LENGTHOF(openStr)); 569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(verbose) { 57050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(ures_getType(resource) == URES_TABLE) { 571c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, "// TABLE", -1); 572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 573c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printCString(out, "// ARRAY", -1); 574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 576c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, cr, UPRV_LENGTHOF(cr)); 577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(suppressAliases == FALSE) { 579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru while(U_SUCCESS(*status) && ures_hasNext(resource)) { 580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = ures_getNextResource(resource, t, status); 581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(*status)) { 582c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printOutBundle(out, t, indent+indentsize, pname, status); 583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportError(pname, status, "While processing table"); 585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ZERO_ERROR; 586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { /* we have to use low level access to do this */ 58950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Resource r; 59050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t resSize = ures_getSize(resource); 59150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UBool isTable = (UBool)(ures_getType(resource) == URES_TABLE); 59250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho for(i = 0; i < resSize; i++) { 593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru /* need to know if it's an alias */ 59450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(isTable) { 59550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho r = res_getTableItemByIndex(&resource->fResData, resource->fRes, i, &key); 596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 59750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho r = res_getArrayItem(&resource->fResData, resource->fRes, i); 598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if(U_SUCCESS(*status)) { 60050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(res_getPublicType(r) == URES_ALIAS) { 601c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printOutAlias(out, resource, r, key, indent+indentsize, pname, status); 602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru t = ures_getByIndex(resource, i, t, status); 604c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printOutBundle(out, t, indent+indentsize, pname, status); 605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } else { 607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru reportError(pname, status, "While processing table"); 608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *status = U_ZERO_ERROR; 609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 613c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printIndent(out, indent); 614c14898b482f76ecab9026615e2e4c6fe78358bdcFredrik Roubert printString(out, closeStr, UPRV_LENGTHOF(closeStr)); 615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ures_close(t); 616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru default: 619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru break; 620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *getEncodingName(const char *encoding) { 625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru UErrorCode err; 626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const char *enc; 627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(enc = ucnv_getStandardName(encoding, "MIME", &err))) { 630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru err = U_ZERO_ERROR; 631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!(enc = ucnv_getStandardName(encoding, "IANA", &err))) { 632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ; 633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return enc; 637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void reportError(const char *pname, UErrorCode *status, const char *when) { 64059d709d503bab6e2b61931737e662dd293b40578ccornelius u_fprintf(ustderr, "%s: error %d while %s: %s\n", pname, *status, when, u_errorName(*status)); 641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 64359d709d503bab6e2b61931737e662dd293b40578ccornelius#else 64459d709d503bab6e2b61931737e662dd293b40578ccorneliusextern int 64559d709d503bab6e2b61931737e662dd293b40578ccorneliusmain(int argc, char* argv[]) { 64659d709d503bab6e2b61931737e662dd293b40578ccornelius /* Changing stdio.h ustdio.h requires that formatting not be disabled. */ 64759d709d503bab6e2b61931737e662dd293b40578ccornelius return 3; 64859d709d503bab6e2b61931737e662dd293b40578ccornelius} 64959d709d503bab6e2b61931737e662dd293b40578ccornelius#endif /* !UCONFIG_NO_FORMATTING */ 65059d709d503bab6e2b61931737e662dd293b40578ccornelius 651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Local Variables: 653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * indent-tabs-mode: nil 654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * End: 655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 656