🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.gcc.bug
Article #610

gcc -pedantic doesn't check for bad file ends

#610
From: Paul Eggert
Date: Wed, 20 Sep 1989 22:04
129 lines
4023 bytes
Draft ANSI C (2.1.1.2) requires that ``A source file that is not empty shall
end in a new-line character, which shall not be immediately preceded by a
backslash character.''  GCC 1.35 doesn't check this requirement.  Here is a
patch to make it check the requirement if the -pedantic option is set.
Although the check is partly performed when the file is initially input, the
error message is deferred until after the input is scanned, so that the user
is not confused by an initial error message that refers to the end of the
file.

*** old/cccp.c	Wed Sep 20 14:59:04 1989
--- new/cccp.c	Wed Sep 20 14:55:50 1989
***************
*** 272,277 ****
--- 272,303 ----
  
  /* List of other included files.  */
  struct file_name_list *all_include_files = 0;
+ 
+ /* Make sure data ends with a newline.  And put a null after it.
+    Yield nonzero if we had to append a newline. */
+ 
+ int
+ ensure_proper_end (fp)
+      register FILE_BUF *fp;
+ {
+   int adjusted = 0;
+   if (fp->length > 0 && fp->buf[fp->length-1] != '\n') {
+     fp->buf[fp->length++] = '\n';
+     adjusted = 1;
+   }
+   fp->buf[fp->length] = '\0';
+   return adjusted;
+ }
+ 
+ check_proper_end (fp, adjusted)
+       register FILE_BUF *fp;
+       int adjusted;
+ {
+   if (adjusted)
+     error ("last character is not a newline");
+   if (fp->length > 1 && fp->buf[fp->length-2] == '\\')
+     error ("last line ends in a backslash");
+ }
  
  /* Structure allocated for every #define.  For a simple replacement
     such as
***************
*** 512,517 ****
--- 538,544 ----
    char **pend_undefs = (char **) xmalloc (argc * sizeof (char *));
    int inhibit_predefs = 0;
    int no_standard_includes = 0;
+   int adjusted;
  
    /* Non-0 means don't output the preprocessed program.  */
    int inhibit_output = 0;
***************
*** 955,965 ****
    if (!no_trigraphs)
      trigraph_pcp (fp);
  
!   /* Make sure data ends with a newline.  And put a null after it.  */
! 
!   if (fp->length > 0 && fp->buf[fp->length-1] != '\n')
!     fp->buf[fp->length++] = '\n';
!   fp->buf[fp->length] = '\0';
  
    /* Now that we know the input file is valid, open the output.  */
  
--- 982,988 ----
    if (!no_trigraphs)
      trigraph_pcp (fp);
  
!   adjusted = ensure_proper_end (fp);
  
    /* Now that we know the input file is valid, open the output.  */
  
***************
*** 974,979 ****
--- 997,1005 ----
  
    rescan (&outbuf, 0);
  
+   if (pedantic)
+     check_proper_end (fp, adjusted);
+ 
    /* Now we have processed the entire input
       Write whichever kind of output has been requested.  */
  
***************
*** 2533,2538 ****
--- 2559,2565 ----
    long i;
    FILE_BUF *fp;			/* For input stack frame */
    int success = 0;
+   int adjusted;
  
    if (file_size_and_mode (f, &st_mode, &st_size) < 0)
      goto nope;		/* Impossible? */
***************
*** 2597,2605 ****
    if (!no_trigraphs)
      trigraph_pcp (fp);
  
!   if (fp->length > 0 && fp->buf[fp->length-1] != '\n')
!     fp->buf[fp->length++] = '\n';
!   fp->buf[fp->length] = '\0';
  
    success = 1;
    indepth++;
--- 2624,2630 ----
    if (!no_trigraphs)
      trigraph_pcp (fp);
  
!   adjusted = ensure_proper_end (fp);
  
    success = 1;
    indepth++;
***************
*** 2606,2611 ****
--- 2631,2638 ----
  
    output_line_command (fp, op, 0);
    rescan (op, 0);
+   if (pedantic)
+     check_proper_end (fp, adjusted);
    indepth--;
    output_line_command (&instack[indepth], op, 0);
  
Technical Details
Message-ID: <8909202204.AA16026@rise.twinsun.com>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!usc!gem.mps.ohio-state.edu!tut.cis.ohio-state.edu!twinsun.com!eggert

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!usc!gem.mps.ohio-state.edu!tut.cis.ohio-state.edu!twinsun.com!eggert
From: eggert@twinsun.com (Paul Eggert)
Newsgroups: gnu.gcc.bug
Subject: gcc -pedantic doesn't check for bad file ends
Message-ID: <8909202204.AA16026@rise.twinsun.com>
Date: 20 Sep 89 22:04:37 GMT
Sender: daemon@tut.cis.ohio-state.edu
Distribution: gnu
Organization: GNUs Not Usenet
Lines: 129