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