]>
git.saurik.com Git - apple/icu.git/blob - icuSources/extra/uconv/uwmsg.c
2 **********************************************************************
3 * Copyright (C) 1998-2014, International Business Machines Corporation
4 * and others. All Rights Reserved.
5 **********************************************************************
9 * Modification History:
11 * Date Name Description
12 * 06/14/99 stephen Creation.
13 *******************************************************************************
16 #include "unicode/ucnv.h"
17 #include "unicode/ustring.h"
18 #include "unicode/umsg.h"
19 #include "unicode/uwmsg.h"
20 #include "unicode/ures.h"
21 #include "unicode/putil.h"
31 /* Print a ustring to the specified FILE* in the default codepage */
33 uprint(const UChar
*s
,
39 UConverter
*converter
;
41 const UChar
*mySource
;
42 const UChar
*mySourceEnd
;
48 /* set up the conversion parameters */
50 mySourceEnd
= mySource
+ sourceLen
;
54 /* open a default converter */
55 converter
= ucnv_open(0, status
);
57 /* if we failed, clean up and exit */
58 if(U_FAILURE(*status
)) goto finish
;
60 /* perform the conversion */
62 /* reset the error code */
63 *status
= U_ZERO_ERROR
;
65 /* perform the conversion */
66 ucnv_fromUnicode(converter
, &myTarget
, myTarget
+ arraySize
,
67 &mySource
, mySourceEnd
, NULL
,
70 /* Write the converted data to the FILE* */
71 fwrite(buf
, sizeof(char), myTarget
- buf
, f
);
73 /* update the conversion parameters*/
77 while(*status
== U_BUFFER_OVERFLOW_ERROR
);
81 /* close the converter */
82 ucnv_close(converter
);
85 static UResourceBundle
*gBundle
= NULL
;
87 U_STRING_DECL(gNoFormatting
, " (UCONFIG_NO_FORMATTING see uconfig.h)", 38);
89 U_CFUNC UResourceBundle
*u_wmsg_setPath(const char *path
, UErrorCode
*err
)
98 *err
= U_ILLEGAL_ARGUMENT_ERROR
;
103 UResourceBundle
*b
= NULL
;
104 b
= ures_open(path
, NULL
, err
);
112 U_STRING_INIT(gNoFormatting
, " (UCONFIG_NO_FORMATTING see uconfig.h)", 38);
118 /* Format a message and print it's output to fp */
119 U_CFUNC
int u_wmsg(FILE *fp
, const char *tag
, ... )
123 UErrorCode err
= U_ZERO_ERROR
;
124 #if !UCONFIG_NO_FORMATTING
128 int32_t resultLength
= UPRV_LENGTHOF(result
);
133 fprintf(stderr
, "u_wmsg: No path set!!\n"); /* FIXME: codepage?? */
138 msg
= ures_getStringByKey(gBundle
, tag
, &msgLen
, &err
);
145 #if UCONFIG_NO_FORMATTING
146 resultLength
= sizeof(gNoFormatting
) / U_SIZEOF_UCHAR
;
147 if((msgLen
+ resultLength
) <= UPRV_LENGTHOF(result
)) {
148 memcpy(result
, msg
, msgLen
* U_SIZEOF_UCHAR
);
149 memcpy(result
+ msgLen
, gNoFormatting
, resultLength
);
150 resultLength
+= msgLen
;
151 uprint(result
, resultLength
, fp
, &err
);
153 uprint(msg
,msgLen
, fp
, &err
);
158 resultLength
= u_vformatMessage(uloc_getDefault(), msg
, msgLen
, result
, resultLength
, ap
, &err
);
165 fprintf(stderr
, "u_wmsg: failed to format %s:%s, err %s\n",
171 uprint(msg
,msgLen
, fp
, &err
);
175 uprint(result
, resultLength
, fp
, &err
);
181 fprintf(stderr
, "u_wmsg: failed to print %s: %s, err %s\n",
192 /* these will break if the # of messages change. simply add or remove 0's .. */
193 UChar
**gInfoMessages
= NULL
;
195 UChar
**gErrMessages
= NULL
;
197 static const UChar
*fetchErrorName(UErrorCode err
)
199 if (!gInfoMessages
) {
200 gInfoMessages
= (UChar
**)malloc((U_ERROR_WARNING_LIMIT
-U_ERROR_WARNING_START
)*sizeof(UChar
*));
201 memset(gInfoMessages
, 0, (U_ERROR_WARNING_LIMIT
-U_ERROR_WARNING_START
)*sizeof(UChar
*));
204 gErrMessages
= (UChar
**)malloc(U_ERROR_LIMIT
*sizeof(UChar
*));
205 memset(gErrMessages
, 0, U_ERROR_LIMIT
*sizeof(UChar
*));
208 return gErrMessages
[err
];
210 return gInfoMessages
[err
-U_ERROR_WARNING_START
];
213 U_CFUNC
const UChar
*u_wmsg_errorName(UErrorCode err
)
217 UErrorCode subErr
= U_ZERO_ERROR
;
218 const char *textMsg
= NULL
;
221 msg
= (UChar
*)fetchErrorName(err
);
234 const char *errname
= u_errorName(err
);
236 msg
= (UChar
*)ures_getStringByKey(gBundle
, errname
, &msgLen
, &subErr
);
237 if(U_FAILURE(subErr
))
244 if(msg
== NULL
) /* Couldn't find it anywhere.. */
247 textMsg
= u_errorName(err
);
249 sprintf(error
, "UNDOCUMENTED ICU ERROR %d", err
);
252 msg
= (UChar
*)malloc((strlen(textMsg
)+1)*sizeof(msg
[0]));
253 u_charsToUChars(textMsg
, msg
, (int32_t)(strlen(textMsg
)+1));
257 gErrMessages
[err
] = msg
;
259 gInfoMessages
[err
-U_ERROR_WARNING_START
] = msg
;