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