1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru**********************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Copyright (C) 1998-2004, International Business Machines Corporation
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* and others.  All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru**********************************************************************
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* File uwmsg.c
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Date        Name        Description
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   06/14/99    stephen     Creation.
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/umsg.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uwmsg.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ures.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/putil.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cstring.h"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h>
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdarg.h>
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <string.h>
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define LENGTHOF(array) (sizeof(array)/sizeof((array)[0]))
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define BUF_SIZE 128
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Print a ustring to the specified FILE* in the default codepage */
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic void
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuprint(const UChar *s,
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       int32_t sourceLen,
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       FILE *f,
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       UErrorCode *status)
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* converter */
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UConverter *converter;
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char buf [BUF_SIZE];
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *mySource;
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *mySourceEnd;
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    char *myTarget;
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t arraySize;
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(s == 0) return;
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* set up the conversion parameters */
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    mySource     = s;
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    mySourceEnd  = mySource + sourceLen;
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    myTarget     = buf;
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    arraySize    = BUF_SIZE;
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* open a default converter */
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    converter = ucnv_open(0, status);
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* if we failed, clean up and exit */
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*status)) goto finish;
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* perform the conversion */
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    do {
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* reset the error code */
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ZERO_ERROR;
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* perform the conversion */
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        ucnv_fromUnicode(converter, &myTarget,  myTarget + arraySize,
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            &mySource, mySourceEnd, NULL,
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            TRUE, status);
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* Write the converted data to the FILE* */
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fwrite(buf, sizeof(char), myTarget - buf, f);
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* update the conversion parameters*/
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        myTarget     = buf;
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        arraySize    = BUF_SIZE;
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    while(*status == U_BUFFER_OVERFLOW_ERROR);
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querufinish:
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* close the converter */
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(converter);
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const char *gPath = 0;
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UResourceBundle *gBundle = NULL;
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_STRING_DECL(gNoFormatting, " (UCONFIG_NO_FORMATTING see uconfig.h)", 38);
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC UResourceBundle *u_wmsg_setPath(const char *path, UErrorCode *err)
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(U_FAILURE(*err))
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  {
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  if(gBundle != NULL)
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  {
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    *err = U_ILLEGAL_ARGUMENT_ERROR;
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  else
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  {
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UResourceBundle *b = NULL;
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    b = ures_open(path, NULL, err);
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*err))
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         return 0;
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    gPath = uprv_strdup(path);
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    gBundle = b;
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    U_STRING_INIT(gNoFormatting, " (UCONFIG_NO_FORMATTING see uconfig.h)", 38);
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  }
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru  return gBundle;
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* Format a message and print it's output to fp */
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int u_wmsg(FILE *fp, const char *tag, ... )
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const UChar *msg;
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t      msgLen;
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode  err = U_ZERO_ERROR;
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_list ap;
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar   result[4096];
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t resultLength = LENGTHOF(result);
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(gBundle == NULL)
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "u_wmsg: No path set!!\n"); /* FIXME: codepage?? */
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return -1;
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    msg = ures_getStringByKey(gBundle, tag, &msgLen, &err);
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err))
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "u_wmsg: failed to load tag [%s] [%s] [%s]!!\n", tag,  u_errorName(err), gPath);
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return -1;
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if UCONFIG_NO_FORMATTING
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    resultLength = sizeof(gNoFormatting) / U_SIZEOF_UCHAR;
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if((msgLen + resultLength) <= LENGTHOF(result)) {
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memcpy(result, msg, msgLen * U_SIZEOF_UCHAR);
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memcpy(result + msgLen, gNoFormatting, resultLength);
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        resultLength += msgLen;
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprint(result, resultLength, fp, &err);
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprint(msg,msgLen, fp, &err);
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#else
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_start(ap, tag);
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    resultLength = u_vformatMessage(uloc_getDefault(), msg, msgLen, result, resultLength, ap, &err);
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_end(ap);
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err))
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "u_wmsg: failed to format %s:%s, err %s\n",
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uloc_getDefault(),
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            tag,
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            u_errorName(err));
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        err = U_ZERO_ERROR;
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprint(msg,msgLen, fp, &err);
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return -1;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    uprint(result, resultLength, fp, &err);
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(err))
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "u_wmsg: failed to print %s: %s, err %s\n",
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            uloc_getDefault(),
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            tag,
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            u_errorName(err));
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return -1;
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* these will break if the # of messages change. simply add or remove 0's .. */
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUChar **gInfoMessages = NULL;
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUChar **gErrMessages = NULL;
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const UChar *fetchErrorName(UErrorCode err)
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (!gInfoMessages) {
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        gInfoMessages = (UChar **)malloc((U_ERROR_WARNING_LIMIT-U_ERROR_WARNING_START)*sizeof(UChar*));
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memset(gInfoMessages, 0, (U_ERROR_WARNING_LIMIT-U_ERROR_WARNING_START)*sizeof(UChar*));
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (!gErrMessages) {
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        gErrMessages = (UChar **)malloc(U_ERROR_LIMIT*sizeof(UChar*));
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        memset(gErrMessages, 0, U_ERROR_LIMIT*sizeof(UChar*));
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(err>=0)
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return gErrMessages[err];
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return gInfoMessages[err-U_ERROR_WARNING_START];
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC const UChar *u_wmsg_errorName(UErrorCode err)
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *msg;
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t msgLen;
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode subErr = U_ZERO_ERROR;
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    const char *textMsg = NULL;
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* try the cache */
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    msg = (UChar*)fetchErrorName(err);
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(msg)
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return msg;
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(gBundle == NULL)
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        msg = NULL;
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        const char *errname = u_errorName(err);
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (errname) {
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            msg = (UChar*)ures_getStringByKey(gBundle, errname, &msgLen, &subErr);
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(U_FAILURE(subErr))
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            {
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                msg = NULL;
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(msg == NULL)  /* Couldn't find it anywhere.. */
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    {
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        char error[128];
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        textMsg = u_errorName(err);
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (!textMsg) {
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            sprintf(error, "UNDOCUMENTED ICU ERROR %d", err);
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            textMsg = error;
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        msg = (UChar*)malloc((strlen(textMsg)+1)*sizeof(msg[0]));
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        u_charsToUChars(textMsg, msg, (int32_t)(strlen(textMsg)+1));
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(err>=0)
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        gErrMessages[err] = msg;
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        gInfoMessages[err-U_ERROR_WARNING_START] = msg;
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return msg;
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
270