cexcept: README 2.0.1-optipng (2011-Jul-22)
Updated by Cosmin Truta

http://www.nicemice.net/cexcept/

Adam M. Costello
http://www.nicemice.net/amc/

cexcept (pronounced "see except" in English) is a package providing
a Try/Catch/Throw exception handling interface for ANSI C (C89 and
subsequent ISO standards).  It does not attempt to handle system
exceptions like floating-point exceptions or addressing exceptions, nor
compiler-generated exceptions like C++ exceptions; it is intended as an
enhanced user-friendly alternative to setjmp() and longjmp().

The package consists of the following files:

    name        version
    ----------  -------
    README       2.0.1-optipng
    cexcept.h    2.0.1-optipng
    example1.c   2.0.0
    example2.c   2.0.0
    rationale    2.0.0

The package is both free-as-in-speech and free-as-in-beer:

    Copyright (c) 2000-2008 Adam M. Costello and Cosmin Truta.
    This package may be modified only if its author and version
    information is updated accurately, and may be redistributed
    only if accompanied by this unaltered notice.  Subject to those
    restrictions, permission is granted to anyone to do anything with
    this package.  The copyright holders make no guarantees regarding
    this package, and are not responsible for any damage resulting from
    its use.

The version number of this README file can be considered the version
number of the whole package.

The file cexcept.h contains the documentation and implementation of the
interface.  The other files are supporting documents.

The project web page is:

    http://www.nicemice.net/cexcept/

Here is another place to obtain the package, not guaranteed to always
have the very latest version, but probably more highly available:

    http://cexcept.sourceforge.net/

The remainder of this file is a log of changes.


2011-Jul-22-Fri

  cexcept.h 2.0.1 --> 2.0.1-optipng
    * Made exception__prev volatile to avoid "variable might be clobbered
      by longjmp" warnings when a function contains multiple Try blocks.

2008-Jul-23-Wed

  cexcept.h 2.0.0 --> 2.0.1
    * Clarified the license.
    * Reworded the introductory comments.
    * Bug fix:  The statement following Try could not be an if-statement
      (without else); the Catch would then be parsed wrong.
    * Quieted a new warning in gcc 4.2.

  README 2.0.0 --> 2.0.1
    * Reworded the license to agree with cexcept.h.
    * Updated the URLs.

2001-Jul-12-Thu

  cexcept.h 1.0.0 --> 2.0.0
    * The documentation had neglected to mention that the Catch
      expression was evaluated before the Try clause was executed.
      Rather than document this unintuitive behavior, we have changed
      the interface so that the Catch expression is not evaluated unless
      and until an exception is caught.  This change will not affect
      applications that never used Catch expressions with side effects.
    * The implementation had been technically incorrect because it
      modified the object named by the Catch expression between the
      setjmp and longjmp calls, even though it might be a non-volatile
      automatic object (which it was in example.c).  The problem (which
      affected no known compilers) has been corrected by performing two
      copies: first into volatile temporary storage before the longjmp,
      then into the Catch expression after the longjmp.
    * The requirement that the Catch expression have the "exact same
      type" that was passed to define_exception_type() has been slightly
      relaxed to disregard type qualifiers.
    * In the license, "no guarantees about the correctness of this file"
      has been changed to "no guarantees regarding this file".
    * Notes have been added that "real" exceptions are not supported, and
      the size of the exception type has performance implications.

  rationale 1.0.0 --> 2.0.0
    * Removed the obsolete question about why the Catch expression is
      always evaluated.
    * Updated the answer to the question about the type of the Catch
      expression, to correspond to the new implementation.
    * Added a question about why two copies are necessary.
    * Added a question about why "real" exceptions cannot be caught.

  example.c 1.0.0 --> example1.c 2.0.0
  example2.c 1.0.0 --> 2.0.0
    * Renamed example.c to example1.c.
    * Changed the version number to agree with cexcept.h in the first
      two places (2.0.*).

  README 1.0.0 --> 2.0.0
    * Reworded the license to agree with cexcept.h.
    * Changed the version number to agree with cexcept.h in the first
      two places (2.0.*).


2000-Jun-21-Wed

  cexcept.h 0.6.1 --> 1.0.0
    * Changed the version number to indicate stability.
    * Changed "an lvalue" to "a modifiable lvalue" to agree with the
      language in the ISO C Standard.
    * Added hints about dealing with the inability to return from a Try
      clause, and with automatic variables modified within a Try clause.
    * Clarified the restriction on Throw'ing a comma-expression.

  example.c 0.6.0 --> 1.0.0
    * Changed the version number to agree with cexcept.h in the first
      two places (1.0.*).

  example2.c 0.6.0 --> 1.0.0
    * Changed the version number to agree with cexcept.h in the first
      two places (1.0.*).

  rationale 0.6.1 --> 1.0.0
    * Changed the version number to agree with cexcept.h in the first
      two places (1.0.*).

  README 0.6.3 --> 1.0.0
    * Changed the version number to agree with cexcept.h in the first
      two places (1.0.*).


2000-Apr-22-Sat

  cexcept.h 0.6.0 --> 0.6.1
    * Clarified that the wrapper .h file is needed only when there are
      multiple .c files.


2000-Apr-08-Sat

  rationale 0.6.0 --> 0.6.1
    * Added rationale for disallowing jumping in/out of Try clauses.
    * Expanded the discussion of finally clauses.
    * Added rationale for the lack of expressionless Throw.


2000-Apr-07-Fri

  Created README, which incorporates changelog.

  cexcept.h amc.0.5.3 --> 0.6.0
    * The expression passed to Catch must now have exactly the same type
      passed to define_exception_type(), and it is always evaluated
      exactly once, regardless of whether an exception is caught.
    * Added Catch_anonymous.
    * Changed init_exception_context() to take an argument, and to be
      optional for statically allocated contexts.
    * Clarified allowable exception types, added examples.
    * Clarified the restrictions on jumping in Try/Catch statements.
    * Reworded some other parts of the documentation.

  cexcept-example.c amc.0.5.0 --> example.c 0.6.0
    * Now uses the 0.6.* interface, and demonstrates Catch_anonymous.

  cexcept-example2.c amc.0.5.0 --> example2.c 0.6.0
    * Now uses the 0.6.* interface.

  cexcept-rationale amc.0.5.1 --> rationale 0.6.0
    * Added rationale for the new Catch expression semantics.


2000-Apr-01-Fri

  cexcept.h amc.0.5.2 --> amc.0.5.3
    * Eliminated a compiler warning about an uninitialized variable.
    * Improved the documentation of allowable exception types.
    * Added advice about using a macro for the_exception_context, and
      changed the example accordingly.
    * Improved the documentation regarding jumping out of Try and Catch.


Earlier changes were not logged.
