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 */ 19static 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 */ 30static 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 39U_CAPI u_nl_catd U_EXPORT2 40u_catopen(const char* name, const char* locale, UErrorCode* ec) { 41 return (u_nl_catd) ures_open(name, locale, ec); 42} 43 44U_CAPI void U_EXPORT2 45u_catclose(u_nl_catd catd) { 46 ures_close((UResourceBundle*) catd); /* may be nullptr */ 47} 48 49U_CAPI const char16_t* U_EXPORT2 50u_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