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