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* |
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 |
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 |
45 | u_catclose(u_nl_catd catd) { |
46 | ures_close((UResourceBundle*) catd); /* may be nullptr */ |
47 | } |
48 | |
49 | U_CAPI const char16_t* U_EXPORT2 |
50 | u_catgets(u_nl_catd catd, int32_t set_num, int32_t msg_num, |
51 | const char16_t* s, |
52 | int32_t* len, UErrorCode* ec) { |
53 | |
54 | char key[MAX_KEY_LEN]; |
55 | const char16_t* result; |
56 | |
57 | if (ec == nullptr || 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 != nullptr) { |
73 | *len = u_strlen(s); |
74 | } |
75 | return s; |
76 | } |
77 | |
78 | /*eof*/ |
79 | |