yexcep.h
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* -*- Mode: C; c-file-style: "bsd" -*- */
  2. #ifndef YEXCEP_H
  3. #define YEXCEP_H
  4. /*   yes, macros with gotos in them, but in the interests of
  5.  *   avoiding repetition of code, and having less error prone
  6.  *   error handling
  7.  *
  8.  *   EXCEP_DECL - declares the return value and local state variables
  9.  *                needed by the exception macros
  10.  *
  11.  *   THROW( x ) - set return value to x and goto function cleanup
  12.  *                section (CATCH: block).  In the catch block, THROW
  13.  *                does not goto catch label to avoid loops, and instead
  14.  *                falls through to the next statement.
  15.  *
  16.  *   EXCEP_OK   - success return value (=1)
  17.  *
  18.  *   EXCEP_FAIL - failure return value (=0), other user exceptions are 
  19.  *                given negative values (<0)
  20.  *
  21.  *   TRY( x )   - if code returns value <= 0 TRY sets return value to 
  22.  *                that value and goes to function cleanup section 
  23.  *                (CATCH: block).  In the catch block, TRY does not goto
  24.  *                the catch label to avoid loops, and instead
  25.  *                falls through to the next statement.  The
  26.  *                return value is set to the first non success value
  27.  *                returned by a TRY, unless this is overridden by a THROW.
  28.  *
  29.  *   CATCH:     - start of catch block, also switches behavior of 
  30.  *                TRY and THROW to not goto CATCH: inside the catch
  31.  *                block to avoid loops
  32.  *
  33.  *   EXCEP_RET  - return the current return value from the function
  34.  *                equivlanet to return (EXCEPTION)
  35.  *
  36.  *   EXCEPTION  - current return value, is set to EXCEP_OK by EXCEP_DECL
  37.  *
  38.  *   EXCEP_BOOL - convert current return value to EXCEP_OK, or EXCEP_FAIL
  39.  *                (EXCEP_FAIL is anything other than EXCEP_OK)
  40.  *
  41.  */
  42. /* example usage */
  43. /*
  44.  * 
  45.  * #define EXCEP_OK_COMMENT 2
  46.  * #define EXCEP_NULL_PTR -1
  47.  * #define EXCEP_OUT_OF_MEM -2
  48.  * 
  49.  * int bar( char *c )
  50.  * {
  51.  *     EXCEP_DECL;
  52.  * 
  53.  *     if ( !c ) { THROW( EXCEP_NULL_PTR ); }
  54.  *     if ( *c == '' ) { THROW( EXCEP_FAIL ); );
  55.  *     if ( *c == '#' ) { SET( EXCEP_COMMENT ); }
  56.  *  CATCH:
  57.  *     EXCEP_RET;
  58.  * }
  59.  * 
  60.  * int foo( char *c )
  61.  * {
  62.  *     EXCEP_DECL;
  63.  *     int *p = NULL;
  64.  * 
  65.  *     if ( !c ) { THROW( EXCEP_NULL_PTR ); }
  66.  *     TRY( bar( c ) );
  67.  *     if ( RETURN == EXCEP_COMMENT ) { print( "commentn" ); }
  68.  *     p = strdup( c );
  69.  *     if ( !p ) { THROW( EXCEP_OUT_OF_MEM ); }
  70.  * 
  71.  *  CATCH:
  72.  *     if ( p ) { TRY( bar( p ) ); free( p ); }
  73.  *     THROW( EXCEP_BOOL );
  74.  *     if ( EXCEPTION == EXCEP_OK ) { printf( "successn" ); }
  75.  *     EXCEP_RET;
  76.  * }
  77.  * 
  78.  */
  79. #define EXCEP_FAIL 0
  80. #define EXCEP_OK 1
  81. #define EXCEP_DECL int _thr = 0, _ret2 = 0, _ret = _ret2+EXCEP_OK
  82. #define THROW( x ) 
  83.     do { 
  84.         _ret = (x); 
  85.         if( !_thr ) { goto _catch; } 
  86.     } while ( 0 )
  87. #define TRY( x ) 
  88.     do { 
  89.         _ret2 = (x); 
  90.         if ( _ret > 0 && _ret2 <= 0 ) { THROW( _ret2 ); } 
  91.     } while ( 0 )
  92. #define SET( x ) (_ret = (x))
  93. #define EXCEP_RET return( _ret )
  94. #define EXCEPTION _ret
  95. #define RETURN _ret2
  96. #define CATCH _catch: _thr = 1; if ( 0 ) { goto _foo; } _foo
  97. #define EXCEP_BOOL ( _ret > 0 ? EXCEP_OK : EXCEP_FAIL )
  98. #endif