1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************* 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 464339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* Copyright (C) 2016 and later: Unicode, Inc. and others. 564339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* License & terms of use: http://www.unicode.org/copyright.html#License 664339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* 764339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert******************************************************************************* 864339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert******************************************************************************* 964339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert* 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Copyright (C) 1999-2007, International Business Machines 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************* 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* file name: uresb.c 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* encoding: US-ASCII 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* tab size: 8 (not used) 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* indentation:4 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* created on: 2000sep6 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* created by: Vladimir Weinstein 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/****************************************************************************** 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This program prints out resource bundles - example for 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * ICU workshop 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * TODO: make a complete i18n layout for this program. 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************/ 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/putil.h" 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ures.h" 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustdio.h" 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uloc.h" 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h" 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uoptions.h" 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "toolutil.h" 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h> 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h> 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef WIN32 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <direct.h> 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <unistd.h> 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define URESB_DEFAULTTRUNC 40 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic char *currdir = NULL; 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*--locale sr_YU and --encoding cp855 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * are interesting on Win32 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *locale = NULL; 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *encoding = NULL; 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *resPath = NULL; 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t indentsize = 4; 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UFILE *outerr = NULL; 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t truncsize = URESB_DEFAULTTRUNC; 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UBool trunc = FALSE; 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst UChar baderror[] = { 0x0042, 0x0041, 0x0044, 0x0000 }; 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst UChar *getErrorName(UErrorCode errorNumber); 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid reportError(UErrorCode *status); 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UChar *quotedString(const UChar *string); 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent, UErrorCode *status); 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid printIndent(UFILE *out, int32_t indent); 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid printHex(UFILE *out, const int8_t *what); 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UOption options[]={ 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_HELP_H, 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_HELP_QUESTION_MARK, 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { "locale", NULL, NULL, NULL, 'l', UOPT_REQUIRES_ARG, 0 }, 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_ENCODING, 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { "path", NULL, NULL, NULL, 'p', UOPT_OPTIONAL_ARG, 0 }, 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { "truncate", NULL, NULL, NULL, 't', UOPT_OPTIONAL_ARG, 0 }, 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UOPTION_VERBOSE 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UBool VERBOSE = FALSE; 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruextern int 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querumain(int argc, char* argv[]) { 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UResourceBundle *bundle = NULL; 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UFILE *out = NULL; 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t i = 0; 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char* arg; 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char resPathBuffer[1024]; 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef WIN32 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru currdir = _getcwd(NULL, 0); 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru currdir = getcwd(NULL, 0); 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru argc=u_parseArgs(argc, argv, sizeof(options)/sizeof(options[0]), options); 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* error handling, printing usage message */ 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(argc<0) { 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "error in command line argument \"%s\"\n", 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru argv[-argc]); 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(argc<2 || options[0].doesOccur || options[1].doesOccur) { 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fprintf(stderr, 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru "usage: %s [-options] locale(s)\n", 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru argv[0]); 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR; 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[2].doesOccur) { 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru locale = options[2].value; 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru locale = 0; 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[3].doesOccur) { 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru encoding = options[3].value; 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru encoding = NULL; 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[4].doesOccur) { 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[4].value != NULL) { 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru resPath = options[4].value; /* we'll use users resources */ 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru resPath = NULL; /* we'll use ICU system resources for dumping */ 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru strcpy(resPathBuffer, currdir); 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /*strcat(resPathBuffer, U_FILE_SEP_STRING); 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru strcat(resPathBuffer, "uresb");*/ 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru resPath = resPathBuffer; /* we'll just dump uresb samples resources */ 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[5].doesOccur) { 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru trunc = TRUE; 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[5].value != NULL) { 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru truncsize = atoi(options[5].value); /* user defined printable size */ 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru truncsize = URESB_DEFAULTTRUNC; /* we'll use default omitting size */ 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru trunc = FALSE; 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(options[6].doesOccur) { 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru VERBOSE = TRUE; 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru outerr = u_finit(stderr, locale, encoding); 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru out = u_finit(stdout, locale, encoding); 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for(i = 1; i < argc; ++i) { 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status = U_ZERO_ERROR; 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru arg = getLongPathname(argv[i]); 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "uresb: processing file \"%s\" in path \"%s\"\n", arg, resPath); 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru bundle = ures_open(resPath, arg, &status); 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_SUCCESS(status)) { 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%s\n", arg); 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printOutBundle(out, bundle, 0, &status); 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru reportError(&status); 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ures_close(bundle); 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fclose(out); 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fclose(outerr); 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 0; 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid printIndent(UFILE *out, int32_t indent) { 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char inchar[256]; 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t i = 0; 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for(i = 0; i<indent; i++) { 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru inchar[i] = ' '; 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru inchar[indent] = '\0'; 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%s", inchar); 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid printHex(UFILE *out, const int8_t *what) { 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%02X", (uint8_t)*what); 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UChar *quotedString(const UChar *string) { 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int len = u_strlen(string); 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int alen = len; 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *sp; 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *newstr, *np; 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (sp = string; *sp; ++sp) { 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru switch (*sp) { 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case '\n': 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 0x0022: 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ++alen; 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru newstr = (UChar *) malloc((1 + alen) * sizeof(*newstr)); 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (sp = string, np = newstr; *sp; ++sp) { 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru switch (*sp) { 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case '\n': 210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *np++ = 0x005C; 211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *np++ = 0x006E; 212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case 0x0022: 215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *np++ = 0x005C; 216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru default: 218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *np++ = *sp; 219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *np = 0; 223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return newstr; 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid printOutBundle(UFILE *out, UResourceBundle *resource, int32_t indent, UErrorCode *status) { 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t i = 0; 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *key = ures_getKey(resource); 230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru switch(ures_getType(resource)) { 232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case URES_STRING : 233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len=0; 235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar*thestr = ures_getString(resource, &len, status); 236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UChar *string = quotedString(thestr); 237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* TODO: String truncation */ 239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(trunc && len > truncsize) { 241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printIndent(out, indent); 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "// WARNING: this string, size %d is truncated to %d\n", len, truncsize/2); 243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru len = truncsize/2; 244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printIndent(out, indent); 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(key != NULL) { 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%s { \"%S\" } ", key, string); 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "\"%S\",", string); 251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(VERBOSE) { 253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, " // STRING"); 254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "\n"); 256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru free(string); 257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case URES_INT : 260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printIndent(out, indent); 261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(key != NULL) { 262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%s", key); 263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, ":int { %li } ", ures_getInt(resource, status)); 265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(VERBOSE) { 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, " // INT"); 268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "\n"); 270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case URES_BINARY : 272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len = 0; 274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const int8_t *data = (const int8_t *)ures_getBinary(resource, &len, status); 275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(trunc && len > truncsize) { 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printIndent(out, indent); 277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "// WARNING: this resource, size %li is truncated to %li\n", len, truncsize/2); 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru len = truncsize/2; 279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_SUCCESS(*status)) { 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printIndent(out, indent); 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(key != NULL) { 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%s", key); 284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, ":binary { "); 286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for(i = 0; i<len; i++) { 287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printHex(out, data++); 288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, " }"); 290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(VERBOSE) { 291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, " // BINARY"); 292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "\n"); 294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru reportError(status); 297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case URES_INT_VECTOR : 301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len = 0; 303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const int32_t *data = ures_getIntVector(resource, &len, status); 304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_SUCCESS(*status)) { 305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printIndent(out, indent); 306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(key != NULL) { 307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%s", key); 308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, ":intvector { "); 310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for(i = 0; i<len-1; i++) { 311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%d, ", data[i]); 312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(len > 0) { 314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%d ", data[len-1]); 315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "}"); 317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(VERBOSE) { 318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, " // INTVECTOR"); 319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "\n"); 321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru reportError(status); 324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case URES_TABLE : 328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru case URES_ARRAY : 329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UResourceBundle *t = NULL; 331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ures_resetIterator(resource); 332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printIndent(out, indent); 333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(key != NULL) { 334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "%s ", key); 335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "{"); 337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(VERBOSE) { 338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(ures_getType(resource) == URES_TABLE) { 339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, " // TABLE"); 340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, " // ARRAY"); 342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "\n"); 345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru while(ures_hasNext(resource)) { 347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru t = ures_getNextResource(resource, t, status); 348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printOutBundle(out, t, indent+indentsize, status); 349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru printIndent(out, indent); 352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(out, "}\n"); 353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ures_close(t); 354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru default: 357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru break; 358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid reportError(UErrorCode *status) { 363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru u_fprintf(outerr, "Error %d(%s) : %U happened!\n", *status, u_errorName(*status), getErrorName(*status)); 364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst UChar *getErrorName(UErrorCode errorNumber) { 368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t len = 0; 370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UResourceBundle *error = ures_open(currdir, locale, &status); 372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UResourceBundle *errorcodes = ures_getByKey(error, "errorcodes", NULL, &status); 374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const UChar *result = ures_getStringByIndex(errorcodes, errorNumber, &len, &status); 376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ures_close(errorcodes); 378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ures_close(error); 379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(U_SUCCESS(status)) { 381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return result; 382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return baderror; 384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 387