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
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
|
.\" Copyright (c) 1991, 1992, 1993, 1994 Free Software Foundation
.\" See section COPYING for conditions for redistribution
.\"
.\" $OpenBSD: protoize.1,v 1.1 2003/01/18 23:49:52 deraadt Exp $
.Dd January 14, 2003
.Dt PROTOIZE 1
.Os
.Sh NAME
.Nm protoize, unprotoize
.Nd automatically add or remove function prototypes
.Sh SYNOPSIS
.Nm protoize
.Bk -words
.Op Fl CfgklNnqv
.Op Fl B Ar directory
.Op Fl c Ar COMPILATION-OPTIONS
.Op Fl d Ar directory ...
.Op Fl i Ar string
.Op Fl p Ar program
.Op Fl x Ar
.Ar
.Ek
.Nm unprotoize
.Bk -words
.Op Fl fkNnqv
.Op Fl c Ar COMPILATION-OPTIONS
.Op Fl d Ar directory ...
.Op Fl i Ar string
.Op Fl p Ar program
.Op Fl x Ar
.Ar
.Ek
.Sh DESCRIPTION
.Nm protoize
is an optional part of GNU C. You can use it
to add prototypes to a program, thus converting the program to ANSI C
in one respect. The companion program
.Nm unprotoize
does the reverse: it removes argument types from any
prototypes that are found.
.Pp
When you run these programs, you must specify a set of source files
as command line arguments. The conversion programs start out by
compiling these files to see what functions they define. The
information gathered about a file
.Ar FOO
is saved in a file named
.Ar FOO.X .
.Pp
After scanning comes the actual conversion. The specified files are all
eligible to be converted; any files they include (whether sources or
just headers) are eligible as well.
.Pp
But not all the eligible files are converted. By default,
.Nm protoize
and
.Nm unprotoize
convert only source and header files in the
current directory. You can specify additional directories whose files
should be converted with the
.Sq Fl d Ar directory ...
option. You can also
specify particular files to exclude with the
.Sq Fl x Ar
option. A file
is converted if it is eligible, its directory name matches one of the
specified directory names, and its name within the directory has not
been excluded.
.Pp
Basic conversion with
.Nm protoize
consists of rewriting most function
definitions and function declarations to specify the types of the
arguments. The only ones not rewritten are those for varargs functions.
.Pp
.Nm protoize
optionally inserts prototype declarations at the
beginning of the source file, to make them available for any calls that
precede the function's definition. Or it can insert prototype
declarations with block scope in the blocks where undeclared functions
are called.
.Pp
Basic conversion with
.Nm unprotoize
consists of rewriting most
function declarations to remove any argument types, and rewriting
function definitions to the old-style pre-ANSI form.
.Pp
Both conversion programs print a warning for any function
declaration or definition that they can't convert. You can suppress
these warnings with the
.Fl q
option.
.Pp
The output from
.Nm protoize
or
.Nm unprotoize
replaces the original
source file. The original file is renamed to a name ending with
`.save'. If the `.save' file already exists, then the source file is
simply discarded.
.Pp
.Nm protoize
and
.Nm unprotoize
both depend on
.Xr gcc 1
to scan the
program and collect information about the functions it uses.
.Pp
The options are as follows:
.Bl -tag -width Ds
.It Fl B Ar directory
Look for the file `SYSCALLS.c.X' in
.Ar directory ,
instead of the
usual directory
.Pq normally Pa /usr/local/lib .
This file contains
prototype information about standard system functions. This option
applies only to
.Nm protoize .
.It Fl C
Rename files to end in `.C' instead of `.c'. This is convenient
if you are converting a C program to C++. This option applies
only to
.Nm protoize .
.It Fl c Ar COMPILATION-OPTIONS
Use
.Ar COMPILATION-OPTIONS
as the options when running `gcc' to
produce the `.X' files. The special option
.Fl aux-info
is always
passed in addition, to tell `gcc' to write a `.X' file.
.Pp
Note that the compilation options must be given as a single
argument to
.Nm protoize
or
.Nm unprotoize .
If you want to specify
several `gcc' options, you must quote the entire set of
compilation options to make them a single word in the shell.
.Pp
There are certain `gcc' arguments that you cannot use, because they
would produce the wrong kind of output. These include
.Fl g ,
.Fl O ,
.Fl c ,
.Fl S ,
and
.Fl o .
If you include these in the
.Ar COMPILATION-OPTIONS ,
they are ignored.
.It Fl d Ar directory
Specify additional directories whose files should be converted.
.It Fl g
Add explicit global declarations. This means inserting explicit
declarations at the beginning of each source file for each function
that is called in the file and was not declared. These
declarations precede the first function definition that contains a
call to an undeclared function. This option applies only to
.Nm protoize .
.It Fl i Ar string
Indent old-style parameter declarations with the string
.Ar string .
This option applies only to
.Nm protoize .
.Pp
.Nm unprotoize
converts prototyped function definitions to old-style
function definitions, where the arguments are declared between the
argument list and the initial `{'. By default,
.Nm unprotoize
uses
five spaces as the indentation. If you want to indent with just
one space instead, use
.Fl i
" ".
.It Fl k
Keep the `.X' files. Normally, they are deleted after conversion
is finished.
.It Fl l
Add explicit local declarations.
.Nm protoize
with
.Fl l
inserts a
prototype declaration for each function in each block which calls
the function without any declaration. This option applies only to
.Nm protoize .
.It Fl N
Make no `.save' files. The original files are simply deleted.
Use this option with caution.
.It Fl n
Make no real changes. This mode just prints information about the
conversions that would have been done without
.Fl n .
.It Fl p Ar program
Use the program
.Ar program
as the compiler. Normally, the name `gcc' is used.
.It Fl q
Work quietly. Most warnings are suppressed.
.It Fl v
Print the version number, just like
.Fl v
for `gcc'.
.It Fl x Ar
List of files to exclude from the conversion process.
.El
.Pp
If you need special compiler options to compile one of your program's
source files, then you should generate that file's `.X' file specially,
by running `gcc' on that source file with the appropriate options and
the option
.Fl aux-info .
Then run
.Nm protoize
on the entire set of
files.
.Nm protoize
will use the existing `.X' file because it is newer
than the source file. For example:
.Pp
.Cm $ gcc -Dfoo=bar file1.c -aux-info
.br
.Cm $ protoize *.c
.Pp
You need to include the special files along with the rest in the
.Nm protoize
command, even though their `.X' files already exist, because
otherwise they won't get converted.
.Pp
.Sy "Note: most of this information is out of date and superceded by the"
.Sy "EGCS install procedures. It is provided for historical reference only."
.Sh SEE ALSO
.Xr gcc 1
.Sh AUTHORS
See the GNU CC manual for the contributors to GNU CC.
.Sh HISTORY
Ron Guilmette implemented the
.Nm protoize
and
.Nm unprotoize
tools.
.Sh BUGS
For instructions on reporting bugs, see the GCC manual.
.Sh CAVEATS
The conversion programs
.Nm protoize
and
.Nm unprotoize
can sometimes
change a source file in a way that won't work unless you rearrange it.
.Pp
.Nm protoize
can insert references to a type name or type tag before
the definition, or in a file where they are not defined.
.Pp
If this happens, compiler error messages should indicate where the
new references are, so fixing the file by hand is straightforward.
.Pp
There are some C constructs which
.Nm protoize
cannot figure out.
For example, it can't determine argument types for declaring a
pointer-to-function variable; this must be done by hand.
.Nm protoize
inserts a comment containing `???' each time it finds such a
variable; all such variables can be found by searching for this
string. ANSI C does not require declaring the argument types of
pointer-to-function types.
.Pp
Using
.Nm unprotoize
can easily introduce bugs. If the program
relied on prototypes to bring about conversion of arguments, these
conversions will not take place in the program without prototypes.
One case in which you can be sure
.Nm unprotoize
is safe is when you
are removing prototypes that were made with
.Nm protoize ;
if the
program worked before without any prototypes, it will work again
without them.
.Pp
You can find all the places where this problem might occur by
compiling the program with the
.Fl Ar Wconversion
option. It prints a
warning whenever an argument is converted.
.Pp
Both conversion programs can be confused if there are macro calls
in and around the text to be converted. In other words, the
standard syntax for a declaration or definition must not result
from expanding a macro. This problem is inherent in the design of
C and cannot be fixed. If only a few functions have confusing
macro calls, you can easily convert them manually.
.Pp
.Nm protoize
cannot get the argument types for a function whose
definition was not actually compiled due to preprocessing
conditionals. When this happens,
.Nm protoize
changes nothing in
regard to such a function.
.Nm protoize
tries to detect such
instances and warn about them.
.Pp
You can generally work around this problem by using
.Nm protoize
step
by step, each time specifying a different set of
.Fl D
options for
compilation, until all of the functions have been converted.
There is no automatic way to verify that you have got them all,
however.
.Pp
Confusion may result if there is an occasion to convert a function
declaration or definition in a region of source code where there
is more than one formal parameter list present. Thus, attempts to
convert code containing multiple (conditionally compiled) versions
of a single function header (in the same vicinity) may not produce
the desired (or expected) results.
.Pp
If you plan on converting source files which contain such code, it
is recommended that you first make sure that each conditionally
compiled region of source code which contains an alternative
function header also contains at least one additional follower
token (past the final right parenthesis of the function header).
This should circumvent the problem.
.Pp
.Nm unprotoize
can become confused when trying to convert a function
definition or declaration which contains a declaration for a
pointer-to-function formal argument which has the same name as the
function being defined or declared. We recommand you avoid such
choices of formal parameter names.
.Pp
It might ne necessary to correct some of the indentation by hand and
break long lines. (The conversion programs don't write lines
longer than eighty characters in any case.)
.Sh COPYING
Copyright 1991, 1992, 1993 Free Software Foundation, Inc.
.Pp
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.
.Pp
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
.Pp
Permission is granted to copy and distribute translations of this
manual into another language, under the above conditions for modified
versions, except that this permission notice may be included in
translations approved by the Free Software Foundation instead of in
the original English.
|