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