[comp.bugs.4bsd] bugs in /usr/ucb/indent

jik@athena.mit.edu (Jonathan Isaiah Kamens) (12/15/88)

After the uproar raised recently in comp.unix.wizards about the
different indentation styles available to Unix C programmers, I
decided to try out the indent program mentioned by several people
during the discussion.  I got:

% indent ~/src/leave.c /tmp/leave.c
Segmentation Violation (core dumped).
%

Not pretty.  I was running this on an IBM RT workstation, so I tried
in on a VAX 750, and it worked.  Since the VAX tends to be just a bit
more tolerant of things like illegal array indices and such than the
RT does, I ran the code through saber on an RT.

The results were not pretty.  I've included below those fixes which I
had to make before indent would work properly on the RT.

If I may so, this code is very sloppy.  Whoever wrote it throws around
illegal array references liberally and seems to assume that the
machine will "do the right thing" instead of writing the code
correctly himself.

(Your line numbers may vary, of course.)

  Jonathan Kamens
  MIT Project Athena

--------begin patches to io.c from /usr/ucb/indent source code--------
*** /tmp/,RCSt1013186	Wed Dec 14 18:31:04 1988
--- io.c	Wed Dec 14 18:21:51 1988
***************
*** 258,264 ****
      *(e_com = s_com) = '\0';
      ps.ind_level = ps.i_l_follow;
      ps.paren_level = ps.p_l_follow;
!     paren_target = -ps.paren_indents[ps.paren_level - 1];
      return;
  };
  
--- 258,265 ----
      *(e_com = s_com) = '\0';
      ps.ind_level = ps.i_l_follow;
      ps.paren_level = ps.p_l_follow;
!     paren_target = (ps.paren_level > 0 ? -ps.paren_indents[ps.paren_level - 1]
! 		    : 0);
      return;
  };
  
***************
*** 330,343 ****
      }
      p = in_buffer;
      buf_ptr = p;
!     while ((*p++ = i = getc(f)) != EOF && i != '\n');
      if (i == EOF) {
! 	p[-1] = ' ';
  	*p++ = '\n';
  	had_eof = true;
      }
      buf_end = p;
!     if (p[-2] == '/' && p[-3] == '*') {
  	if (in_buffer[3] == 'I' && strncmp(in_buffer, "/**INDENT**", 11) == 0)
  	    fill_buffer();	/* flush indent error message */
  	else {
--- 331,348 ----
      }
      p = in_buffer;
      buf_ptr = p;
!     while ((i = getc(f)) != EOF && i != '\n')
! 	 *p++ = i;
!     if (i == '\n') *p++ = i;
      if (i == EOF) {
! 	if (p - in_buffer > 0)
! 	     p[-1] = ' ';
  	*p++ = '\n';
  	had_eof = true;
      }
      buf_end = p;
!     
!     if (p - in_buffer > 3) if (p[-2] == '/' && p[-3] == '*') {
  	if (in_buffer[3] == 'I' && strncmp(in_buffer, "/**INDENT**", 11) == 0)
  	    fill_buffer();	/* flush indent error message */
  	else {
--------end of patches to io.c--------