tor-browser

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

ures_cnv.cpp (2430B)


      1 // © 2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4 *******************************************************************************
      5 *
      6 *   Copyright (C) 1997-2006, International Business Machines
      7 *   Corporation and others.  All Rights Reserved.
      8 *
      9 *******************************************************************************
     10 *   file name:  ures_cnv.c
     11 *   encoding:   UTF-8
     12 *   tab size:   8 (not used)
     13 *   indentation:4
     14 *
     15 *   created on: 2004aug25
     16 *   created by: Markus W. Scherer
     17 *
     18 *   Character conversion functions moved here from uresbund.c
     19 */
     20 
     21 #include "unicode/utypes.h"
     22 #include "unicode/putil.h"
     23 #include "unicode/ustring.h"
     24 #include "unicode/ucnv.h"
     25 #include "unicode/ures.h"
     26 #include "uinvchar.h"
     27 #include "ustr_cnv.h"
     28 
     29 U_CAPI UResourceBundle * U_EXPORT2
     30 ures_openU(const char16_t *myPath,
     31           const char *localeID, 
     32           UErrorCode *status)
     33 {
     34    char pathBuffer[1024];
     35    int32_t length;
     36    char *path = pathBuffer;
     37 
     38    if(status==nullptr || U_FAILURE(*status)) {
     39        return nullptr;
     40    }
     41    if(myPath==nullptr) {
     42        path = nullptr;
     43    }
     44    else {
     45        length=u_strlen(myPath);
     46        if(length>=(int32_t)sizeof(pathBuffer)) {
     47            *status=U_ILLEGAL_ARGUMENT_ERROR;
     48            return nullptr;
     49        } else if(uprv_isInvariantUString(myPath, length)) {
     50            /*
     51             * the invariant converter is sufficient for package and tree names
     52             * and is more efficient
     53             */
     54            u_UCharsToChars(myPath, path, length+1); /* length+1 to include the NUL */
     55        } else {
     56 #if !UCONFIG_NO_CONVERSION
     57            /* use the default converter to support variant-character paths */
     58            UConverter *cnv=u_getDefaultConverter(status);
     59            length=ucnv_fromUChars(cnv, path, (int32_t)sizeof(pathBuffer), myPath, length, status);
     60            u_releaseDefaultConverter(cnv);
     61            if(U_FAILURE(*status)) {
     62                return nullptr;
     63            }
     64            if(length>=(int32_t)sizeof(pathBuffer)) {
     65                /* not NUL-terminated - path too long */
     66                *status=U_ILLEGAL_ARGUMENT_ERROR;
     67                return nullptr;
     68            }
     69 #else
     70            /* the default converter is not available */
     71            *status=U_UNSUPPORTED_ERROR;
     72            return nullptr;
     73 #endif
     74        }
     75    }
     76 
     77    return ures_open(path, localeID, status);
     78 }