#ifndef UNPRO
#define THISPROG PROTOIZE
#define thisprog protoize
#define Thisprog Protoize
#define otherprog unprotoize
#define from_convention varargs
#define to_convention stdarg
#else
#define THISPROG UNPROTOIZE
#define thisprog unprotoize
#define Thisprog Unprotoize
#define otherprog protoize
#define from_convention stdarg
#define to_convention varargs
#endif
.\"     Man page file for the thisprog program.
.\"     This is badly out of date, especially concerning
.\"     the way of deciding which files to convert.
.\"     Really all this information should be updated and put in gcc.texinfo.
.\"  
.\"     Written by Ron Guilmette (rfg@mcc.com).
.\"  
.\"     Copyright (C) 1989, 1990 Free Software Foundation, Inc.
.\"  
.\"  This file is part of GNU CC.
.\"  
.\"  GNU CC is free software; you can redistribute it and/or modify
.\"  it under the terms of the GNU General Public License as published by
.\"  the Free Software Foundation; either version 1, or (at your option)
.\"  any later version.
.\"  
.\"  GNU CC is distributed in the hope that it will be useful,
.\"  but WITHOUT ANY WARRANTY; without even the implied warranty of
.\"  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
.\"  GNU General Public License for more details.
.\"  
.\"  You should have received a copy of the GNU General Public License
.\"  along with GNU CC; see the file COPYING.  If not, write to
.\"  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
.\"
.TH THISPROG 1 "21 January 1990" ""
.SH NAME
#ifndef UNPRO
thisprog \- convert K&R C source code to ANSI C prototype format
#else
thisprog \- convert ANSI C source code to K&R C (unprototyped) format
#endif
.SH SYNOPSIS
.B thisprog
[
#ifndef UNPRO
.B -VqfnkNlgC
] [
.B -B
.I <dir>
#else
.B -VqfnkN
] [
.B -i
.I <str>
#endif
] [
.B -c
.I <cc opts>
] [
.I file\c
\&... ]
.SH DESCRIPTION
.fi
.ad b
.I Thisprog
aids in the conversion of 
#ifndef UNPRO
K&R C source code files to ANSI C source code files with function prototypes.
This conversion is useful for eliciting more complete
interface checking from ANSI C compilers, or as
a preliminary step in the conversion of C programs to C++.
#else
ANSI C source code files to K&R C source code files without function prototypes
.
This conversion is useful for porting ANSI C programs to
machines for which no ANSI C compiler is available.
#endif
.PP
.I Thisprog
is designed to be used in conjunction
with the GNU C compiler.  The GNU C compiler does preliminary
.I "information gathering"
about functions by analyzing the files to be converted.
The GNU C compiler may be invoked automatically as a result of
running
.I thisprog
so it is important to have it properly installed before attempting
to convert source files via
.I thisprog.
#ifndef UNPRO
.PP
.I Thisprog
actually has two primary functions.  First, It converts
existing function declarations and definitions
to prototype form.
Second, for cases in which functions
are called before they have been declared
(i.e. points of
.I implicit
function declarations),
.I thisprog
can be instructed to
insert new prototype style function declarations
into the source code.
For implicit function declarations,
.I thisprog
can either
insert the new (explicit) function declaration
at the very beginning of the block which contains
the implicit declaration, or (at the user\'s option)
these explicit declarations can be inserted near the tops of the
source files where the implicit declarations occurred.
The insertion of these new (explicit) function
declarations (by thisprog) assures that
.B all
function calls in your source files will be 
checked for the correct
number and types of parameters
during subsequent compilations.
#endif
.PP
.I Thisprog
supports the conversion of both large and small systems of C source
code to
#ifndef UNPRO
prototype
#else
unprototyped
#endif
form.
.I Thisprog
can perform the conversion of an
entire program in one (batch) step.
#ifndef UNPRO
.PP
.I Thisprog
is able to convert entire systems of C source code because
it knows how to use information (gleaned by the C compiler) from one
source file to convert
function definitions and declarations in that same source file or in
other source files (as required).
#endif
.PP
Each conversion of a system of source code to
#ifndef UNPRO
prototyped
#else
unprototyped
#endif
format consists of two major steps.  First, there is an
.I "information gathering"
step.  In this step,
all of the source files that make up a given
executable program are recompiled using the GNU C compiler and using the
.B -fgen-aux-info
option.
These recompilations will be performed automatically by
.I thisprog
on an
.I as needed
basis.
.PP
As individual compilation steps are performed, you may notice
that a side-effect of these compilations is to create files with a
.B .X
suffix in the same directory with the original
.I base
source files being compiled.
During compilation with
.B -fgen-aux-info,
one such
.B .X
file is created for
each
.I base
source file compiled.  These files contain
information about function definitions and declarations and
additional coded information which can be used by
.I thisprog
to convert your source code
automatically to
#ifndef UNPRO
prototyped
#else
unprototyped
#endif
format.
.PP
After a full set of
.B .X
files corresponding to all of the
.B .c
(i.e.
.I base
source) files for an individual
program
have been created,
.I thisprog
performs the actual conversion step.
.PP
Execution of the
.I thisprog
program causes your original source files to be converted such that both
their function declarations and their function definitions are in
#ifndef UNPRO
prototyped
#else
unprototyped
#endif
format.
After the conversion of your system, you will be
left with a set of similar (but converted) source files
with the same names as your original files.
.PP
Before it writes each converted file back to disk,
.I thisprog
attempts to rename the original file, giving it a
.B .save
suffix.
It then creates a new output file
with the same name that the original file had.
This ensures that if there were any hard links to the original
input files, these will not be altered by the conversion process.
.PP
WARNING!  If for any given original file, a save file already exists,
.I thisprog
will assume that the existing save file contains a backup of the
original file as it existed before any conversions were applied.
Thus, if there is an existing save file,
.I thisprog
will not overwrite this existing save file, and no new backup of
that particular original file will be made during that run of
.I thisprog.
.PP
An important safety feature of
.I thisprog
is that it normally only tries to convert files for which you have both
read and write permissions.  Also,
.I thisprog
will normally only convert files located in directories that you
have both search and write permissions for.
.PP
Another safety feature is that
.I thisprog
will not normally convert files which
are located in
.I system
include directories.
A
.I system
include directory is defined by
.I thisprog
as either
.B /usr/include
(or any of its subdirectories)
or a directory whose full absolute pathname includes
either
.B gcc-include
or
.B g++-include.
.PP
Most of the above safety features can be overridden by using the
.B \-f
(force) option (see below),
but even when
.B \-f
is used, you cannot force the conversion of files for which you
do not at least have read permission, or files in directories that you do not
at least have write permission for.
.PP
Note that
.I thisprog
will make no attempt to convert definitions
#ifndef UNPRO
or declarations
#endif
of functions which accept a variable number of arguments
and which are written using the
.I from_convention
conventions.
All such function definitions
#ifndef UNPRO
and declarations
#endif
must be converted manually to the
.I to_convention
conventions.
Warnings are automatically issued for
.I from_convention
function definitions
#ifndef UNPRO
and declarations
#endif
which are left unconverted by
.I thisprog.
.SH OPTIONS
.I Thisprog
recognizes the following options:
.TP
.B \-V
Version number.  Causes the current version number to be
printed on stderr.
.TP
.B \-q
Quiet mode.
Normally,
.I thisprog
may issue many verbose warnings concerning noteworthy conditions.
These warnings can often be helpful to the overall conversion effort.
Users who prefer not to see such messages can use the
.B \-q
option which suppresses most such warnings.
.TP
.B \-f
Force mode.
Use of this option overrides the normal safety
features of
.I thisprog.
It allows for attempts to convert system include files,
and files not writable by you.
These conversions are still subject to all normal
file protections provided by the operating system.
This option should be used only with extreme caution.
It can be especially dangerous to use this option when logged on as
.I root.
Note that when this option is used, you are allowed to convert even files
that you do not have write access to.  So long as you have write access
to the containing directory, conversion may occur.
.TP
.B \-n
No convert mode.  Do not actually perform any conversions on base source files
or on include files.  Rather, simply do all steps leading up to conversion
and then print a list (to stdout) of the names of all files which would
actually be modified if the conversions were actually performed.  This option
may be useful to you if you are converting a system of source files
that you are unfamiliar with.  In such cases, you may need to verify
ahead of time that include files which belong to other people or to
other projects will not be modified by running
.I thisprog.
Use of this option also implicitly enables
.I keep mode.
(See the
.B \-k
option below.)
.TP
.B \-k
Keep mode.  Normally,
.I thisprog
reads the information in the
.B .X
files created by the GNU C compiler, and then
immediately deletes these files (since they will no longer be
valid or useful after conversion).  When the
.B \-k
option is used however, the
.B .X
files are not deleted during conversion.
.TP
.B -N
No save mode.  When this option is used, no attempt is made to
make backups of original files (by renaming them such that they have
an added
.B .save
suffix).
Use this option with extreme caution, and
only when you have previously backed up
all of the files that might be converted
by running
.I thisprog.
(See the
.B -n
option above.)
.TP
.B \-c <cc opts>
Specify compile options.  The
.B \-c
option can be used as a means of passing on important compilation
options to the C compiler.  It may often be necessary to use this option
to pass command line preprocessor definitions on to the compilation step.
Note that The compile options must be given as a single argument to
.I thisprog.
If you have more than one
compilation option, you will have to quote the entire set of
compilation options in order to keep the shell from treating
them as separate arguments to
.I thisprog.
Note also that certain options are automatically suppressed by
.I thisprog
and cannot be passed on to the compiler (i.e.
.B "-g, -O, -c, -S,"
and
.B "-o"
are suppressed).
#ifndef UNPRO
.TP
.B \-C
C++ conversion mode.
Normally,
.I thisprog
writes its (converted) output files back to files of the same names
as the original (unconverted) input files.
In C++ conversion mode,
after each output file is written,
a check is made to see if the given output file has a
.B .c
suffix.  If it does, then the given file is renamed, and its suffix
is changed to
.B .C.
This makes the output file
acceptable as a C++ input file for either the GNU C++ compiler or
for the Cfront translator.
.TP
.B \-l
Add explicit local declarations.  This option causes
.I thisprog
to insert
explicit declarations for functions that were only implicitly declared
in the original source code.  When the
.B \-l
option is used, lists of additional new
explicit function declarations are inserted near the
starts of blocks where explicit function declarations took place.
(See also the
.B \-g
option below.)
.TP
.B \-g
Add explicit global declarations.  This option causes
.I thisprog
to insert
explicit declarations for functions that were only implicitly declared
in your original source code.  When the
.B \-g
option is used, a list of additional new
explicit function declarations is inserted just before the
first function definition in each individual source file that previously
contained implicit declarations.
(See also the
.B \-l
option above.)
.TP
.B \-B <dir>
Alternate library directory option.  Use this option to specify that
.I thisprog
should attempt to find the file
.B SYSCALLS.c.X
in the alternate directory indicated in the option.
#else
.TP
.B \-i <str>
Indent string option.
This option can be used to specify a string to use when indenting
lines containing declarations for formal parameter variables.
The default indentation string for such lines is a sequence of five spaces
(i.e.\ GNU style indentation) but you may use this option to specify
any other string that you like (e.g.\ a tab character).
Note that
the shell has its own interpretations for blanks and tabs, so you
will generally have to quotes the argument given in the
.B -i
option.
#endif
.SH EXAMPLES
Assume that you have
a directory with
all of the files for your system in it.  Also
assume that your system consists of two
executable programs, one built from the files
.B s1.c, s2.c,
and
.B s3.c,
and the other built from the files
.B s4.c
and
.B s5.c.
Finally, assume that these source files share some common include files.
.PP
In order to properly convert such a system of programs, you
would need to perform the steps shown below.
.sp 1
.in +0.5i
.ft B
thisprog s1.c s2.c s3.c
.br
thisprog s4.c s5.c
.sp 1
.ft R
.in -0.5i
.PP
In the example above, the first invocation of
.I thisprog
causes three
.B .X
files (called
.B s1.c.X, s2.c.X,
and
.B s3.c.X)
to be created.
These files are generated automatically by
.I thisprog
(which invokes the GNU C compiler to create them).
These files contain information about function definitions and declarations
.I both
for their corresponding
.B .c
files and for any files
which are included by these
.I base
.B .c
files.
.PP
After
.I thisprog
has invoked the compiler for each of the files which make up
.I prog1,
it performs the actual conversion of these base files (and
may perform some conversion of their include files
depending upon the information available in the
.B .X
files).
Finally, after performing all necessary conversions,
.I thisprog
automatically deletes the files
.B s1.c.X, s2.c.X,
and
.B s3.c.X.
.PP
After performing the conversion for
.I prog1,
(as illustrated above)
you would then
request
.I thisprog
to convert all of the files which make up
.I prog2
in a similar fashion.
This step would create two more
.B .X
files (called
.B s4.c.X
and
.B s5.c.X).
As with the conversion of
.I prog1,
.I thisprog
will automatically generate any needed
.B .X
files (by invoking the GNU C compiler),
will perform the conversion of all of the given
.I base
source files (and possibly do some conversion on include files),
and will finish up by
automatically deleting the
.B .X
files that were generated during this run.
.PP
You may occasionally find that you need to convert a
particular program which
consists of several
.I base
source files, some of which must be compiled
with unusual options.
In such cases, you can still convert the program via
a special mechanism.
For each
.I base
source file which requires special compilation options,
you can create a corresponding
.B .X
file for the
.I base
file
.I (before
invoking
.I thisprog).
You would do this by invoking the GNU C compiler directly
with the required special options, and with the
.B -fgen-aux-info
option.
.I Thisprog
is smart enough to use existing
.B .X
files (when they are available and when they are up to date) so creating
.B .X
files ahead of time with the GNU C compiler
is an easy way to accommodate unusual compilation options for individual
.I base
files.
.PP
Note that
.I thisprog
checks each preexisting
.B .X
file before it tries to use it in order
to insure that it is up-to-date
with respect to all of the source files
that it contains information about.
If this check fails,
.I thisprog
will automatically
invoke the GNU C compiler (with default options) to recreate the needed
.B .X file.
.SH CAVEATS
#ifndef UNPRO
The
.I thisprog
program doesn\'t just get information from your own
.B .X
files.  Every time
.I thisprog
executes, it also reads a file
.B SYSCALLS.c.X
from some standard installation directory
(if it exists) to obtain a pre-written set of function prototypes for
various standard system-supplied functions.  These prototypes are effectively
added to the set of prototypes which 
.I thisprog
can use to perform prototype substitutions on your source files.
If the source code for any individual programs that you are converting
contains its own definitions
for functions with the same names as standard system-supplied functions,
.I thisprog
is intelligent enough to allow the parameter typing from your own
function definitions to take precedence over the information
contained in the
.B SYSCALLS.c.X
file.
.PP
.I Thisprog
changes
#ifndef UNPRO
(and possibly adds to)
#endif
your original source code
in ways which may require you to rearrange the placement of other
items in your code.  Specifically, it is often necessary to move
around type definitions or declarations for
.B "enum, struct,"
and
.B union
types.
#ifndef UNPRO
.PP
Usage of
.I thisprog
may cause source lines to grow quite long and thereby become difficult
to read and to edit.  Fortunately,
.I thisprog
is intelligent enough to automatically break up very long lines containing
newly inserted function prototypes whenever the length of
any given output line would otherwise exceed 79 columns (including tabs
to standard UNIX tab stops).
.PP
Note that in traditional (K&R) C, it was not possible to declare
parameter types for
.B "function pointer"
parameters and variables.
Such function pointer variables could only be
declared with empty parameter lists in traditional C.  Unfortunately,
this means that
.I thisprog
typically
has no adequate source of information from which to manufacture
appropriate (prototyped) formal argument lists for such function pointer
variables.  Thus, declarations of function pointer variables and
parameters will not be properly converted by
.I thisprog.
In the case of function pointer variables,
.I thisprog
currently  performs no conversion whatsoever.
In the case of function pointer parameters however,
.I thisprog
will attempt to do half-hearted conversions by 
manufacturing formal parameter lists for such parameters.
These manufactured formal parameter lists will look
like \`\.\.\.\'.
#endif
.PP
#endif
It is naive to assume that the conversions performed by
.I thisprog
are sufficient to make your source code completely compatible with
#ifndef UNPRO
ANSI C or C++.
#else
K&R C.
#endif
The automatic conversion of your source files via
.I thisprog
is only one step (albeit a big one) towards
full conversion.  A full conversion may also require
lots of editing "by hand".
.PP
.I Thisprog
only converts function declarations and definitions.  No conversion of
.I types
(such as function types and pointer-to-function types)
contained in
.B typedef
statements is attempted.  These must be converted manually.
#ifdef UNPRO
.PP
Naive conversion of source code via
.I thisprog
may introduce bugs into the resulting (converted) code unless you are very
careful.  The reason for this is rather subtle.
Basically, when a call is made to a prototyped function, the types of
some of the parameter values in the call may be implicitly converted
to the types of the corresponding formal parameters (as declared in the
function prototype).  These implicit conversions can (occasionally) involve
changes of representation for the passed values (for instance from int
to float).  Unfortunately, once your code has been converted via
.I thisprog,
these implicit conversions will no longer take place within the function
calls which require them.
.PP
The only remedy for this problem (currently) is for users of
.I thisprog
to make sure that explicit casts are inserted into calls which will force
these type conversions to occur even in the absence of function
prototypes.  Users can determine the exact set of places where such explicit
casts may be required by compiling all code to be converted using the
.B -Wconversion
option to GCC prior to conversion.  The warnings produced by
.B -Wconversion
will indicate those places in the original source code where explicit
casts must be inserted.  Once these explicit casts have been manually
inserted (and the warnings from
.B -Wconversion
eliminated), conversion may be performed without any possibility of
generating code which is incorrect due to missed type conversions.
#else
.PP
When converting to full prototype format, it may often be the case that
complete information regarding the types of function parameters is not
actually available in the original (K&R) code.
This will almost always be the case for parameters whose types are
pointer-to-function types.
For pointer-to-function parameters, it it customary (in K&R C) to
omit the types of the arguments which the pointed-to function expects
to receive.
In cases where the argument types for function pointer parameters are
not present in the original source code,
.I thisprog
notes this lack of complete information in a useful (but harmless)
way.  After conversion, the (prototyped) parameter lists for 
pointer-to-function parameters are represented in the converted
files as comments which contain the string "???".  You can easily
locate all such strings after conversion (using your favorite editor)
and replace them with more complete information regarding the
true parameter profile of the pointed-to functions.
#endif
.SH WARNINGS
There are numerous possible warning and error messages which
.I thisprog
may issue for strange circumstances (e.g.\ missing input
files, etc.) or for noteworthy conditions in the source code being converted.
These should all be self-explanatory.
If any message is not self-explanatory, it\'s a bug.  Please report it.
.SH FILES
.ta 3.0i
/usr/local/bin/gcc	GNU C compiler
.br
/usr/local/bin/thisprog	the thisprog program
#ifndef UNPRO
.br
/usr/local/lib/SYSCALLS.c.X	aux info file for system functions
#endif
.SH "SEE ALSO"
gcc(1), g++(1), otherprog(1)
.SH BUGS
.I Thisprog
can easily be confused by
source code which has
macro calls in the
vicinity of something which it has to convert.
Fortunately, such cases seem to be rare in practice.
This is an inherent problem with the compiler
based approach to information gathering and will likely never be fixed.
When it does become confused,
.I thisprog
will still proceed to convert the file it is working on as much as
possible.  Only the particularly confusing function definitions and
declarations will fail to be converted.  These can subsequently be converted
manually.
.PP
Due to the method currently used to gather information,
.I thisprog
will fail to convert function declarations and definitions which
are located in conditional compilation sections which were
.I "preprocessed out"
during the creation of the
.B .X
files used for conversion.
You can generally work around this problem by doing
repeated conversion steps using
.I thisprog,
each with a different set of compilation options (i.e.\ preprocessor
symbol definitions) but assuring complete conversion can
currently only be done by visual inspection.
Currently,
.I thisprog
attempts to find function definitions which were
.I "preprocessed out"
and to issues warnings for such cases.
A later revision of
.I thisprog
#ifndef UNPRO
may also be able to detect cases where function declarations
have been
.I "preprocessed out"
and to issue appropriate warnings for those cases also.
#else
may be able to convert both function declarations and function
definitions which have been
.I "preprocessed out."
#endif
.PP
Currently,
.I thisprog
makes no attempt to convert declarations of
.I "pointer to function"
types, variables, or fields.
#ifdef UNPRO
A later version of
.I thisprog
may attempt to perform conversions of these 
declarative items also.
#endif
.PP
Currently,
.I from_convention
functions definitions
#ifndef UNPRO
and declarations
#endif
must be converted by hand to use the
.I to_convention
convention.
It is possible that a subsequent version of
.I thisprog
will make some attempt to do these conversions automatically.
.PP
.I Thisprog
may get confused if it finds that it has 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.
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.
#ifdef UNPRO
.PP
.I Thisprog
can become confused when trying to convert a function
definition or declaration
which contains a declaration for a
.I pointer-to-function
formal argument
which has the same name as the function being defined or
declared.
Such unfortunate choices of formal parameter names are discouraged.
#endif
.PP
Bugs (and requests for reasonable enhancements) should be reported to
bug-gcc@prep.ai.mit.edu.  Bugs may actually be fixed if they can be easily
reproduced, so it is in your interest to report them
in such a way that reproduction is easy.
.SH COPYING
Copyright (c) 1989, 1990 Free Software Foundation, Inc.
.sp 1
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.
.sp 1
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.
.sp 1
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.
.SH AUTHORS
Written by Ronald F.\ Guilmette at the Microelectronics and Computer Technology
Corporation (MCC).  Generously donated by MCC to the Free Software
Foundation.
.sp 1
See the GNU C Compiler Manual for a list of contributors to GNU C.
