Latest indent request

Gordon Burditt gordon at sneaky.TANDY.COM
Fri Dec 16 18:10:31 AEST 1988


Before anyone gets too enthusiastic about running all code in sight
through indenter/beautifier programs so they conform to THE correct
brace style, be very sure you aren't destroying code in the process.

If you are using a source code control system, and you must run code
through an indenter, it would be an excellent idea to check in all the
code, compile it, save the result, check out the code, beautify it,
compile it, and compare the object files and/or executables.  When you
finally manage to get a match, check in the beautified source (and the
source to the beautifier!) without further changes.  Then check it
out and continue development.  (Some System V compilers put time-stamps or 
other variable information in object headers that won't be the same each 
time you compile.  These differences don't count.)

Beautifiers can destroy code.  I'm not entirely convinced that it is
possible to write a beautifier that properly handles sufficiently
obscure code.   For example:

	char *rcfile = "/usr/foobar/RCFILE; { char *basedir = LIBDIR/rn";

where, unknown to the beautifier, this code is normally compiled with
	cc '-DRCFILE=.foorc"' '-DLIBDIR="/usr/spool/news' ...
so that's TWO declarations, not one, and that brace in the middle
is not inside the string.  Yes, this depends on Reiser CPP operation that
is not standard.  If you want to beautify this code, fix stuff like this
and forget about brace styles.

Few indenters will tolerate code written in this obnoxious outdented style,
especially since it only sees one close brace in the whole program, and
that one is first:
# define END \
	\
	} \
	\


							void doit(foo, bar) {
						if (foo == bar) {
					bark();
					if(2 + 2 != 4) {
				printf("assert error!");
					END

					printf("this code is ugly");
						END
							END
For a less extreme example, how about:
# ifdef BSD
	if (write(socketfd, buffer, length) != length) {
# else
	if (sndmsg(msgid, buffer, length, NO_WAIT) == NULL) {
# endif
		...
	}

I tried using a beautifier called "indent" a few years ago.  This may or
may not have anything to do with any program you know of by the same
name.  It broke things.  The first thing that got mangled was multi-line
# defines, because it didn't know it had to use backslashes on the
continuation lines.  Someone fixed it.  Then it decided to turn
"x= -y;" into "x-=y;" because it thought it was cleaning up old-style
assignment operators.  That took several hours to find.  Someone fixed it.  
Then it decided that *a/*b was the beginning of a comment, and it was free 
to insert line breaks at white space inside that quoted string inside the 
so-called comment.  Someone fixed it.  Then the program acted strange.  
Well, this time it was a bug in the program, but how could I have any 
confidence it wasn't the indenter?  

Now, what does that pre-ANSI indenter do to programs written for your
new ANSI compiler?

				Gordon L. Burditt
				...!texbell!sneaky!gordon



More information about the Comp.unix.wizards mailing list