Home | History | Annotate | Line # | Download | only in libcpp
      1 /* CPP Library - charsets
      2    Copyright (C) 1998-2022 Free Software Foundation, Inc.
      3 
      4    Broken out of c-lex.cc Apr 2003, adding valid C99 UCN ranges.
      5 
      6 This program is free software; you can redistribute it and/or modify it
      7 under the terms of the GNU General Public License as published by the
      8 Free Software Foundation; either version 3, or (at your option) any
      9 later version.
     10 
     11 This program is distributed in the hope that it will be useful,
     12 but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 GNU General Public License for more details.
     15 
     16 You should have received a copy of the GNU General Public License
     17 along with this program; see the file COPYING3.  If not see
     18 <http://www.gnu.org/licenses/>.  */
     19 
     20 #include "config.h"
     21 #include "system.h"
     22 #include "cpplib.h"
     23 #include "internal.h"
     24 
     25 /* Character set handling for C-family languages.
     26 
     27    Terminological note: In what follows, "charset" or "character set"
     28    will be taken to mean both an abstract set of characters and an
     29    encoding for that set.
     30 
     31    The C99 standard discusses two character sets: source and execution.
     32    The source character set is used for internal processing in translation
     33    phases 1 through 4; the execution character set is used thereafter.
     34    Both are required by 5.2.1.2p1 to be multibyte encodings, not wide
     35    character encodings (see 3.7.2, 3.7.3 for the standardese meanings
     36    of these terms).  Furthermore, the "basic character set" (listed in
     37    5.2.1p3) is to be encoded in each with values one byte wide, and is
     38    to appear in the initial shift state.
     39 
     40    It is not explicitly mentioned, but there is also a "wide execution
     41    character set" used to encode wide character constants and wide
     42    string literals; this is supposed to be the result of applying the
     43    standard library function mbstowcs() to an equivalent narrow string
     44    (6.4.5p5).  However, the behavior of hexadecimal and octal
     45    \-escapes is at odds with this; they are supposed to be translated
     46    directly to wchar_t values (6.4.4.4p5,6).
     47 
     48    The source character set is not necessarily the character set used
     49    to encode physical source files on disk; translation phase 1 converts
     50    from whatever that encoding is to the source character set.
     51 
     52    The presence of universal character names in C99 (6.4.3 et seq.)
     53    forces the source character set to be isomorphic to ISO 10646,
     54    that is, Unicode.  There is no such constraint on the execution
     55    character set; note also that the conversion from source to
     56    execution character set does not occur for identifiers (5.1.1.2p1#5).
     57 
     58    For convenience of implementation, the source character set's
     59    encoding of the basic character set should be identical to the
     60    execution character set OF THE HOST SYSTEM's encoding of the basic
     61    character set, and it should not be a state-dependent encoding.
     62 
     63    cpplib uses UTF-8 or UTF-EBCDIC for the source character set,
     64    depending on whether the host is based on ASCII or EBCDIC (see
     65    respectively Unicode section 2.3/ISO10646 Amendment 2, and Unicode
     66    Technical Report #16).  With limited exceptions, it relies on the
     67    system library's iconv() primitive to do charset conversion
     68    (specified in SUSv2).  */
     69 
     70 #if !HAVE_ICONV
     71 /* Make certain that the uses of iconv(), iconv_open(), iconv_close()
     72    below, which are guarded only by if statements with compile-time
     73    constant conditions, do not cause link errors.  */
     74 #define iconv_open(x, y) (errno = EINVAL, (iconv_t)-1)
     75 #define iconv(a,b,c,d,e) (errno = EINVAL, (size_t)-1)
     76 #define iconv_close(x)   (void)0
     77 #define ICONV_CONST
     78 #endif
     79 
     80 #if HOST_CHARSET == HOST_CHARSET_ASCII
     81 #define SOURCE_CHARSET "UTF-8"
     82 #define LAST_POSSIBLY_BASIC_SOURCE_CHAR 0x7e
     83 #elif HOST_CHARSET == HOST_CHARSET_EBCDIC
     84 #define SOURCE_CHARSET "UTF-EBCDIC"
     85 #define LAST_POSSIBLY_BASIC_SOURCE_CHAR 0xFF
     86 #else
     87 #error "Unrecognized basic host character set"
     88 #endif
     89 
     90 #ifndef EILSEQ
     91 #define EILSEQ EINVAL
     92 #endif
     93 
     94 /* This structure is used for a resizable string buffer throughout.  */
     95 /* Don't call it strbuf, as that conflicts with unistd.h on systems
     96    such as DYNIX/ptx where unistd.h includes stropts.h.  */
     97 struct _cpp_strbuf
     98 {
     99   uchar *text;
    100   size_t asize;
    101   size_t len;
    102 };
    103 
    104 /* This is enough to hold any string that fits on a single 80-column
    105    line, even if iconv quadruples its size (e.g. conversion from
    106    ASCII to UTF-32) rounded up to a power of two.  */
    107 #define OUTBUF_BLOCK_SIZE 256
    108 
    109 /* Conversions between UTF-8 and UTF-16/32 are implemented by custom
    110    logic.  This is because a depressing number of systems lack iconv,
    111    or have have iconv libraries that do not do these conversions, so
    112    we need a fallback implementation for them.  To ensure the fallback
    113    doesn't break due to neglect, it is used on all systems.
    114 
    115    UTF-32 encoding is nice and simple: a four-byte binary number,
    116    constrained to the range 00000000-7FFFFFFF to avoid questions of
    117    signedness.  We do have to cope with big- and little-endian
    118    variants.
    119 
    120    UTF-16 encoding uses two-byte binary numbers, again in big- and
    121    little-endian variants, for all values in the 00000000-0000FFFF
    122    range.  Values in the 00010000-0010FFFF range are encoded as pairs
    123    of two-byte numbers, called "surrogate pairs": given a number S in
    124    this range, it is mapped to a pair (H, L) as follows:
    125 
    126      H = (S - 0x10000) / 0x400 + 0xD800
    127      L = (S - 0x10000) % 0x400 + 0xDC00
    128 
    129    Two-byte values in the D800...DFFF range are ill-formed except as a
    130    component of a surrogate pair.  Even if the encoding within a
    131    two-byte value is little-endian, the H member of the surrogate pair
    132    comes first.
    133 
    134    There is no way to encode values in the 00110000-7FFFFFFF range,
    135    which is not currently a problem as there are no assigned code
    136    points in that range; however, the author expects that it will
    137    eventually become necessary to abandon UTF-16 due to this
    138    limitation.  Note also that, because of these pairs, UTF-16 does
    139    not meet the requirements of the C standard for a wide character
    140    encoding (see 3.7.3 and 6.4.4.4p11).
    141 
    142    UTF-8 encoding looks like this:
    143 
    144    value range	       encoded as
    145    00000000-0000007F   0xxxxxxx
    146    00000080-000007FF   110xxxxx 10xxxxxx
    147    00000800-0000FFFF   1110xxxx 10xxxxxx 10xxxxxx
    148    00010000-001FFFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    149    00200000-03FFFFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    150    04000000-7FFFFFFF   1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    151 
    152    Values in the 0000D800 ... 0000DFFF range (surrogates) are invalid,
    153    which means that three-byte sequences ED xx yy, with A0 <= xx <= BF,
    154    never occur.  Note also that any value that can be encoded by a
    155    given row of the table can also be encoded by all successive rows,
    156    but this is not done; only the shortest possible encoding for any
    157    given value is valid.  For instance, the character 07C0 could be
    158    encoded as any of DF 80, E0 9F 80, F0 80 9F 80, F8 80 80 9F 80, or
    159    FC 80 80 80 9F 80.  Only the first is valid.
    160 
    161    An implementation note: the transformation from UTF-16 to UTF-8, or
    162    vice versa, is easiest done by using UTF-32 as an intermediary.  */
    163 
    164 /* Internal primitives which go from an UTF-8 byte stream to native-endian
    165    UTF-32 in a cppchar_t, or vice versa; this avoids an extra marshal/unmarshal
    166    operation in several places below.  */
    167 static inline int
    168 one_utf8_to_cppchar (const uchar **inbufp, size_t *inbytesleftp,
    169 		     cppchar_t *cp)
    170 {
    171   static const uchar masks[6] = { 0x7F, 0x1F, 0x0F, 0x07, 0x03, 0x01 };
    172   static const uchar patns[6] = { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
    173 
    174   cppchar_t c;
    175   const uchar *inbuf = *inbufp;
    176   size_t nbytes, i;
    177 
    178   if (*inbytesleftp < 1)
    179     return EINVAL;
    180 
    181   c = *inbuf;
    182   if (c < 0x80)
    183     {
    184       *cp = c;
    185       *inbytesleftp -= 1;
    186       *inbufp += 1;
    187       return 0;
    188     }
    189 
    190   /* The number of leading 1-bits in the first byte indicates how many
    191      bytes follow.  */
    192   for (nbytes = 2; nbytes < 7; nbytes++)
    193     if ((c & ~masks[nbytes-1]) == patns[nbytes-1])
    194       goto found;
    195   return EILSEQ;
    196  found:
    197 
    198   if (*inbytesleftp < nbytes)
    199     return EINVAL;
    200 
    201   c = (c & masks[nbytes-1]);
    202   inbuf++;
    203   for (i = 1; i < nbytes; i++)
    204     {
    205       cppchar_t n = *inbuf++;
    206       if ((n & 0xC0) != 0x80)
    207 	return EILSEQ;
    208       c = ((c << 6) + (n & 0x3F));
    209     }
    210 
    211   /* Make sure the shortest possible encoding was used.  */
    212   if (c <=      0x7F && nbytes > 1) return EILSEQ;
    213   if (c <=     0x7FF && nbytes > 2) return EILSEQ;
    214   if (c <=    0xFFFF && nbytes > 3) return EILSEQ;
    215   if (c <=  0x1FFFFF && nbytes > 4) return EILSEQ;
    216   if (c <= 0x3FFFFFF && nbytes > 5) return EILSEQ;
    217 
    218   /* Make sure the character is valid.  */
    219   if (c > 0x7FFFFFFF || (c >= 0xD800 && c <= 0xDFFF)) return EILSEQ;
    220 
    221   *cp = c;
    222   *inbufp = inbuf;
    223   *inbytesleftp -= nbytes;
    224   return 0;
    225 }
    226 
    227 static inline int
    228 one_cppchar_to_utf8 (cppchar_t c, uchar **outbufp, size_t *outbytesleftp)
    229 {
    230   static const uchar masks[6] =  { 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
    231   static const uchar limits[6] = { 0x80, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE };
    232   size_t nbytes;
    233   uchar buf[6], *p = &buf[6];
    234   uchar *outbuf = *outbufp;
    235 
    236   nbytes = 1;
    237   if (c < 0x80)
    238     *--p = c;
    239   else
    240     {
    241       do
    242 	{
    243 	  *--p = ((c & 0x3F) | 0x80);
    244 	  c >>= 6;
    245 	  nbytes++;
    246 	}
    247       while (c >= 0x3F || (c & limits[nbytes-1]));
    248       *--p = (c | masks[nbytes-1]);
    249     }
    250 
    251   if (*outbytesleftp < nbytes)
    252     return E2BIG;
    253 
    254   while (p < &buf[6])
    255     *outbuf++ = *p++;
    256   *outbytesleftp -= nbytes;
    257   *outbufp = outbuf;
    258   return 0;
    259 }
    260 
    261 /* The following four functions transform one character between the two
    262    encodings named in the function name.  All have the signature
    263    int (*)(iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp,
    264            uchar **outbufp, size_t *outbytesleftp)
    265 
    266    BIGEND must have the value 0 or 1, coerced to (iconv_t); it is
    267    interpreted as a boolean indicating whether big-endian or
    268    little-endian encoding is to be used for the member of the pair
    269    that is not UTF-8.
    270 
    271    INBUFP, INBYTESLEFTP, OUTBUFP, OUTBYTESLEFTP work exactly as they
    272    do for iconv.
    273 
    274    The return value is either 0 for success, or an errno value for
    275    failure, which may be E2BIG (need more space), EILSEQ (ill-formed
    276    input sequence), ir EINVAL (incomplete input sequence).  */
    277 
    278 static inline int
    279 one_utf8_to_utf32 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp,
    280 		   uchar **outbufp, size_t *outbytesleftp)
    281 {
    282   uchar *outbuf;
    283   cppchar_t s = 0;
    284   int rval;
    285 
    286   /* Check for space first, since we know exactly how much we need.  */
    287   if (*outbytesleftp < 4)
    288     return E2BIG;
    289 
    290   rval = one_utf8_to_cppchar (inbufp, inbytesleftp, &s);
    291   if (rval)
    292     return rval;
    293 
    294   outbuf = *outbufp;
    295   outbuf[bigend ? 3 : 0] = (s & 0x000000FF);
    296   outbuf[bigend ? 2 : 1] = (s & 0x0000FF00) >> 8;
    297   outbuf[bigend ? 1 : 2] = (s & 0x00FF0000) >> 16;
    298   outbuf[bigend ? 0 : 3] = (s & 0xFF000000) >> 24;
    299 
    300   *outbufp += 4;
    301   *outbytesleftp -= 4;
    302   return 0;
    303 }
    304 
    305 static inline int
    306 one_utf32_to_utf8 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp,
    307 		   uchar **outbufp, size_t *outbytesleftp)
    308 {
    309   cppchar_t s;
    310   int rval;
    311   const uchar *inbuf;
    312 
    313   if (*inbytesleftp < 4)
    314     return EINVAL;
    315 
    316   inbuf = *inbufp;
    317 
    318   s  = inbuf[bigend ? 0 : 3] << 24;
    319   s += inbuf[bigend ? 1 : 2] << 16;
    320   s += inbuf[bigend ? 2 : 1] << 8;
    321   s += inbuf[bigend ? 3 : 0];
    322 
    323   if (s >= 0x7FFFFFFF || (s >= 0xD800 && s <= 0xDFFF))
    324     return EILSEQ;
    325 
    326   rval = one_cppchar_to_utf8 (s, outbufp, outbytesleftp);
    327   if (rval)
    328     return rval;
    329 
    330   *inbufp += 4;
    331   *inbytesleftp -= 4;
    332   return 0;
    333 }
    334 
    335 static inline int
    336 one_utf8_to_utf16 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp,
    337 		   uchar **outbufp, size_t *outbytesleftp)
    338 {
    339   int rval;
    340   cppchar_t s = 0;
    341   const uchar *save_inbuf = *inbufp;
    342   size_t save_inbytesleft = *inbytesleftp;
    343   uchar *outbuf = *outbufp;
    344 
    345   rval = one_utf8_to_cppchar (inbufp, inbytesleftp, &s);
    346   if (rval)
    347     return rval;
    348 
    349   if (s > 0x0010FFFF)
    350     {
    351       *inbufp = save_inbuf;
    352       *inbytesleftp = save_inbytesleft;
    353       return EILSEQ;
    354     }
    355 
    356   if (s <= 0xFFFF)
    357     {
    358       if (*outbytesleftp < 2)
    359 	{
    360 	  *inbufp = save_inbuf;
    361 	  *inbytesleftp = save_inbytesleft;
    362 	  return E2BIG;
    363 	}
    364       outbuf[bigend ? 1 : 0] = (s & 0x00FF);
    365       outbuf[bigend ? 0 : 1] = (s & 0xFF00) >> 8;
    366 
    367       *outbufp += 2;
    368       *outbytesleftp -= 2;
    369       return 0;
    370     }
    371   else
    372     {
    373       cppchar_t hi, lo;
    374 
    375       if (*outbytesleftp < 4)
    376 	{
    377 	  *inbufp = save_inbuf;
    378 	  *inbytesleftp = save_inbytesleft;
    379 	  return E2BIG;
    380 	}
    381 
    382       hi = (s - 0x10000) / 0x400 + 0xD800;
    383       lo = (s - 0x10000) % 0x400 + 0xDC00;
    384 
    385       /* Even if we are little-endian, put the high surrogate first.
    386 	 ??? Matches practice?  */
    387       outbuf[bigend ? 1 : 0] = (hi & 0x00FF);
    388       outbuf[bigend ? 0 : 1] = (hi & 0xFF00) >> 8;
    389       outbuf[bigend ? 3 : 2] = (lo & 0x00FF);
    390       outbuf[bigend ? 2 : 3] = (lo & 0xFF00) >> 8;
    391 
    392       *outbufp += 4;
    393       *outbytesleftp -= 4;
    394       return 0;
    395     }
    396 }
    397 
    398 static inline int
    399 one_utf16_to_utf8 (iconv_t bigend, const uchar **inbufp, size_t *inbytesleftp,
    400 		   uchar **outbufp, size_t *outbytesleftp)
    401 {
    402   cppchar_t s;
    403   const uchar *inbuf = *inbufp;
    404   int rval;
    405 
    406   if (*inbytesleftp < 2)
    407     return EINVAL;
    408   s  = inbuf[bigend ? 0 : 1] << 8;
    409   s += inbuf[bigend ? 1 : 0];
    410 
    411   /* Low surrogate without immediately preceding high surrogate is invalid.  */
    412   if (s >= 0xDC00 && s <= 0xDFFF)
    413     return EILSEQ;
    414   /* High surrogate must have a following low surrogate.  */
    415   else if (s >= 0xD800 && s <= 0xDBFF)
    416     {
    417       cppchar_t hi = s, lo;
    418       if (*inbytesleftp < 4)
    419 	return EINVAL;
    420 
    421       lo  = inbuf[bigend ? 2 : 3] << 8;
    422       lo += inbuf[bigend ? 3 : 2];
    423 
    424       if (lo < 0xDC00 || lo > 0xDFFF)
    425 	return EILSEQ;
    426 
    427       s = (hi - 0xD800) * 0x400 + (lo - 0xDC00) + 0x10000;
    428     }
    429 
    430   rval = one_cppchar_to_utf8 (s, outbufp, outbytesleftp);
    431   if (rval)
    432     return rval;
    433 
    434   /* Success - update the input pointers (one_cppchar_to_utf8 has done
    435      the output pointers for us).  */
    436   if (s <= 0xFFFF)
    437     {
    438       *inbufp += 2;
    439       *inbytesleftp -= 2;
    440     }
    441   else
    442     {
    443       *inbufp += 4;
    444       *inbytesleftp -= 4;
    445     }
    446   return 0;
    447 }
    448 
    449 /* Helper routine for the next few functions.  The 'const' on
    450    one_conversion means that we promise not to modify what function is
    451    pointed to, which lets the inliner see through it.  */
    452 
    453 static inline bool
    454 conversion_loop (int (*const one_conversion)(iconv_t, const uchar **, size_t *,
    455 					     uchar **, size_t *),
    456 		 iconv_t cd, const uchar *from, size_t flen, struct _cpp_strbuf *to)
    457 {
    458   const uchar *inbuf;
    459   uchar *outbuf;
    460   size_t inbytesleft, outbytesleft;
    461   int rval;
    462 
    463   inbuf = from;
    464   inbytesleft = flen;
    465   outbuf = to->text + to->len;
    466   outbytesleft = to->asize - to->len;
    467 
    468   for (;;)
    469     {
    470       do
    471 	rval = one_conversion (cd, &inbuf, &inbytesleft,
    472 			       &outbuf, &outbytesleft);
    473       while (inbytesleft && !rval);
    474 
    475       if (__builtin_expect (inbytesleft == 0, 1))
    476 	{
    477 	  to->len = to->asize - outbytesleft;
    478 	  return true;
    479 	}
    480       if (rval != E2BIG)
    481 	{
    482 	  errno = rval;
    483 	  return false;
    484 	}
    485 
    486       outbytesleft += OUTBUF_BLOCK_SIZE;
    487       to->asize += OUTBUF_BLOCK_SIZE;
    488       to->text = XRESIZEVEC (uchar, to->text, to->asize);
    489       outbuf = to->text + to->asize - outbytesleft;
    490     }
    491 }
    492 
    493 
    494 /* These functions convert entire strings between character sets.
    495    They all have the signature
    496 
    497    bool (*)(iconv_t cd, const uchar *from, size_t flen, struct _cpp_strbuf *to);
    498 
    499    The input string FROM is converted as specified by the function
    500    name plus the iconv descriptor CD (which may be fake), and the
    501    result appended to TO.  On any error, false is returned, otherwise true.  */
    502 
    503 /* These four use the custom conversion code above.  */
    504 static bool
    505 convert_utf8_utf16 (iconv_t cd, const uchar *from, size_t flen,
    506 		    struct _cpp_strbuf *to)
    507 {
    508   return conversion_loop (one_utf8_to_utf16, cd, from, flen, to);
    509 }
    510 
    511 static bool
    512 convert_utf8_utf32 (iconv_t cd, const uchar *from, size_t flen,
    513 		    struct _cpp_strbuf *to)
    514 {
    515   return conversion_loop (one_utf8_to_utf32, cd, from, flen, to);
    516 }
    517 
    518 static bool
    519 convert_utf16_utf8 (iconv_t cd, const uchar *from, size_t flen,
    520 		    struct _cpp_strbuf *to)
    521 {
    522   return conversion_loop (one_utf16_to_utf8, cd, from, flen, to);
    523 }
    524 
    525 static bool
    526 convert_utf32_utf8 (iconv_t cd, const uchar *from, size_t flen,
    527 		    struct _cpp_strbuf *to)
    528 {
    529   return conversion_loop (one_utf32_to_utf8, cd, from, flen, to);
    530 }
    531 
    532 /* Identity conversion, used when we have no alternative.  */
    533 static bool
    534 convert_no_conversion (iconv_t cd ATTRIBUTE_UNUSED,
    535 		       const uchar *from, size_t flen, struct _cpp_strbuf *to)
    536 {
    537   if (to->len + flen > to->asize)
    538     {
    539       to->asize = to->len + flen;
    540       to->asize += to->asize / 4;
    541       to->text = XRESIZEVEC (uchar, to->text, to->asize);
    542     }
    543   memcpy (to->text + to->len, from, flen);
    544   to->len += flen;
    545   return true;
    546 }
    547 
    548 /* And this one uses the system iconv primitive.  It's a little
    549    different, since iconv's interface is a little different.  */
    550 #if HAVE_ICONV
    551 
    552 #define CONVERT_ICONV_GROW_BUFFER \
    553   do { \
    554       outbytesleft += OUTBUF_BLOCK_SIZE; \
    555       to->asize += OUTBUF_BLOCK_SIZE; \
    556       to->text = XRESIZEVEC (uchar, to->text, to->asize); \
    557       outbuf = (char *)to->text + to->asize - outbytesleft; \
    558   } while (0)
    559 
    560 static bool
    561 convert_using_iconv (iconv_t cd, const uchar *from, size_t flen,
    562 		     struct _cpp_strbuf *to)
    563 {
    564   ICONV_CONST char *inbuf;
    565   char *outbuf;
    566   size_t inbytesleft, outbytesleft;
    567 
    568   /* Reset conversion descriptor and check that it is valid.  */
    569   if (iconv (cd, 0, 0, 0, 0) == (size_t)-1)
    570     return false;
    571 
    572   inbuf = (ICONV_CONST char *)from;
    573   inbytesleft = flen;
    574   outbuf = (char *)to->text + to->len;
    575   outbytesleft = to->asize - to->len;
    576 
    577   for (;;)
    578     {
    579       iconv (cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
    580       if (__builtin_expect (inbytesleft == 0, 1))
    581 	{
    582 	  /* Close out any shift states, returning to the initial state.  */
    583 	  if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t)-1)
    584 	    {
    585 	      if (errno != E2BIG)
    586 		return false;
    587 
    588 	      CONVERT_ICONV_GROW_BUFFER;
    589 	      if (iconv (cd, 0, 0, &outbuf, &outbytesleft) == (size_t)-1)
    590 		return false;
    591 	    }
    592 
    593 	  to->len = to->asize - outbytesleft;
    594 	  return true;
    595 	}
    596       if (errno != E2BIG)
    597 	return false;
    598 
    599       CONVERT_ICONV_GROW_BUFFER;
    600     }
    601 }
    602 #else
    603 #define convert_using_iconv 0 /* prevent undefined symbol error below */
    604 #endif
    605 
    606 /* Arrange for the above custom conversion logic to be used automatically
    607    when conversion between a suitable pair of character sets is requested.  */
    608 
    609 #define APPLY_CONVERSION(CONVERTER, FROM, FLEN, TO) \
    610    CONVERTER.func (CONVERTER.cd, FROM, FLEN, TO)
    611 
    612 struct cpp_conversion
    613 {
    614   const char *pair;
    615   convert_f func;
    616   iconv_t fake_cd;
    617 };
    618 static const struct cpp_conversion conversion_tab[] = {
    619   { "UTF-8/UTF-32LE", convert_utf8_utf32, (iconv_t)0 },
    620   { "UTF-8/UTF-32BE", convert_utf8_utf32, (iconv_t)1 },
    621   { "UTF-8/UTF-16LE", convert_utf8_utf16, (iconv_t)0 },
    622   { "UTF-8/UTF-16BE", convert_utf8_utf16, (iconv_t)1 },
    623   { "UTF-32LE/UTF-8", convert_utf32_utf8, (iconv_t)0 },
    624   { "UTF-32BE/UTF-8", convert_utf32_utf8, (iconv_t)1 },
    625   { "UTF-16LE/UTF-8", convert_utf16_utf8, (iconv_t)0 },
    626   { "UTF-16BE/UTF-8", convert_utf16_utf8, (iconv_t)1 },
    627 };
    628 
    629 /* Subroutine of cpp_init_iconv: initialize and return a
    630    cset_converter structure for conversion from FROM to TO.  If
    631    iconv_open() fails, issue an error and return an identity
    632    converter.  Silently return an identity converter if FROM and TO
    633    are identical.
    634 
    635    PFILE is only used for generating diagnostics; setting it to NULL
    636    suppresses diagnostics.  */
    637 
    638 static struct cset_converter
    639 init_iconv_desc (cpp_reader *pfile, const char *to, const char *from)
    640 {
    641   struct cset_converter ret;
    642   char *pair;
    643   size_t i;
    644 
    645   ret.to = to;
    646   ret.from = from;
    647 
    648   if (!strcasecmp (to, from))
    649     {
    650       ret.func = convert_no_conversion;
    651       ret.cd = (iconv_t) -1;
    652       ret.width = -1;
    653       return ret;
    654     }
    655 
    656   pair = (char *) alloca(strlen(to) + strlen(from) + 2);
    657 
    658   strcpy(pair, from);
    659   strcat(pair, "/");
    660   strcat(pair, to);
    661   for (i = 0; i < ARRAY_SIZE (conversion_tab); i++)
    662     if (!strcasecmp (pair, conversion_tab[i].pair))
    663       {
    664 	ret.func = conversion_tab[i].func;
    665 	ret.cd = conversion_tab[i].fake_cd;
    666 	ret.width = -1;
    667 	return ret;
    668       }
    669 
    670   /* No custom converter - try iconv.  */
    671   if (HAVE_ICONV)
    672     {
    673       ret.func = convert_using_iconv;
    674       ret.cd = iconv_open (to, from);
    675       ret.width = -1;
    676 
    677       if (ret.cd == (iconv_t) -1)
    678 	{
    679 	  if (pfile)
    680 	    {
    681 	      if (errno == EINVAL)
    682 		cpp_error (pfile, CPP_DL_ERROR, /* FIXME should be DL_SORRY */
    683 			   "conversion from %s to %s not supported by iconv",
    684 			   from, to);
    685 	      else
    686 		cpp_errno (pfile, CPP_DL_ERROR, "iconv_open");
    687 	    }
    688 	  ret.func = convert_no_conversion;
    689 	}
    690     }
    691   else
    692     {
    693       if (pfile)
    694 	{
    695 	  cpp_error (pfile, CPP_DL_ERROR, /* FIXME: should be DL_SORRY */
    696 		     "no iconv implementation, cannot convert from %s to %s",
    697 		     from, to);
    698 	}
    699       ret.func = convert_no_conversion;
    700       ret.cd = (iconv_t) -1;
    701       ret.width = -1;
    702     }
    703 
    704   return ret;
    705 }
    706 
    707 /* If charset conversion is requested, initialize iconv(3) descriptors
    708    for conversion from the source character set to the execution
    709    character sets.  If iconv is not present in the C library, and
    710    conversion is requested, issue an error.  */
    711 
    712 void
    713 cpp_init_iconv (cpp_reader *pfile)
    714 {
    715   const char *ncset = CPP_OPTION (pfile, narrow_charset);
    716   const char *wcset = CPP_OPTION (pfile, wide_charset);
    717   const char *default_wcset;
    718 
    719   bool be = CPP_OPTION (pfile, bytes_big_endian);
    720 
    721   if (CPP_OPTION (pfile, wchar_precision) >= 32)
    722     default_wcset = be ? "UTF-32BE" : "UTF-32LE";
    723   else if (CPP_OPTION (pfile, wchar_precision) >= 16)
    724     default_wcset = be ? "UTF-16BE" : "UTF-16LE";
    725   else
    726     /* This effectively means that wide strings are not supported,
    727        so don't do any conversion at all.  */
    728    default_wcset = SOURCE_CHARSET;
    729 
    730   if (!ncset)
    731     ncset = SOURCE_CHARSET;
    732   if (!wcset)
    733     wcset = default_wcset;
    734 
    735   pfile->narrow_cset_desc = init_iconv_desc (pfile, ncset, SOURCE_CHARSET);
    736   pfile->narrow_cset_desc.width = CPP_OPTION (pfile, char_precision);
    737   pfile->utf8_cset_desc = init_iconv_desc (pfile, "UTF-8", SOURCE_CHARSET);
    738   pfile->utf8_cset_desc.width = CPP_OPTION (pfile, char_precision);
    739   pfile->char16_cset_desc = init_iconv_desc (pfile,
    740 					     be ? "UTF-16BE" : "UTF-16LE",
    741 					     SOURCE_CHARSET);
    742   pfile->char16_cset_desc.width = 16;
    743   pfile->char32_cset_desc = init_iconv_desc (pfile,
    744 					     be ? "UTF-32BE" : "UTF-32LE",
    745 					     SOURCE_CHARSET);
    746   pfile->char32_cset_desc.width = 32;
    747   pfile->wide_cset_desc = init_iconv_desc (pfile, wcset, SOURCE_CHARSET);
    748   pfile->wide_cset_desc.width = CPP_OPTION (pfile, wchar_precision);
    749 }
    750 
    751 /* Destroy iconv(3) descriptors set up by cpp_init_iconv, if necessary.  */
    752 void
    753 _cpp_destroy_iconv (cpp_reader *pfile)
    754 {
    755   if (HAVE_ICONV)
    756     {
    757       if (pfile->narrow_cset_desc.func == convert_using_iconv)
    758 	iconv_close (pfile->narrow_cset_desc.cd);
    759       if (pfile->utf8_cset_desc.func == convert_using_iconv)
    760 	iconv_close (pfile->utf8_cset_desc.cd);
    761       if (pfile->char16_cset_desc.func == convert_using_iconv)
    762 	iconv_close (pfile->char16_cset_desc.cd);
    763       if (pfile->char32_cset_desc.func == convert_using_iconv)
    764 	iconv_close (pfile->char32_cset_desc.cd);
    765       if (pfile->wide_cset_desc.func == convert_using_iconv)
    766 	iconv_close (pfile->wide_cset_desc.cd);
    767     }
    768 }
    769 
    770 /* Utility routine for use by a full compiler.  C is a character taken
    771    from the *basic* source character set, encoded in the host's
    772    execution encoding.  Convert it to (the target's) execution
    773    encoding, and return that value.
    774 
    775    Issues an internal error if C's representation in the narrow
    776    execution character set fails to be a single-byte value (C99
    777    5.2.1p3: "The representation of each member of the source and
    778    execution character sets shall fit in a byte.")  May also issue an
    779    internal error if C fails to be a member of the basic source
    780    character set (testing this exactly is too hard, especially when
    781    the host character set is EBCDIC).  */
    782 cppchar_t
    783 cpp_host_to_exec_charset (cpp_reader *pfile, cppchar_t c)
    784 {
    785   uchar sbuf[1];
    786   struct _cpp_strbuf tbuf;
    787 
    788   /* This test is merely an approximation, but it suffices to catch
    789      the most important thing, which is that we don't get handed a
    790      character outside the unibyte range of the host character set.  */
    791   if (c > LAST_POSSIBLY_BASIC_SOURCE_CHAR)
    792     {
    793       cpp_error (pfile, CPP_DL_ICE,
    794 		 "character 0x%lx is not in the basic source character set\n",
    795 		 (unsigned long)c);
    796       return 0;
    797     }
    798 
    799   /* Being a character in the unibyte range of the host character set,
    800      we can safely splat it into a one-byte buffer and trust that that
    801      is a well-formed string.  */
    802   sbuf[0] = c;
    803 
    804   /* This should never need to reallocate, but just in case... */
    805   tbuf.asize = 1;
    806   tbuf.text = XNEWVEC (uchar, tbuf.asize);
    807   tbuf.len = 0;
    808 
    809   if (!APPLY_CONVERSION (pfile->narrow_cset_desc, sbuf, 1, &tbuf))
    810     {
    811       cpp_errno (pfile, CPP_DL_ICE, "converting to execution character set");
    812       return 0;
    813     }
    814   if (tbuf.len != 1)
    815     {
    816       cpp_error (pfile, CPP_DL_ICE,
    817 		 "character 0x%lx is not unibyte in execution character set",
    818 		 (unsigned long)c);
    819       return 0;
    820     }
    821   c = tbuf.text[0];
    822   free(tbuf.text);
    823   return c;
    824 }
    825 
    826 
    827 
    829 /* cpp_substring_ranges's constructor. */
    830 
    831 cpp_substring_ranges::cpp_substring_ranges () :
    832   m_ranges (NULL),
    833   m_num_ranges (0),
    834   m_alloc_ranges (8)
    835 {
    836   m_ranges = XNEWVEC (source_range, m_alloc_ranges);
    837 }
    838 
    839 /* cpp_substring_ranges's destructor. */
    840 
    841 cpp_substring_ranges::~cpp_substring_ranges ()
    842 {
    843   free (m_ranges);
    844 }
    845 
    846 /* Add RANGE to the vector of source_range information.  */
    847 
    848 void
    849 cpp_substring_ranges::add_range (source_range range)
    850 {
    851   if (m_num_ranges >= m_alloc_ranges)
    852     {
    853       m_alloc_ranges *= 2;
    854       m_ranges
    855 	= (source_range *)xrealloc (m_ranges,
    856 				    sizeof (source_range) * m_alloc_ranges);
    857     }
    858   m_ranges[m_num_ranges++] = range;
    859 }
    860 
    861 /* Read NUM ranges from LOC_READER, adding them to the vector of source_range
    862    information.  */
    863 
    864 void
    865 cpp_substring_ranges::add_n_ranges (int num,
    866 				    cpp_string_location_reader &loc_reader)
    867 {
    868   for (int i = 0; i < num; i++)
    869     add_range (loc_reader.get_next ());
    870 }
    871 
    872 
    873 
    875 /* Utility routine that computes a mask of the form 0000...111... with
    876    WIDTH 1-bits.  */
    877 static inline size_t
    878 width_to_mask (size_t width)
    879 {
    880   width = MIN (width, BITS_PER_CPPCHAR_T);
    881   if (width >= CHAR_BIT * sizeof (size_t))
    882     return ~(size_t) 0;
    883   else
    884     return ((size_t) 1 << width) - 1;
    885 }
    886 
    887 /* A large table of unicode character information.  */
    888 enum {
    889   /* Valid in a C99 identifier?  */
    890   C99 = 1,
    891   /* Valid in a C99 identifier, but not as the first character?  */
    892   N99 = 2,
    893   /* Valid in a C++ identifier?  */
    894   CXX = 4,
    895   /* Valid in a C11/C++11 identifier?  */
    896   C11 = 8,
    897   /* Valid in a C11/C++11 identifier, but not as the first character?  */
    898   N11 = 16,
    899   /* Valid in a C++23 identifier?  */
    900   CXX23 = 32,
    901   /* Valid in a C++23 identifier, but not as the first character?  */
    902   NXX23 = 64,
    903   /* NFC representation is not valid in an identifier?  */
    904   CID = 128,
    905   /* Might be valid NFC form?  */
    906   NFC = 256,
    907   /* Might be valid NFKC form?  */
    908   NKC = 512,
    909   /* Certain preceding characters might make it not valid NFC/NKFC form?  */
    910   CTX = 1024
    911 };
    912 
    913 struct ucnrange {
    914   /* Bitmap of flags above.  */
    915   unsigned short flags;
    916   /* Combining class of the character.  */
    917   unsigned char combine;
    918   /* Last character in the range described by this entry.  */
    919   unsigned int end;
    920 };
    921 #include "ucnid.h"
    922 
    923 /* ISO 10646 defines the UCS codespace as the range 0-0x10FFFF inclusive.  */
    924 #define UCS_LIMIT 0x10FFFF
    925 
    926 /* Returns 1 if C is valid in an identifier, 2 if C is valid except at
    927    the start of an identifier, and 0 if C is not valid in an
    928    identifier.  We assume C has already gone through the checks of
    929    _cpp_valid_ucn.  Also update NST for C if returning nonzero.  The
    930    algorithm is a simple binary search on the table defined in
    931    ucnid.h.  */
    932 
    933 static int
    934 ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c,
    935 			 struct normalize_state *nst)
    936 {
    937   int mn, mx, md;
    938   unsigned short valid_flags, invalid_start_flags;
    939 
    940   if (c > UCS_LIMIT)
    941     return 0;
    942 
    943   mn = 0;
    944   mx = ARRAY_SIZE (ucnranges) - 1;
    945   while (mx != mn)
    946     {
    947       md = (mn + mx) / 2;
    948       if (c <= ucnranges[md].end)
    949 	mx = md;
    950       else
    951 	mn = md + 1;
    952     }
    953 
    954   /* When -pedantic, we require the character to have been listed by
    955      the standard for the current language.  Otherwise, we accept the
    956      union of the acceptable sets for all supported language versions.  */
    957   valid_flags = C99 | CXX | C11 | CXX23;
    958   if (CPP_PEDANTIC (pfile))
    959     {
    960       if (CPP_OPTION (pfile, cplusplus))
    961 	valid_flags = CXX23;
    962       else if (CPP_OPTION (pfile, c11_identifiers))
    963 	valid_flags = C11;
    964       else if (CPP_OPTION (pfile, c99))
    965 	valid_flags = C99;
    966     }
    967   if (! (ucnranges[mn].flags & valid_flags))
    968       return 0;
    969 
    970   /* Update NST.  */
    971   if (ucnranges[mn].combine != 0 && ucnranges[mn].combine < nst->prev_class)
    972     nst->level = normalized_none;
    973   else if (ucnranges[mn].flags & CTX)
    974     {
    975       bool safe;
    976       cppchar_t p = nst->previous;
    977 
    978       /* For Hangul, characters in the range AC00-D7A3 are NFC/NFKC,
    979 	 and are combined algorithmically from a sequence of the form
    980 	 1100-1112 1161-1175 11A8-11C2
    981 	 (if the third is not present, it is treated as 11A7, which is not
    982 	 really a valid character).
    983 	 Unfortunately, C99 allows (only) the NFC form, but C++ allows
    984 	 only the combining characters.  */
    985       if (c >= 0x1161 && c <= 0x1175)
    986 	safe = p < 0x1100 || p > 0x1112;
    987       else if (c >= 0x11A8 && c <= 0x11C2)
    988 	safe = (p < 0xAC00 || p > 0xD7A3 || (p - 0xAC00) % 28 != 0);
    989       else
    990 	safe = check_nfc (pfile, c, p);
    991       if (!safe)
    992 	{
    993 	  if ((c >= 0x1161 && c <= 0x1175) || (c >= 0x11A8 && c <= 0x11C2))
    994 	    nst->level = MAX (nst->level, normalized_identifier_C);
    995 	  else
    996 	    nst->level = normalized_none;
    997 	}
    998     }
    999   else if (ucnranges[mn].flags & NKC)
   1000     ;
   1001   else if (ucnranges[mn].flags & NFC)
   1002     nst->level = MAX (nst->level, normalized_C);
   1003   else if (ucnranges[mn].flags & CID)
   1004     nst->level = MAX (nst->level, normalized_identifier_C);
   1005   else
   1006     nst->level = normalized_none;
   1007   if (ucnranges[mn].combine == 0)
   1008     nst->previous = c;
   1009   nst->prev_class = ucnranges[mn].combine;
   1010 
   1011   if (!CPP_PEDANTIC (pfile))
   1012     {
   1013       /* If not -pedantic, accept as character that may
   1014 	 begin an identifier a union of characters allowed
   1015 	 at that position in each of the character sets.  */
   1016       if ((ucnranges[mn].flags & (C99 | N99)) == C99
   1017 	  || (ucnranges[mn].flags & CXX) != 0
   1018 	  || (ucnranges[mn].flags & (C11 | N11)) == C11
   1019 	  || (ucnranges[mn].flags & (CXX23 | NXX23)) == CXX23)
   1020 	return 1;
   1021       return 2;
   1022     }
   1023 
   1024   if (CPP_OPTION (pfile, cplusplus))
   1025     invalid_start_flags = NXX23;
   1026   else if (CPP_OPTION (pfile, c11_identifiers))
   1027     invalid_start_flags = N11;
   1028   else if (CPP_OPTION (pfile, c99))
   1029     invalid_start_flags = N99;
   1030   else
   1031     invalid_start_flags = 0;
   1032 
   1033   /* In C99, UCN digits may not begin identifiers.  In C11 and C++11,
   1034      UCN combining characters may not begin identifiers.  */
   1035   if (ucnranges[mn].flags & invalid_start_flags)
   1036     return 2;
   1037 
   1038   return 1;
   1039 }
   1040 
   1041 /* [lex.charset]: The character designated by the universal character
   1042    name \UNNNNNNNN is that character whose character short name in
   1043    ISO/IEC 10646 is NNNNNNNN; the character designated by the
   1044    universal character name \uNNNN is that character whose character
   1045    short name in ISO/IEC 10646 is 0000NNNN.  If the hexadecimal value
   1046    for a universal character name corresponds to a surrogate code point
   1047    (in the range 0xD800-0xDFFF, inclusive), the program is ill-formed.
   1048    Additionally, if the hexadecimal value for a universal-character-name
   1049    outside a character or string literal corresponds to a control character
   1050    (in either of the ranges 0x00-0x1F or 0x7F-0x9F, both inclusive) or to a
   1051    character in the basic source character set, the program is ill-formed.
   1052 
   1053    C99 6.4.3: A universal character name shall not specify a character
   1054    whose short identifier is less than 00A0 other than 0024 ($), 0040 (@),
   1055    or 0060 (`), nor one in the range D800 through DFFF inclusive.
   1056 
   1057    If the hexadecimal value is larger than the upper bound of the UCS
   1058    codespace specified in ISO/IEC 10646, a pedantic warning is issued
   1059    in all versions of C and in the C++20 or later versions of C++.
   1060 
   1061    *PSTR must be preceded by "\u" or "\U"; it is assumed that the
   1062    buffer end is delimited by a non-hex digit.  Returns false if the
   1063    UCN has not been consumed, true otherwise.
   1064 
   1065    The value of the UCN, whether valid or invalid, is returned in *CP.
   1066    Diagnostics are emitted for invalid values.  PSTR is updated to point
   1067    one beyond the UCN, or to the syntactically invalid character.
   1068 
   1069    IDENTIFIER_POS is 0 when not in an identifier, 1 for the start of
   1070    an identifier, or 2 otherwise.
   1071 
   1072    If LOC_READER is non-NULL, then position information is
   1073    read from *LOC_READER and CHAR_RANGE->m_finish is updated accordingly.  */
   1074 
   1075 bool
   1076 _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
   1077 		const uchar *limit, int identifier_pos,
   1078 		struct normalize_state *nst, cppchar_t *cp,
   1079 		source_range *char_range,
   1080 		cpp_string_location_reader *loc_reader)
   1081 {
   1082   cppchar_t result, c;
   1083   unsigned int length;
   1084   const uchar *str = *pstr;
   1085   const uchar *base = str - 2;
   1086 
   1087   if (!CPP_OPTION (pfile, cplusplus) && !CPP_OPTION (pfile, c99))
   1088     cpp_error (pfile, CPP_DL_WARNING,
   1089 	       "universal character names are only valid in C++ and C99");
   1090   else if (CPP_OPTION (pfile, cpp_warn_c90_c99_compat) > 0
   1091 	   && !CPP_OPTION (pfile, cplusplus))
   1092     cpp_error (pfile, CPP_DL_WARNING,
   1093 	       "C99's universal character names are incompatible with C90");
   1094   else if (CPP_WTRADITIONAL (pfile) && identifier_pos == 0)
   1095     cpp_warning (pfile, CPP_W_TRADITIONAL,
   1096 	         "the meaning of '\\%c' is different in traditional C",
   1097 	         (int) str[-1]);
   1098 
   1099   if (str[-1] == 'u')
   1100     length = 4;
   1101   else if (str[-1] == 'U')
   1102     length = 8;
   1103   else
   1104     {
   1105       cpp_error (pfile, CPP_DL_ICE, "In _cpp_valid_ucn but not a UCN");
   1106       length = 4;
   1107     }
   1108 
   1109   result = 0;
   1110   do
   1111     {
   1112       c = *str;
   1113       if (!ISXDIGIT (c))
   1114 	break;
   1115       str++;
   1116       if (loc_reader)
   1117 	{
   1118 	  gcc_assert (char_range);
   1119 	  char_range->m_finish = loc_reader->get_next ().m_finish;
   1120 	}
   1121       result = (result << 4) + hex_value (c);
   1122     }
   1123   while (--length && str < limit);
   1124 
   1125   /* Partial UCNs are not valid in strings, but decompose into
   1126      multiple tokens in identifiers, so we can't give a helpful
   1127      error message in that case.  */
   1128   if (length && identifier_pos)
   1129     {
   1130       *cp = 0;
   1131       return false;
   1132     }
   1133 
   1134   *pstr = str;
   1135   if (length)
   1136     {
   1137       cpp_error (pfile, CPP_DL_ERROR,
   1138 		 "incomplete universal character name %.*s",
   1139 		 (int) (str - base), base);
   1140       result = 1;
   1141     }
   1142   /* The C99 standard permits $, @ and ` to be specified as UCNs.  We use
   1143      hex escapes so that this also works with EBCDIC hosts.
   1144      C++0x permits everything below 0xa0 within literals;
   1145      ucn_valid_in_identifier will complain about identifiers.  */
   1146   else if ((result < 0xa0
   1147 	    && !CPP_OPTION (pfile, cplusplus)
   1148 	    && (result != 0x24 && result != 0x40 && result != 0x60))
   1149 	   || (result & 0x80000000)
   1150 	   || (result >= 0xD800 && result <= 0xDFFF))
   1151     {
   1152       cpp_error (pfile, CPP_DL_ERROR,
   1153 		 "%.*s is not a valid universal character",
   1154 		 (int) (str - base), base);
   1155       result = 1;
   1156     }
   1157   else if (identifier_pos && result == 0x24
   1158 	   && CPP_OPTION (pfile, dollars_in_ident))
   1159     {
   1160       if (CPP_OPTION (pfile, warn_dollars) && !pfile->state.skipping)
   1161 	{
   1162 	  CPP_OPTION (pfile, warn_dollars) = 0;
   1163 	  cpp_error (pfile, CPP_DL_PEDWARN, "'$' in identifier or number");
   1164 	}
   1165       NORMALIZE_STATE_UPDATE_IDNUM (nst, result);
   1166     }
   1167   else if (identifier_pos)
   1168     {
   1169       int validity = ucn_valid_in_identifier (pfile, result, nst);
   1170 
   1171       if (validity == 0)
   1172 	cpp_error (pfile, CPP_DL_ERROR,
   1173 		   "universal character %.*s is not valid in an identifier",
   1174 		   (int) (str - base), base);
   1175       else if (validity == 2 && identifier_pos == 1)
   1176 	cpp_error (pfile, CPP_DL_ERROR,
   1177    "universal character %.*s is not valid at the start of an identifier",
   1178 		   (int) (str - base), base);
   1179     }
   1180   else if (result > UCS_LIMIT
   1181 	   && (!CPP_OPTION (pfile, cplusplus)
   1182 	       || CPP_OPTION (pfile, lang) > CLK_CXX17))
   1183     cpp_error (pfile, CPP_DL_PEDWARN,
   1184 	       "%.*s is outside the UCS codespace",
   1185 	       (int) (str - base), base);
   1186 
   1187   *cp = result;
   1188   return true;
   1189 }
   1190 
   1191 /* Convert an UCN, pointed to by FROM, to UTF-8 encoding, then translate
   1192    it to the execution character set and write the result into TBUF,
   1193    if TBUF is non-NULL.
   1194    An advanced pointer is returned.  Issues all relevant diagnostics.
   1195    If LOC_READER is non-NULL, then RANGES must be non-NULL and CHAR_RANGE
   1196    contains the location of the character so far: location information
   1197    is read from *LOC_READER, and *RANGES is updated accordingly.  */
   1198 static const uchar *
   1199 convert_ucn (cpp_reader *pfile, const uchar *from, const uchar *limit,
   1200 	     struct _cpp_strbuf *tbuf, struct cset_converter cvt,
   1201 	     source_range char_range,
   1202 	     cpp_string_location_reader *loc_reader,
   1203 	     cpp_substring_ranges *ranges)
   1204 {
   1205   cppchar_t ucn;
   1206   uchar buf[6];
   1207   uchar *bufp = buf;
   1208   size_t bytesleft = 6;
   1209   int rval;
   1210   struct normalize_state nst = INITIAL_NORMALIZE_STATE;
   1211 
   1212   /* loc_reader and ranges must either be both NULL, or both be non-NULL.  */
   1213   gcc_assert ((loc_reader != NULL) == (ranges != NULL));
   1214 
   1215   from++;  /* Skip u/U.  */
   1216 
   1217   if (loc_reader)
   1218     /* The u/U is part of the spelling of this character.  */
   1219     char_range.m_finish = loc_reader->get_next ().m_finish;
   1220 
   1221   _cpp_valid_ucn (pfile, &from, limit, 0, &nst,
   1222 		  &ucn, &char_range, loc_reader);
   1223 
   1224   rval = one_cppchar_to_utf8 (ucn, &bufp, &bytesleft);
   1225   if (rval)
   1226     {
   1227       errno = rval;
   1228       cpp_errno (pfile, CPP_DL_ERROR,
   1229 		 "converting UCN to source character set");
   1230     }
   1231   else
   1232     {
   1233       if (tbuf)
   1234 	if (!APPLY_CONVERSION (cvt, buf, 6 - bytesleft, tbuf))
   1235 	  cpp_errno (pfile, CPP_DL_ERROR,
   1236 		     "converting UCN to execution character set");
   1237 
   1238       if (loc_reader)
   1239 	{
   1240 	  int num_encoded_bytes = 6 - bytesleft;
   1241 	  for (int i = 0; i < num_encoded_bytes; i++)
   1242 	    ranges->add_range (char_range);
   1243 	}
   1244     }
   1245 
   1246   return from;
   1247 }
   1248 
   1249 /*  Performs a similar task as _cpp_valid_ucn, but parses UTF-8-encoded
   1250     extended characters rather than UCNs.  If the return value is TRUE, then a
   1251     character was successfully decoded and stored in *CP; *PSTR has been
   1252     updated to point one past the valid UTF-8 sequence.  Diagnostics may have
   1253     been emitted if the character parsed is not allowed in the current context.
   1254     If the return value is FALSE, then *PSTR has not been modified and *CP may
   1255     equal 0, to indicate that *PSTR does not form a valid UTF-8 sequence, or it
   1256     may, when processing an identifier in C mode, equal a codepoint that was
   1257     validly encoded but is not allowed to appear in an identifier.  In either
   1258     case, no diagnostic is emitted, and the return value of FALSE should cause
   1259     a new token to be formed.
   1260 
   1261     Unlike _cpp_valid_ucn, this will never be called when lexing a string; only
   1262     a potential identifier, or a CPP_OTHER token.  NST is unused in the latter
   1263     case.
   1264 
   1265     As in _cpp_valid_ucn, IDENTIFIER_POS is 0 when not in an identifier, 1 for
   1266     the start of an identifier, or 2 otherwise.  */
   1267 
   1268 extern bool
   1269 _cpp_valid_utf8 (cpp_reader *pfile,
   1270 		 const uchar **pstr,
   1271 		 const uchar *limit,
   1272 		 int identifier_pos,
   1273 		 struct normalize_state *nst,
   1274 		 cppchar_t *cp)
   1275 {
   1276   const uchar *base = *pstr;
   1277   size_t inbytesleft = limit - base;
   1278   if (one_utf8_to_cppchar (pstr, &inbytesleft, cp))
   1279     {
   1280       /* No diagnostic here as this byte will rather become a
   1281 	 new token.  */
   1282       *cp = 0;
   1283       return false;
   1284     }
   1285 
   1286   if (identifier_pos)
   1287     {
   1288       switch (ucn_valid_in_identifier (pfile, *cp, nst))
   1289 	{
   1290 
   1291 	case 0:
   1292 	  /* In C++, this is an error for invalid character in an identifier
   1293 	     because logically, the UTF-8 was converted to a UCN during
   1294 	     translation phase 1 (even though we don't physically do it that
   1295 	     way).  In C, this byte rather becomes grammatically a separate
   1296 	     token.  */
   1297 
   1298 	  if (CPP_OPTION (pfile, cplusplus))
   1299 	    cpp_error (pfile, CPP_DL_ERROR,
   1300 		       "extended character %.*s is not valid in an identifier",
   1301 		       (int) (*pstr - base), base);
   1302 	  else
   1303 	    {
   1304 	      *pstr = base;
   1305 	      return false;
   1306 	    }
   1307 
   1308 	  break;
   1309 
   1310 	case 2:
   1311 	  if (identifier_pos == 1)
   1312 	    {
   1313 	      /* This is treated the same way in C++ or C99 -- lexed as an
   1314 		 identifier which is then invalid because an identifier is
   1315 		 not allowed to start with this character.  */
   1316 	      cpp_error (pfile, CPP_DL_ERROR,
   1317 	  "extended character %.*s is not valid at the start of an identifier",
   1318 			 (int) (*pstr - base), base);
   1319 	    }
   1320 	  break;
   1321 	}
   1322     }
   1323 
   1324   return true;
   1325 }
   1326 
   1327 /* Subroutine of convert_hex and convert_oct.  N is the representation
   1328    in the execution character set of a numeric escape; write it into the
   1329    string buffer TBUF and update the end-of-string pointer therein.  WIDE
   1330    is true if it's a wide string that's being assembled in TBUF.  This
   1331    function issues no diagnostics and never fails.  */
   1332 static void
   1333 emit_numeric_escape (cpp_reader *pfile, cppchar_t n,
   1334 		     struct _cpp_strbuf *tbuf, struct cset_converter cvt)
   1335 {
   1336   size_t width = cvt.width;
   1337 
   1338   if (width != CPP_OPTION (pfile, char_precision))
   1339     {
   1340       /* We have to render this into the target byte order, which may not
   1341 	 be our byte order.  */
   1342       bool bigend = CPP_OPTION (pfile, bytes_big_endian);
   1343       size_t cwidth = CPP_OPTION (pfile, char_precision);
   1344       size_t cmask = width_to_mask (cwidth);
   1345       size_t nbwc = width / cwidth;
   1346       size_t i;
   1347       size_t off = tbuf->len;
   1348       cppchar_t c;
   1349 
   1350       if (tbuf->len + nbwc > tbuf->asize)
   1351 	{
   1352 	  tbuf->asize += OUTBUF_BLOCK_SIZE;
   1353 	  tbuf->text = XRESIZEVEC (uchar, tbuf->text, tbuf->asize);
   1354 	}
   1355 
   1356       for (i = 0; i < nbwc; i++)
   1357 	{
   1358 	  c = n & cmask;
   1359 	  n >>= cwidth;
   1360 	  tbuf->text[off + (bigend ? nbwc - i - 1 : i)] = c;
   1361 	}
   1362       tbuf->len += nbwc;
   1363     }
   1364   else
   1365     {
   1366       /* Note: this code does not handle the case where the target
   1367 	 and host have a different number of bits in a byte.  */
   1368       if (tbuf->len + 1 > tbuf->asize)
   1369 	{
   1370 	  tbuf->asize += OUTBUF_BLOCK_SIZE;
   1371 	  tbuf->text = XRESIZEVEC (uchar, tbuf->text, tbuf->asize);
   1372 	}
   1373       tbuf->text[tbuf->len++] = n;
   1374     }
   1375 }
   1376 
   1377 /* Convert a hexadecimal escape, pointed to by FROM, to the execution
   1378    character set and write it into the string buffer TBUF (if non-NULL).
   1379    Returns an advanced pointer, and issues diagnostics as necessary.
   1380    No character set translation occurs; this routine always produces the
   1381    execution-set character with numeric value equal to the given hex
   1382    number.  You can, e.g. generate surrogate pairs this way.
   1383    If LOC_READER is non-NULL, then RANGES must be non-NULL and CHAR_RANGE
   1384    contains the location of the character so far: location information
   1385    is read from *LOC_READER, and *RANGES is updated accordingly.  */
   1386 static const uchar *
   1387 convert_hex (cpp_reader *pfile, const uchar *from, const uchar *limit,
   1388 	     struct _cpp_strbuf *tbuf, struct cset_converter cvt,
   1389 	     source_range char_range,
   1390 	     cpp_string_location_reader *loc_reader,
   1391 	     cpp_substring_ranges *ranges)
   1392 {
   1393   cppchar_t c, n = 0, overflow = 0;
   1394   int digits_found = 0;
   1395   size_t width = cvt.width;
   1396   size_t mask = width_to_mask (width);
   1397 
   1398   /* loc_reader and ranges must either be both NULL, or both be non-NULL.  */
   1399   gcc_assert ((loc_reader != NULL) == (ranges != NULL));
   1400 
   1401   if (CPP_WTRADITIONAL (pfile))
   1402     cpp_warning (pfile, CPP_W_TRADITIONAL,
   1403 	         "the meaning of '\\x' is different in traditional C");
   1404 
   1405   /* Skip 'x'.  */
   1406   from++;
   1407 
   1408   /* The 'x' is part of the spelling of this character.  */
   1409   if (loc_reader)
   1410     char_range.m_finish = loc_reader->get_next ().m_finish;
   1411 
   1412   while (from < limit)
   1413     {
   1414       c = *from;
   1415       if (! hex_p (c))
   1416 	break;
   1417       from++;
   1418       if (loc_reader)
   1419 	char_range.m_finish = loc_reader->get_next ().m_finish;
   1420       overflow |= n ^ (n << 4 >> 4);
   1421       n = (n << 4) + hex_value (c);
   1422       digits_found = 1;
   1423     }
   1424 
   1425   if (!digits_found)
   1426     {
   1427       cpp_error (pfile, CPP_DL_ERROR,
   1428 		 "\\x used with no following hex digits");
   1429       return from;
   1430     }
   1431 
   1432   if (overflow | (n != (n & mask)))
   1433     {
   1434       cpp_error (pfile, CPP_DL_PEDWARN,
   1435 		 "hex escape sequence out of range");
   1436       n &= mask;
   1437     }
   1438 
   1439   if (tbuf)
   1440     emit_numeric_escape (pfile, n, tbuf, cvt);
   1441   if (ranges)
   1442     ranges->add_range (char_range);
   1443 
   1444   return from;
   1445 }
   1446 
   1447 /* Convert an octal escape, pointed to by FROM, to the execution
   1448    character set and write it into the string buffer TBUF.  Returns an
   1449    advanced pointer, and issues diagnostics as necessary.
   1450    No character set translation occurs; this routine always produces the
   1451    execution-set character with numeric value equal to the given octal
   1452    number.
   1453    If LOC_READER is non-NULL, then RANGES must be non-NULL and CHAR_RANGE
   1454    contains the location of the character so far: location information
   1455    is read from *LOC_READER, and *RANGES is updated accordingly.  */
   1456 static const uchar *
   1457 convert_oct (cpp_reader *pfile, const uchar *from, const uchar *limit,
   1458 	     struct _cpp_strbuf *tbuf, struct cset_converter cvt,
   1459 	     source_range char_range,
   1460 	     cpp_string_location_reader *loc_reader,
   1461 	     cpp_substring_ranges *ranges)
   1462 {
   1463   size_t count = 0;
   1464   cppchar_t c, n = 0;
   1465   size_t width = cvt.width;
   1466   size_t mask = width_to_mask (width);
   1467 
   1468   /* loc_reader and ranges must either be both NULL, or both be non-NULL.  */
   1469   gcc_assert ((loc_reader != NULL) == (ranges != NULL));
   1470 
   1471   while (from < limit && count++ < 3)
   1472     {
   1473       c = *from;
   1474       if (c < '0' || c > '7')
   1475 	break;
   1476       from++;
   1477       if (loc_reader)
   1478 	char_range.m_finish = loc_reader->get_next ().m_finish;
   1479       n = (n << 3) + c - '0';
   1480     }
   1481 
   1482   if (n != (n & mask))
   1483     {
   1484       cpp_error (pfile, CPP_DL_PEDWARN,
   1485 		 "octal escape sequence out of range");
   1486       n &= mask;
   1487     }
   1488 
   1489   if (tbuf)
   1490     emit_numeric_escape (pfile, n, tbuf, cvt);
   1491   if (ranges)
   1492     ranges->add_range (char_range);
   1493 
   1494   return from;
   1495 }
   1496 
   1497 /* Convert an escape sequence (pointed to by FROM) to its value on
   1498    the target, and to the execution character set.  Do not scan past
   1499    LIMIT.  Write the converted value into TBUF, if TBUF is non-NULL.
   1500    Returns an advanced pointer.  Handles all relevant diagnostics.
   1501    If LOC_READER is non-NULL, then RANGES must be non-NULL: location
   1502    information is read from *LOC_READER, and *RANGES is updated
   1503    accordingly.  */
   1504 static const uchar *
   1505 convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit,
   1506 		struct _cpp_strbuf *tbuf, struct cset_converter cvt,
   1507 		cpp_string_location_reader *loc_reader,
   1508 		cpp_substring_ranges *ranges)
   1509 {
   1510   /* Values of \a \b \e \f \n \r \t \v respectively.  */
   1511 #if HOST_CHARSET == HOST_CHARSET_ASCII
   1512   static const uchar charconsts[] = {  7,  8, 27, 12, 10, 13,  9, 11 };
   1513 #elif HOST_CHARSET == HOST_CHARSET_EBCDIC
   1514   static const uchar charconsts[] = { 47, 22, 39, 12, 21, 13,  5, 11 };
   1515 #else
   1516 #error "unknown host character set"
   1517 #endif
   1518 
   1519   uchar c;
   1520 
   1521   /* Record the location of the backslash.  */
   1522   source_range char_range;
   1523   if (loc_reader)
   1524     char_range = loc_reader->get_next ();
   1525 
   1526   c = *from;
   1527   switch (c)
   1528     {
   1529       /* UCNs, hex escapes, and octal escapes are processed separately.  */
   1530     case 'u': case 'U':
   1531       return convert_ucn (pfile, from, limit, tbuf, cvt,
   1532 			  char_range, loc_reader, ranges);
   1533 
   1534     case 'x':
   1535       return convert_hex (pfile, from, limit, tbuf, cvt,
   1536 			  char_range, loc_reader, ranges);
   1537 
   1538     case '0':  case '1':  case '2':  case '3':
   1539     case '4':  case '5':  case '6':  case '7':
   1540       return convert_oct (pfile, from, limit, tbuf, cvt,
   1541 			  char_range, loc_reader, ranges);
   1542 
   1543       /* Various letter escapes.  Get the appropriate host-charset
   1544 	 value into C.  */
   1545     case '\\': case '\'': case '"': case '?': break;
   1546 
   1547     case '(': case '{': case '[': case '%':
   1548       /* '\(', etc, can be used at the beginning of a line in a long
   1549 	 string split onto multiple lines with \-newline, to prevent
   1550 	 Emacs or other text editors from getting confused.  '\%' can
   1551 	 be used to prevent SCCS from mangling printf format strings.  */
   1552       if (CPP_PEDANTIC (pfile))
   1553 	goto unknown;
   1554       break;
   1555 
   1556     case 'b': c = charconsts[1];  break;
   1557     case 'f': c = charconsts[3];  break;
   1558     case 'n': c = charconsts[4];  break;
   1559     case 'r': c = charconsts[5];  break;
   1560     case 't': c = charconsts[6];  break;
   1561     case 'v': c = charconsts[7];  break;
   1562 
   1563     case 'a':
   1564       if (CPP_WTRADITIONAL (pfile))
   1565 	cpp_warning (pfile, CPP_W_TRADITIONAL,
   1566 		     "the meaning of '\\a' is different in traditional C");
   1567       c = charconsts[0];
   1568       break;
   1569 
   1570     case 'e': case 'E':
   1571       if (CPP_PEDANTIC (pfile))
   1572 	cpp_error (pfile, CPP_DL_PEDWARN,
   1573 		   "non-ISO-standard escape sequence, '\\%c'", (int) c);
   1574       c = charconsts[2];
   1575       break;
   1576 
   1577     default:
   1578     unknown:
   1579       if (ISGRAPH (c))
   1580 	cpp_error (pfile, CPP_DL_PEDWARN,
   1581 		   "unknown escape sequence: '\\%c'", (int) c);
   1582       else
   1583 	{
   1584 	  encoding_rich_location rich_loc (pfile);
   1585 
   1586 	  /* diagnostic.cc does not support "%03o".  When it does, this
   1587 	     code can use %03o directly in the diagnostic again.  */
   1588 	  char buf[32];
   1589 	  sprintf(buf, "%03o", (int) c);
   1590 	  cpp_error_at (pfile, CPP_DL_PEDWARN, &rich_loc,
   1591 			"unknown escape sequence: '\\%s'", buf);
   1592 	}
   1593     }
   1594 
   1595   if (tbuf)
   1596     /* Now convert what we have to the execution character set.  */
   1597     if (!APPLY_CONVERSION (cvt, &c, 1, tbuf))
   1598       cpp_errno (pfile, CPP_DL_ERROR,
   1599 		 "converting escape sequence to execution character set");
   1600 
   1601   if (loc_reader)
   1602     {
   1603       char_range.m_finish = loc_reader->get_next ().m_finish;
   1604       ranges->add_range (char_range);
   1605     }
   1606 
   1607   return from + 1;
   1608 }
   1609 
   1610 /* TYPE is a token type.  The return value is the conversion needed to
   1612    convert from source to execution character set for the given type. */
   1613 static struct cset_converter
   1614 converter_for_type (cpp_reader *pfile, enum cpp_ttype type)
   1615 {
   1616   switch (type)
   1617     {
   1618     default:
   1619 	return pfile->narrow_cset_desc;
   1620     case CPP_UTF8CHAR:
   1621     case CPP_UTF8STRING:
   1622 	return pfile->utf8_cset_desc;
   1623     case CPP_CHAR16:
   1624     case CPP_STRING16:
   1625 	return pfile->char16_cset_desc;
   1626     case CPP_CHAR32:
   1627     case CPP_STRING32:
   1628 	return pfile->char32_cset_desc;
   1629     case CPP_WCHAR:
   1630     case CPP_WSTRING:
   1631 	return pfile->wide_cset_desc;
   1632     }
   1633 }
   1634 
   1635 /* FROM is an array of cpp_string structures of length COUNT.  These
   1636    are to be converted from the source to the execution character set,
   1637    escape sequences translated, and finally all are to be
   1638    concatenated.  WIDE indicates whether or not to produce a wide
   1639    string.  If TO is non-NULL, the result is written into TO.
   1640    If LOC_READERS and OUT are non-NULL, then location information
   1641    is read from LOC_READERS (which must be an array of length COUNT),
   1642    and location information is written to *RANGES.
   1643 
   1644    Returns true for success, false for failure.  */
   1645 
   1646 static bool
   1647 cpp_interpret_string_1 (cpp_reader *pfile, const cpp_string *from, size_t count,
   1648 			cpp_string *to,  enum cpp_ttype type,
   1649 			cpp_string_location_reader *loc_readers,
   1650 			cpp_substring_ranges *out)
   1651 {
   1652   struct _cpp_strbuf tbuf;
   1653   const uchar *p, *base, *limit;
   1654   size_t i;
   1655   struct cset_converter cvt = converter_for_type (pfile, type);
   1656 
   1657   /* loc_readers and out must either be both NULL, or both be non-NULL.  */
   1658   gcc_assert ((loc_readers != NULL) == (out != NULL));
   1659 
   1660   if (to)
   1661     {
   1662       tbuf.asize = MAX (OUTBUF_BLOCK_SIZE, from->len);
   1663       tbuf.text = XNEWVEC (uchar, tbuf.asize);
   1664       tbuf.len = 0;
   1665     }
   1666 
   1667   cpp_string_location_reader *loc_reader = NULL;
   1668   for (i = 0; i < count; i++)
   1669     {
   1670       if (loc_readers)
   1671 	loc_reader = &loc_readers[i];
   1672 
   1673       p = from[i].text;
   1674       if (*p == 'u')
   1675 	{
   1676 	  p++;
   1677 	  if (loc_reader)
   1678 	    loc_reader->get_next ();
   1679 	  if (*p == '8')
   1680 	    {
   1681 	      p++;
   1682 	      if (loc_reader)
   1683 		loc_reader->get_next ();
   1684 	    }
   1685 	}
   1686       else if (*p == 'L' || *p == 'U') p++;
   1687       if (*p == 'R')
   1688 	{
   1689 	  const uchar *prefix;
   1690 
   1691 	  /* Skip over 'R"'.  */
   1692 	  p += 2;
   1693 	  if (loc_reader)
   1694 	    {
   1695 	      loc_reader->get_next ();
   1696 	      loc_reader->get_next ();
   1697 	    }
   1698 	  prefix = p;
   1699 	  while (*p != '(')
   1700 	    {
   1701 	      p++;
   1702 	      if (loc_reader)
   1703 		loc_reader->get_next ();
   1704 	    }
   1705 	  p++;
   1706 	  if (loc_reader)
   1707 	    loc_reader->get_next ();
   1708 	  limit = from[i].text + from[i].len;
   1709 	  if (limit >= p + (p - prefix) + 1)
   1710 	    limit -= (p - prefix) + 1;
   1711 
   1712 	  /* Raw strings are all normal characters; these can be fed
   1713 	     directly to convert_cset.  */
   1714 	  if (to)
   1715 	    if (!APPLY_CONVERSION (cvt, p, limit - p, &tbuf))
   1716 	      goto fail;
   1717 
   1718 	  if (loc_reader)
   1719 	    {
   1720 	      /* If generating source ranges, assume we have a 1:1
   1721 		 correspondence between bytes in the source encoding and bytes
   1722 		 in the execution encoding (e.g. if we have a UTF-8 to UTF-8
   1723 		 conversion), so that this run of bytes in the source file
   1724 		 corresponds to a run of bytes in the execution string.
   1725 		 This requirement is guaranteed by an early-reject in
   1726 		 cpp_interpret_string_ranges.  */
   1727 	      gcc_assert (cvt.func == convert_no_conversion);
   1728 	      out->add_n_ranges (limit - p, *loc_reader);
   1729 	    }
   1730 
   1731 	  continue;
   1732 	}
   1733 
   1734       /* If we don't now have a leading quote, something has gone wrong.
   1735 	 This can occur if cpp_interpret_string_ranges is handling a
   1736 	 stringified macro argument, but should not be possible otherwise.  */
   1737       if (*p != '"' && *p != '\'')
   1738 	{
   1739 	  gcc_assert (out != NULL);
   1740 	  cpp_error (pfile, CPP_DL_ERROR, "missing open quote");
   1741 	  if (to)
   1742 	    free (tbuf.text);
   1743 	  return false;
   1744 	}
   1745 
   1746       /* Skip leading quote.  */
   1747       p++;
   1748       if (loc_reader)
   1749 	loc_reader->get_next ();
   1750 
   1751       limit = from[i].text + from[i].len - 1; /* Skip trailing quote.  */
   1752 
   1753       for (;;)
   1754 	{
   1755 	  base = p;
   1756 	  while (p < limit && *p != '\\')
   1757 	    p++;
   1758 	  if (p > base)
   1759 	    {
   1760 	      /* We have a run of normal characters; these can be fed
   1761 		 directly to convert_cset.  */
   1762 	      if (to)
   1763 		if (!APPLY_CONVERSION (cvt, base, p - base, &tbuf))
   1764 		  goto fail;
   1765 	    /* Similar to above: assumes we have a 1:1 correspondence
   1766 	       between bytes in the source encoding and bytes in the
   1767 	       execution encoding.  */
   1768 	      if (loc_reader)
   1769 		{
   1770 		  gcc_assert (cvt.func == convert_no_conversion);
   1771 		  out->add_n_ranges (p - base, *loc_reader);
   1772 		}
   1773 	    }
   1774 	  if (p >= limit)
   1775 	    break;
   1776 
   1777 	  struct _cpp_strbuf *tbuf_ptr = to ? &tbuf : NULL;
   1778 	  p = convert_escape (pfile, p + 1, limit, tbuf_ptr, cvt,
   1779 			      loc_reader, out);
   1780 	}
   1781     }
   1782 
   1783   if (to)
   1784     {
   1785       /* NUL-terminate the 'to' buffer and translate it to a cpp_string
   1786 	 structure.  */
   1787       emit_numeric_escape (pfile, 0, &tbuf, cvt);
   1788       tbuf.text = XRESIZEVEC (uchar, tbuf.text, tbuf.len);
   1789       to->text = tbuf.text;
   1790       to->len = tbuf.len;
   1791     }
   1792   /* Use the location of the trailing quote as the location of the
   1793      NUL-terminator.  */
   1794   if (loc_reader)
   1795     {
   1796       source_range range = loc_reader->get_next ();
   1797       out->add_range (range);
   1798     }
   1799 
   1800   return true;
   1801 
   1802  fail:
   1803   cpp_errno (pfile, CPP_DL_ERROR, "converting to execution character set");
   1804   if (to)
   1805     free (tbuf.text);
   1806   return false;
   1807 }
   1808 
   1809 /* FROM is an array of cpp_string structures of length COUNT.  These
   1810    are to be converted from the source to the execution character set,
   1811    escape sequences translated, and finally all are to be
   1812    concatenated.  WIDE indicates whether or not to produce a wide
   1813    string.  The result is written into TO.  Returns true for success,
   1814    false for failure.  */
   1815 bool
   1816 cpp_interpret_string (cpp_reader *pfile, const cpp_string *from, size_t count,
   1817 		      cpp_string *to,  enum cpp_ttype type)
   1818 {
   1819   return cpp_interpret_string_1 (pfile, from, count, to, type, NULL, NULL);
   1820 }
   1821 
   1822 /* A "do nothing" diagnostic-handling callback for use by
   1823    cpp_interpret_string_ranges, so that it can temporarily suppress
   1824    diagnostic-handling.  */
   1825 
   1826 static bool
   1827 noop_diagnostic_cb (cpp_reader *, enum cpp_diagnostic_level,
   1828 		    enum cpp_warning_reason, rich_location *,
   1829 		    const char *, va_list *)
   1830 {
   1831   /* no-op.  */
   1832   return true;
   1833 }
   1834 
   1835 /* This function mimics the behavior of cpp_interpret_string, but
   1836    rather than generating a string in the execution character set,
   1837    *OUT is written to with the source code ranges of the characters
   1838    in such a string.
   1839    FROM and LOC_READERS should both be arrays of length COUNT.
   1840    Returns NULL for success, or an error message for failure.  */
   1841 
   1842 const char *
   1843 cpp_interpret_string_ranges (cpp_reader *pfile, const cpp_string *from,
   1844 			     cpp_string_location_reader *loc_readers,
   1845 			     size_t count,
   1846 			     cpp_substring_ranges *out,
   1847 			     enum cpp_ttype type)
   1848 {
   1849   /* There are a couple of cases in the range-handling in
   1850      cpp_interpret_string_1 that rely on there being a 1:1 correspondence
   1851      between bytes in the source encoding and bytes in the execution
   1852      encoding, so that each byte in the execution string can correspond
   1853      to the location of a byte in the source string.
   1854 
   1855      This holds for the typical case of a UTF-8 to UTF-8 conversion.
   1856      Enforce this requirement by only attempting to track substring
   1857      locations if we have source encoding == execution encoding.
   1858 
   1859      This is a stronger condition than we need, since we could e.g.
   1860      have ASCII to EBCDIC (with 1 byte per character before and after),
   1861      but it seems to be a reasonable restriction.  */
   1862   struct cset_converter cvt = converter_for_type (pfile, type);
   1863   if (cvt.func != convert_no_conversion)
   1864     return "execution character set != source character set";
   1865 
   1866   /* For on-demand strings we have already lexed the strings, so there
   1867      should be no diagnostics.  However, if we have bogus source location
   1868      data (or stringified macro arguments), the attempt to lex the
   1869      strings could fail with an diagnostic.  Temporarily install an
   1870      diagnostic-handler to catch the diagnostic, so that it can lead to this call
   1871      failing, rather than being emitted as a user-visible diagnostic.
   1872      If an diagnostic does occur, we should see it via the return value of
   1873      cpp_interpret_string_1.  */
   1874   bool (*saved_diagnostic_handler) (cpp_reader *, enum cpp_diagnostic_level,
   1875 				    enum cpp_warning_reason, rich_location *,
   1876 				    const char *, va_list *)
   1877     ATTRIBUTE_FPTR_PRINTF(5,0);
   1878 
   1879   saved_diagnostic_handler = pfile->cb.diagnostic;
   1880   pfile->cb.diagnostic = noop_diagnostic_cb;
   1881 
   1882   bool result = cpp_interpret_string_1 (pfile, from, count, NULL, type,
   1883 					loc_readers, out);
   1884 
   1885   /* Restore the saved diagnostic-handler.  */
   1886   pfile->cb.diagnostic = saved_diagnostic_handler;
   1887 
   1888   if (!result)
   1889     return "cpp_interpret_string_1 failed";
   1890 
   1891   /* Success.  */
   1892   return NULL;
   1893 }
   1894 
   1895 /* Subroutine of do_line and do_linemarker.  Convert escape sequences
   1896    in a string, but do not perform character set conversion.  */
   1897 bool
   1898 cpp_interpret_string_notranslate (cpp_reader *pfile, const cpp_string *from,
   1899 				  size_t count,	cpp_string *to,
   1900 				  enum cpp_ttype type ATTRIBUTE_UNUSED)
   1901 {
   1902   struct cset_converter save_narrow_cset_desc = pfile->narrow_cset_desc;
   1903   bool retval;
   1904 
   1905   pfile->narrow_cset_desc.func = convert_no_conversion;
   1906   pfile->narrow_cset_desc.cd = (iconv_t) -1;
   1907   pfile->narrow_cset_desc.width = CPP_OPTION (pfile, char_precision);
   1908 
   1909   retval = cpp_interpret_string (pfile, from, count, to, CPP_STRING);
   1910 
   1911   pfile->narrow_cset_desc = save_narrow_cset_desc;
   1912   return retval;
   1913 }
   1914 
   1915 
   1916 /* Subroutine of cpp_interpret_charconst which performs the conversion
   1918    to a number, for narrow strings.  STR is the string structure returned
   1919    by cpp_interpret_string.  PCHARS_SEEN and UNSIGNEDP are as for
   1920    cpp_interpret_charconst.  TYPE is the token type.  */
   1921 static cppchar_t
   1922 narrow_str_to_charconst (cpp_reader *pfile, cpp_string str,
   1923 			 unsigned int *pchars_seen, int *unsignedp,
   1924 			 enum cpp_ttype type)
   1925 {
   1926   size_t width = CPP_OPTION (pfile, char_precision);
   1927   size_t max_chars = CPP_OPTION (pfile, int_precision) / width;
   1928   size_t mask = width_to_mask (width);
   1929   size_t i;
   1930   cppchar_t result, c;
   1931   bool unsigned_p;
   1932 
   1933   /* The value of a multi-character character constant, or a
   1934      single-character character constant whose representation in the
   1935      execution character set is more than one byte long, is
   1936      implementation defined.  This implementation defines it to be the
   1937      number formed by interpreting the byte sequence in memory as a
   1938      big-endian binary number.  If overflow occurs, the high bytes are
   1939      lost, and a warning is issued.
   1940 
   1941      We don't want to process the NUL terminator handed back by
   1942      cpp_interpret_string.  */
   1943   result = 0;
   1944   for (i = 0; i < str.len - 1; i++)
   1945     {
   1946       c = str.text[i] & mask;
   1947       if (width < BITS_PER_CPPCHAR_T)
   1948 	result = (result << width) | c;
   1949       else
   1950 	result = c;
   1951     }
   1952 
   1953   if (type == CPP_UTF8CHAR)
   1954     max_chars = 1;
   1955   if (i > max_chars)
   1956     {
   1957       i = max_chars;
   1958       cpp_error (pfile, type == CPP_UTF8CHAR ? CPP_DL_ERROR : CPP_DL_WARNING,
   1959 		 "character constant too long for its type");
   1960     }
   1961   else if (i > 1 && CPP_OPTION (pfile, warn_multichar))
   1962     cpp_warning (pfile, CPP_W_MULTICHAR, "multi-character character constant");
   1963 
   1964   /* Multichar constants are of type int and therefore signed.  */
   1965   if (i > 1)
   1966     unsigned_p = 0;
   1967   else if (type == CPP_UTF8CHAR && !CPP_OPTION (pfile, cplusplus))
   1968     unsigned_p = 1;
   1969   else
   1970     unsigned_p = CPP_OPTION (pfile, unsigned_char);
   1971 
   1972   /* Truncate the constant to its natural width, and simultaneously
   1973      sign- or zero-extend to the full width of cppchar_t.
   1974      For single-character constants, the value is WIDTH bits wide.
   1975      For multi-character constants, the value is INT_PRECISION bits wide.  */
   1976   if (i > 1)
   1977     width = CPP_OPTION (pfile, int_precision);
   1978   if (width < BITS_PER_CPPCHAR_T)
   1979     {
   1980       mask = ((cppchar_t) 1 << width) - 1;
   1981       if (unsigned_p || !(result & (1 << (width - 1))))
   1982 	result &= mask;
   1983       else
   1984 	result |= ~mask;
   1985     }
   1986   *pchars_seen = i;
   1987   *unsignedp = unsigned_p;
   1988   return result;
   1989 }
   1990 
   1991 /* Subroutine of cpp_interpret_charconst which performs the conversion
   1992    to a number, for wide strings.  STR is the string structure returned
   1993    by cpp_interpret_string.  PCHARS_SEEN and UNSIGNEDP are as for
   1994    cpp_interpret_charconst.  TYPE is the token type.  */
   1995 static cppchar_t
   1996 wide_str_to_charconst (cpp_reader *pfile, cpp_string str,
   1997 		       unsigned int *pchars_seen, int *unsignedp,
   1998 		       enum cpp_ttype type)
   1999 {
   2000   bool bigend = CPP_OPTION (pfile, bytes_big_endian);
   2001   size_t width = converter_for_type (pfile, type).width;
   2002   size_t cwidth = CPP_OPTION (pfile, char_precision);
   2003   size_t mask = width_to_mask (width);
   2004   size_t cmask = width_to_mask (cwidth);
   2005   size_t nbwc = width / cwidth;
   2006   size_t off, i;
   2007   cppchar_t result = 0, c;
   2008 
   2009   if (str.len <= nbwc)
   2010     {
   2011       /* Error recovery, if no errors have been diagnosed previously,
   2012 	 there should be at least two wide characters.  Empty literals
   2013 	 are diagnosed earlier and we can get just the zero terminator
   2014 	 only if there were errors diagnosed during conversion.  */
   2015       *pchars_seen = 0;
   2016       *unsignedp = 0;
   2017       return 0;
   2018     }
   2019 
   2020   /* This is finicky because the string is in the target's byte order,
   2021      which may not be our byte order.  Only the last character, ignoring
   2022      the NUL terminator, is relevant.  */
   2023   off = str.len - (nbwc * 2);
   2024   result = 0;
   2025   for (i = 0; i < nbwc; i++)
   2026     {
   2027       c = bigend ? str.text[off + i] : str.text[off + nbwc - i - 1];
   2028       result = (result << cwidth) | (c & cmask);
   2029     }
   2030 
   2031   /* Wide character constants have type wchar_t, and a single
   2032      character exactly fills a wchar_t, so a multi-character wide
   2033      character constant is guaranteed to overflow.  */
   2034   if (str.len > nbwc * 2)
   2035     cpp_error (pfile, (CPP_OPTION (pfile, cplusplus)
   2036 		       && (type == CPP_CHAR16 || type == CPP_CHAR32))
   2037 		      ? CPP_DL_ERROR : CPP_DL_WARNING,
   2038 	       "character constant too long for its type");
   2039 
   2040   /* Truncate the constant to its natural width, and simultaneously
   2041      sign- or zero-extend to the full width of cppchar_t.  */
   2042   if (width < BITS_PER_CPPCHAR_T)
   2043     {
   2044       if (type == CPP_CHAR16 || type == CPP_CHAR32
   2045 	  || CPP_OPTION (pfile, unsigned_wchar)
   2046 	  || !(result & (1 << (width - 1))))
   2047 	result &= mask;
   2048       else
   2049 	result |= ~mask;
   2050     }
   2051 
   2052   if (type == CPP_CHAR16 || type == CPP_CHAR32
   2053       || CPP_OPTION (pfile, unsigned_wchar))
   2054     *unsignedp = 1;
   2055   else
   2056     *unsignedp = 0;
   2057 
   2058   *pchars_seen = 1;
   2059   return result;
   2060 }
   2061 
   2062 /* Interpret a (possibly wide) character constant in TOKEN.
   2063    PCHARS_SEEN points to a variable that is filled in with the number
   2064    of characters seen, and UNSIGNEDP to a variable that indicates
   2065    whether the result has signed type.  */
   2066 cppchar_t
   2067 cpp_interpret_charconst (cpp_reader *pfile, const cpp_token *token,
   2068 			 unsigned int *pchars_seen, int *unsignedp)
   2069 {
   2070   cpp_string str = { 0, 0 };
   2071   bool wide = (token->type != CPP_CHAR && token->type != CPP_UTF8CHAR);
   2072   int u8 = 2 * int(token->type == CPP_UTF8CHAR);
   2073   cppchar_t result;
   2074 
   2075   /* An empty constant will appear as L'', u'', U'', u8'', or '' */
   2076   if (token->val.str.len == (size_t) (2 + wide + u8))
   2077     {
   2078       cpp_error (pfile, CPP_DL_ERROR, "empty character constant");
   2079       *pchars_seen = 0;
   2080       *unsignedp = 0;
   2081       return 0;
   2082     }
   2083   else if (!cpp_interpret_string (pfile, &token->val.str, 1, &str,
   2084 				  token->type))
   2085     {
   2086       *pchars_seen = 0;
   2087       *unsignedp = 0;
   2088       return 0;
   2089     }
   2090 
   2091   if (wide)
   2092     result = wide_str_to_charconst (pfile, str, pchars_seen, unsignedp,
   2093 				    token->type);
   2094   else
   2095     result = narrow_str_to_charconst (pfile, str, pchars_seen, unsignedp,
   2096 				      token->type);
   2097 
   2098   if (str.text != token->val.str.text)
   2099     free ((void *)str.text);
   2100 
   2101   return result;
   2102 }
   2103 
   2104 /* Convert an identifier denoted by ID and LEN, which might contain
   2106    UCN escapes or UTF-8 multibyte chars, to the source character set,
   2107    either UTF-8 or UTF-EBCDIC.  Assumes that the identifier is actually
   2108    a valid identifier.  */
   2109 cpp_hashnode *
   2110 _cpp_interpret_identifier (cpp_reader *pfile, const uchar *id, size_t len)
   2111 {
   2112   /* It turns out that a UCN escape always turns into fewer characters
   2113      than the escape itself, so we can allocate a temporary in advance.  */
   2114   uchar * buf = (uchar *) alloca (len + 1);
   2115   uchar * bufp = buf;
   2116   size_t idp;
   2117 
   2118   for (idp = 0; idp < len; idp++)
   2119     if (id[idp] != '\\')
   2120       *bufp++ = id[idp];
   2121     else
   2122       {
   2123 	unsigned length = id[idp+1] == 'u' ? 4 : 8;
   2124 	cppchar_t value = 0;
   2125 	size_t bufleft = len - (bufp - buf);
   2126 	int rval;
   2127 
   2128 	idp += 2;
   2129 	while (length && idp < len && ISXDIGIT (id[idp]))
   2130 	  {
   2131 	    value = (value << 4) + hex_value (id[idp]);
   2132 	    idp++;
   2133 	    length--;
   2134 	  }
   2135 	idp--;
   2136 
   2137 	/* Special case for EBCDIC: if the identifier contains
   2138 	   a '$' specified using a UCN, translate it to EBCDIC.  */
   2139 	if (value == 0x24)
   2140 	  {
   2141 	    *bufp++ = '$';
   2142 	    continue;
   2143 	  }
   2144 
   2145 	rval = one_cppchar_to_utf8 (value, &bufp, &bufleft);
   2146 	if (rval)
   2147 	  {
   2148 	    errno = rval;
   2149 	    cpp_errno (pfile, CPP_DL_ERROR,
   2150 		       "converting UCN to source character set");
   2151 	    break;
   2152 	  }
   2153       }
   2154 
   2155   return CPP_HASHNODE (ht_lookup (pfile->hash_table,
   2156 				  buf, bufp - buf, HT_ALLOC));
   2157 }
   2158 
   2159 
   2161 /* Utility to strip a UTF-8 byte order marking from the beginning
   2162    of a buffer.  Returns the number of bytes to skip, which currently
   2163    will be either 0 or 3.  */
   2164 int
   2165 cpp_check_utf8_bom (const char *data, size_t data_length)
   2166 {
   2167 
   2168 #if HOST_CHARSET == HOST_CHARSET_ASCII
   2169   const unsigned char *udata = (const unsigned char *) data;
   2170   if (data_length >= 3 && udata[0] == 0xef && udata[1] == 0xbb
   2171       && udata[2] == 0xbf)
   2172     return 3;
   2173 #endif
   2174 
   2175   return 0;
   2176 }
   2177 
   2178 
   2179 /* Convert an input buffer (containing the complete contents of one
   2180    source file) from INPUT_CHARSET to the source character set.  INPUT
   2181    points to the input buffer, SIZE is its allocated size, and LEN is
   2182    the length of the meaningful data within the buffer.  The
   2183    translated buffer is returned, *ST_SIZE is set to the length of
   2184    the meaningful data within the translated buffer, and *BUFFER_START
   2185    is set to the start of the returned buffer.  *BUFFER_START may
   2186    differ from the return value in the case of a BOM or other ignored
   2187    marker information.
   2188 
   2189    INPUT is expected to have been allocated with xmalloc.  This
   2190    function will either set *BUFFER_START to INPUT, or free it and set
   2191    *BUFFER_START to a pointer to another xmalloc-allocated block of
   2192    memory.
   2193 
   2194    PFILE is only used to generate diagnostics; setting it to NULL suppresses
   2195    diagnostics, and causes a return of NULL if there was any error instead.  */
   2196 
   2197 uchar *
   2198 _cpp_convert_input (cpp_reader *pfile, const char *input_charset,
   2199 		    uchar *input, size_t size, size_t len,
   2200 		    const unsigned char **buffer_start, off_t *st_size)
   2201 {
   2202   struct cset_converter input_cset;
   2203   struct _cpp_strbuf to;
   2204   unsigned char *buffer;
   2205 
   2206   input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset);
   2207   if (input_cset.func == convert_no_conversion)
   2208     {
   2209       to.text = input;
   2210       to.asize = size;
   2211       to.len = len;
   2212     }
   2213   else
   2214     {
   2215       to.asize = MAX (65536, len);
   2216       to.text = XNEWVEC (uchar, to.asize);
   2217       to.len = 0;
   2218 
   2219       const bool ok = APPLY_CONVERSION (input_cset, input, len, &to);
   2220       free (input);
   2221 
   2222       /* Clean up the mess.  */
   2223       if (input_cset.func == convert_using_iconv)
   2224 	iconv_close (input_cset.cd);
   2225 
   2226       /* Handle conversion failure.  */
   2227       if (!ok)
   2228 	{
   2229 	  if (!pfile)
   2230 	    {
   2231 	      XDELETEVEC (to.text);
   2232 	      *buffer_start = NULL;
   2233 	      *st_size = 0;
   2234 	      return NULL;
   2235 	    }
   2236 	  cpp_error (pfile, CPP_DL_ERROR, "failure to convert %s to %s",
   2237 		     input_charset, SOURCE_CHARSET);
   2238 	}
   2239     }
   2240 
   2241   /* Resize buffer if we allocated substantially too much, or if we
   2242      haven't enough space for the \n-terminator or following
   2243      15 bytes of padding (used to quiet warnings from valgrind or
   2244      Address Sanitizer, when the optimized lexer accesses aligned
   2245      16-byte memory chunks, including the bytes after the malloced,
   2246      area, and stops lexing on '\n').  */
   2247   if (to.len + 4096 < to.asize || to.len + 16 > to.asize)
   2248     to.text = XRESIZEVEC (uchar, to.text, to.len + 16);
   2249 
   2250   memset (to.text + to.len, '\0', 16);
   2251 
   2252   /* If the file is using old-school Mac line endings (\r only),
   2253      terminate with another \r, not an \n, so that we do not mistake
   2254      the \r\n sequence for a single DOS line ending and erroneously
   2255      issue the "No newline at end of file" diagnostic.  */
   2256   if (to.len && to.text[to.len - 1] == '\r')
   2257     to.text[to.len] = '\r';
   2258   else
   2259     to.text[to.len] = '\n';
   2260 
   2261   buffer = to.text;
   2262   *st_size = to.len;
   2263 
   2264   /* Ignore a UTF-8 BOM if we see one and the source charset is UTF-8.  Note
   2265      that glib'c UTF-8 iconv() provider (as of glibc 2.7) does not ignore a
   2266      BOM -- however, even if it did, we would still need this code due
   2267      to the 'convert_no_conversion' case.  */
   2268   const int bom_len = cpp_check_utf8_bom ((const char *) to.text, to.len);
   2269   *st_size -= bom_len;
   2270   buffer += bom_len;
   2271 
   2272   *buffer_start = to.text;
   2273   return buffer;
   2274 }
   2275 
   2276 /* Decide on the default encoding to assume for input files.  */
   2277 const char *
   2278 _cpp_default_encoding (void)
   2279 {
   2280   const char *current_encoding = NULL;
   2281 
   2282   /* We disable this because the default codeset is 7-bit ASCII on
   2283      most platforms, and this causes conversion failures on every
   2284      file in GCC that happens to have one of the upper 128 characters
   2285      in it -- most likely, as part of the name of a contributor.
   2286      We should definitely recognize in-band markers of file encoding,
   2287      like:
   2288      - the appropriate Unicode byte-order mark (FE FF) to recognize
   2289        UTF16 and UCS4 (in both big-endian and little-endian flavors)
   2290        and UTF8
   2291      - a "#i", "#d", "/ *", "//", " #p" or "#p" (for #pragma) to
   2292        distinguish ASCII and EBCDIC.
   2293      - now we can parse something like "#pragma GCC encoding <xyz>
   2294        on the first line, or even Emacs/VIM's mode line tags (there's
   2295        a problem here in that VIM uses the last line, and Emacs has
   2296        its more elaborate "local variables" convention).
   2297      - investigate whether Java has another common convention, which
   2298        would be friendly to support.
   2299      (Zack Weinberg and Paolo Bonzini, May 20th 2004)  */
   2300 #if defined (HAVE_LOCALE_H) && defined (HAVE_LANGINFO_CODESET) && 0
   2301   setlocale (LC_CTYPE, "");
   2302   current_encoding = nl_langinfo (CODESET);
   2303 #endif
   2304   if (current_encoding == NULL || *current_encoding == '\0')
   2305     current_encoding = SOURCE_CHARSET;
   2306 
   2307   return current_encoding;
   2308 }
   2309 
   2310 /* Check if the configured input charset requires no conversion, other than
   2311    possibly stripping a UTF-8 BOM.  */
   2312 bool cpp_input_conversion_is_trivial (const char *input_charset)
   2313 {
   2314   return !strcasecmp (input_charset, SOURCE_CHARSET);
   2315 }
   2316 
   2317 /* Implementation of class cpp_string_location_reader.  */
   2318 
   2319 /* Constructor for cpp_string_location_reader.  */
   2320 
   2321 cpp_string_location_reader::
   2322 cpp_string_location_reader (location_t src_loc,
   2323 			    line_maps *line_table)
   2324 {
   2325   src_loc = get_range_from_loc (line_table, src_loc).m_start;
   2326 
   2327   /* SRC_LOC might be a macro location.  It only makes sense to do
   2328      column-by-column calculations on ordinary maps, so get the
   2329      corresponding location in an ordinary map.  */
   2330   m_loc
   2331     = linemap_resolve_location (line_table, src_loc,
   2332 				LRK_SPELLING_LOCATION, NULL);
   2333 
   2334   const line_map_ordinary *map
   2335     = linemap_check_ordinary (linemap_lookup (line_table, m_loc));
   2336   m_offset_per_column = (1 << map->m_range_bits);
   2337 }
   2338 
   2339 /* Get the range of the next source byte.  */
   2340 
   2341 source_range
   2342 cpp_string_location_reader::get_next ()
   2343 {
   2344   source_range result;
   2345   result.m_start = m_loc;
   2346   result.m_finish = m_loc;
   2347   if (m_loc <= LINE_MAP_MAX_LOCATION_WITH_COLS)
   2348     m_loc += m_offset_per_column;
   2349   return result;
   2350 }
   2351 
   2352 cpp_display_width_computation::
   2353 cpp_display_width_computation (const char *data, int data_length,
   2354 			       const cpp_char_column_policy &policy) :
   2355   m_begin (data),
   2356   m_next (m_begin),
   2357   m_bytes_left (data_length),
   2358   m_policy (policy),
   2359   m_display_cols (0)
   2360 {
   2361   gcc_assert (policy.m_tabstop > 0);
   2362   gcc_assert (policy.m_width_cb);
   2363 }
   2364 
   2365 
   2366 /* The main implementation function for class cpp_display_width_computation.
   2367    m_next points on entry to the start of the UTF-8 encoding of the next
   2368    character, and is updated to point just after the last byte of the encoding.
   2369    m_bytes_left contains on entry the remaining size of the buffer into which
   2370    m_next points, and this is also updated accordingly.  If m_next does not
   2371    point to a valid UTF-8-encoded sequence, then it will be treated as a single
   2372    byte with display width 1.  m_cur_display_col is the current display column,
   2373    relative to which tab stops should be expanded.  Returns the display width of
   2374    the codepoint just processed.
   2375    If OUT is non-NULL, it is populated.  */
   2376 
   2377 int
   2378 cpp_display_width_computation::process_next_codepoint (cpp_decoded_char *out)
   2379 {
   2380   cppchar_t c;
   2381   int next_width;
   2382 
   2383   if (out)
   2384     out->m_start_byte = m_next;
   2385 
   2386   if (*m_next == '\t')
   2387     {
   2388       ++m_next;
   2389       --m_bytes_left;
   2390       next_width = m_policy.m_tabstop - (m_display_cols % m_policy.m_tabstop);
   2391       if (out)
   2392 	{
   2393 	  out->m_ch = '\t';
   2394 	  out->m_valid_ch = true;
   2395 	}
   2396     }
   2397   else if (one_utf8_to_cppchar ((const uchar **) &m_next, &m_bytes_left, &c)
   2398 	   != 0)
   2399     {
   2400       /* Input is not convertible to UTF-8.  This could be fine, e.g. in a
   2401 	 string literal, so don't complain.  Just treat it as if it has a width
   2402 	 of one.  */
   2403       ++m_next;
   2404       --m_bytes_left;
   2405       next_width = m_policy.m_undecoded_byte_width;
   2406       if (out)
   2407 	out->m_valid_ch = false;
   2408     }
   2409   else
   2410     {
   2411       /*  one_utf8_to_cppchar() has updated m_next and m_bytes_left for us.  */
   2412       next_width = m_policy.m_width_cb (c);
   2413       if (out)
   2414 	{
   2415 	  out->m_ch = c;
   2416 	  out->m_valid_ch = true;
   2417 	}
   2418     }
   2419 
   2420   if (out)
   2421     out->m_next_byte = m_next;
   2422 
   2423   m_display_cols += next_width;
   2424   return next_width;
   2425 }
   2426 
   2427 /*  Utility to advance the byte stream by the minimum amount needed to consume
   2428     N display columns.  Returns the number of display columns that were
   2429     actually skipped.  This could be less than N, if there was not enough data,
   2430     or more than N, if the last character to be skipped had a sufficiently large
   2431     display width.  */
   2432 int
   2433 cpp_display_width_computation::advance_display_cols (int n)
   2434 {
   2435   const int start = m_display_cols;
   2436   const int target = start + n;
   2437   while (m_display_cols < target && !done ())
   2438     process_next_codepoint (NULL);
   2439   return m_display_cols - start;
   2440 }
   2441 
   2442 /*  For the string of length DATA_LENGTH bytes that begins at DATA, compute
   2443     how many display columns are occupied by the first COLUMN bytes.  COLUMN
   2444     may exceed DATA_LENGTH, in which case the phantom bytes at the end are
   2445     treated as if they have display width 1.  Tabs are expanded to the next tab
   2446     stop, relative to the start of DATA, and non-printable-ASCII characters
   2447     will be escaped as per POLICY.  */
   2448 
   2449 int
   2450 cpp_byte_column_to_display_column (const char *data, int data_length,
   2451 				   int column,
   2452 				   const cpp_char_column_policy &policy)
   2453 {
   2454   const int offset = MAX (0, column - data_length);
   2455   cpp_display_width_computation dw (data, column - offset, policy);
   2456   while (!dw.done ())
   2457     dw.process_next_codepoint (NULL);
   2458   return dw.display_cols_processed () + offset;
   2459 }
   2460 
   2461 /*  For the string of length DATA_LENGTH bytes that begins at DATA, compute
   2462     the least number of bytes that will result in at least DISPLAY_COL display
   2463     columns.  The return value may exceed DATA_LENGTH if the entire string does
   2464     not occupy enough display columns.  Non-printable-ASCII characters
   2465     will be escaped as per POLICY.  */
   2466 
   2467 int
   2468 cpp_display_column_to_byte_column (const char *data, int data_length,
   2469 				   int display_col,
   2470 				   const cpp_char_column_policy &policy)
   2471 {
   2472   cpp_display_width_computation dw (data, data_length, policy);
   2473   const int avail_display = dw.advance_display_cols (display_col);
   2474   return dw.bytes_processed () + MAX (0, display_col - avail_display);
   2475 }
   2476 
   2477 /* Our own version of wcwidth().  We don't use the actual wcwidth() in glibc,
   2478    because that will inspect the user's locale, and in particular in an ASCII
   2479    locale, it will not return anything useful for extended characters.  But GCC
   2480    in other respects (see e.g. _cpp_default_encoding()) behaves as if
   2481    everything is UTF-8.  We also make some tweaks that are useful for the way
   2482    GCC needs to use this data, e.g. tabs and other control characters should be
   2483    treated as having width 1.  The lookup tables are generated from
   2484    contrib/unicode/gen_wcwidth.py and were made by simply calling glibc
   2485    wcwidth() on all codepoints, then applying the small tweaks.  These tables
   2486    are not highly optimized, but for the present purpose of outputting
   2487    diagnostics, they are sufficient.  */
   2488 
   2489 #include "generated_cpp_wcwidth.h"
   2490 int cpp_wcwidth (cppchar_t c)
   2491 {
   2492   if (__builtin_expect (c <= wcwidth_range_ends[0], true))
   2493     return wcwidth_widths[0];
   2494 
   2495   /* Binary search the tables.  */
   2496   int begin = 1;
   2497   static const int end
   2498       = sizeof wcwidth_range_ends / sizeof (*wcwidth_range_ends);
   2499   int len = end - begin;
   2500   do
   2501     {
   2502       int half = len/2;
   2503       int middle = begin + half;
   2504       if (c > wcwidth_range_ends[middle])
   2505 	{
   2506 	  begin = middle + 1;
   2507 	  len -= half + 1;
   2508 	}
   2509       else
   2510 	len = half;
   2511     } while (len);
   2512 
   2513   if (__builtin_expect (begin != end, true))
   2514     return wcwidth_widths[begin];
   2515   return 1;
   2516 }
   2517