#!/bin/sh # ccformat - convert C code to standard format # @(#) ccformat.sh 1.3 11/5/89 14:39:29 # how to suppress newlines in echo case `echo -n` in "") n=-n; c=;; *) n=; c='\c';; esac # initialize TMPF=/tmp/ccformat.$$ ERROR= TROFF= BCK= FLAGS="-st -di8 -npsl -bap -bad -bbb -nbc -i4 -d0 -nip -nfc1 -cd41 -c49" trap 'rm -f .ind.$$ $TMPF; exit 1' 1 2 3 15 # parse command options while : do case $1 in -t) TROFF=-troff;; -b) case $# in 1) ERROR="-b option requires backup argument"; break;; *) BCK=$2; shift;; esac;; -T) case $# in 1) ERROR="-T option requires typename argument"; break;; *) FLAGS="$FLAGS -T$2"; shift;; esac;; -*) ERROR="invalid option: $1"; break;; *) break;; esac shift done # check for invalid commands test -z "$ERROR" || { echo "$0: $ERROR" 1>&2 echo "usage: $0 [-b backup] [-t] [-T typename] [file(s)]" 1>&2 exit 1; } # format the files case $# in 0) indent $TROFF $FLAGS;; *) case "$TROFF" in -troff) for i in $* do indent $TROFF $FLAGS $i done;; *) for i in $* do echo $n $i... $c test -z "$BCK" || cp $i $i"$BCK" || { echo backup FAILED; exit 1; } { # some versions of indent return garbage exit status -- gack! (indent $FLAGS <$i 2>.ind.$$ >$TMPF || test ! -s .ind.$$) >$TMPF && # try a device full check # echo >>$TMPF && ( # ignore interrupts while we overwrite the original file trap '' 1 2 3 15; cp $TMPF $i ) && echo replaced; } || { echo replacement FAILED; exit 1; } done;; esac;; esac rm -f $TMPF .ind.$$ exit #++ # NAME # ccformat 1 # SUMMARY # convert C source text to standard format # PROJECT # sdetools # SYNOPSIS # ccformat [-b backup] [-t] [-T typename] [file(s)] # DESCRIPTION # The \fIccformat\fR command adjusts the layout of C program text # such that it approximates the Kernighan and Ritchie coding style. # # If no file names are specified, \fIccformat\fR reads # from standard input and writes the result to standard output. # This is convenient for source formatting from within a text # editor program. # # Otherwise, the named files are overwritten with their # formatted equivalent. The \fI-b\fR option (see below) provides # a way to create backup copies of the original files. # # Alternatively, the command can be used as a preprocessor for # pretty-printing with the \fInroff\fR or \fItroff\fR commands # (see the -t option below). In this case, output is always written # to standard output and no change is made to source files. # # The following options are recognized: # .TP # -b backup # Requests that a copy of the original files be saved. The backup # file name is constructed by appending the specified \fIbackup\fR # string to the original file name. # This option is ignored when the \fI-t\fR # option is specifid. # .TP # -t # Makes the program act as a preprocessor # for pretty-printing with \fInroff\fR or \fItroff\fR. # For example, in order to produce a pretty-printed # version on the line printer, use # ccformat -t file(s) | nroff -mindent | col | lp # .TP # -T typename # Adds \fItypename\fR to the list of type keywords. # Names accumulate: -T can be specified more # than once. You need to specify all the # typenames that appear in your program that # are defined by typedefs - nothing will be # harmed if you miss a few, but the program # won't be formatted as nicely as it should. # PROGRAM LAYOUT # .fi # .ad # The following program layout is produced: # .TP # comments # Comments starting in the first column are left untouched. # These are often carefully laid out by the programmer. # .sp # Comments that appear in-between statements are lined up with # the surrounding program text, and are adjusted to accommodate # as many words on a line as possible. # However, a blank line in the middle of a comment is respected. # .sp # Trailing comments after declarations begin at column 41 # (5 tab stops). # Trailing comments after executable statements start at # column 49 (6 tab stops). # .TP # indentation # Statements are indented by multiples of four columns. # There is only one statement per line. A control statement # is always placed on a separate line. # .TP # braces # If an opening brace is preceded by a control statement (\fCif, # else, do, for\fR or \fCswitch\fR), it is placed on the same line # as the control statement. # .sp # A closing brace is placed at the same level of indentation as the # program text that precedes the corresponding opening brace. # If a closing brace is followed by a control statement (\fCelse\fR # or \fCwhile\fR), that control statement is placed on the same line # as the closing brace. # .sp # In practice, brace placement is as # exemplified by the books on C by B.W. Kernighan and D.M. Ritchie. # .TP # blanks # Blanks are placed around assignment and arithmetic operators. # Commas in declarations or parameter lists are followed by one blank. # .sp # In the following cases a # blank line is inserted if it is not already present in the text: # 1) in front of a block comment, 2) between local declarations and # executable statements 3) after each function body. # .TP # declarations # In the output, each variable declaration appears on # a separate line. # COMMANDS # indent(1) # FILES # /tmp/ccformat.* intermediate files # SEE ALSO # indent(1) # DIAGNOSTICS # Indent may complain in case of syntax errors. These show # up as comments in the resulting program text. # BUGS # The programs seems to beave even when fed ANSI C or even C++ # code; this has not been tested thoroughly, however. # # Will produce useless files when fed with anything that is # not C program text. This does not imply a judgment about # C programs in general. # AUTHOR(S) # W.Z. Venema # Eindhoven University of Technology # Department of Mathematics and Computer Science # Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands # CREATION DATE # Fri May 6 14:07:04 MET DST 1988 # STATUS # ccformat.sh 1.3 11/5/89 14:39:29 (draft) #--