94a883658e
* It now knows about the existence of #elif which would have caused it to produce incorrect results in some situations. * It can now process #if and #elif lines according to the values of symbols that are specified on the command line. The expression parser is only a simple subset of what C allows but it should be sufficient for most real-world code (it can cope with everything it finds in xterm). * It has an option for printing all of the symbols that might control #if processing. The unifdefall script uses this option along with cpp -dM to strip all #ifs from a file. * It has much larger static limits. * It handles nested #ifs much more completely. There have also been many style improvements: KNF; ANSI function definitions; all global stuff moved to the top of the file; use stdbool instead of h0h0bool; const-correctness; err(3) instead of fprintf(stderr, ...); enum instead of #define; commentary. I used NetBSD's unifdef as the basis of this since it has received the most attention over the years. PR: 37454 Reviewed by: markm, dwmalone Approved by: dwmalone (mentor) MFC after: 3 weeks
268 lines
6.3 KiB
Groff
268 lines
6.3 KiB
Groff
.\" Copyright (c) 1985, 1991, 1993
|
|
.\" The Regents of the University of California. All rights reserved.
|
|
.\"
|
|
.\" This code is derived from software contributed to Berkeley by
|
|
.\" Dave Yost. Support for #if and #elif was added by Tony Finch.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
.\" must display the following acknowledgement:
|
|
.\" This product includes software developed by the University of
|
|
.\" California, Berkeley and its contributors.
|
|
.\" 4. Neither the name of the University nor the names of its contributors
|
|
.\" may be used to endorse or promote products derived from this software
|
|
.\" without specific prior written permission.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
.\" SUCH DAMAGE.
|
|
.\"
|
|
.\" @(#)unifdef.1 8.2 (Berkeley) 4/1/94
|
|
.\" $dotat: things/unifdef.1,v 1.23 2002/05/14 22:15:03 fanf Exp $
|
|
.\" $FreeBSD$
|
|
.\"
|
|
.Dd April 26, 2002
|
|
.Dt UNIFDEF 1
|
|
.Os
|
|
.Sh NAME
|
|
.Nm unifdef ,
|
|
.Nm unifdefall
|
|
.Nd remove preprocessor conditionals from code
|
|
.Sh SYNOPSIS
|
|
.Nm
|
|
.Op Fl clst
|
|
.Oo
|
|
.Fl I Ns Ar path
|
|
.Fl D Ns Ar sym Ns Oo = Ns Ar val Oc
|
|
.Fl U Ns Ar sym
|
|
.Fl iD Ns Ar sym Ns Oo = Ns Ar val Oc
|
|
.Fl iU Ns Ar sym
|
|
.Oc
|
|
.Ar ...
|
|
.Op Ar file
|
|
.Nm unifdefall
|
|
.Op Fl I Ns Ar path
|
|
.Ar ...
|
|
.Ar file
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Nm
|
|
utility selectively processes conditional
|
|
.Xr cpp 1
|
|
directives.
|
|
It removes from a file
|
|
both the directives
|
|
and any additional text that they specify should be removed,
|
|
while otherwise leaving the file alone.
|
|
.Pp
|
|
The
|
|
.Nm
|
|
utility acts on
|
|
.Li #if ,
|
|
.Li #ifdef ,
|
|
.Li #ifndef ,
|
|
.Li #elif ,
|
|
.Li #else ,
|
|
and
|
|
.Li #endif
|
|
lines,
|
|
and it understands only the commonly-used subset
|
|
of the expression syntax for
|
|
.Li #if
|
|
and
|
|
.Li #elif
|
|
lines.
|
|
Integer values of symbols defined on the command line,
|
|
the
|
|
.Fn defined
|
|
operator applied to symbols defined or undefined on the command line,
|
|
the operators
|
|
.Li ! ,
|
|
.Li < ,
|
|
.Li > ,
|
|
.Li <= ,
|
|
.Li >= ,
|
|
.Li == ,
|
|
.Li != ,
|
|
.Li && ,
|
|
.Li || ,
|
|
and parenthesized expressions
|
|
are handled,
|
|
and anything more complicated is passed through unharmed.
|
|
.Li #ifdef
|
|
and
|
|
.Li #ifndef
|
|
directives are only processed
|
|
if the symbol is specified on the command line,
|
|
otherwise they are also passed though unchanged.
|
|
.Pp
|
|
The
|
|
.Nm
|
|
utility also understands just enough about C
|
|
to know when one of the directives is inactive
|
|
because it is inside
|
|
a comment,
|
|
or a single or double quote.
|
|
Parsing for quotes is very simplistic:
|
|
when it finds an open quote,
|
|
it ignores everything (except escaped quotes)
|
|
until it finds a close quote, and
|
|
it will not complain if it gets
|
|
to the end of a line and finds no backslash for continuation.
|
|
.Pp
|
|
A script called
|
|
.Nm unifdefall
|
|
can be used to remove all conditional
|
|
.Xr cpp 1
|
|
directives from a file.
|
|
It uses
|
|
.Li unifdef -s
|
|
and
|
|
.Li cpp -dM
|
|
to get lists of all the controlling symbols
|
|
and their definitions (or lack thereof),
|
|
then invokes
|
|
.Li unifdef
|
|
with appropriate arguments to process the file.
|
|
.Pp
|
|
Available options:
|
|
.Bl -tag -width Ds
|
|
.It Fl D Ns Ar sym Ns Oo = Ns Ar val Oc
|
|
Specify that a symbol is defined,
|
|
and optionally specify what value to give it
|
|
for the purpose of handling
|
|
.Li #if
|
|
and
|
|
.Li #elif
|
|
directives.
|
|
.Pp
|
|
.It Fl U Ns Ar sym
|
|
Specify that a symbol is undefined.
|
|
If the same symbol appears in more than one argument,
|
|
the last occurrence dominates.
|
|
.Pp
|
|
.It Fl c
|
|
If the
|
|
.Fl c
|
|
flag is specified,
|
|
then the operation of
|
|
.Nm
|
|
is complemented,
|
|
i.e. the lines that would have been removed or blanked
|
|
are retained and vice versa.
|
|
.Pp
|
|
.It Fl l
|
|
Replace removed lines with blank lines
|
|
instead of deleting them.
|
|
.Pp
|
|
.It Fl s
|
|
Instead of processing the input file as usual,
|
|
this option causes
|
|
.Nm
|
|
to produce a list of symbols that appear in expressions
|
|
that
|
|
.Nm
|
|
understands.
|
|
It is useful in conjunction with the
|
|
.Fl dM
|
|
option of
|
|
.Xr cpp 1
|
|
for creating
|
|
.Nm
|
|
command lines.
|
|
.Pp
|
|
.It Fl t
|
|
Disables parsing for C comments and quotes, which is useful
|
|
for plain text.
|
|
.Pp
|
|
.It Fl iD Ns Ar sym Ns Oo = Ns Ar val Oc
|
|
.It Fl iU Ns Ar sym
|
|
Ignore ifdefs.
|
|
If your C code uses ifdefs to delimit non-C lines,
|
|
such as comments
|
|
or code which is under construction,
|
|
then you must tell
|
|
.Nm
|
|
which symbols are used for that purpose so that it won't try to parse
|
|
for quotes and comments
|
|
inside those ifdefs.
|
|
One specifies ignored symbols with
|
|
.Fl iD Ns Ar sym Ns Oo = Ns Ar val Oc
|
|
and
|
|
.Fl iU Ns Ar sym
|
|
similar to
|
|
.Fl D Ns Ar sym Ns Oo = Ns Ar val Oc
|
|
and
|
|
.Fl U Ns Ar sym
|
|
above.
|
|
.Pp
|
|
.It Fl I Ns Ar path
|
|
Specifies to
|
|
.Nm unifdefall
|
|
an additional place to look for
|
|
.Li #include
|
|
files.
|
|
This option is ignored by
|
|
.Nm
|
|
for compatibility with
|
|
.Xr cpp 1
|
|
and to simplify the implementation of
|
|
.Nm unifdefall .
|
|
.El
|
|
.Pp
|
|
The
|
|
.Nm
|
|
utility copies its output to
|
|
.Em stdout
|
|
and will take its input from
|
|
.Em stdin
|
|
if no
|
|
.Ar file
|
|
argument is given.
|
|
.Pp
|
|
The
|
|
.Nm
|
|
utility works nicely with the
|
|
.Fl D Ns Ar sym
|
|
option of
|
|
.Xr diff 1 .
|
|
.Sh SEE ALSO
|
|
.Xr cpp 1 ,
|
|
.Xr diff 1
|
|
.Sh DIAGNOSTICS
|
|
.Bl -item -compact
|
|
.It
|
|
Inappropriate elif, else or endif.
|
|
.It
|
|
Premature
|
|
.Tn EOF
|
|
with line numbers of the unterminated
|
|
.Li #ifdefs .
|
|
.El
|
|
.Pp
|
|
Exit status is 0 if output is exact copy of input, 1 if not, 2 if trouble.
|
|
.Sh BUGS
|
|
Expression evaluation is very limited.
|
|
.Pp
|
|
Doesn't work correctly if input contains null characters.
|
|
.Sh HISTORY
|
|
The
|
|
.Nm
|
|
command appeared in
|
|
.Bx 4.3 .
|