diff options
author | Jakub Jelinek <jakub@redhat.com> | 2002-05-03 19:55:26 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-05-03 19:55:26 +0200 |
commit | 8157303b1e8961a18aa8779a99aea6a7d8dc7116 (patch) | |
tree | dbe5b094a244905e054685be52116a6381e25201 | |
parent | 66319f5cad7b88171aa276f018b7dce645b7788f (diff) | |
download | gcc-8157303b1e8961a18aa8779a99aea6a7d8dc7116.zip gcc-8157303b1e8961a18aa8779a99aea6a7d8dc7116.tar.gz gcc-8157303b1e8961a18aa8779a99aea6a7d8dc7116.tar.bz2 |
re PR preprocessor/6489 (tradcpp0 fails on line ending with '\r\n')
PR preprocessor/6489
* tradcpp.c (fixup_newlines): New.
(main, finclude): Use it.
From-SVN: r53103
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tradcpp.c | 39 |
2 files changed, 45 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 71e4466..cac4081 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-05-03 Jakub Jelinek <jakub@redhat.com> + + PR preprocessor/6489 + * tradcpp.c (fixup_newlines): New. + (main, finclude): Use it. + 2002-05-03 Richard Sandiford <rsandifo@redhat.com> * config/mips/elf64.h (UNIQUE_SECTION): Use mips_unique_section. diff --git a/gcc/tradcpp.c b/gcc/tradcpp.c index 4ed6332..6381c2d 100644 --- a/gcc/tradcpp.c +++ b/gcc/tradcpp.c @@ -430,6 +430,7 @@ static void grow_outbuf PARAMS ((FILE_BUF *, int)); static int handle_directive PARAMS ((FILE_BUF *, FILE_BUF *)); static void process_include PARAMS ((struct file_name_list *, const U_CHAR *, int, int, FILE_BUF *)); +static void fixup_newlines PARAMS ((FILE_BUF *)); static void finclude PARAMS ((int, const char *, struct file_name_list *, FILE_BUF *)); static void init_dependency_output PARAMS ((void)); @@ -952,6 +953,7 @@ main (argc, argv) } fp->bufp = fp->buf; fp->if_stack = if_stack; + fixup_newlines (fp); /* Make sure data ends with a newline. And put a null after it. */ @@ -2594,6 +2596,42 @@ process_include (stackp, fbeg, flen, system_header_p, op) } } +/* Replace all CR NL, NL CR and CR sequences with NL. */ + +static void +fixup_newlines (FILE_BUF *fp) +{ + U_CHAR *p, *q, *end; + + if (fp->length <= 0) + return; + + end = fp->buf + fp->length; + *end = '\r'; + p = (U_CHAR *) strchr ((const char *) fp->buf, '\r'); + *end = '\0'; + if (p == end) + return; + + if (p > fp->buf && p[-1] == '\n') + p--; + q = p; + while (p < end) + switch (*p) + { + default: + *q++ = *p++; + break; + case '\n': + case '\r': + p += 1 + (p[0] + p[1] == '\n' + '\r'); + *q++ = '\n'; + break; + } + + fp->length = q - fp->buf; +} + /* Process the contents of include file FNAME, already open on descriptor F, with output to OP. */ @@ -2668,6 +2706,7 @@ finclude (f, fname, nhd, op) fp->length = st_size; } close (f); + fixup_newlines (fp); /* Make sure data ends with a newline. And put a null after it. */ |