tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ucat.cpp (2178B)


      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*/