tor-browser

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

ucnv_cnv.cpp (4798B)


      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) 1999-2004, International Business Machines
      7 *   Corporation and others.  All Rights Reserved.
      8 *
      9 ******************************************************************************
     10 *
     11 *   uconv_cnv.c:
     12 *   Implements all the low level conversion functions
     13 *   T_UnicodeConverter_{to,from}Unicode_$ConversionType
     14 *
     15 *   Change history:
     16 *
     17 *   06/29/2000  helena      Major rewrite of the callback APIs.
     18 */
     19 
     20 #include "unicode/utypes.h"
     21 
     22 #if !UCONFIG_NO_CONVERSION
     23 
     24 #include "unicode/ucnv_err.h"
     25 #include "unicode/ucnv.h"
     26 #include "unicode/uset.h"
     27 #include "ucnv_cnv.h"
     28 #include "ucnv_bld.h"
     29 #include "cmemory.h"
     30 
     31 U_CFUNC void
     32 ucnv_getCompleteUnicodeSet(const UConverter *cnv,
     33                   const USetAdder *sa,
     34                   UConverterUnicodeSet which,
     35                   UErrorCode *pErrorCode) {
     36    (void)cnv;
     37    (void)which;
     38    (void)pErrorCode;
     39    sa->addRange(sa->set, 0, 0x10ffff);
     40 }
     41 
     42 U_CFUNC void
     43 ucnv_getNonSurrogateUnicodeSet(const UConverter *cnv,
     44                               const USetAdder *sa,
     45                               UConverterUnicodeSet which,
     46                               UErrorCode *pErrorCode) {
     47    (void)cnv;
     48    (void)which;
     49    (void)pErrorCode;
     50    sa->addRange(sa->set, 0, 0xd7ff);
     51    sa->addRange(sa->set, 0xe000, 0x10ffff);
     52 }
     53 
     54 U_CFUNC void
     55 ucnv_fromUWriteBytes(UConverter *cnv,
     56                     const char *bytes, int32_t length,
     57                     char **target, const char *targetLimit,
     58                     int32_t **offsets,
     59                     int32_t sourceIndex,
     60                     UErrorCode *pErrorCode) {
     61    char *t=*target;
     62    int32_t *o;
     63 
     64    /* write bytes */
     65    if(offsets==nullptr || (o=*offsets)==nullptr) {
     66        while(length>0 && t<targetLimit) {
     67            *t++=*bytes++;
     68            --length;
     69        }
     70    } else {
     71        /* output with offsets */
     72        while(length>0 && t<targetLimit) {
     73            *t++=*bytes++;
     74            *o++=sourceIndex;
     75            --length;
     76        }
     77        *offsets=o;
     78    }
     79    *target=t;
     80 
     81    /* write overflow */
     82    if(length>0) {
     83        if(cnv!=nullptr) {
     84            t=(char *)cnv->charErrorBuffer;
     85            cnv->charErrorBufferLength=(int8_t)length;
     86            do {
     87                *t++=(uint8_t)*bytes++;
     88            } while(--length>0);
     89        }
     90        *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
     91    }
     92 }
     93 
     94 U_CFUNC void
     95 ucnv_toUWriteUChars(UConverter *cnv,
     96                    const char16_t *uchars, int32_t length,
     97                    char16_t **target, const char16_t *targetLimit,
     98                    int32_t **offsets,
     99                    int32_t sourceIndex,
    100                    UErrorCode *pErrorCode) {
    101    char16_t *t=*target;
    102    int32_t *o;
    103 
    104    /* write UChars */
    105    if(offsets==nullptr || (o=*offsets)==nullptr) {
    106        while(length>0 && t<targetLimit) {
    107            *t++=*uchars++;
    108            --length;
    109        }
    110    } else {
    111        /* output with offsets */
    112        while(length>0 && t<targetLimit) {
    113            *t++=*uchars++;
    114            *o++=sourceIndex;
    115            --length;
    116        }
    117        *offsets=o;
    118    }
    119    *target=t;
    120 
    121    /* write overflow */
    122    if(length>0) {
    123        if(cnv!=nullptr) {
    124            t=cnv->UCharErrorBuffer;
    125            cnv->UCharErrorBufferLength=(int8_t)length;
    126            do {
    127                *t++=*uchars++;
    128            } while(--length>0);
    129        }
    130        *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
    131    }
    132 }
    133 
    134 U_CFUNC void
    135 ucnv_toUWriteCodePoint(UConverter *cnv,
    136                       UChar32 c,
    137                       char16_t **target, const char16_t *targetLimit,
    138                       int32_t **offsets,
    139                       int32_t sourceIndex,
    140                       UErrorCode *pErrorCode) {
    141    char16_t *t;
    142    int32_t *o;
    143 
    144    t=*target;
    145 
    146    if(t<targetLimit) {
    147        if(c<=0xffff) {
    148            *t++=(char16_t)c;
    149            c=U_SENTINEL;
    150        } else /* c is a supplementary code point */ {
    151            *t++=U16_LEAD(c);
    152            c=U16_TRAIL(c);
    153            if(t<targetLimit) {
    154                *t++=(char16_t)c;
    155                c=U_SENTINEL;
    156            }
    157        }
    158 
    159        /* write offsets */
    160        if(offsets!=nullptr && (o=*offsets)!=nullptr) {
    161            *o++=sourceIndex;
    162            if((*target+1)<t) {
    163                *o++=sourceIndex;
    164            }
    165            *offsets=o;
    166        }
    167    }
    168 
    169    *target=t;
    170 
    171    /* write overflow from c */
    172    if(c>=0) {
    173        if(cnv!=nullptr) {
    174            int8_t i=0;
    175            U16_APPEND_UNSAFE(cnv->UCharErrorBuffer, i, c);
    176            cnv->UCharErrorBufferLength=i;
    177        }
    178        *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
    179    }
    180 }
    181 
    182 #endif