`unifdef' is a package that can delete code guarded by C-style
preprocessor directives.

Examples:

Take this relatively simple code:

    #ifdef USELONGLONG
    long long x;
    #else
    long x;
    #endif

`M-x unifdef-current-buffer RET USELONGLONG RET' will transform
this into:

    long long x;

A (somewhat) more complex piece of code:

    #if ALPHA
      Alpha();
    #elif BETA
      Beta();
    #elif GAMMA
      Gamma();
    #else
      Delta();
    #endif

`M-x unifdef-current-buffer RET BETA RET' will transform
this into:

    #if ALPHA
      Alpha();
    #else
      Beta();
    #endif


What is converted:

This package can convert code that test if a symbol is defined or
if a symbol is true.  For example:

    #ifdef SYMBOL

    #if defined SYMBOL

    #if defined(SYMBOL)

    #if SYMBOL

Or if the symbol is undefined or false:

    #ifndef SYMBOL

    #if !defined SYMBOL

    #if !defined(SYMBOL)

    #if !SYMBOL

And likewise for `elif'.

What is not converted:

This package does *not* handle complex expressions involving
symbols.  For example:

    #if ALPHA && BETA

    #if ALPHA == 1234

    #if (ALPHA ^ BETA) == 0x1234

    #if defined(ALPHA) && defined(BETA)

Commands:

* `unifdef-current-buffer' -- Convert all occurrences in the
  current buffer.

* `unifdef-convert-block' -- Convert the next preprocessor block.
  (Note, in some cases, this command might need to be applied
  repeatedly.)

When prefixed with C-u the command is inverted, i.e. it assumes
that the supplied symbol is undefined or false.  In the example
above, the line `long x;' would be retained.

Warning:

The command provided by this package can perform massive changes to
your source files.  Make sure that they are backed up, e.g. by
using a version control system.  As for all tools that
automatically transform source code, it is advisable to manually
inspect the end result.