re PR preprocessor/33415 (Can't compile .cpp file with UTF-8 BOM.)
libcpp PR libcpp/33415: * charset.c (_cpp_convert_input): Add buffer_start argument. Ignore UTF-8 BOM if seen. * internal.h (_cpp_convert_input): Add argument. * files.c (struct _cpp_file) <buffer_start>: New field. (destroy_cpp_file): Free buffer_start, not buffer. (_cpp_pop_file_buffer): Likewise. (read_file_guts): Update. gcc/testsuite PR libcpp/33415: * gcc.dg/cpp/pr33415.c: New file. From-SVN: r134507
This commit is contained in:
parent
009890be6c
commit
688e7a5344
6 changed files with 68 additions and 16 deletions
|
@ -74,6 +74,10 @@ struct _cpp_file
|
|||
/* The contents of NAME after calling read_file(). */
|
||||
const uchar *buffer;
|
||||
|
||||
/* Pointer to the real start of BUFFER. read_file() might increment
|
||||
BUFFER; when freeing, this this pointer must be used instead. */
|
||||
const uchar *buffer_start;
|
||||
|
||||
/* The macro, if any, preventing re-inclusion. */
|
||||
const cpp_hashnode *cmacro;
|
||||
|
||||
|
@ -635,8 +639,11 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
|
|||
cpp_error (pfile, CPP_DL_WARNING,
|
||||
"%s is shorter than expected", file->path);
|
||||
|
||||
file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset),
|
||||
buf, size, total, &file->st.st_size);
|
||||
file->buffer = _cpp_convert_input (pfile,
|
||||
CPP_OPTION (pfile, input_charset),
|
||||
buf, size, total,
|
||||
&file->buffer_start,
|
||||
&file->st.st_size);
|
||||
file->buffer_valid = true;
|
||||
|
||||
return true;
|
||||
|
@ -969,8 +976,8 @@ make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
|
|||
static void
|
||||
destroy_cpp_file (_cpp_file *file)
|
||||
{
|
||||
if (file->buffer)
|
||||
free ((void *) file->buffer);
|
||||
if (file->buffer_start)
|
||||
free ((void *) file->buffer_start);
|
||||
free ((void *) file->name);
|
||||
free (file);
|
||||
}
|
||||
|
@ -1302,9 +1309,10 @@ _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
|
|||
/* Invalidate control macros in the #including file. */
|
||||
pfile->mi_valid = false;
|
||||
|
||||
if (file->buffer)
|
||||
if (file->buffer_start)
|
||||
{
|
||||
free ((void *) file->buffer);
|
||||
free ((void *) file->buffer_start);
|
||||
file->buffer_start = NULL;
|
||||
file->buffer = NULL;
|
||||
file->buffer_valid = false;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue