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