1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 **********************************************************************
5 * Copyright (c) 2003, International Business Machines
6 * Corporation and others.  All Rights Reserved.
7 **********************************************************************
8 * Author: Alan Liu
9 * Created: March 19 2003
10 * Since: ICU 2.6
11 **********************************************************************
12 */
13 #include "unicode/ucat.h"
14 #include "unicode/ustring.h"
15 #include "cstring.h"
16 #include "uassert.h"
17 
18 /* Separator between set_num and msg_num */
19 static const char SEPARATOR = '%';
20 
21 /* Maximum length of a set_num/msg_num key, incl. terminating zero.
22  * Longest possible key is "-2147483648%-2147483648" */
23 #define MAX_KEY_LEN (24)
24 
25 /**
26  * Fill in buffer with a set_num/msg_num key string, given the numeric
27  * values. Numeric values must be >= 0. Buffer must be of length
28  * MAX_KEY_LEN or more.
29  */
30 static char*
_catkey(char * buffer,int32_t set_num,int32_t msg_num)31 _catkey(char* buffer, int32_t set_num, int32_t msg_num) {
32     int32_t i = 0;
33     i = T_CString_integerToString(buffer, set_num, 10);
34     buffer[i++] = SEPARATOR;
35     T_CString_integerToString(buffer+i, msg_num, 10);
36     return buffer;
37 }
38 
39 U_CAPI u_nl_catd U_EXPORT2
u_catopen(const char * name,const char * locale,UErrorCode * ec)40 u_catopen(const char* name, const char* locale, UErrorCode* ec) {
41     return (u_nl_catd) ures_open(name, locale, ec);
42 }
43 
44 U_CAPI void U_EXPORT2
u_catclose(u_nl_catd catd)45 u_catclose(u_nl_catd catd) {
46     ures_close((UResourceBundle*) catd); /* may be NULL */
47 }
48 
49 U_CAPI const UChar* U_EXPORT2
u_catgets(u_nl_catd catd,int32_t set_num,int32_t msg_num,const UChar * s,int32_t * len,UErrorCode * ec)50 u_catgets(u_nl_catd catd, int32_t set_num, int32_t msg_num,
51           const UChar* s,
52           int32_t* len, UErrorCode* ec) {
53 
54     char key[MAX_KEY_LEN];
55     const UChar* result;
56 
57     if (ec == NULL || U_FAILURE(*ec)) {
58         goto ERROR;
59     }
60 
61     result = ures_getStringByKey((const UResourceBundle*) catd,
62                                  _catkey(key, set_num, msg_num),
63                                  len, ec);
64     if (U_FAILURE(*ec)) {
65         goto ERROR;
66     }
67 
68     return result;
69 
70  ERROR:
71     /* In case of any failure, return s */
72     if (len != NULL) {
73         *len = u_strlen(s);
74     }
75     return s;
76 }
77 
78 /*eof*/
79