summaryrefslogtreecommitdiffstats
path: root/mantools/ccformat
blob: 9ac6c57af58f8532ed6d7faadd705bc081092463 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#!/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)
#--