mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-24 13:24:56 +08:00
161 lines
6.6 KiB
Plaintext
161 lines
6.6 KiB
Plaintext
@(#) README 1.6 93/06/18 22:29:34
|
|
|
|
unproto - Compile ANSI C with traditional UNIX C compiler
|
|
|
|
Description:
|
|
------------
|
|
|
|
This is a filter that sits in between the UNIX C preprocessor and the
|
|
next UNIX C compiler stage, on the fly transforming ANSI C syntax to
|
|
old C syntax. Line number information is preserved so that compiler
|
|
diagnostics still make sense. It runs at roughly the same speed as
|
|
/lib/cpp, so it has negligible impact on compilation time.
|
|
|
|
Typically, the program is invoked by the native UNIX C compiler as an
|
|
alternate preprocessor. The unprototyper in turn invokes the native C
|
|
preprocessor and massages its output. Similar tricks can be used with
|
|
the lint(1) command. Details are given below.
|
|
|
|
The filter rewrites ANSI-style function headings, function pointer
|
|
types and type casts, function prototypes, and combinations thereof.
|
|
Unlike some other unprototypers, this one is fully recursive and does
|
|
not depend on source file layout (see the example.c file).
|
|
|
|
Besides the rewriting of argument lists, the program does the following
|
|
transformations: string concatenation, conversion of \a and \x escape
|
|
sequences to their octal equivalents, translation of the __TIME__ and
|
|
__DATE__ macros, optional mapping of `void *' to `char *', and optional
|
|
mapping of plain `void' to `int'.
|
|
|
|
The unprototyper provides hooks for compilers that require special
|
|
tricks for variadic functions (fortunately, many don't). <stdarg.h>
|
|
support is provided for sparc, mips, mc68k, 80x86, vax, and others.
|
|
|
|
The program has been tested with SunOS 4.1.1 (sparc), Ultrix 4.0 and
|
|
4.2 (mips), and Microport System V Release 2 (80286). It should work
|
|
with almost every PCC-based UNIX C compiler.
|
|
|
|
Restrictions:
|
|
-------------
|
|
|
|
A description of restrictions and workarounds can be found in the
|
|
unproto.1 manual page.
|
|
|
|
Problems fixed with this release:
|
|
---------------------------------
|
|
|
|
Prototypes and definitions of functions returning pointer to function
|
|
were not rewritten to old style.
|
|
|
|
Operation:
|
|
----------
|
|
|
|
This package implements a non-default C preprocessor (the output from
|
|
the default C preprocessor being piped through the unprototyper). How
|
|
one tells the C compiler to use a non-default preprocessor program is
|
|
somewhat compiler-dependent:
|
|
|
|
SunOS 4.x: cc -Qpath directory_with_alternate_cpp ...
|
|
|
|
Ultrix 4.x: cc -tp -hdirectory_with_alternate_cpp -B ...
|
|
|
|
System V.2: cc -Bdirectory_with_alternate_cpp/ -tp ...
|
|
|
|
Examples of these, and others, can be found in the acc.sh shell script
|
|
that emulates an ANSI C compiler. Your C compiler manual page should
|
|
provide the necessary information.
|
|
|
|
A more portable, but less efficient, approach relies on the observation
|
|
that almost every UNIX C compiler supports the -E (write preprocessor
|
|
output to stdout) and -P options (preprocess file.c into file.i). Just
|
|
add the following lines to your Makefiles:
|
|
|
|
.c.o:
|
|
$(CC) $(CFLAGS) -E $*.c | unproto >$*.i # simulate -P option
|
|
$(CC) $(CFLAGS) -c $*.i
|
|
rm -f $*.i
|
|
|
|
On some systems the lint(1) command is just a shell script, and writing
|
|
a version that uses the unprototyper should not be too hard. With SunOS
|
|
4.x, /usr/bin/lint is not a shell script, but it does accept the same
|
|
syntax as the cc(1) command for the specification of a non-default
|
|
compiler pass.
|
|
|
|
You may have to do some research on the lint command provided with your
|
|
own machine.
|
|
|
|
Configuration:
|
|
--------------
|
|
|
|
Check the contents of the `stdarg.h' file provided with this package.
|
|
This file serves a dual purpose: (1) on systems that do not provide a
|
|
stdarg.h file, it should be included by C source files that implements
|
|
ANSI-style variadic functions; (2) it is also used to configure the
|
|
unprototyper so that it emits the proper magic when it sees `...'.
|
|
|
|
The `stdarg.h' file has support for sparc, mips, and for compilers that
|
|
pass arguments via the stack (typical for 80*86, mc68k and vax). It
|
|
gives general hints for other compilers.
|
|
|
|
The other sample header files (stddef.h and stdlib.h) are not required
|
|
to build the unprototyper.
|
|
|
|
The `varargs.c' file provided with this package can be used to verify
|
|
that the `stdarg.h' file has been set up correctly.
|
|
|
|
If your C compiler has no hooks for an alternate preprocessor (the
|
|
unprototyper will be used as: `cc cflags -E file.c | unproto >file.i'),
|
|
build the `unproto' executable without the `PIPE_THROUGH_CPP' feature.
|
|
Details are given in the Makefile.
|
|
|
|
Otherwise, the `cpp.sh' shell script can be used to set up the pipe
|
|
between the native C preprocessor and the unprototyper command. The
|
|
script assumes that the unprototyper binary is called `unproto', and
|
|
that it was compiled without the `PIPE_THROUGH_CPP' feature. See the
|
|
Makefile and the `cpp.sh' script for details and for a description of
|
|
possible problems with this approach.
|
|
|
|
The overhead and problems of shell-script interpretation can be avoided
|
|
by letting the unprototyper itself pipe its standard input through the
|
|
C preprocessor. For this mode of operation, the unprototyper binary
|
|
should be called `cpp', and the `unproto.c' source file should be
|
|
compiled with the `PIPE_THROUGH_CPP' macro defined as the absolute
|
|
pathname of the native C preprocessor (usually `/lib/cpp'). See the
|
|
Makefile for details.
|
|
|
|
Installation:
|
|
-------------
|
|
|
|
Install the `unproto.1' manual page in a suitable place. If your system
|
|
does not provide a `stdarg.h' file, find a suitable place for the one
|
|
provided with the unprototyper and install it there. The same goes for
|
|
the sample stddef.h and stdlib.h files; make sure that the definitions
|
|
in there apply to your environment. Most or all of the latter files are
|
|
already part of Ultrix 4.x and SunOS 4.1.1.
|
|
|
|
The ANSI float.h and limits.h files can be generated with the config
|
|
program by Steve Pemberton (comp.sources.misc volume 10, issue 62,
|
|
available from ftp.uu.net as comp.sources.misc/volume10/config42.Z).
|
|
|
|
If you run the unprototyper with "cc -E" just install the `unproto'
|
|
binary; the `cpp' and `acc' shell scripts will not be needed.
|
|
|
|
If you use the `cpp' shell script to pipe the preprocessor output
|
|
through the unprototyper program, install the `unproto' binary in a
|
|
place where the `cpp' shell script can find it, and install the `cpp'
|
|
shell script in a suitable place. Edit the `acc' shell script and
|
|
install it in a suitable place. From now on, type `acc' instead of
|
|
`cc'.
|
|
|
|
If the unprototyper itself opens the pipe to the C preprocessor (i.e.
|
|
the unprototyper was built with the `PIPE_THROUGH_CPP' macro defined),
|
|
install the `cpp' unprototyper binary in a suitable place. Edit the
|
|
`acc' shell script and install it in a suitable place. From now on,
|
|
type `acc' instead of `cc'.
|
|
|
|
Wietse Venema
|
|
wietse@wzv.win.tue.nl
|
|
Mathematics and Computing Science
|
|
Eindhoven University of Technology
|
|
The Netherlands
|