[comp.bugs.4bsd] indent munges code

thorinn@skinfaxe.diku.dk (Lars Henrik Mathiesen) (12/14/89)

Description:
	Indent(1) will _silently_ convert ``old style'' assignment
	operators like =- and =* to the newer forms -= and *=.  This
	is a problem with C compilers like GNU gcc and SunOS4 cc which
	do not support the ``old style'' and _silently_ parses it as
	two operators.  Additionally, if a `=' token is followed by a
	character with bit 0200 set, a wild memory reference is made.

Fix:
	A new option -osa/-nosa (old style assignment), default off,
	to determine if these constructs are interpreted in the old or
	the new style.  Under -osa a warning message is always printed
	for each conversion; after all, the semantics are changed for
	_some_ compilers even if it isn't for yours.

RCS file: RCS/indent.1,v
retrieving revision 1.1
diff -c -r1.1 indent.1
*** /tmp/,RCSt1003087	Wed Dec 13 17:49:41 1989
--- indent.1	Wed Dec 13 17:03:25 1989
***************
*** 33,38 ****
--- 33,39 ----
  [\ \fB\-l\fIn\fR\ ]
  [\ \fB\-lc\fIn\fR\ ]
  [\ \fB\-lp\fR\ |\ \fB\-nlp\fR\ ]
+ [\ \fB\-osa\fR\ |\ \fB\-nosa\fR\ ]
  [\ \fB\-npro\fR\ ]
  [\ \fB\-pcs\fR\ |\ \fB\-npcs\fR\ ]
  [\ \fB\-ps\fR\ |\ \fB\-nps\fR\ ]
***************
*** 265,270 ****
--- 266,277 ----
  		p5));
  .ft R
  .fi
+ .TP 15
+ .BR \-osa , \-nosa
+ If true (\fB\-osa\fR) old style assignment operators (`=-', `=*', and so on)
+ are considered to be tokens, and are converted to the newer form (`-=', `*=').
+ The default is 
+ .BR \-nosa .
  .TP 15
  .B \-npro
  Causes the profile files, `./.indent.pro' and `~/.indent.pro', to be ignored.
===================================================================
RCS file: RCS/indent_globs.h,v
retrieving revision 1.1
diff -c -r1.1 indent_globs.h
*** /tmp/,RCSt1003087	Wed Dec 13 17:49:45 1989
--- indent_globs.h	Wed Dec 13 16:12:11 1989
***************
*** 121,126 ****
--- 121,128 ----
  int	lineup_to_parens;	/* if true, continued code within parens will
  				   be lined up to the open paren */
  int	block_comment_max_col;
+ int	convert_old_assignment;	/* if true, old style assignment operators (=+)
+ 				   are accepted and converted to new style */
  
  
  struct parser_state {
===================================================================
RCS file: RCS/args.c,v
retrieving revision 1.1
diff -c -r1.1 args.c
*** /tmp/,RCSt1003087	Wed Dec 13 17:49:49 1989
--- args.c	Wed Dec 13 16:27:10 1989
***************
*** 97,102 ****
--- 97,104 ----
      "nbbb",	PRO_BOOL,	false,	OFF, &blanklines_before_blockcomments,
      "ps",	PRO_BOOL,	false,	ON,	&pointer_as_binop,
      "nps",	PRO_BOOL,	false,	OFF,	&pointer_as_binop,
+     "osa",	PRO_BOOL,	false,	ON,	&convert_old_assignment,
+     "nosa",	PRO_BOOL,	false,	OFF,	&convert_old_assignment,
      "troff",	PRO_BOOL,	false,	ON,	&troff,
      "T",	PRO_SPECIAL,	0,	KEY,	0,
   /* whew! */
===================================================================
RCS file: RCS/lexi.c,v
retrieving revision 1.1
diff -c -r1.1 lexi.c
*** /tmp/,RCSt1003087	Wed Dec 13 17:49:53 1989
--- lexi.c	Wed Dec 13 17:49:20 1989
***************
*** 461,468 ****
  	case '=':
  	    if (ps.in_or_st)
  		ps.block_init = 1;
! 	    if (chartype[*buf_ptr] == opchar) {	/* we have two char
  						 * assignment */
  		tok[-1] = *buf_ptr++;
  		if ((tok[-1] == '<' || tok[-1] == '>') && tok[-1] == *buf_ptr)
  		    *tok++ = *buf_ptr++;
--- 461,470 ----
  	case '=':
  	    if (ps.in_or_st)
  		ps.block_init = 1;
! 	    if (convert_old_assignment &&
! 		chartype[*buf_ptr & 0177] == opchar) {	/* we have two char
  						 * assignment */
+ 		printf("%d: Old style assignment converted\n", line_no);
  		tok[-1] = *buf_ptr++;
  		if ((tok[-1] == '<' || tok[-1] == '>') && tok[-1] == *buf_ptr)
  		    *tok++ = *buf_ptr++;