]> gcc.gnu.org Git - gcc.git/commitdiff
re PR preprocessor/6489 (tradcpp0 fails on line ending with '\r\n')
authorJakub Jelinek <jakub@redhat.com>
Fri, 3 May 2002 17:55:26 +0000 (19:55 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 3 May 2002 17:55:26 +0000 (19:55 +0200)
PR preprocessor/6489
* tradcpp.c (fixup_newlines): New.
(main, finclude): Use it.

From-SVN: r53103

gcc/ChangeLog
gcc/tradcpp.c

index 71e4466b0a67738b3f76c691d7e2b2d29061b7aa..cac408130e5c70fea0dc83c1d22b6f4f8f26bbe0 100644 (file)
@@ -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.
index 4ed6332ac7ffd16146ee198e04476c0ca56ca100..6381c2dc4e437191aa5b3858b9c87d7b8231e507 100644 (file)
@@ -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.  */
 
This page took 0.08664 seconds and 5 git commands to generate.