xref: /freebsd/contrib/unifdef/unifdef.1 (revision 049b7608f41bf4e93ac6de718c45bef261f6977d)
1fb3ef04dSDag-Erling Smørgrav.\" Copyright (c) 1985, 1991, 1993
2fb3ef04dSDag-Erling Smørgrav.\"	The Regents of the University of California.  All rights reserved.
3fb3ef04dSDag-Erling Smørgrav.\" Copyright (c) 2002 - 2015 Tony Finch <dot@dotat.at>.  All rights reserved.
4fb3ef04dSDag-Erling Smørgrav.\"
5fb3ef04dSDag-Erling Smørgrav.\" This code is derived from software contributed to Berkeley by
6fb3ef04dSDag-Erling Smørgrav.\" Dave Yost. It was rewritten to support ANSI C by Tony Finch.
7fb3ef04dSDag-Erling Smørgrav.\"
8fb3ef04dSDag-Erling Smørgrav.\" Redistribution and use in source and binary forms, with or without
9fb3ef04dSDag-Erling Smørgrav.\" modification, are permitted provided that the following conditions
10fb3ef04dSDag-Erling Smørgrav.\" are met:
11fb3ef04dSDag-Erling Smørgrav.\" 1. Redistributions of source code must retain the above copyright
12fb3ef04dSDag-Erling Smørgrav.\"    notice, this list of conditions and the following disclaimer.
13fb3ef04dSDag-Erling Smørgrav.\" 2. Redistributions in binary form must reproduce the above copyright
14fb3ef04dSDag-Erling Smørgrav.\"    notice, this list of conditions and the following disclaimer in the
15fb3ef04dSDag-Erling Smørgrav.\"    documentation and/or other materials provided with the distribution.
16fb3ef04dSDag-Erling Smørgrav.\" 3. Neither the name of the University nor the names of its contributors
17fb3ef04dSDag-Erling Smørgrav.\"    may be used to endorse or promote products derived from this software
18fb3ef04dSDag-Erling Smørgrav.\"    without specific prior written permission.
19fb3ef04dSDag-Erling Smørgrav.\"
20fb3ef04dSDag-Erling Smørgrav.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21fb3ef04dSDag-Erling Smørgrav.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22fb3ef04dSDag-Erling Smørgrav.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23fb3ef04dSDag-Erling Smørgrav.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24fb3ef04dSDag-Erling Smørgrav.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25fb3ef04dSDag-Erling Smørgrav.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26fb3ef04dSDag-Erling Smørgrav.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27fb3ef04dSDag-Erling Smørgrav.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28fb3ef04dSDag-Erling Smørgrav.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29fb3ef04dSDag-Erling Smørgrav.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30fb3ef04dSDag-Erling Smørgrav.\" SUCH DAMAGE.
31fb3ef04dSDag-Erling Smørgrav.\"
32fb3ef04dSDag-Erling Smørgrav.Dd December 3, 2015
33fb3ef04dSDag-Erling Smørgrav.Dt UNIFDEF 1 PRM
34fb3ef04dSDag-Erling Smørgrav.Os " "
35fb3ef04dSDag-Erling Smørgrav.Sh NAME
36fb3ef04dSDag-Erling Smørgrav.Nm unifdef , unifdefall
37fb3ef04dSDag-Erling Smørgrav.Nd remove preprocessor conditionals from code
38fb3ef04dSDag-Erling Smørgrav.Sh SYNOPSIS
39fb3ef04dSDag-Erling Smørgrav.Nm
40fb3ef04dSDag-Erling Smørgrav.Op Fl bBcdehKkmnsStV
41fb3ef04dSDag-Erling Smørgrav.Op Fl I Ns Ar path
42fb3ef04dSDag-Erling Smørgrav.Op Fl [i]D Ns Ar sym Ns Op = Ns Ar val
43fb3ef04dSDag-Erling Smørgrav.Op Fl [i]U Ns Ar sym
44fb3ef04dSDag-Erling Smørgrav.Ar ...
45fb3ef04dSDag-Erling Smørgrav.Op Fl f Ar defile
46fb3ef04dSDag-Erling Smørgrav.Op Fl x Bro Ar 012 Brc
47fb3ef04dSDag-Erling Smørgrav.Op Fl M Ar backext
48fb3ef04dSDag-Erling Smørgrav.Op Fl o Ar outfile
49fb3ef04dSDag-Erling Smørgrav.Op Ar infile ...
50fb3ef04dSDag-Erling Smørgrav.Nm unifdefall
51fb3ef04dSDag-Erling Smørgrav.Op Fl I Ns Ar path
52fb3ef04dSDag-Erling Smørgrav.Ar ...
53fb3ef04dSDag-Erling Smørgrav.Ar file
54fb3ef04dSDag-Erling Smørgrav.Sh DESCRIPTION
55fb3ef04dSDag-Erling SmørgravThe
56fb3ef04dSDag-Erling Smørgrav.Nm
57fb3ef04dSDag-Erling Smørgravutility selectively processes conditional
58fb3ef04dSDag-Erling Smørgrav.Xr cpp 1
59fb3ef04dSDag-Erling Smørgravdirectives.
60fb3ef04dSDag-Erling SmørgravIt removes from a file
61fb3ef04dSDag-Erling Smørgravboth the directives
62fb3ef04dSDag-Erling Smørgravand any additional text that they specify should be removed,
63fb3ef04dSDag-Erling Smørgravwhile otherwise leaving the file alone.
64fb3ef04dSDag-Erling Smørgrav.Pp
65fb3ef04dSDag-Erling SmørgravThe
66fb3ef04dSDag-Erling Smørgrav.Nm
67fb3ef04dSDag-Erling Smørgravutility acts on
68fb3ef04dSDag-Erling Smørgrav.Ic #if , #ifdef , #ifndef ,
69fb3ef04dSDag-Erling Smørgrav.Ic #elif , #else ,
70fb3ef04dSDag-Erling Smørgravand
71fb3ef04dSDag-Erling Smørgrav.Ic #endif
72fb3ef04dSDag-Erling Smørgravlines,
73fb3ef04dSDag-Erling Smørgravusing macros specified in
74fb3ef04dSDag-Erling Smørgrav.Fl D
75fb3ef04dSDag-Erling Smørgravand
76fb3ef04dSDag-Erling Smørgrav.Fl U
77fb3ef04dSDag-Erling Smørgravcommand line options or in
78fb3ef04dSDag-Erling Smørgrav.Fl f
79fb3ef04dSDag-Erling Smørgravdefinitions files.
80fb3ef04dSDag-Erling SmørgravA directive is processed
81fb3ef04dSDag-Erling Smørgravif the macro specifications are sufficient to provide
82fb3ef04dSDag-Erling Smørgrava definite value for its control expression.
83fb3ef04dSDag-Erling SmørgravIf the result is false,
84fb3ef04dSDag-Erling Smørgravthe directive and the following lines under its control are removed.
85fb3ef04dSDag-Erling SmørgravIf the result is true,
86fb3ef04dSDag-Erling Smørgravonly the directive is removed.
87fb3ef04dSDag-Erling SmørgravAn
88fb3ef04dSDag-Erling Smørgrav.Ic #ifdef
89fb3ef04dSDag-Erling Smørgravor
90fb3ef04dSDag-Erling Smørgrav.Ic #ifndef
91fb3ef04dSDag-Erling Smørgravdirective is passed through unchanged
92fb3ef04dSDag-Erling Smørgravif its controlling macro is not specified.
93fb3ef04dSDag-Erling SmørgravAny
94fb3ef04dSDag-Erling Smørgrav.Ic #if
95fb3ef04dSDag-Erling Smørgravor
96fb3ef04dSDag-Erling Smørgrav.Ic #elif
97fb3ef04dSDag-Erling Smørgravcontrol expression that has an unknown value or that
98fb3ef04dSDag-Erling Smørgrav.Nm
99fb3ef04dSDag-Erling Smørgravcannot parse is passed through unchanged.
100fb3ef04dSDag-Erling SmørgravBy default,
101fb3ef04dSDag-Erling Smørgrav.Nm
102fb3ef04dSDag-Erling Smørgravignores
103fb3ef04dSDag-Erling Smørgrav.Ic #if
104fb3ef04dSDag-Erling Smørgravand
105fb3ef04dSDag-Erling Smørgrav.Ic #elif
106fb3ef04dSDag-Erling Smørgravlines with constant expressions;
107fb3ef04dSDag-Erling Smørgravit can be told to process them by specifying the
108fb3ef04dSDag-Erling Smørgrav.Fl k
109fb3ef04dSDag-Erling Smørgravflag on the command line.
110fb3ef04dSDag-Erling Smørgrav.Pp
111fb3ef04dSDag-Erling SmørgravIt understands a commonly-used subset
112fb3ef04dSDag-Erling Smørgravof the expression syntax for
113fb3ef04dSDag-Erling Smørgrav.Ic #if
114fb3ef04dSDag-Erling Smørgravand
115fb3ef04dSDag-Erling Smørgrav.Ic #elif
116fb3ef04dSDag-Erling Smørgravlines:
117fb3ef04dSDag-Erling Smørgravinteger constants,
118fb3ef04dSDag-Erling Smørgravinteger values of macros defined on the command line,
119fb3ef04dSDag-Erling Smørgravthe
120fb3ef04dSDag-Erling Smørgrav.Fn defined
121fb3ef04dSDag-Erling Smørgravoperator,
122fb3ef04dSDag-Erling Smørgravthe operators
123fb3ef04dSDag-Erling Smørgrav.Ic \&! , ~ , -
124fb3ef04dSDag-Erling Smørgrav(unary),
125fb3ef04dSDag-Erling Smørgrav.Ic * , / , % , + , - ,
126fb3ef04dSDag-Erling Smørgrav.Ic < , <= , > , >= , == , != , & , ^ , \&| ,
127fb3ef04dSDag-Erling Smørgrav.Ic && , || ,
128fb3ef04dSDag-Erling Smørgravand parenthesized expressions.
129fb3ef04dSDag-Erling SmørgravDivision by zero is treated as an unknown value.
130fb3ef04dSDag-Erling SmørgravA kind of
131fb3ef04dSDag-Erling Smørgrav.Dq "short circuit"
132fb3ef04dSDag-Erling Smørgravevaluation is used for the
133fb3ef04dSDag-Erling Smørgrav.Ic &&
134fb3ef04dSDag-Erling Smørgravoperator:
135fb3ef04dSDag-Erling Smørgravif either operand is definitely false then the result is false,
136fb3ef04dSDag-Erling Smørgraveven if the value of the other operand is unknown.
137fb3ef04dSDag-Erling SmørgravSimilarly,
138fb3ef04dSDag-Erling Smørgravif either operand of
139fb3ef04dSDag-Erling Smørgrav.Ic ||
140fb3ef04dSDag-Erling Smørgravis definitely true then the result is true.
141fb3ef04dSDag-Erling Smørgrav.Pp
142fb3ef04dSDag-Erling SmørgravWhen evaluating an expression,
143fb3ef04dSDag-Erling Smørgrav.Nm
144fb3ef04dSDag-Erling Smørgravdoes not expand macros first.
145fb3ef04dSDag-Erling SmørgravThe value of a macro must be a simple number,
146fb3ef04dSDag-Erling Smørgravnot an expression.
147fb3ef04dSDag-Erling SmørgravA limited form of indirection is allowed,
148fb3ef04dSDag-Erling Smørgravwhere one macro's value is the name of another.
149fb3ef04dSDag-Erling Smørgrav.Pp
150fb3ef04dSDag-Erling SmørgravIn most cases,
151fb3ef04dSDag-Erling Smørgrav.Nm
152fb3ef04dSDag-Erling Smørgravdoes not distinguish between object-like macros
153fb3ef04dSDag-Erling Smørgrav(without arguments) and function-like macros (with arguments).
154fb3ef04dSDag-Erling SmørgravA function-like macro invocation can appear in
155fb3ef04dSDag-Erling Smørgrav.Ic #if
156fb3ef04dSDag-Erling Smørgravand
157fb3ef04dSDag-Erling Smørgrav.Ic #elif
158fb3ef04dSDag-Erling Smørgravcontrol expressions.
159fb3ef04dSDag-Erling SmørgravIf the macro is not explicitly defined,
160fb3ef04dSDag-Erling Smørgravor is defined with the
161fb3ef04dSDag-Erling Smørgrav.Fl D
162fb3ef04dSDag-Erling Smørgravflag on the command-line,
163fb3ef04dSDag-Erling Smørgravor with
164fb3ef04dSDag-Erling Smørgrav.Ic #define
165fb3ef04dSDag-Erling Smørgravin a
166fb3ef04dSDag-Erling Smørgrav.Fl f
167fb3ef04dSDag-Erling Smørgravdefinitions file,
168fb3ef04dSDag-Erling Smørgravits arguments are ignored.
169fb3ef04dSDag-Erling SmørgravIf a macro is explicitly undefined on the command line with the
170fb3ef04dSDag-Erling Smørgrav.Fl U
171fb3ef04dSDag-Erling Smørgravflag,
172fb3ef04dSDag-Erling Smørgravor with
173fb3ef04dSDag-Erling Smørgrav.Ic #undef
174fb3ef04dSDag-Erling Smørgravin a
175fb3ef04dSDag-Erling Smørgrav.Fl f
176fb3ef04dSDag-Erling Smørgravdefinitions file,
177fb3ef04dSDag-Erling Smørgravit may not have any arguments since this leads to a syntax error.
178fb3ef04dSDag-Erling Smørgrav.Pp
179fb3ef04dSDag-Erling SmørgravThe
180fb3ef04dSDag-Erling Smørgrav.Nm
181fb3ef04dSDag-Erling Smørgravutility understands just enough about C
182fb3ef04dSDag-Erling Smørgravto know when one of the directives is inactive
183fb3ef04dSDag-Erling Smørgravbecause it is inside
184fb3ef04dSDag-Erling Smørgrava comment,
185fb3ef04dSDag-Erling Smørgravor cannot be evaluated because it is split by a backslash-continued line.
186fb3ef04dSDag-Erling SmørgravIt spots unusually-formatted preprocessor directives
187fb3ef04dSDag-Erling Smørgravand passes them through unchanged when the layout is too odd for it to handle.
188fb3ef04dSDag-Erling Smørgrav(See the
189fb3ef04dSDag-Erling Smørgrav.Sx BUGS
190fb3ef04dSDag-Erling Smørgravsection below.)
191fb3ef04dSDag-Erling Smørgrav.Pp
192fb3ef04dSDag-Erling SmørgravA script called
193fb3ef04dSDag-Erling Smørgrav.Nm unifdefall
194fb3ef04dSDag-Erling Smørgravcan be used to remove all conditional
195fb3ef04dSDag-Erling Smørgrav.Xr cpp 1
196fb3ef04dSDag-Erling Smørgravdirectives from a file.
197fb3ef04dSDag-Erling SmørgravIt uses
198fb3ef04dSDag-Erling Smørgrav.Nm Fl s
199fb3ef04dSDag-Erling Smørgravand
200fb3ef04dSDag-Erling Smørgrav.Nm cpp Fl dM
201fb3ef04dSDag-Erling Smørgravto get lists of all the controlling macros
202fb3ef04dSDag-Erling Smørgravand their definitions (or lack thereof),
203fb3ef04dSDag-Erling Smørgravthen invokes
204fb3ef04dSDag-Erling Smørgrav.Nm
205fb3ef04dSDag-Erling Smørgravwith appropriate arguments to process the file.
206fb3ef04dSDag-Erling Smørgrav.Sh OPTIONS
207fb3ef04dSDag-Erling Smørgrav.Bl -tag -width indent -compact
208fb3ef04dSDag-Erling Smørgrav.It Fl D Ns Ar sym Ns = Ns Ar val
209fb3ef04dSDag-Erling SmørgravSpecify that a macro is defined to a given value.
210fb3ef04dSDag-Erling Smørgrav.Pp
211fb3ef04dSDag-Erling Smørgrav.It Fl D Ns Ar sym
212fb3ef04dSDag-Erling SmørgravSpecify that a macro is defined to the value 1.
213fb3ef04dSDag-Erling Smørgrav.Pp
214fb3ef04dSDag-Erling Smørgrav.It Fl U Ns Ar sym
215fb3ef04dSDag-Erling SmørgravSpecify that a macro is undefined.
216fb3ef04dSDag-Erling Smørgrav.Pp
217fb3ef04dSDag-Erling SmørgravIf the same macro appears in more than one argument,
218fb3ef04dSDag-Erling Smørgravthe last occurrence dominates.
219fb3ef04dSDag-Erling Smørgrav.Pp
220fb3ef04dSDag-Erling Smørgrav.It Fl iD Ns Ar sym Ns Op = Ns Ar val
221fb3ef04dSDag-Erling Smørgrav.It Fl iU Ns Ar sym
222fb3ef04dSDag-Erling SmørgravC strings, comments,
223fb3ef04dSDag-Erling Smørgravand line continuations
224fb3ef04dSDag-Erling Smørgravare ignored within
225fb3ef04dSDag-Erling Smørgrav.Ic #ifdef
226fb3ef04dSDag-Erling Smørgravand
227fb3ef04dSDag-Erling Smørgrav.Ic #ifndef
228fb3ef04dSDag-Erling Smørgravblocks
229fb3ef04dSDag-Erling Smørgravcontrolled by macros
230fb3ef04dSDag-Erling Smørgravspecified with these options.
231fb3ef04dSDag-Erling Smørgrav.Pp
232fb3ef04dSDag-Erling Smørgrav.It Fl f Ar defile
233fb3ef04dSDag-Erling SmørgravThe file
234fb3ef04dSDag-Erling Smørgrav.Ar defile
235fb3ef04dSDag-Erling Smørgravcontains
236fb3ef04dSDag-Erling Smørgrav.Ic #define
237fb3ef04dSDag-Erling Smørgravand
238fb3ef04dSDag-Erling Smørgrav.Ic #undef
239fb3ef04dSDag-Erling Smørgravpreprocessor directives,
240fb3ef04dSDag-Erling Smørgravwhich have the same effect as the corresponding
241fb3ef04dSDag-Erling Smørgrav.Fl D
242fb3ef04dSDag-Erling Smørgravand
243fb3ef04dSDag-Erling Smørgrav.Fl U
244fb3ef04dSDag-Erling Smørgravcommand-line arguments.
245fb3ef04dSDag-Erling SmørgravYou can have multiple
246fb3ef04dSDag-Erling Smørgrav.Fl f
247fb3ef04dSDag-Erling Smørgravarguments and mix them with
248fb3ef04dSDag-Erling Smørgrav.Fl D
249fb3ef04dSDag-Erling Smørgravand
250fb3ef04dSDag-Erling Smørgrav.Fl U
251fb3ef04dSDag-Erling Smørgravarguments;
252fb3ef04dSDag-Erling Smørgravlater options override earlier ones.
253fb3ef04dSDag-Erling Smørgrav.Pp
254fb3ef04dSDag-Erling SmørgravEach directive must be on a single line.
255fb3ef04dSDag-Erling SmørgravObject-like macro definitions (without arguments)
256fb3ef04dSDag-Erling Smørgravare set to the given value.
257fb3ef04dSDag-Erling SmørgravFunction-like macro definitions (with arguments)
258fb3ef04dSDag-Erling Smørgravare treated as if they are set to 1.
259fb3ef04dSDag-Erling Smørgrav.Pp
260fb3ef04dSDag-Erling Smørgrav.Em Warning:
261fb3ef04dSDag-Erling Smørgravstring literals and character constants are not parsed correctly in
262fb3ef04dSDag-Erling Smørgrav.Fl f
263fb3ef04dSDag-Erling Smørgravfiles.
264fb3ef04dSDag-Erling Smørgrav.Pp
265fb3ef04dSDag-Erling Smørgrav.It Fl b
266fb3ef04dSDag-Erling SmørgravReplace removed lines with blank lines
267fb3ef04dSDag-Erling Smørgravinstead of deleting them.
268fb3ef04dSDag-Erling SmørgravMutually exclusive with the
269fb3ef04dSDag-Erling Smørgrav.Fl B
270fb3ef04dSDag-Erling Smørgravoption.
271fb3ef04dSDag-Erling Smørgrav.Pp
272fb3ef04dSDag-Erling Smørgrav.It Fl B
273fb3ef04dSDag-Erling SmørgravCompress blank lines around a deleted section.
274fb3ef04dSDag-Erling SmørgravMutually exclusive with the
275fb3ef04dSDag-Erling Smørgrav.Fl b
276fb3ef04dSDag-Erling Smørgravoption.
277fb3ef04dSDag-Erling Smørgrav.Pp
278fb3ef04dSDag-Erling Smørgrav.It Fl c
279fb3ef04dSDag-Erling SmørgravComplement,
280fb3ef04dSDag-Erling Smørgravi.e., lines that would have been removed or blanked
281fb3ef04dSDag-Erling Smørgravare retained and vice versa.
282fb3ef04dSDag-Erling Smørgrav.Pp
283fb3ef04dSDag-Erling Smørgrav.It Fl d
284fb3ef04dSDag-Erling SmørgravTurn on printing of debugging messages.
285fb3ef04dSDag-Erling Smørgrav.Pp
286fb3ef04dSDag-Erling Smørgrav.It Fl e
287fb3ef04dSDag-Erling SmørgravBy default,
288fb3ef04dSDag-Erling Smørgrav.Nm
289fb3ef04dSDag-Erling Smørgravwill report an error if it needs to remove
290fb3ef04dSDag-Erling Smørgrava preprocessor directive that spans more than one line,
291fb3ef04dSDag-Erling Smørgravfor example, if it has a multi-line
292fb3ef04dSDag-Erling Smørgravcomment hanging off its right hand end.
293fb3ef04dSDag-Erling SmørgravThe
294fb3ef04dSDag-Erling Smørgrav.Fl e
295fb3ef04dSDag-Erling Smørgravflag makes it ignore the line instead.
296fb3ef04dSDag-Erling Smørgrav.Pp
297fb3ef04dSDag-Erling Smørgrav.It Fl h
298fb3ef04dSDag-Erling SmørgravPrint help.
299fb3ef04dSDag-Erling Smørgrav.Pp
300fb3ef04dSDag-Erling Smørgrav.It Fl I Ns Ar path
301fb3ef04dSDag-Erling SmørgravSpecifies to
302fb3ef04dSDag-Erling Smørgrav.Nm unifdefall
303fb3ef04dSDag-Erling Smørgravan additional place to look for
304fb3ef04dSDag-Erling Smørgrav.Ic #include
305fb3ef04dSDag-Erling Smørgravfiles.
306fb3ef04dSDag-Erling SmørgravThis option is ignored by
307fb3ef04dSDag-Erling Smørgrav.Nm
308fb3ef04dSDag-Erling Smørgravfor compatibility with
309fb3ef04dSDag-Erling Smørgrav.Xr cpp 1
310fb3ef04dSDag-Erling Smørgravand to simplify the implementation of
311fb3ef04dSDag-Erling Smørgrav.Nm unifdefall .
312fb3ef04dSDag-Erling Smørgrav.Pp
313fb3ef04dSDag-Erling Smørgrav.It Fl K
314fb3ef04dSDag-Erling SmørgravAlways treat the result of
315fb3ef04dSDag-Erling Smørgrav.Ic &&
316fb3ef04dSDag-Erling Smørgravand
317fb3ef04dSDag-Erling Smørgrav.Ic ||
318fb3ef04dSDag-Erling Smørgravoperators as unknown if either operand is unknown,
319fb3ef04dSDag-Erling Smørgravinstead of short-circuiting when unknown operands can't affect the result.
320fb3ef04dSDag-Erling SmørgravThis option is for compatibility with older versions of
321fb3ef04dSDag-Erling Smørgrav.Nm .
322fb3ef04dSDag-Erling Smørgrav.Pp
323fb3ef04dSDag-Erling Smørgrav.It Fl k
324fb3ef04dSDag-Erling SmørgravProcess
325fb3ef04dSDag-Erling Smørgrav.Ic #if
326fb3ef04dSDag-Erling Smørgravand
327fb3ef04dSDag-Erling Smørgrav.Ic #elif
328fb3ef04dSDag-Erling Smørgravlines with constant expressions.
329fb3ef04dSDag-Erling SmørgravBy default, sections controlled by such lines are passed through unchanged
330fb3ef04dSDag-Erling Smørgravbecause they typically start
331fb3ef04dSDag-Erling Smørgrav.Dq Li "#if 0"
332fb3ef04dSDag-Erling Smørgravand are used as a kind of comment to sketch out future or past development.
333fb3ef04dSDag-Erling SmørgravIt would be rude to strip them out, just as it would be for normal comments.
334fb3ef04dSDag-Erling Smørgrav.Pp
335fb3ef04dSDag-Erling Smørgrav.It Fl m
336fb3ef04dSDag-Erling SmørgravModify one or more input files in place.
337fb3ef04dSDag-Erling SmørgravIf an input file is not modified,
338fb3ef04dSDag-Erling Smørgravthe original is preserved instead of being overwritten with an identical copy.
339fb3ef04dSDag-Erling Smørgrav.Pp
340fb3ef04dSDag-Erling Smørgrav.It Fl M Ar backext
341fb3ef04dSDag-Erling SmørgravModify input files in place, and keep backups of the original files by
342fb3ef04dSDag-Erling Smørgravappending the
343fb3ef04dSDag-Erling Smørgrav.Ar backext
344fb3ef04dSDag-Erling Smørgravto the input filenames.
345fb3ef04dSDag-Erling SmørgravA zero length
346fb3ef04dSDag-Erling Smørgrav.Ar backext
347fb3ef04dSDag-Erling Smørgravbehaves the same as the
348fb3ef04dSDag-Erling Smørgrav.Fl m
349fb3ef04dSDag-Erling Smørgravoption.
350fb3ef04dSDag-Erling Smørgrav.Pp
351fb3ef04dSDag-Erling Smørgrav.It Fl n
352fb3ef04dSDag-Erling SmørgravAdd
353fb3ef04dSDag-Erling Smørgrav.Li #line
354fb3ef04dSDag-Erling Smørgravdirectives to the output following any deleted lines,
355fb3ef04dSDag-Erling Smørgravso that errors produced when compiling the output file correspond to
356fb3ef04dSDag-Erling Smørgravline numbers in the input file.
357fb3ef04dSDag-Erling Smørgrav.Pp
358fb3ef04dSDag-Erling Smørgrav.It Fl o Ar outfile
359fb3ef04dSDag-Erling SmørgravWrite output to the file
360fb3ef04dSDag-Erling Smørgrav.Ar outfile
361fb3ef04dSDag-Erling Smørgravinstead of the standard output when processing a single file.
362fb3ef04dSDag-Erling Smørgrav.Pp
363fb3ef04dSDag-Erling Smørgrav.It Fl s
364fb3ef04dSDag-Erling SmørgravInstead of processing an input file as usual,
365fb3ef04dSDag-Erling Smørgravthis option causes
366fb3ef04dSDag-Erling Smørgrav.Nm
367fb3ef04dSDag-Erling Smørgravto produce a list of macros that are used in
368fb3ef04dSDag-Erling Smørgravpreprocessor directive controlling expressions.
369fb3ef04dSDag-Erling Smørgrav.Pp
370fb3ef04dSDag-Erling Smørgrav.It Fl S
371fb3ef04dSDag-Erling SmørgravLike the
372fb3ef04dSDag-Erling Smørgrav.Fl s
373fb3ef04dSDag-Erling Smørgravoption, but the nesting depth of each macro is also printed.
374fb3ef04dSDag-Erling SmørgravThis is useful for working out the number of possible combinations
375fb3ef04dSDag-Erling Smørgravof interdependent defined/undefined macros.
376fb3ef04dSDag-Erling Smørgrav.Pp
377fb3ef04dSDag-Erling Smørgrav.It Fl t
378fb3ef04dSDag-Erling SmørgravDisables parsing for C strings, comments,
379fb3ef04dSDag-Erling Smørgravand line continuations,
380fb3ef04dSDag-Erling Smørgravwhich is useful
381fb3ef04dSDag-Erling Smørgravfor plain text.
382fb3ef04dSDag-Erling SmørgravThis is a blanket version of the
383fb3ef04dSDag-Erling Smørgrav.Fl iD
384fb3ef04dSDag-Erling Smørgravand
385fb3ef04dSDag-Erling Smørgrav.Fl iU
386fb3ef04dSDag-Erling Smørgravflags.
387fb3ef04dSDag-Erling Smørgrav.Pp
388fb3ef04dSDag-Erling Smørgrav.It Fl V
389fb3ef04dSDag-Erling SmørgravPrint version details.
390fb3ef04dSDag-Erling Smørgrav.Pp
391fb3ef04dSDag-Erling Smørgrav.It Fl x Bro Ar 012 Brc
392fb3ef04dSDag-Erling SmørgravSet exit status mode to zero, one, or two.
393fb3ef04dSDag-Erling SmørgravSee the
394fb3ef04dSDag-Erling Smørgrav.Sx EXIT STATUS
395fb3ef04dSDag-Erling Smørgravsection below for details.
396fb3ef04dSDag-Erling Smørgrav.El
397fb3ef04dSDag-Erling Smørgrav.Pp
398fb3ef04dSDag-Erling SmørgravThe
399fb3ef04dSDag-Erling Smørgrav.Nm
400fb3ef04dSDag-Erling Smørgravutility takes its input from
401fb3ef04dSDag-Erling Smørgrav.Em stdin
402fb3ef04dSDag-Erling Smørgravif there are no
403fb3ef04dSDag-Erling Smørgrav.Ar file
404fb3ef04dSDag-Erling Smørgravarguments.
405fb3ef04dSDag-Erling SmørgravYou must use the
406fb3ef04dSDag-Erling Smørgrav.Fl m
407fb3ef04dSDag-Erling Smørgravor
408fb3ef04dSDag-Erling Smørgrav.Fl M
409fb3ef04dSDag-Erling Smørgravoptions if there are multiple input files.
410*049b7608SDag-Erling SmørgravYou can specify input from stdin or output to stdout with
411fb3ef04dSDag-Erling Smørgrav.Ql - .
412fb3ef04dSDag-Erling Smørgrav.Pp
413fb3ef04dSDag-Erling SmørgravThe
414fb3ef04dSDag-Erling Smørgrav.Nm
415fb3ef04dSDag-Erling Smørgravutility works nicely with the
416fb3ef04dSDag-Erling Smørgrav.Fl D Ns Ar sym
417fb3ef04dSDag-Erling Smørgravoption of
418fb3ef04dSDag-Erling Smørgrav.Xr diff 1 .
419fb3ef04dSDag-Erling Smørgrav.Sh EXIT STATUS
420fb3ef04dSDag-Erling SmørgravIn normal usage the
421fb3ef04dSDag-Erling Smørgrav.Nm
422fb3ef04dSDag-Erling Smørgravutility's exit status depends on the mode set using the
423fb3ef04dSDag-Erling Smørgrav.Fl x
424fb3ef04dSDag-Erling Smørgravoption.
425fb3ef04dSDag-Erling Smørgrav.Pp
426fb3ef04dSDag-Erling SmørgravIf the exit mode is zero (the default) then
427fb3ef04dSDag-Erling Smørgrav.Nm
428fb3ef04dSDag-Erling Smørgravexits with status 0 if the output is an exact copy of the input,
429fb3ef04dSDag-Erling Smørgravor with status 1 if the output differs.
430fb3ef04dSDag-Erling Smørgrav.Pp
431fb3ef04dSDag-Erling SmørgravIf the exit mode is one,
432fb3ef04dSDag-Erling Smørgrav.Nm
433fb3ef04dSDag-Erling Smørgravexits with status 1 if the output is unmodified
434fb3ef04dSDag-Erling Smørgravor 0 if it differs.
435fb3ef04dSDag-Erling Smørgrav.Pp
436fb3ef04dSDag-Erling SmørgravIf the exit mode is two,
437fb3ef04dSDag-Erling Smørgrav.Nm
438fb3ef04dSDag-Erling Smørgravexits with status zero in both cases.
439fb3ef04dSDag-Erling Smørgrav.Pp
440fb3ef04dSDag-Erling SmørgravIn all exit modes,
441fb3ef04dSDag-Erling Smørgrav.Nm
442fb3ef04dSDag-Erling Smørgravexits with status 2 if there is an error.
443fb3ef04dSDag-Erling Smørgrav.Pp
444fb3ef04dSDag-Erling SmørgravThe exit status is 0 if the
445fb3ef04dSDag-Erling Smørgrav.Fl h
446fb3ef04dSDag-Erling Smørgravor
447fb3ef04dSDag-Erling Smørgrav.Fl V
448fb3ef04dSDag-Erling Smørgravcommand line options are given.
449fb3ef04dSDag-Erling Smørgrav.Sh DIAGNOSTICS
450fb3ef04dSDag-Erling Smørgrav.Bl -item
451fb3ef04dSDag-Erling Smørgrav.It
452fb3ef04dSDag-Erling Smørgrav.Tn EOF
453fb3ef04dSDag-Erling Smørgravin comment
454fb3ef04dSDag-Erling Smørgrav.It
455fb3ef04dSDag-Erling SmørgravInappropriate
456fb3ef04dSDag-Erling Smørgrav.Ic #elif ,
457fb3ef04dSDag-Erling Smørgrav.Ic #else
458fb3ef04dSDag-Erling Smørgravor
459fb3ef04dSDag-Erling Smørgrav.Ic #endif
460fb3ef04dSDag-Erling Smørgrav.It
461fb3ef04dSDag-Erling SmørgravMissing macro name in #define or #undef
462fb3ef04dSDag-Erling Smørgrav.It
463fb3ef04dSDag-Erling SmørgravObfuscated preprocessor control line
464fb3ef04dSDag-Erling Smørgrav.It
465fb3ef04dSDag-Erling SmørgravPremature
466fb3ef04dSDag-Erling Smørgrav.Tn EOF
467fb3ef04dSDag-Erling Smørgrav(with the line number of the most recent unterminated
468fb3ef04dSDag-Erling Smørgrav.Ic #if )
469fb3ef04dSDag-Erling Smørgrav.It
470fb3ef04dSDag-Erling SmørgravToo many levels of nesting
471fb3ef04dSDag-Erling Smørgrav.It
472fb3ef04dSDag-Erling SmørgravUnrecognized preprocessor directive
473fb3ef04dSDag-Erling Smørgrav.It
474fb3ef04dSDag-Erling SmørgravUnterminated char or string literal
475fb3ef04dSDag-Erling Smørgrav.El
476fb3ef04dSDag-Erling Smørgrav.Sh SEE ALSO
477fb3ef04dSDag-Erling Smørgrav.Xr cpp 1 ,
478fb3ef04dSDag-Erling Smørgrav.Xr diff 1
479fb3ef04dSDag-Erling Smørgrav.Pp
480fb3ef04dSDag-Erling SmørgravThe unifdef home page is
481fb3ef04dSDag-Erling Smørgrav.Pa http://dotat.at/prog/unifdef
482fb3ef04dSDag-Erling Smørgrav.Sh HISTORY
483fb3ef04dSDag-Erling SmørgravThe
484fb3ef04dSDag-Erling Smørgrav.Nm
485fb3ef04dSDag-Erling Smørgravcommand appeared in
486fb3ef04dSDag-Erling Smørgrav.Bx 2.9 .
487fb3ef04dSDag-Erling Smørgrav.Tn ANSI\~C
488fb3ef04dSDag-Erling Smørgravsupport was added in
489fb3ef04dSDag-Erling Smørgrav.Fx 4.7 .
490fb3ef04dSDag-Erling Smørgrav.Sh AUTHORS
491fb3ef04dSDag-Erling Smørgrav.An -nosplit
492fb3ef04dSDag-Erling SmørgravThe original implementation was written by
493fb3ef04dSDag-Erling Smørgrav.An Dave Yost Aq Mt Dave@Yost.com .
494fb3ef04dSDag-Erling Smørgrav.An Tony Finch Aq Mt dot@dotat.at
495fb3ef04dSDag-Erling Smørgravrewrote it to support
496fb3ef04dSDag-Erling Smørgrav.Tn ANSI\~C .
497fb3ef04dSDag-Erling Smørgrav.Sh BUGS
498fb3ef04dSDag-Erling Smørgrav.Bl -bullet
499fb3ef04dSDag-Erling Smørgrav.It
500fb3ef04dSDag-Erling SmørgravExpression evaluation is very limited.
501fb3ef04dSDag-Erling Smørgrav.It
502fb3ef04dSDag-Erling SmørgravCharacter constants are not evaluated.
503fb3ef04dSDag-Erling SmørgravString literals and character constants in
504fb3ef04dSDag-Erling Smørgrav.Fl f
505fb3ef04dSDag-Erling Smørgravdefinition files are ignored rather than parsed as
506fb3ef04dSDag-Erling Smørgravpart of a macro's replacement tokens.
507fb3ef04dSDag-Erling Smørgrav.It
508fb3ef04dSDag-Erling SmørgravOnly the basic form of C++ raw string literals is recognized,
509fb3ef04dSDag-Erling Smørgravlike
510fb3ef04dSDag-Erling Smørgrav.Li R"(string)"
511fb3ef04dSDag-Erling Smørgravwithout delimiters as in
512fb3ef04dSDag-Erling Smørgrav.Li R"delimiter(string)delimiter" .
513fb3ef04dSDag-Erling Smørgrav.It
514fb3ef04dSDag-Erling SmørgravSource files are processed one line at a time,
515fb3ef04dSDag-Erling Smørgravso preprocessor directives split across more than one physical line
516fb3ef04dSDag-Erling Smørgrav(because of comments or backslash-newline)
517fb3ef04dSDag-Erling Smørgravcannot be handled in every situation.
518fb3ef04dSDag-Erling Smørgrav.It
519fb3ef04dSDag-Erling SmørgravTrigraphs are not recognized.
520fb3ef04dSDag-Erling Smørgrav.It
521fb3ef04dSDag-Erling SmørgravThere is no support for macros with different definitions at
522fb3ef04dSDag-Erling Smørgravdifferent points in the source file.
523fb3ef04dSDag-Erling Smørgrav.It
524fb3ef04dSDag-Erling SmørgravThe text-mode and ignore functionality does not correspond to modern
525fb3ef04dSDag-Erling Smørgrav.Xr cpp 1
526fb3ef04dSDag-Erling Smørgravbehaviour.
527fb3ef04dSDag-Erling Smørgrav.El
528fb3ef04dSDag-Erling Smørgrav.Pp
529fb3ef04dSDag-Erling SmørgravPlease send bug reports by email to
530fb3ef04dSDag-Erling Smørgrav.Aq Mt dot@dotat.at .
531