unifdef(1)							   unifdef(1)



NAME

  unifdef - Removes #ifdefed lines

SYNOPSIS

  unifdef [-tlc] [-Dsymbol] [-idsymbol] [-iusymbol] [file] [-Usymbol]

  The unifdef command partially simulates the behavior of the C preprocessor
  in processing #ifdef conditionals.

FLAGS

  -c  Complements the action of unifdef; retains lines that would normally be
      removed and removes lines that would normally be retained.

  -Dsymbol
      Specifies symbol as a defined #ifdef symbol.

  -idsymbol
      Specifies defined lines inside certain #ifdefs to be ignored but copied
      out.

  -iusymbol
      Specifies undefined lines inside certain #ifdefs to be ignored and not
      copied out.

  -l  Replaces removed lines with blank lines instead of deleting them.

  -t  Processes plain text (rather than C code) input.	The unifdef command
      does not try to recognize comments, single quotes, and double quotes.

  -Usymbol
      Specifies symbol as an undefined #ifdef symbol.

DESCRIPTION

  The unifdef command recognizes nested #ifdefs, comments, single and double
  quotes of C syntax so that it can function correctly, but does not include
  files or interpret macros.  The unifdef command recognizes, but does not
  remove comments.

  The unifdef command takes its input from stdin if no file argument is
  given, and copies its output to stdout.

  You specify the symbols you want defined with -Dsymbol or undefined with
  -Usymbol and the lines inside those #ifdefs are copied to the output or
  removed, as appropriate.  The #ifdef, #ifndef, #else, #elif, and endif
  lines associated with symbol are also removed.  #ifdefs involving unspeci-
  fied symbols are untouched and copied out along with their associated
  #ifdef, #else, elif, and #endif lines.  If the same symbol appears in more
  than one argument, only the first occurrence is significant.	For instance,
  if an #ifdef X occurs nested inside another #ifdef X, the inside #ifdef is
  considered an unrecognized symbol.

  If you use #ifdefs to delimit non-C lines, such as comments or unfinished
  code, it is necessary to specify which symbols are to be used for that pur-
  pose.	 Otherwise, the unifdef command tries to parse for quotes and com-
  ments in those #ifdef lines.

  Keywords


  The following keywords can be used with the unifdef command:

       ifdef
       ifndef
       else
       endif
       elif


  The unifdef command uses the elif keyword as follows.	 (Note that "Under-
  stood" means unifdef knows how to convert elif to if.)

  # elif defined (X)
      Understood

  # elif X
      Not understood

  # elif defined (X)  defined (Y)
      Not understood

  For example:

       # ifdef X
       x
       # elif defined (Y)
       y
       # elif defined (A)  || defined (B)
       a
       # else
       default
       # endif


  The following list shows the results of using the elif keyword with vari-
  ables:

       -DX
       x

       -UX
       # if defined (Y)
       y
       # elif defined (A)  || defined (B)
       a
       # else
       default
       # endif
       -UX -DY
       y

       -UY -UX
       # if defined (Y)
       y
       # elif defined (A)  || defined (B)
       a
       # else
       default
       # endif

       -UY -UX -DA
       # if defined (Y)
       y
       # elif defined (A)  || defined (B)
       a
       # else
       default
       # endif


EXAMPLES

   1.  The following command line causes the unifdef command to read the file
       original.c and remove the #ifdef A lines.  It then removes everything
       following an #elif/#else associated with the #ifdef A down to the
       #endif:
	    unifdef -DA original.c > modified.c


   2.  The following command line causes the unifdef command to read the file
       original.c, and remove the #ifdef A down to either its associated
       #elif/#else, or its associated #endif:
	    unifdef -UA original.c > modified.c


       In the case of the #elif, the #elif is replaced with #if.  In the case
       of #else, the #else is deleted along with its associated #endif.

NOTES

  The unifdef command cannot process cpp constructs such as:

       #if defined(X) || defined(Y)


DIAGNOSTICS

  The unifdef command can fail for several reasons:  a premature end of file,
  or an inappropriate else, elif, or endif.

EXIT VALUES

  Exit status is 0 if output is an exact copy of input, 1 if not, 2 if the
  unifdef command fails.

RELATED INFORMATION

  Commands:  diff(1).