xref: /netbsd-src/external/gpl3/gcc.old/dist/libcpp/charset.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
1 /* CPP Library - charsets
2    Copyright (C) 1998-2020 Free Software Foundation, Inc.
3 
4    Broken out of c-lex.c 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
one_utf8_to_cppchar(const uchar ** inbufp,size_t * inbytesleftp,cppchar_t * cp)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
one_cppchar_to_utf8(cppchar_t c,uchar ** outbufp,size_t * outbytesleftp)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
one_utf8_to_utf32(iconv_t bigend,const uchar ** inbufp,size_t * inbytesleftp,uchar ** outbufp,size_t * outbytesleftp)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
one_utf32_to_utf8(iconv_t bigend,const uchar ** inbufp,size_t * inbytesleftp,uchar ** outbufp,size_t * outbytesleftp)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
one_utf8_to_utf16(iconv_t bigend,const uchar ** inbufp,size_t * inbytesleftp,uchar ** outbufp,size_t * outbytesleftp)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
one_utf16_to_utf8(iconv_t bigend,const uchar ** inbufp,size_t * inbytesleftp,uchar ** outbufp,size_t * outbytesleftp)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
conversion_loop(int (* const one_conversion)(iconv_t,const uchar **,size_t *,uchar **,size_t *),iconv_t cd,const uchar * from,size_t flen,struct _cpp_strbuf * to)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
convert_utf8_utf16(iconv_t cd,const uchar * from,size_t flen,struct _cpp_strbuf * to)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
convert_utf8_utf32(iconv_t cd,const uchar * from,size_t flen,struct _cpp_strbuf * to)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
convert_utf16_utf8(iconv_t cd,const uchar * from,size_t flen,struct _cpp_strbuf * to)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
convert_utf32_utf8(iconv_t cd,const uchar * from,size_t flen,struct _cpp_strbuf * to)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
convert_no_conversion(iconv_t cd ATTRIBUTE_UNUSED,const uchar * from,size_t flen,struct _cpp_strbuf * to)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
convert_using_iconv(iconv_t cd,const uchar * from,size_t flen,struct _cpp_strbuf * to)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 static struct cset_converter
init_iconv_desc(cpp_reader * pfile,const char * to,const char * from)635 init_iconv_desc (cpp_reader *pfile, const char *to, const char *from)
636 {
637   struct cset_converter ret;
638   char *pair;
639   size_t i;
640 
641   if (!strcasecmp (to, from))
642     {
643       ret.func = convert_no_conversion;
644       ret.cd = (iconv_t) -1;
645       ret.width = -1;
646       return ret;
647     }
648 
649   pair = (char *) alloca(strlen(to) + strlen(from) + 2);
650 
651   strcpy(pair, from);
652   strcat(pair, "/");
653   strcat(pair, to);
654   for (i = 0; i < ARRAY_SIZE (conversion_tab); i++)
655     if (!strcasecmp (pair, conversion_tab[i].pair))
656       {
657 	ret.func = conversion_tab[i].func;
658 	ret.cd = conversion_tab[i].fake_cd;
659 	ret.width = -1;
660 	return ret;
661       }
662 
663   /* No custom converter - try iconv.  */
664   if (HAVE_ICONV)
665     {
666       ret.func = convert_using_iconv;
667       ret.cd = iconv_open (to, from);
668       ret.width = -1;
669 
670       if (ret.cd == (iconv_t) -1)
671 	{
672 	  if (errno == EINVAL)
673 	    cpp_error (pfile, CPP_DL_ERROR, /* FIXME should be DL_SORRY */
674 		       "conversion from %s to %s not supported by iconv",
675 		       from, to);
676 	  else
677 	    cpp_errno (pfile, CPP_DL_ERROR, "iconv_open");
678 
679 	  ret.func = convert_no_conversion;
680 	}
681     }
682   else
683     {
684       cpp_error (pfile, CPP_DL_ERROR, /* FIXME: should be DL_SORRY */
685 		 "no iconv implementation, cannot convert from %s to %s",
686 		 from, to);
687       ret.func = convert_no_conversion;
688       ret.cd = (iconv_t) -1;
689       ret.width = -1;
690     }
691   return ret;
692 }
693 
694 /* If charset conversion is requested, initialize iconv(3) descriptors
695    for conversion from the source character set to the execution
696    character sets.  If iconv is not present in the C library, and
697    conversion is requested, issue an error.  */
698 
699 void
cpp_init_iconv(cpp_reader * pfile)700 cpp_init_iconv (cpp_reader *pfile)
701 {
702   const char *ncset = CPP_OPTION (pfile, narrow_charset);
703   const char *wcset = CPP_OPTION (pfile, wide_charset);
704   const char *default_wcset;
705 
706   bool be = CPP_OPTION (pfile, bytes_big_endian);
707 
708   if (CPP_OPTION (pfile, wchar_precision) >= 32)
709     default_wcset = be ? "UTF-32BE" : "UTF-32LE";
710   else if (CPP_OPTION (pfile, wchar_precision) >= 16)
711     default_wcset = be ? "UTF-16BE" : "UTF-16LE";
712   else
713     /* This effectively means that wide strings are not supported,
714        so don't do any conversion at all.  */
715    default_wcset = SOURCE_CHARSET;
716 
717   if (!ncset)
718     ncset = SOURCE_CHARSET;
719   if (!wcset)
720     wcset = default_wcset;
721 
722   pfile->narrow_cset_desc = init_iconv_desc (pfile, ncset, SOURCE_CHARSET);
723   pfile->narrow_cset_desc.width = CPP_OPTION (pfile, char_precision);
724   pfile->utf8_cset_desc = init_iconv_desc (pfile, "UTF-8", SOURCE_CHARSET);
725   pfile->utf8_cset_desc.width = CPP_OPTION (pfile, char_precision);
726   pfile->char16_cset_desc = init_iconv_desc (pfile,
727 					     be ? "UTF-16BE" : "UTF-16LE",
728 					     SOURCE_CHARSET);
729   pfile->char16_cset_desc.width = 16;
730   pfile->char32_cset_desc = init_iconv_desc (pfile,
731 					     be ? "UTF-32BE" : "UTF-32LE",
732 					     SOURCE_CHARSET);
733   pfile->char32_cset_desc.width = 32;
734   pfile->wide_cset_desc = init_iconv_desc (pfile, wcset, SOURCE_CHARSET);
735   pfile->wide_cset_desc.width = CPP_OPTION (pfile, wchar_precision);
736 }
737 
738 /* Destroy iconv(3) descriptors set up by cpp_init_iconv, if necessary.  */
739 void
_cpp_destroy_iconv(cpp_reader * pfile)740 _cpp_destroy_iconv (cpp_reader *pfile)
741 {
742   if (HAVE_ICONV)
743     {
744       if (pfile->narrow_cset_desc.func == convert_using_iconv)
745 	iconv_close (pfile->narrow_cset_desc.cd);
746       if (pfile->utf8_cset_desc.func == convert_using_iconv)
747 	iconv_close (pfile->utf8_cset_desc.cd);
748       if (pfile->char16_cset_desc.func == convert_using_iconv)
749 	iconv_close (pfile->char16_cset_desc.cd);
750       if (pfile->char32_cset_desc.func == convert_using_iconv)
751 	iconv_close (pfile->char32_cset_desc.cd);
752       if (pfile->wide_cset_desc.func == convert_using_iconv)
753 	iconv_close (pfile->wide_cset_desc.cd);
754     }
755 }
756 
757 /* Utility routine for use by a full compiler.  C is a character taken
758    from the *basic* source character set, encoded in the host's
759    execution encoding.  Convert it to (the target's) execution
760    encoding, and return that value.
761 
762    Issues an internal error if C's representation in the narrow
763    execution character set fails to be a single-byte value (C99
764    5.2.1p3: "The representation of each member of the source and
765    execution character sets shall fit in a byte.")  May also issue an
766    internal error if C fails to be a member of the basic source
767    character set (testing this exactly is too hard, especially when
768    the host character set is EBCDIC).  */
769 cppchar_t
cpp_host_to_exec_charset(cpp_reader * pfile,cppchar_t c)770 cpp_host_to_exec_charset (cpp_reader *pfile, cppchar_t c)
771 {
772   uchar sbuf[1];
773   struct _cpp_strbuf tbuf;
774 
775   /* This test is merely an approximation, but it suffices to catch
776      the most important thing, which is that we don't get handed a
777      character outside the unibyte range of the host character set.  */
778   if (c > LAST_POSSIBLY_BASIC_SOURCE_CHAR)
779     {
780       cpp_error (pfile, CPP_DL_ICE,
781 		 "character 0x%lx is not in the basic source character set\n",
782 		 (unsigned long)c);
783       return 0;
784     }
785 
786   /* Being a character in the unibyte range of the host character set,
787      we can safely splat it into a one-byte buffer and trust that that
788      is a well-formed string.  */
789   sbuf[0] = c;
790 
791   /* This should never need to reallocate, but just in case... */
792   tbuf.asize = 1;
793   tbuf.text = XNEWVEC (uchar, tbuf.asize);
794   tbuf.len = 0;
795 
796   if (!APPLY_CONVERSION (pfile->narrow_cset_desc, sbuf, 1, &tbuf))
797     {
798       cpp_errno (pfile, CPP_DL_ICE, "converting to execution character set");
799       return 0;
800     }
801   if (tbuf.len != 1)
802     {
803       cpp_error (pfile, CPP_DL_ICE,
804 		 "character 0x%lx is not unibyte in execution character set",
805 		 (unsigned long)c);
806       return 0;
807     }
808   c = tbuf.text[0];
809   free(tbuf.text);
810   return c;
811 }
812 
813 
814 
815 /* cpp_substring_ranges's constructor. */
816 
cpp_substring_ranges()817 cpp_substring_ranges::cpp_substring_ranges () :
818   m_ranges (NULL),
819   m_num_ranges (0),
820   m_alloc_ranges (8)
821 {
822   m_ranges = XNEWVEC (source_range, m_alloc_ranges);
823 }
824 
825 /* cpp_substring_ranges's destructor. */
826 
~cpp_substring_ranges()827 cpp_substring_ranges::~cpp_substring_ranges ()
828 {
829   free (m_ranges);
830 }
831 
832 /* Add RANGE to the vector of source_range information.  */
833 
834 void
add_range(source_range range)835 cpp_substring_ranges::add_range (source_range range)
836 {
837   if (m_num_ranges >= m_alloc_ranges)
838     {
839       m_alloc_ranges *= 2;
840       m_ranges
841 	= (source_range *)xrealloc (m_ranges,
842 				    sizeof (source_range) * m_alloc_ranges);
843     }
844   m_ranges[m_num_ranges++] = range;
845 }
846 
847 /* Read NUM ranges from LOC_READER, adding them to the vector of source_range
848    information.  */
849 
850 void
add_n_ranges(int num,cpp_string_location_reader & loc_reader)851 cpp_substring_ranges::add_n_ranges (int num,
852 				    cpp_string_location_reader &loc_reader)
853 {
854   for (int i = 0; i < num; i++)
855     add_range (loc_reader.get_next ());
856 }
857 
858 
859 
860 /* Utility routine that computes a mask of the form 0000...111... with
861    WIDTH 1-bits.  */
862 static inline size_t
width_to_mask(size_t width)863 width_to_mask (size_t width)
864 {
865   width = MIN (width, BITS_PER_CPPCHAR_T);
866   if (width >= CHAR_BIT * sizeof (size_t))
867     return ~(size_t) 0;
868   else
869     return ((size_t) 1 << width) - 1;
870 }
871 
872 /* A large table of unicode character information.  */
873 enum {
874   /* Valid in a C99 identifier?  */
875   C99 = 1,
876   /* Valid in a C99 identifier, but not as the first character?  */
877   N99 = 2,
878   /* Valid in a C++ identifier?  */
879   CXX = 4,
880   /* Valid in a C11/C++11 identifier?  */
881   C11 = 8,
882   /* Valid in a C11/C++11 identifier, but not as the first character?  */
883   N11 = 16,
884   /* NFC representation is not valid in an identifier?  */
885   CID = 32,
886   /* Might be valid NFC form?  */
887   NFC = 64,
888   /* Might be valid NFKC form?  */
889   NKC = 128,
890   /* Certain preceding characters might make it not valid NFC/NKFC form?  */
891   CTX = 256
892 };
893 
894 struct ucnrange {
895   /* Bitmap of flags above.  */
896   unsigned short flags;
897   /* Combining class of the character.  */
898   unsigned char combine;
899   /* Last character in the range described by this entry.  */
900   unsigned int end;
901 };
902 #include "ucnid.h"
903 
904 /* ISO 10646 defines the UCS codespace as the range 0-0x10FFFF inclusive.  */
905 #define UCS_LIMIT 0x10FFFF
906 
907 /* Returns 1 if C is valid in an identifier, 2 if C is valid except at
908    the start of an identifier, and 0 if C is not valid in an
909    identifier.  We assume C has already gone through the checks of
910    _cpp_valid_ucn.  Also update NST for C if returning nonzero.  The
911    algorithm is a simple binary search on the table defined in
912    ucnid.h.  */
913 
914 static int
ucn_valid_in_identifier(cpp_reader * pfile,cppchar_t c,struct normalize_state * nst)915 ucn_valid_in_identifier (cpp_reader *pfile, cppchar_t c,
916 			 struct normalize_state *nst)
917 {
918   int mn, mx, md;
919   unsigned short valid_flags, invalid_start_flags;
920 
921   if (c > UCS_LIMIT)
922     return 0;
923 
924   mn = 0;
925   mx = ARRAY_SIZE (ucnranges) - 1;
926   while (mx != mn)
927     {
928       md = (mn + mx) / 2;
929       if (c <= ucnranges[md].end)
930 	mx = md;
931       else
932 	mn = md + 1;
933     }
934 
935   /* When -pedantic, we require the character to have been listed by
936      the standard for the current language.  Otherwise, we accept the
937      union of the acceptable sets for all supported language versions.  */
938   valid_flags = C99 | CXX | C11;
939   if (CPP_PEDANTIC (pfile))
940     {
941       if (CPP_OPTION (pfile, c11_identifiers))
942 	valid_flags = C11;
943       else if (CPP_OPTION (pfile, c99))
944 	valid_flags = C99;
945       else if (CPP_OPTION (pfile, cplusplus))
946 	valid_flags = CXX;
947     }
948   if (! (ucnranges[mn].flags & valid_flags))
949       return 0;
950   if (CPP_OPTION (pfile, c11_identifiers))
951     invalid_start_flags = N11;
952   else if (CPP_OPTION (pfile, c99))
953     invalid_start_flags = N99;
954   else
955     invalid_start_flags = 0;
956 
957   /* Update NST.  */
958   if (ucnranges[mn].combine != 0 && ucnranges[mn].combine < nst->prev_class)
959     nst->level = normalized_none;
960   else if (ucnranges[mn].flags & CTX)
961     {
962       bool safe;
963       cppchar_t p = nst->previous;
964 
965       /* For Hangul, characters in the range AC00-D7A3 are NFC/NFKC,
966 	 and are combined algorithmically from a sequence of the form
967 	 1100-1112 1161-1175 11A8-11C2
968 	 (if the third is not present, it is treated as 11A7, which is not
969 	 really a valid character).
970 	 Unfortunately, C99 allows (only) the NFC form, but C++ allows
971 	 only the combining characters.  */
972       if (c >= 0x1161 && c <= 0x1175)
973 	safe = p < 0x1100 || p > 0x1112;
974       else if (c >= 0x11A8 && c <= 0x11C2)
975 	safe = (p < 0xAC00 || p > 0xD7A3 || (p - 0xAC00) % 28 != 0);
976       else
977 	safe = check_nfc (pfile, c, p);
978       if (!safe)
979 	{
980 	  if ((c >= 0x1161 && c <= 0x1175) || (c >= 0x11A8 && c <= 0x11C2))
981 	    nst->level = MAX (nst->level, normalized_identifier_C);
982 	  else
983 	    nst->level = normalized_none;
984 	}
985     }
986   else if (ucnranges[mn].flags & NKC)
987     ;
988   else if (ucnranges[mn].flags & NFC)
989     nst->level = MAX (nst->level, normalized_C);
990   else if (ucnranges[mn].flags & CID)
991     nst->level = MAX (nst->level, normalized_identifier_C);
992   else
993     nst->level = normalized_none;
994   if (ucnranges[mn].combine == 0)
995     nst->previous = c;
996   nst->prev_class = ucnranges[mn].combine;
997 
998   /* In C99, UCN digits may not begin identifiers.  In C11 and C++11,
999      UCN combining characters may not begin identifiers.  */
1000   if (ucnranges[mn].flags & invalid_start_flags)
1001     return 2;
1002 
1003   return 1;
1004 }
1005 
1006 /* [lex.charset]: The character designated by the universal character
1007    name \UNNNNNNNN is that character whose character short name in
1008    ISO/IEC 10646 is NNNNNNNN; the character designated by the
1009    universal character name \uNNNN is that character whose character
1010    short name in ISO/IEC 10646 is 0000NNNN.  If the hexadecimal value
1011    for a universal character name corresponds to a surrogate code point
1012    (in the range 0xD800-0xDFFF, inclusive), the program is ill-formed.
1013    Additionally, if the hexadecimal value for a universal-character-name
1014    outside a character or string literal corresponds to a control character
1015    (in either of the ranges 0x00-0x1F or 0x7F-0x9F, both inclusive) or to a
1016    character in the basic source character set, the program is ill-formed.
1017 
1018    C99 6.4.3: A universal character name shall not specify a character
1019    whose short identifier is less than 00A0 other than 0024 ($), 0040 (@),
1020    or 0060 (`), nor one in the range D800 through DFFF inclusive.
1021 
1022    If the hexadecimal value is larger than the upper bound of the UCS
1023    codespace specified in ISO/IEC 10646, a pedantic warning is issued
1024    in all versions of C and in the C++2a or later versions of C++.
1025 
1026    *PSTR must be preceded by "\u" or "\U"; it is assumed that the
1027    buffer end is delimited by a non-hex digit.  Returns false if the
1028    UCN has not been consumed, true otherwise.
1029 
1030    The value of the UCN, whether valid or invalid, is returned in *CP.
1031    Diagnostics are emitted for invalid values.  PSTR is updated to point
1032    one beyond the UCN, or to the syntactically invalid character.
1033 
1034    IDENTIFIER_POS is 0 when not in an identifier, 1 for the start of
1035    an identifier, or 2 otherwise.
1036 
1037    If LOC_READER is non-NULL, then position information is
1038    read from *LOC_READER and CHAR_RANGE->m_finish is updated accordingly.  */
1039 
1040 bool
_cpp_valid_ucn(cpp_reader * pfile,const uchar ** pstr,const uchar * limit,int identifier_pos,struct normalize_state * nst,cppchar_t * cp,source_range * char_range,cpp_string_location_reader * loc_reader)1041 _cpp_valid_ucn (cpp_reader *pfile, const uchar **pstr,
1042 		const uchar *limit, int identifier_pos,
1043 		struct normalize_state *nst, cppchar_t *cp,
1044 		source_range *char_range,
1045 		cpp_string_location_reader *loc_reader)
1046 {
1047   cppchar_t result, c;
1048   unsigned int length;
1049   const uchar *str = *pstr;
1050   const uchar *base = str - 2;
1051 
1052   if (!CPP_OPTION (pfile, cplusplus) && !CPP_OPTION (pfile, c99))
1053     cpp_error (pfile, CPP_DL_WARNING,
1054 	       "universal character names are only valid in C++ and C99");
1055   else if (CPP_OPTION (pfile, cpp_warn_c90_c99_compat) > 0
1056 	   && !CPP_OPTION (pfile, cplusplus))
1057     cpp_error (pfile, CPP_DL_WARNING,
1058 	       "C99's universal character names are incompatible with C90");
1059   else if (CPP_WTRADITIONAL (pfile) && identifier_pos == 0)
1060     cpp_warning (pfile, CPP_W_TRADITIONAL,
1061 	         "the meaning of '\\%c' is different in traditional C",
1062 	         (int) str[-1]);
1063 
1064   if (str[-1] == 'u')
1065     length = 4;
1066   else if (str[-1] == 'U')
1067     length = 8;
1068   else
1069     {
1070       cpp_error (pfile, CPP_DL_ICE, "In _cpp_valid_ucn but not a UCN");
1071       length = 4;
1072     }
1073 
1074   result = 0;
1075   do
1076     {
1077       c = *str;
1078       if (!ISXDIGIT (c))
1079 	break;
1080       str++;
1081       if (loc_reader)
1082 	{
1083 	  gcc_assert (char_range);
1084 	  char_range->m_finish = loc_reader->get_next ().m_finish;
1085 	}
1086       result = (result << 4) + hex_value (c);
1087     }
1088   while (--length && str < limit);
1089 
1090   /* Partial UCNs are not valid in strings, but decompose into
1091      multiple tokens in identifiers, so we can't give a helpful
1092      error message in that case.  */
1093   if (length && identifier_pos)
1094     {
1095       *cp = 0;
1096       return false;
1097     }
1098 
1099   *pstr = str;
1100   if (length)
1101     {
1102       cpp_error (pfile, CPP_DL_ERROR,
1103 		 "incomplete universal character name %.*s",
1104 		 (int) (str - base), base);
1105       result = 1;
1106     }
1107   /* The C99 standard permits $, @ and ` to be specified as UCNs.  We use
1108      hex escapes so that this also works with EBCDIC hosts.
1109      C++0x permits everything below 0xa0 within literals;
1110      ucn_valid_in_identifier will complain about identifiers.  */
1111   else if ((result < 0xa0
1112 	    && !CPP_OPTION (pfile, cplusplus)
1113 	    && (result != 0x24 && result != 0x40 && result != 0x60))
1114 	   || (result & 0x80000000)
1115 	   || (result >= 0xD800 && result <= 0xDFFF))
1116     {
1117       cpp_error (pfile, CPP_DL_ERROR,
1118 		 "%.*s is not a valid universal character",
1119 		 (int) (str - base), base);
1120       result = 1;
1121     }
1122   else if (identifier_pos && result == 0x24
1123 	   && CPP_OPTION (pfile, dollars_in_ident))
1124     {
1125       if (CPP_OPTION (pfile, warn_dollars) && !pfile->state.skipping)
1126 	{
1127 	  CPP_OPTION (pfile, warn_dollars) = 0;
1128 	  cpp_error (pfile, CPP_DL_PEDWARN, "'$' in identifier or number");
1129 	}
1130       NORMALIZE_STATE_UPDATE_IDNUM (nst, result);
1131     }
1132   else if (identifier_pos)
1133     {
1134       int validity = ucn_valid_in_identifier (pfile, result, nst);
1135 
1136       if (validity == 0)
1137 	cpp_error (pfile, CPP_DL_ERROR,
1138 		   "universal character %.*s is not valid in an identifier",
1139 		   (int) (str - base), base);
1140       else if (validity == 2 && identifier_pos == 1)
1141 	cpp_error (pfile, CPP_DL_ERROR,
1142    "universal character %.*s is not valid at the start of an identifier",
1143 		   (int) (str - base), base);
1144     }
1145   else if (result > UCS_LIMIT
1146 	   && (!CPP_OPTION (pfile, cplusplus)
1147 	       || CPP_OPTION (pfile, lang) > CLK_CXX17))
1148     cpp_error (pfile, CPP_DL_PEDWARN,
1149 	       "%.*s is outside the UCS codespace",
1150 	       (int) (str - base), base);
1151 
1152   *cp = result;
1153   return true;
1154 }
1155 
1156 /* Convert an UCN, pointed to by FROM, to UTF-8 encoding, then translate
1157    it to the execution character set and write the result into TBUF,
1158    if TBUF is non-NULL.
1159    An advanced pointer is returned.  Issues all relevant diagnostics.
1160    If LOC_READER is non-NULL, then RANGES must be non-NULL and CHAR_RANGE
1161    contains the location of the character so far: location information
1162    is read from *LOC_READER, and *RANGES is updated accordingly.  */
1163 static const uchar *
convert_ucn(cpp_reader * pfile,const uchar * from,const uchar * limit,struct _cpp_strbuf * tbuf,struct cset_converter cvt,source_range char_range,cpp_string_location_reader * loc_reader,cpp_substring_ranges * ranges)1164 convert_ucn (cpp_reader *pfile, const uchar *from, const uchar *limit,
1165 	     struct _cpp_strbuf *tbuf, struct cset_converter cvt,
1166 	     source_range char_range,
1167 	     cpp_string_location_reader *loc_reader,
1168 	     cpp_substring_ranges *ranges)
1169 {
1170   cppchar_t ucn;
1171   uchar buf[6];
1172   uchar *bufp = buf;
1173   size_t bytesleft = 6;
1174   int rval;
1175   struct normalize_state nst = INITIAL_NORMALIZE_STATE;
1176 
1177   /* loc_reader and ranges must either be both NULL, or both be non-NULL.  */
1178   gcc_assert ((loc_reader != NULL) == (ranges != NULL));
1179 
1180   from++;  /* Skip u/U.  */
1181 
1182   if (loc_reader)
1183     /* The u/U is part of the spelling of this character.  */
1184     char_range.m_finish = loc_reader->get_next ().m_finish;
1185 
1186   _cpp_valid_ucn (pfile, &from, limit, 0, &nst,
1187 		  &ucn, &char_range, loc_reader);
1188 
1189   rval = one_cppchar_to_utf8 (ucn, &bufp, &bytesleft);
1190   if (rval)
1191     {
1192       errno = rval;
1193       cpp_errno (pfile, CPP_DL_ERROR,
1194 		 "converting UCN to source character set");
1195     }
1196   else
1197     {
1198       if (tbuf)
1199 	if (!APPLY_CONVERSION (cvt, buf, 6 - bytesleft, tbuf))
1200 	  cpp_errno (pfile, CPP_DL_ERROR,
1201 		     "converting UCN to execution character set");
1202 
1203       if (loc_reader)
1204 	{
1205 	  int num_encoded_bytes = 6 - bytesleft;
1206 	  for (int i = 0; i < num_encoded_bytes; i++)
1207 	    ranges->add_range (char_range);
1208 	}
1209     }
1210 
1211   return from;
1212 }
1213 
1214 /*  Performs a similar task as _cpp_valid_ucn, but parses UTF-8-encoded
1215     extended characters rather than UCNs.  If the return value is TRUE, then a
1216     character was successfully decoded and stored in *CP; *PSTR has been
1217     updated to point one past the valid UTF-8 sequence.  Diagnostics may have
1218     been emitted if the character parsed is not allowed in the current context.
1219     If the return value is FALSE, then *PSTR has not been modified and *CP may
1220     equal 0, to indicate that *PSTR does not form a valid UTF-8 sequence, or it
1221     may, when processing an identifier in C mode, equal a codepoint that was
1222     validly encoded but is not allowed to appear in an identifier.  In either
1223     case, no diagnostic is emitted, and the return value of FALSE should cause
1224     a new token to be formed.
1225 
1226     Unlike _cpp_valid_ucn, this will never be called when lexing a string; only
1227     a potential identifier, or a CPP_OTHER token.  NST is unused in the latter
1228     case.
1229 
1230     As in _cpp_valid_ucn, IDENTIFIER_POS is 0 when not in an identifier, 1 for
1231     the start of an identifier, or 2 otherwise.  */
1232 
1233 extern bool
_cpp_valid_utf8(cpp_reader * pfile,const uchar ** pstr,const uchar * limit,int identifier_pos,struct normalize_state * nst,cppchar_t * cp)1234 _cpp_valid_utf8 (cpp_reader *pfile,
1235 		 const uchar **pstr,
1236 		 const uchar *limit,
1237 		 int identifier_pos,
1238 		 struct normalize_state *nst,
1239 		 cppchar_t *cp)
1240 {
1241   const uchar *base = *pstr;
1242   size_t inbytesleft = limit - base;
1243   if (one_utf8_to_cppchar (pstr, &inbytesleft, cp))
1244     {
1245       /* No diagnostic here as this byte will rather become a
1246 	 new token.  */
1247       *cp = 0;
1248       return false;
1249     }
1250 
1251   if (identifier_pos)
1252     {
1253       switch (ucn_valid_in_identifier (pfile, *cp, nst))
1254 	{
1255 
1256 	case 0:
1257 	  /* In C++, this is an error for invalid character in an identifier
1258 	     because logically, the UTF-8 was converted to a UCN during
1259 	     translation phase 1 (even though we don't physically do it that
1260 	     way).  In C, this byte rather becomes grammatically a separate
1261 	     token.  */
1262 
1263 	  if (CPP_OPTION (pfile, cplusplus))
1264 	    cpp_error (pfile, CPP_DL_ERROR,
1265 		       "extended character %.*s is not valid in an identifier",
1266 		       (int) (*pstr - base), base);
1267 	  else
1268 	    {
1269 	      *pstr = base;
1270 	      return false;
1271 	    }
1272 
1273 	  break;
1274 
1275 	case 2:
1276 	  if (identifier_pos == 1)
1277 	    {
1278 	      /* This is treated the same way in C++ or C99 -- lexed as an
1279 		 identifier which is then invalid because an identifier is
1280 		 not allowed to start with this character.  */
1281 	      cpp_error (pfile, CPP_DL_ERROR,
1282 	  "extended character %.*s is not valid at the start of an identifier",
1283 			 (int) (*pstr - base), base);
1284 	    }
1285 	  break;
1286 	}
1287     }
1288 
1289   return true;
1290 }
1291 
1292 /* Subroutine of convert_hex and convert_oct.  N is the representation
1293    in the execution character set of a numeric escape; write it into the
1294    string buffer TBUF and update the end-of-string pointer therein.  WIDE
1295    is true if it's a wide string that's being assembled in TBUF.  This
1296    function issues no diagnostics and never fails.  */
1297 static void
emit_numeric_escape(cpp_reader * pfile,cppchar_t n,struct _cpp_strbuf * tbuf,struct cset_converter cvt)1298 emit_numeric_escape (cpp_reader *pfile, cppchar_t n,
1299 		     struct _cpp_strbuf *tbuf, struct cset_converter cvt)
1300 {
1301   size_t width = cvt.width;
1302 
1303   if (width != CPP_OPTION (pfile, char_precision))
1304     {
1305       /* We have to render this into the target byte order, which may not
1306 	 be our byte order.  */
1307       bool bigend = CPP_OPTION (pfile, bytes_big_endian);
1308       size_t cwidth = CPP_OPTION (pfile, char_precision);
1309       size_t cmask = width_to_mask (cwidth);
1310       size_t nbwc = width / cwidth;
1311       size_t i;
1312       size_t off = tbuf->len;
1313       cppchar_t c;
1314 
1315       if (tbuf->len + nbwc > tbuf->asize)
1316 	{
1317 	  tbuf->asize += OUTBUF_BLOCK_SIZE;
1318 	  tbuf->text = XRESIZEVEC (uchar, tbuf->text, tbuf->asize);
1319 	}
1320 
1321       for (i = 0; i < nbwc; i++)
1322 	{
1323 	  c = n & cmask;
1324 	  n >>= cwidth;
1325 	  tbuf->text[off + (bigend ? nbwc - i - 1 : i)] = c;
1326 	}
1327       tbuf->len += nbwc;
1328     }
1329   else
1330     {
1331       /* Note: this code does not handle the case where the target
1332 	 and host have a different number of bits in a byte.  */
1333       if (tbuf->len + 1 > tbuf->asize)
1334 	{
1335 	  tbuf->asize += OUTBUF_BLOCK_SIZE;
1336 	  tbuf->text = XRESIZEVEC (uchar, tbuf->text, tbuf->asize);
1337 	}
1338       tbuf->text[tbuf->len++] = n;
1339     }
1340 }
1341 
1342 /* Convert a hexadecimal escape, pointed to by FROM, to the execution
1343    character set and write it into the string buffer TBUF (if non-NULL).
1344    Returns an advanced pointer, and issues diagnostics as necessary.
1345    No character set translation occurs; this routine always produces the
1346    execution-set character with numeric value equal to the given hex
1347    number.  You can, e.g. generate surrogate pairs this way.
1348    If LOC_READER is non-NULL, then RANGES must be non-NULL and CHAR_RANGE
1349    contains the location of the character so far: location information
1350    is read from *LOC_READER, and *RANGES is updated accordingly.  */
1351 static const uchar *
convert_hex(cpp_reader * pfile,const uchar * from,const uchar * limit,struct _cpp_strbuf * tbuf,struct cset_converter cvt,source_range char_range,cpp_string_location_reader * loc_reader,cpp_substring_ranges * ranges)1352 convert_hex (cpp_reader *pfile, const uchar *from, const uchar *limit,
1353 	     struct _cpp_strbuf *tbuf, struct cset_converter cvt,
1354 	     source_range char_range,
1355 	     cpp_string_location_reader *loc_reader,
1356 	     cpp_substring_ranges *ranges)
1357 {
1358   cppchar_t c, n = 0, overflow = 0;
1359   int digits_found = 0;
1360   size_t width = cvt.width;
1361   size_t mask = width_to_mask (width);
1362 
1363   /* loc_reader and ranges must either be both NULL, or both be non-NULL.  */
1364   gcc_assert ((loc_reader != NULL) == (ranges != NULL));
1365 
1366   if (CPP_WTRADITIONAL (pfile))
1367     cpp_warning (pfile, CPP_W_TRADITIONAL,
1368 	         "the meaning of '\\x' is different in traditional C");
1369 
1370   /* Skip 'x'.  */
1371   from++;
1372 
1373   /* The 'x' is part of the spelling of this character.  */
1374   if (loc_reader)
1375     char_range.m_finish = loc_reader->get_next ().m_finish;
1376 
1377   while (from < limit)
1378     {
1379       c = *from;
1380       if (! hex_p (c))
1381 	break;
1382       from++;
1383       if (loc_reader)
1384 	char_range.m_finish = loc_reader->get_next ().m_finish;
1385       overflow |= n ^ (n << 4 >> 4);
1386       n = (n << 4) + hex_value (c);
1387       digits_found = 1;
1388     }
1389 
1390   if (!digits_found)
1391     {
1392       cpp_error (pfile, CPP_DL_ERROR,
1393 		 "\\x used with no following hex digits");
1394       return from;
1395     }
1396 
1397   if (overflow | (n != (n & mask)))
1398     {
1399       cpp_error (pfile, CPP_DL_PEDWARN,
1400 		 "hex escape sequence out of range");
1401       n &= mask;
1402     }
1403 
1404   if (tbuf)
1405     emit_numeric_escape (pfile, n, tbuf, cvt);
1406   if (ranges)
1407     ranges->add_range (char_range);
1408 
1409   return from;
1410 }
1411 
1412 /* Convert an octal escape, pointed to by FROM, to the execution
1413    character set and write it into the string buffer TBUF.  Returns an
1414    advanced pointer, and issues diagnostics as necessary.
1415    No character set translation occurs; this routine always produces the
1416    execution-set character with numeric value equal to the given octal
1417    number.
1418    If LOC_READER is non-NULL, then RANGES must be non-NULL and CHAR_RANGE
1419    contains the location of the character so far: location information
1420    is read from *LOC_READER, and *RANGES is updated accordingly.  */
1421 static const uchar *
convert_oct(cpp_reader * pfile,const uchar * from,const uchar * limit,struct _cpp_strbuf * tbuf,struct cset_converter cvt,source_range char_range,cpp_string_location_reader * loc_reader,cpp_substring_ranges * ranges)1422 convert_oct (cpp_reader *pfile, const uchar *from, const uchar *limit,
1423 	     struct _cpp_strbuf *tbuf, struct cset_converter cvt,
1424 	     source_range char_range,
1425 	     cpp_string_location_reader *loc_reader,
1426 	     cpp_substring_ranges *ranges)
1427 {
1428   size_t count = 0;
1429   cppchar_t c, n = 0;
1430   size_t width = cvt.width;
1431   size_t mask = width_to_mask (width);
1432   bool overflow = false;
1433 
1434   /* loc_reader and ranges must either be both NULL, or both be non-NULL.  */
1435   gcc_assert ((loc_reader != NULL) == (ranges != NULL));
1436 
1437   while (from < limit && count++ < 3)
1438     {
1439       c = *from;
1440       if (c < '0' || c > '7')
1441 	break;
1442       from++;
1443       if (loc_reader)
1444 	char_range.m_finish = loc_reader->get_next ().m_finish;
1445       overflow |= n ^ (n << 3 >> 3);
1446       n = (n << 3) + c - '0';
1447     }
1448 
1449   if (n != (n & mask))
1450     {
1451       cpp_error (pfile, CPP_DL_PEDWARN,
1452 		 "octal escape sequence out of range");
1453       n &= mask;
1454     }
1455 
1456   if (tbuf)
1457     emit_numeric_escape (pfile, n, tbuf, cvt);
1458   if (ranges)
1459     ranges->add_range (char_range);
1460 
1461   return from;
1462 }
1463 
1464 /* Convert an escape sequence (pointed to by FROM) to its value on
1465    the target, and to the execution character set.  Do not scan past
1466    LIMIT.  Write the converted value into TBUF, if TBUF is non-NULL.
1467    Returns an advanced pointer.  Handles all relevant diagnostics.
1468    If LOC_READER is non-NULL, then RANGES must be non-NULL: location
1469    information is read from *LOC_READER, and *RANGES is updated
1470    accordingly.  */
1471 static const uchar *
convert_escape(cpp_reader * pfile,const uchar * from,const uchar * limit,struct _cpp_strbuf * tbuf,struct cset_converter cvt,cpp_string_location_reader * loc_reader,cpp_substring_ranges * ranges)1472 convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit,
1473 		struct _cpp_strbuf *tbuf, struct cset_converter cvt,
1474 		cpp_string_location_reader *loc_reader,
1475 		cpp_substring_ranges *ranges)
1476 {
1477   /* Values of \a \b \e \f \n \r \t \v respectively.  */
1478 #if HOST_CHARSET == HOST_CHARSET_ASCII
1479   static const uchar charconsts[] = {  7,  8, 27, 12, 10, 13,  9, 11 };
1480 #elif HOST_CHARSET == HOST_CHARSET_EBCDIC
1481   static const uchar charconsts[] = { 47, 22, 39, 12, 21, 13,  5, 11 };
1482 #else
1483 #error "unknown host character set"
1484 #endif
1485 
1486   uchar c;
1487 
1488   /* Record the location of the backslash.  */
1489   source_range char_range;
1490   if (loc_reader)
1491     char_range = loc_reader->get_next ();
1492 
1493   c = *from;
1494   switch (c)
1495     {
1496       /* UCNs, hex escapes, and octal escapes are processed separately.  */
1497     case 'u': case 'U':
1498       return convert_ucn (pfile, from, limit, tbuf, cvt,
1499 			  char_range, loc_reader, ranges);
1500 
1501     case 'x':
1502       return convert_hex (pfile, from, limit, tbuf, cvt,
1503 			  char_range, loc_reader, ranges);
1504       break;
1505 
1506     case '0':  case '1':  case '2':  case '3':
1507     case '4':  case '5':  case '6':  case '7':
1508       return convert_oct (pfile, from, limit, tbuf, cvt,
1509 			  char_range, loc_reader, ranges);
1510 
1511       /* Various letter escapes.  Get the appropriate host-charset
1512 	 value into C.  */
1513     case '\\': case '\'': case '"': case '?': break;
1514 
1515     case '(': case '{': case '[': case '%':
1516       /* '\(', etc, can be used at the beginning of a line in a long
1517 	 string split onto multiple lines with \-newline, to prevent
1518 	 Emacs or other text editors from getting confused.  '\%' can
1519 	 be used to prevent SCCS from mangling printf format strings.  */
1520       if (CPP_PEDANTIC (pfile))
1521 	goto unknown;
1522       break;
1523 
1524     case 'b': c = charconsts[1];  break;
1525     case 'f': c = charconsts[3];  break;
1526     case 'n': c = charconsts[4];  break;
1527     case 'r': c = charconsts[5];  break;
1528     case 't': c = charconsts[6];  break;
1529     case 'v': c = charconsts[7];  break;
1530 
1531     case 'a':
1532       if (CPP_WTRADITIONAL (pfile))
1533 	cpp_warning (pfile, CPP_W_TRADITIONAL,
1534 		     "the meaning of '\\a' is different in traditional C");
1535       c = charconsts[0];
1536       break;
1537 
1538     case 'e': case 'E':
1539       if (CPP_PEDANTIC (pfile))
1540 	cpp_error (pfile, CPP_DL_PEDWARN,
1541 		   "non-ISO-standard escape sequence, '\\%c'", (int) c);
1542       c = charconsts[2];
1543       break;
1544 
1545     default:
1546     unknown:
1547       if (ISGRAPH (c))
1548 	cpp_error (pfile, CPP_DL_PEDWARN,
1549 		   "unknown escape sequence: '\\%c'", (int) c);
1550       else
1551 	{
1552 	  /* diagnostic.c does not support "%03o".  When it does, this
1553 	     code can use %03o directly in the diagnostic again.  */
1554 	  char buf[32];
1555 	  sprintf(buf, "%03o", (int) c);
1556 	  cpp_error (pfile, CPP_DL_PEDWARN,
1557 		     "unknown escape sequence: '\\%s'", buf);
1558 	}
1559     }
1560 
1561   if (tbuf)
1562     /* Now convert what we have to the execution character set.  */
1563     if (!APPLY_CONVERSION (cvt, &c, 1, tbuf))
1564       cpp_errno (pfile, CPP_DL_ERROR,
1565 		 "converting escape sequence to execution character set");
1566 
1567   if (loc_reader)
1568     {
1569       char_range.m_finish = loc_reader->get_next ().m_finish;
1570       ranges->add_range (char_range);
1571     }
1572 
1573   return from + 1;
1574 }
1575 
1576 /* TYPE is a token type.  The return value is the conversion needed to
1577    convert from source to execution character set for the given type. */
1578 static struct cset_converter
converter_for_type(cpp_reader * pfile,enum cpp_ttype type)1579 converter_for_type (cpp_reader *pfile, enum cpp_ttype type)
1580 {
1581   switch (type)
1582     {
1583     default:
1584 	return pfile->narrow_cset_desc;
1585     case CPP_UTF8CHAR:
1586     case CPP_UTF8STRING:
1587 	return pfile->utf8_cset_desc;
1588     case CPP_CHAR16:
1589     case CPP_STRING16:
1590 	return pfile->char16_cset_desc;
1591     case CPP_CHAR32:
1592     case CPP_STRING32:
1593 	return pfile->char32_cset_desc;
1594     case CPP_WCHAR:
1595     case CPP_WSTRING:
1596 	return pfile->wide_cset_desc;
1597     }
1598 }
1599 
1600 /* FROM is an array of cpp_string structures of length COUNT.  These
1601    are to be converted from the source to the execution character set,
1602    escape sequences translated, and finally all are to be
1603    concatenated.  WIDE indicates whether or not to produce a wide
1604    string.  If TO is non-NULL, the result is written into TO.
1605    If LOC_READERS and OUT are non-NULL, then location information
1606    is read from LOC_READERS (which must be an array of length COUNT),
1607    and location information is written to *RANGES.
1608 
1609    Returns true for success, false for failure.  */
1610 
1611 static bool
cpp_interpret_string_1(cpp_reader * pfile,const cpp_string * from,size_t count,cpp_string * to,enum cpp_ttype type,cpp_string_location_reader * loc_readers,cpp_substring_ranges * out)1612 cpp_interpret_string_1 (cpp_reader *pfile, const cpp_string *from, size_t count,
1613 			cpp_string *to,  enum cpp_ttype type,
1614 			cpp_string_location_reader *loc_readers,
1615 			cpp_substring_ranges *out)
1616 {
1617   struct _cpp_strbuf tbuf;
1618   const uchar *p, *base, *limit;
1619   size_t i;
1620   struct cset_converter cvt = converter_for_type (pfile, type);
1621 
1622   /* loc_readers and out must either be both NULL, or both be non-NULL.  */
1623   gcc_assert ((loc_readers != NULL) == (out != NULL));
1624 
1625   if (to)
1626     {
1627       tbuf.asize = MAX (OUTBUF_BLOCK_SIZE, from->len);
1628       tbuf.text = XNEWVEC (uchar, tbuf.asize);
1629       tbuf.len = 0;
1630     }
1631 
1632   cpp_string_location_reader *loc_reader = NULL;
1633   for (i = 0; i < count; i++)
1634     {
1635       if (loc_readers)
1636 	loc_reader = &loc_readers[i];
1637 
1638       p = from[i].text;
1639       if (*p == 'u')
1640 	{
1641 	  p++;
1642 	  if (loc_reader)
1643 	    loc_reader->get_next ();
1644 	  if (*p == '8')
1645 	    {
1646 	      p++;
1647 	      if (loc_reader)
1648 		loc_reader->get_next ();
1649 	    }
1650 	}
1651       else if (*p == 'L' || *p == 'U') p++;
1652       if (*p == 'R')
1653 	{
1654 	  const uchar *prefix;
1655 
1656 	  /* Skip over 'R"'.  */
1657 	  p += 2;
1658 	  if (loc_reader)
1659 	    {
1660 	      loc_reader->get_next ();
1661 	      loc_reader->get_next ();
1662 	    }
1663 	  prefix = p;
1664 	  while (*p != '(')
1665 	    {
1666 	      p++;
1667 	      if (loc_reader)
1668 		loc_reader->get_next ();
1669 	    }
1670 	  p++;
1671 	  if (loc_reader)
1672 	    loc_reader->get_next ();
1673 	  limit = from[i].text + from[i].len;
1674 	  if (limit >= p + (p - prefix) + 1)
1675 	    limit -= (p - prefix) + 1;
1676 
1677 	  /* Raw strings are all normal characters; these can be fed
1678 	     directly to convert_cset.  */
1679 	  if (to)
1680 	    if (!APPLY_CONVERSION (cvt, p, limit - p, &tbuf))
1681 	      goto fail;
1682 
1683 	  if (loc_reader)
1684 	    {
1685 	      /* If generating source ranges, assume we have a 1:1
1686 		 correspondence between bytes in the source encoding and bytes
1687 		 in the execution encoding (e.g. if we have a UTF-8 to UTF-8
1688 		 conversion), so that this run of bytes in the source file
1689 		 corresponds to a run of bytes in the execution string.
1690 		 This requirement is guaranteed by an early-reject in
1691 		 cpp_interpret_string_ranges.  */
1692 	      gcc_assert (cvt.func == convert_no_conversion);
1693 	      out->add_n_ranges (limit - p, *loc_reader);
1694 	    }
1695 
1696 	  continue;
1697 	}
1698 
1699       /* If we don't now have a leading quote, something has gone wrong.
1700 	 This can occur if cpp_interpret_string_ranges is handling a
1701 	 stringified macro argument, but should not be possible otherwise.  */
1702       if (*p != '"' && *p != '\'')
1703 	{
1704 	  gcc_assert (out != NULL);
1705 	  cpp_error (pfile, CPP_DL_ERROR, "missing open quote");
1706 	  if (to)
1707 	    free (tbuf.text);
1708 	  return false;
1709 	}
1710 
1711       /* Skip leading quote.  */
1712       p++;
1713       if (loc_reader)
1714 	loc_reader->get_next ();
1715 
1716       limit = from[i].text + from[i].len - 1; /* Skip trailing quote.  */
1717 
1718       for (;;)
1719 	{
1720 	  base = p;
1721 	  while (p < limit && *p != '\\')
1722 	    p++;
1723 	  if (p > base)
1724 	    {
1725 	      /* We have a run of normal characters; these can be fed
1726 		 directly to convert_cset.  */
1727 	      if (to)
1728 		if (!APPLY_CONVERSION (cvt, base, p - base, &tbuf))
1729 		  goto fail;
1730 	    /* Similar to above: assumes we have a 1:1 correspondence
1731 	       between bytes in the source encoding and bytes in the
1732 	       execution encoding.  */
1733 	      if (loc_reader)
1734 		{
1735 		  gcc_assert (cvt.func == convert_no_conversion);
1736 		  out->add_n_ranges (p - base, *loc_reader);
1737 		}
1738 	    }
1739 	  if (p >= limit)
1740 	    break;
1741 
1742 	  struct _cpp_strbuf *tbuf_ptr = to ? &tbuf : NULL;
1743 	  p = convert_escape (pfile, p + 1, limit, tbuf_ptr, cvt,
1744 			      loc_reader, out);
1745 	}
1746     }
1747 
1748   if (to)
1749     {
1750       /* NUL-terminate the 'to' buffer and translate it to a cpp_string
1751 	 structure.  */
1752       emit_numeric_escape (pfile, 0, &tbuf, cvt);
1753       tbuf.text = XRESIZEVEC (uchar, tbuf.text, tbuf.len);
1754       to->text = tbuf.text;
1755       to->len = tbuf.len;
1756     }
1757   /* Use the location of the trailing quote as the location of the
1758      NUL-terminator.  */
1759   if (loc_reader)
1760     {
1761       source_range range = loc_reader->get_next ();
1762       out->add_range (range);
1763     }
1764 
1765   return true;
1766 
1767  fail:
1768   cpp_errno (pfile, CPP_DL_ERROR, "converting to execution character set");
1769   if (to)
1770     free (tbuf.text);
1771   return false;
1772 }
1773 
1774 /* FROM is an array of cpp_string structures of length COUNT.  These
1775    are to be converted from the source to the execution character set,
1776    escape sequences translated, and finally all are to be
1777    concatenated.  WIDE indicates whether or not to produce a wide
1778    string.  The result is written into TO.  Returns true for success,
1779    false for failure.  */
1780 bool
cpp_interpret_string(cpp_reader * pfile,const cpp_string * from,size_t count,cpp_string * to,enum cpp_ttype type)1781 cpp_interpret_string (cpp_reader *pfile, const cpp_string *from, size_t count,
1782 		      cpp_string *to,  enum cpp_ttype type)
1783 {
1784   return cpp_interpret_string_1 (pfile, from, count, to, type, NULL, NULL);
1785 }
1786 
1787 /* A "do nothing" diagnostic-handling callback for use by
1788    cpp_interpret_string_ranges, so that it can temporarily suppress
1789    diagnostic-handling.  */
1790 
1791 static bool
noop_diagnostic_cb(cpp_reader *,enum cpp_diagnostic_level,enum cpp_warning_reason,rich_location *,const char *,va_list *)1792 noop_diagnostic_cb (cpp_reader *, enum cpp_diagnostic_level,
1793 		    enum cpp_warning_reason, rich_location *,
1794 		    const char *, va_list *)
1795 {
1796   /* no-op.  */
1797   return true;
1798 }
1799 
1800 /* This function mimics the behavior of cpp_interpret_string, but
1801    rather than generating a string in the execution character set,
1802    *OUT is written to with the source code ranges of the characters
1803    in such a string.
1804    FROM and LOC_READERS should both be arrays of length COUNT.
1805    Returns NULL for success, or an error message for failure.  */
1806 
1807 const char *
cpp_interpret_string_ranges(cpp_reader * pfile,const cpp_string * from,cpp_string_location_reader * loc_readers,size_t count,cpp_substring_ranges * out,enum cpp_ttype type)1808 cpp_interpret_string_ranges (cpp_reader *pfile, const cpp_string *from,
1809 			     cpp_string_location_reader *loc_readers,
1810 			     size_t count,
1811 			     cpp_substring_ranges *out,
1812 			     enum cpp_ttype type)
1813 {
1814   /* There are a couple of cases in the range-handling in
1815      cpp_interpret_string_1 that rely on there being a 1:1 correspondence
1816      between bytes in the source encoding and bytes in the execution
1817      encoding, so that each byte in the execution string can correspond
1818      to the location of a byte in the source string.
1819 
1820      This holds for the typical case of a UTF-8 to UTF-8 conversion.
1821      Enforce this requirement by only attempting to track substring
1822      locations if we have source encoding == execution encoding.
1823 
1824      This is a stronger condition than we need, since we could e.g.
1825      have ASCII to EBCDIC (with 1 byte per character before and after),
1826      but it seems to be a reasonable restriction.  */
1827   struct cset_converter cvt = converter_for_type (pfile, type);
1828   if (cvt.func != convert_no_conversion)
1829     return "execution character set != source character set";
1830 
1831   /* For on-demand strings we have already lexed the strings, so there
1832      should be no diagnostics.  However, if we have bogus source location
1833      data (or stringified macro arguments), the attempt to lex the
1834      strings could fail with an diagnostic.  Temporarily install an
1835      diagnostic-handler to catch the diagnostic, so that it can lead to this call
1836      failing, rather than being emitted as a user-visible diagnostic.
1837      If an diagnostic does occur, we should see it via the return value of
1838      cpp_interpret_string_1.  */
1839   bool (*saved_diagnostic_handler) (cpp_reader *, enum cpp_diagnostic_level,
1840 				    enum cpp_warning_reason, rich_location *,
1841 				    const char *, va_list *)
1842     ATTRIBUTE_FPTR_PRINTF(5,0);
1843 
1844   saved_diagnostic_handler = pfile->cb.diagnostic;
1845   pfile->cb.diagnostic = noop_diagnostic_cb;
1846 
1847   bool result = cpp_interpret_string_1 (pfile, from, count, NULL, type,
1848 					loc_readers, out);
1849 
1850   /* Restore the saved diagnostic-handler.  */
1851   pfile->cb.diagnostic = saved_diagnostic_handler;
1852 
1853   if (!result)
1854     return "cpp_interpret_string_1 failed";
1855 
1856   /* Success.  */
1857   return NULL;
1858 }
1859 
1860 /* Subroutine of do_line and do_linemarker.  Convert escape sequences
1861    in a string, but do not perform character set conversion.  */
1862 bool
cpp_interpret_string_notranslate(cpp_reader * pfile,const cpp_string * from,size_t count,cpp_string * to,enum cpp_ttype type ATTRIBUTE_UNUSED)1863 cpp_interpret_string_notranslate (cpp_reader *pfile, const cpp_string *from,
1864 				  size_t count,	cpp_string *to,
1865 				  enum cpp_ttype type ATTRIBUTE_UNUSED)
1866 {
1867   struct cset_converter save_narrow_cset_desc = pfile->narrow_cset_desc;
1868   bool retval;
1869 
1870   pfile->narrow_cset_desc.func = convert_no_conversion;
1871   pfile->narrow_cset_desc.cd = (iconv_t) -1;
1872   pfile->narrow_cset_desc.width = CPP_OPTION (pfile, char_precision);
1873 
1874   retval = cpp_interpret_string (pfile, from, count, to, CPP_STRING);
1875 
1876   pfile->narrow_cset_desc = save_narrow_cset_desc;
1877   return retval;
1878 }
1879 
1880 
1881 /* Subroutine of cpp_interpret_charconst which performs the conversion
1882    to a number, for narrow strings.  STR is the string structure returned
1883    by cpp_interpret_string.  PCHARS_SEEN and UNSIGNEDP are as for
1884    cpp_interpret_charconst.  TYPE is the token type.  */
1885 static cppchar_t
narrow_str_to_charconst(cpp_reader * pfile,cpp_string str,unsigned int * pchars_seen,int * unsignedp,enum cpp_ttype type)1886 narrow_str_to_charconst (cpp_reader *pfile, cpp_string str,
1887 			 unsigned int *pchars_seen, int *unsignedp,
1888 			 enum cpp_ttype type)
1889 {
1890   size_t width = CPP_OPTION (pfile, char_precision);
1891   size_t max_chars = CPP_OPTION (pfile, int_precision) / width;
1892   size_t mask = width_to_mask (width);
1893   size_t i;
1894   cppchar_t result, c;
1895   bool unsigned_p;
1896 
1897   /* The value of a multi-character character constant, or a
1898      single-character character constant whose representation in the
1899      execution character set is more than one byte long, is
1900      implementation defined.  This implementation defines it to be the
1901      number formed by interpreting the byte sequence in memory as a
1902      big-endian binary number.  If overflow occurs, the high bytes are
1903      lost, and a warning is issued.
1904 
1905      We don't want to process the NUL terminator handed back by
1906      cpp_interpret_string.  */
1907   result = 0;
1908   for (i = 0; i < str.len - 1; i++)
1909     {
1910       c = str.text[i] & mask;
1911       if (width < BITS_PER_CPPCHAR_T)
1912 	result = (result << width) | c;
1913       else
1914 	result = c;
1915     }
1916 
1917   if (type == CPP_UTF8CHAR)
1918     max_chars = 1;
1919   if (i > max_chars)
1920     {
1921       i = max_chars;
1922       cpp_error (pfile, type == CPP_UTF8CHAR ? CPP_DL_ERROR : CPP_DL_WARNING,
1923 		 "character constant too long for its type");
1924     }
1925   else if (i > 1 && CPP_OPTION (pfile, warn_multichar))
1926     cpp_warning (pfile, CPP_W_MULTICHAR, "multi-character character constant");
1927 
1928   /* Multichar constants are of type int and therefore signed.  */
1929   if (i > 1)
1930     unsigned_p = 0;
1931   else if (type == CPP_UTF8CHAR && !CPP_OPTION (pfile, cplusplus))
1932     unsigned_p = 1;
1933   else
1934     unsigned_p = CPP_OPTION (pfile, unsigned_char);
1935 
1936   /* Truncate the constant to its natural width, and simultaneously
1937      sign- or zero-extend to the full width of cppchar_t.
1938      For single-character constants, the value is WIDTH bits wide.
1939      For multi-character constants, the value is INT_PRECISION bits wide.  */
1940   if (i > 1)
1941     width = CPP_OPTION (pfile, int_precision);
1942   if (width < BITS_PER_CPPCHAR_T)
1943     {
1944       mask = ((cppchar_t) 1 << width) - 1;
1945       if (unsigned_p || !(result & (1 << (width - 1))))
1946 	result &= mask;
1947       else
1948 	result |= ~mask;
1949     }
1950   *pchars_seen = i;
1951   *unsignedp = unsigned_p;
1952   return result;
1953 }
1954 
1955 /* Subroutine of cpp_interpret_charconst which performs the conversion
1956    to a number, for wide strings.  STR is the string structure returned
1957    by cpp_interpret_string.  PCHARS_SEEN and UNSIGNEDP are as for
1958    cpp_interpret_charconst.  TYPE is the token type.  */
1959 static cppchar_t
wide_str_to_charconst(cpp_reader * pfile,cpp_string str,unsigned int * pchars_seen,int * unsignedp,enum cpp_ttype type)1960 wide_str_to_charconst (cpp_reader *pfile, cpp_string str,
1961 		       unsigned int *pchars_seen, int *unsignedp,
1962 		       enum cpp_ttype type)
1963 {
1964   bool bigend = CPP_OPTION (pfile, bytes_big_endian);
1965   size_t width = converter_for_type (pfile, type).width;
1966   size_t cwidth = CPP_OPTION (pfile, char_precision);
1967   size_t mask = width_to_mask (width);
1968   size_t cmask = width_to_mask (cwidth);
1969   size_t nbwc = width / cwidth;
1970   size_t off, i;
1971   cppchar_t result = 0, c;
1972 
1973   if (str.len <= nbwc)
1974     {
1975       /* Error recovery, if no errors have been diagnosed previously,
1976 	 there should be at least two wide characters.  Empty literals
1977 	 are diagnosed earlier and we can get just the zero terminator
1978 	 only if there were errors diagnosed during conversion.  */
1979       *pchars_seen = 0;
1980       *unsignedp = 0;
1981       return 0;
1982     }
1983 
1984   /* This is finicky because the string is in the target's byte order,
1985      which may not be our byte order.  Only the last character, ignoring
1986      the NUL terminator, is relevant.  */
1987   off = str.len - (nbwc * 2);
1988   result = 0;
1989   for (i = 0; i < nbwc; i++)
1990     {
1991       c = bigend ? str.text[off + i] : str.text[off + nbwc - i - 1];
1992       result = (result << cwidth) | (c & cmask);
1993     }
1994 
1995   /* Wide character constants have type wchar_t, and a single
1996      character exactly fills a wchar_t, so a multi-character wide
1997      character constant is guaranteed to overflow.  */
1998   if (str.len > nbwc * 2)
1999     cpp_error (pfile, (CPP_OPTION (pfile, cplusplus)
2000 		       && (type == CPP_CHAR16 || type == CPP_CHAR32))
2001 		      ? CPP_DL_ERROR : CPP_DL_WARNING,
2002 	       "character constant too long for its type");
2003 
2004   /* Truncate the constant to its natural width, and simultaneously
2005      sign- or zero-extend to the full width of cppchar_t.  */
2006   if (width < BITS_PER_CPPCHAR_T)
2007     {
2008       if (type == CPP_CHAR16 || type == CPP_CHAR32
2009 	  || CPP_OPTION (pfile, unsigned_wchar)
2010 	  || !(result & (1 << (width - 1))))
2011 	result &= mask;
2012       else
2013 	result |= ~mask;
2014     }
2015 
2016   if (type == CPP_CHAR16 || type == CPP_CHAR32
2017       || CPP_OPTION (pfile, unsigned_wchar))
2018     *unsignedp = 1;
2019   else
2020     *unsignedp = 0;
2021 
2022   *pchars_seen = 1;
2023   return result;
2024 }
2025 
2026 /* Interpret a (possibly wide) character constant in TOKEN.
2027    PCHARS_SEEN points to a variable that is filled in with the number
2028    of characters seen, and UNSIGNEDP to a variable that indicates
2029    whether the result has signed type.  */
2030 cppchar_t
cpp_interpret_charconst(cpp_reader * pfile,const cpp_token * token,unsigned int * pchars_seen,int * unsignedp)2031 cpp_interpret_charconst (cpp_reader *pfile, const cpp_token *token,
2032 			 unsigned int *pchars_seen, int *unsignedp)
2033 {
2034   cpp_string str = { 0, 0 };
2035   bool wide = (token->type != CPP_CHAR && token->type != CPP_UTF8CHAR);
2036   int u8 = 2 * int(token->type == CPP_UTF8CHAR);
2037   cppchar_t result;
2038 
2039   /* An empty constant will appear as L'', u'', U'', u8'', or '' */
2040   if (token->val.str.len == (size_t) (2 + wide + u8))
2041     {
2042       cpp_error (pfile, CPP_DL_ERROR, "empty character constant");
2043       *pchars_seen = 0;
2044       *unsignedp = 0;
2045       return 0;
2046     }
2047   else if (!cpp_interpret_string (pfile, &token->val.str, 1, &str,
2048 				  token->type))
2049     {
2050       *pchars_seen = 0;
2051       *unsignedp = 0;
2052       return 0;
2053     }
2054 
2055   if (wide)
2056     result = wide_str_to_charconst (pfile, str, pchars_seen, unsignedp,
2057 				    token->type);
2058   else
2059     result = narrow_str_to_charconst (pfile, str, pchars_seen, unsignedp,
2060 				      token->type);
2061 
2062   if (str.text != token->val.str.text)
2063     free ((void *)str.text);
2064 
2065   return result;
2066 }
2067 
2068 /* Convert an identifier denoted by ID and LEN, which might contain
2069    UCN escapes or UTF-8 multibyte chars, to the source character set,
2070    either UTF-8 or UTF-EBCDIC.  Assumes that the identifier is actually
2071    a valid identifier.  */
2072 cpp_hashnode *
_cpp_interpret_identifier(cpp_reader * pfile,const uchar * id,size_t len)2073 _cpp_interpret_identifier (cpp_reader *pfile, const uchar *id, size_t len)
2074 {
2075   /* It turns out that a UCN escape always turns into fewer characters
2076      than the escape itself, so we can allocate a temporary in advance.  */
2077   uchar * buf = (uchar *) alloca (len + 1);
2078   uchar * bufp = buf;
2079   size_t idp;
2080 
2081   for (idp = 0; idp < len; idp++)
2082     if (id[idp] != '\\')
2083       *bufp++ = id[idp];
2084     else
2085       {
2086 	unsigned length = id[idp+1] == 'u' ? 4 : 8;
2087 	cppchar_t value = 0;
2088 	size_t bufleft = len - (bufp - buf);
2089 	int rval;
2090 
2091 	idp += 2;
2092 	while (length && idp < len && ISXDIGIT (id[idp]))
2093 	  {
2094 	    value = (value << 4) + hex_value (id[idp]);
2095 	    idp++;
2096 	    length--;
2097 	  }
2098 	idp--;
2099 
2100 	/* Special case for EBCDIC: if the identifier contains
2101 	   a '$' specified using a UCN, translate it to EBCDIC.  */
2102 	if (value == 0x24)
2103 	  {
2104 	    *bufp++ = '$';
2105 	    continue;
2106 	  }
2107 
2108 	rval = one_cppchar_to_utf8 (value, &bufp, &bufleft);
2109 	if (rval)
2110 	  {
2111 	    errno = rval;
2112 	    cpp_errno (pfile, CPP_DL_ERROR,
2113 		       "converting UCN to source character set");
2114 	    break;
2115 	  }
2116       }
2117 
2118   return CPP_HASHNODE (ht_lookup (pfile->hash_table,
2119 				  buf, bufp - buf, HT_ALLOC));
2120 }
2121 
2122 /* Convert an input buffer (containing the complete contents of one
2123    source file) from INPUT_CHARSET to the source character set.  INPUT
2124    points to the input buffer, SIZE is its allocated size, and LEN is
2125    the length of the meaningful data within the buffer.  The
2126    translated buffer is returned, *ST_SIZE is set to the length of
2127    the meaningful data within the translated buffer, and *BUFFER_START
2128    is set to the start of the returned buffer.  *BUFFER_START may
2129    differ from the return value in the case of a BOM or other ignored
2130    marker information.
2131 
2132    INPUT is expected to have been allocated with xmalloc.  This
2133    function will either set *BUFFER_START to INPUT, or free it and set
2134    *BUFFER_START to a pointer to another xmalloc-allocated block of
2135    memory.  */
2136 uchar *
_cpp_convert_input(cpp_reader * pfile,const char * input_charset,uchar * input,size_t size,size_t len,const unsigned char ** buffer_start,off_t * st_size)2137 _cpp_convert_input (cpp_reader *pfile, const char *input_charset,
2138 		    uchar *input, size_t size, size_t len,
2139 		    const unsigned char **buffer_start, off_t *st_size)
2140 {
2141   struct cset_converter input_cset;
2142   struct _cpp_strbuf to;
2143   unsigned char *buffer;
2144 
2145   input_cset = init_iconv_desc (pfile, SOURCE_CHARSET, input_charset);
2146   if (input_cset.func == convert_no_conversion)
2147     {
2148       to.text = input;
2149       to.asize = size;
2150       to.len = len;
2151     }
2152   else
2153     {
2154       to.asize = MAX (65536, len);
2155       to.text = XNEWVEC (uchar, to.asize);
2156       to.len = 0;
2157 
2158       if (!APPLY_CONVERSION (input_cset, input, len, &to))
2159 	cpp_error (pfile, CPP_DL_ERROR,
2160 		   "failure to convert %s to %s",
2161 		   CPP_OPTION (pfile, input_charset), SOURCE_CHARSET);
2162 
2163       free (input);
2164     }
2165 
2166   /* Clean up the mess.  */
2167   if (input_cset.func == convert_using_iconv)
2168     iconv_close (input_cset.cd);
2169 
2170   /* Resize buffer if we allocated substantially too much, or if we
2171      haven't enough space for the \n-terminator or following
2172      15 bytes of padding (used to quiet warnings from valgrind or
2173      Address Sanitizer, when the optimized lexer accesses aligned
2174      16-byte memory chunks, including the bytes after the malloced,
2175      area, and stops lexing on '\n').  */
2176   if (to.len + 4096 < to.asize || to.len + 16 > to.asize)
2177     to.text = XRESIZEVEC (uchar, to.text, to.len + 16);
2178 
2179   memset (to.text + to.len, '\0', 16);
2180 
2181   /* If the file is using old-school Mac line endings (\r only),
2182      terminate with another \r, not an \n, so that we do not mistake
2183      the \r\n sequence for a single DOS line ending and erroneously
2184      issue the "No newline at end of file" diagnostic.  */
2185   if (to.len && to.text[to.len - 1] == '\r')
2186     to.text[to.len] = '\r';
2187   else
2188     to.text[to.len] = '\n';
2189 
2190   buffer = to.text;
2191   *st_size = to.len;
2192 #if HOST_CHARSET == HOST_CHARSET_ASCII
2193   /* The HOST_CHARSET test just above ensures that the source charset
2194      is UTF-8.  So, ignore a UTF-8 BOM if we see one.  Note that
2195      glib'c UTF-8 iconv() provider (as of glibc 2.7) does not ignore a
2196      BOM -- however, even if it did, we would still need this code due
2197      to the 'convert_no_conversion' case.  */
2198   if (to.len >= 3 && to.text[0] == 0xef && to.text[1] == 0xbb
2199       && to.text[2] == 0xbf)
2200     {
2201       *st_size -= 3;
2202       buffer += 3;
2203     }
2204 #endif
2205 
2206   *buffer_start = to.text;
2207   return buffer;
2208 }
2209 
2210 /* Decide on the default encoding to assume for input files.  */
2211 const char *
_cpp_default_encoding(void)2212 _cpp_default_encoding (void)
2213 {
2214   const char *current_encoding = NULL;
2215 
2216   /* We disable this because the default codeset is 7-bit ASCII on
2217      most platforms, and this causes conversion failures on every
2218      file in GCC that happens to have one of the upper 128 characters
2219      in it -- most likely, as part of the name of a contributor.
2220      We should definitely recognize in-band markers of file encoding,
2221      like:
2222      - the appropriate Unicode byte-order mark (FE FF) to recognize
2223        UTF16 and UCS4 (in both big-endian and little-endian flavors)
2224        and UTF8
2225      - a "#i", "#d", "/ *", "//", " #p" or "#p" (for #pragma) to
2226        distinguish ASCII and EBCDIC.
2227      - now we can parse something like "#pragma GCC encoding <xyz>
2228        on the first line, or even Emacs/VIM's mode line tags (there's
2229        a problem here in that VIM uses the last line, and Emacs has
2230        its more elaborate "local variables" convention).
2231      - investigate whether Java has another common convention, which
2232        would be friendly to support.
2233      (Zack Weinberg and Paolo Bonzini, May 20th 2004)  */
2234 #if defined (HAVE_LOCALE_H) && defined (HAVE_LANGINFO_CODESET) && 0
2235   setlocale (LC_CTYPE, "");
2236   current_encoding = nl_langinfo (CODESET);
2237 #endif
2238   if (current_encoding == NULL || *current_encoding == '\0')
2239     current_encoding = SOURCE_CHARSET;
2240 
2241   return current_encoding;
2242 }
2243 
2244 /* Implementation of class cpp_string_location_reader.  */
2245 
2246 /* Constructor for cpp_string_location_reader.  */
2247 
2248 cpp_string_location_reader::
cpp_string_location_reader(location_t src_loc,line_maps * line_table)2249 cpp_string_location_reader (location_t src_loc,
2250 			    line_maps *line_table)
2251 {
2252   src_loc = get_range_from_loc (line_table, src_loc).m_start;
2253 
2254   /* SRC_LOC might be a macro location.  It only makes sense to do
2255      column-by-column calculations on ordinary maps, so get the
2256      corresponding location in an ordinary map.  */
2257   m_loc
2258     = linemap_resolve_location (line_table, src_loc,
2259 				LRK_SPELLING_LOCATION, NULL);
2260 
2261   const line_map_ordinary *map
2262     = linemap_check_ordinary (linemap_lookup (line_table, m_loc));
2263   m_offset_per_column = (1 << map->m_range_bits);
2264 }
2265 
2266 /* Get the range of the next source byte.  */
2267 
2268 source_range
get_next()2269 cpp_string_location_reader::get_next ()
2270 {
2271   source_range result;
2272   result.m_start = m_loc;
2273   result.m_finish = m_loc;
2274   if (m_loc <= LINE_MAP_MAX_LOCATION_WITH_COLS)
2275     m_loc += m_offset_per_column;
2276   return result;
2277 }
2278 
2279 /* Helper for cpp_byte_column_to_display_column and its inverse.  Given a
2280    pointer to a UTF-8-encoded character, compute its display width.  *INBUFP
2281    points on entry to the start of the UTF-8 encoding of the character, and
2282    is updated to point just after the last byte of the encoding.  *INBYTESLEFTP
2283    contains on entry the remaining size of the buffer into which *INBUFP
2284    points, and this is also updated accordingly.  If *INBUFP does not
2285    point to a valid UTF-8-encoded sequence, then it will be treated as a single
2286    byte with display width 1.  */
2287 
2288 static inline int
compute_next_display_width(const uchar ** inbufp,size_t * inbytesleftp)2289 compute_next_display_width (const uchar **inbufp, size_t *inbytesleftp)
2290 {
2291   cppchar_t c;
2292   if (one_utf8_to_cppchar (inbufp, inbytesleftp, &c) != 0)
2293     {
2294       /* Input is not convertible to UTF-8.  This could be fine, e.g. in a
2295 	 string literal, so don't complain.  Just treat it as if it has a width
2296 	 of one.  */
2297       ++*inbufp;
2298       --*inbytesleftp;
2299       return 1;
2300     }
2301 
2302   /*  one_utf8_to_cppchar() has updated inbufp and inbytesleftp for us.  */
2303   return cpp_wcwidth (c);
2304 }
2305 
2306 /*  For the string of length DATA_LENGTH bytes that begins at DATA, compute
2307     how many display columns are occupied by the first COLUMN bytes.  COLUMN
2308     may exceed DATA_LENGTH, in which case the phantom bytes at the end are
2309     treated as if they have display width 1.  */
2310 
2311 int
cpp_byte_column_to_display_column(const char * data,int data_length,int column)2312 cpp_byte_column_to_display_column (const char *data, int data_length,
2313 				   int column)
2314 {
2315   int display_col = 0;
2316   const uchar *udata = (const uchar *) data;
2317   const int offset = MAX (0, column - data_length);
2318   size_t inbytesleft = column - offset;
2319   while (inbytesleft)
2320     display_col += compute_next_display_width (&udata, &inbytesleft);
2321   return display_col + offset;
2322 }
2323 
2324 /*  For the string of length DATA_LENGTH bytes that begins at DATA, compute
2325     the least number of bytes that will result in at least DISPLAY_COL display
2326     columns.  The return value may exceed DATA_LENGTH if the entire string does
2327     not occupy enough display columns.  */
2328 
2329 int
cpp_display_column_to_byte_column(const char * data,int data_length,int display_col)2330 cpp_display_column_to_byte_column (const char *data, int data_length,
2331 				   int display_col)
2332 {
2333   int column = 0;
2334   const uchar *udata = (const uchar *) data;
2335   size_t inbytesleft = data_length;
2336   while (column < display_col && inbytesleft)
2337       column += compute_next_display_width (&udata, &inbytesleft);
2338   return data_length - inbytesleft + MAX (0, display_col - column);
2339 }
2340 
2341 /* Our own version of wcwidth().  We don't use the actual wcwidth() in glibc,
2342    because that will inspect the user's locale, and in particular in an ASCII
2343    locale, it will not return anything useful for extended characters.  But GCC
2344    in other respects (see e.g. _cpp_default_encoding()) behaves as if
2345    everything is UTF-8.  We also make some tweaks that are useful for the way
2346    GCC needs to use this data, e.g. tabs and other control characters should be
2347    treated as having width 1.  The lookup tables are generated from
2348    contrib/unicode/gen_wcwidth.py and were made by simply calling glibc
2349    wcwidth() on all codepoints, then applying the small tweaks.  These tables
2350    are not highly optimized, but for the present purpose of outputting
2351    diagnostics, they are sufficient.  */
2352 
2353 #include "generated_cpp_wcwidth.h"
cpp_wcwidth(cppchar_t c)2354 int cpp_wcwidth (cppchar_t c)
2355 {
2356   if (__builtin_expect (c <= wcwidth_range_ends[0], true))
2357     return wcwidth_widths[0];
2358 
2359   /* Binary search the tables.  */
2360   int begin = 1;
2361   static const int end
2362       = sizeof wcwidth_range_ends / sizeof (*wcwidth_range_ends);
2363   int len = end - begin;
2364   do
2365     {
2366       int half = len/2;
2367       int middle = begin + half;
2368       if (c > wcwidth_range_ends[middle])
2369 	{
2370 	  begin = middle + 1;
2371 	  len -= half + 1;
2372 	}
2373       else
2374 	len = half;
2375     } while (len);
2376 
2377   if (__builtin_expect (begin != end, true))
2378     return wcwidth_widths[begin];
2379   return 1;
2380 }
2381