Main Page | Class List | Directories | File List | Class Members | File Members

errors.h

Go to the documentation of this file.
00001 /*
00002 || This file is part of Pike. For copyright information see COPYRIGHT.
00003 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
00004 || for more information.
00005 || $Id: errors.h,v 1.32 2005/01/21 14:32:30 mast Exp $
00006 */
00007 
00008 #ifdef ERR_DECLARE
00009 #define DECLARE_ERROR(NAME, SCNAME, INHERIT, DECL) \
00010 PMOD_EXPORT struct program *PIKE_CONCAT(NAME,_error_program); \
00011 ptrdiff_t PIKE_CONCAT(NAME,_error_offset); 
00012 
00013 #define ERR_VAR(TYPE,CTYPE,RUNTYPE,NAME) TYPE NAME ;
00014 #endif
00015 
00016 #ifdef ERR_EXT_DECLARE
00017 #define DECLARE_ERROR(NAME, SCNAME, INHERIT, DECL) \
00018 PMOD_EXPORT extern struct program *PIKE_CONCAT(NAME,_error_program); \
00019 extern ptrdiff_t PIKE_CONCAT(NAME,_error_offset); \
00020 struct PIKE_CONCAT(NAME,_error_struct) { \
00021   DECL \
00022 };
00023 
00024 #define ERR_VAR(TYPE,CTYPE,RUNTYPE,NAME) TYPE NAME ;
00025 
00026 /* Some compilers (eg cl) don't like empty structs... */
00027 #define EMPTY ERR_VAR(INT_TYPE, int, PIKE_T_INT, ignored__)
00028 
00029 #endif /* ERR_EXT_DECLARE */
00030 
00031 #ifdef ERR_SETUP
00032 #define DECLARE_ERROR(NAME, SCNAME, INHERIT, DECL) do{\
00033   ptrdiff_t current_offset=0; \
00034   struct PIKE_CONCAT(NAME,_error_struct) foo; \
00035   start_new_program(); \
00036   INHERIT \
00037   current_offset = PIKE_CONCAT(NAME,_error_offset) = \
00038     ADD_STORAGE(struct PIKE_CONCAT(NAME,_error_struct));\
00039   add_string_constant("error_type", #SCNAME, 0); \
00040   add_integer_constant("is_" #NAME "_error",1,0); \
00041   DECL \
00042   PIKE_CONCAT(NAME,_error_program)=end_program(); \
00043   add_program_constant( #SCNAME "Error",PIKE_CONCAT(NAME,_error_program),0); \
00044 }while(0);
00045 
00046 #define ERR_VAR(TYPE,CTYPE,RUNTYPE,NAME2) \
00047   MAP_VARIABLE(#NAME2, CTYPE, 0, \
00048                current_offset + (((char *)&(foo.NAME2))-((char *)&foo)), RUNTYPE);
00049 
00050 #define EMPTY
00051 
00052 #define ERR_INHERIT(NAME) \
00053   low_inherit(PIKE_CONCAT(NAME,_error_program),0,0,0,0,0);
00054 
00055 #define ERR_FUNC(NAME,FUNC,TYPE,FLAGS) \
00056   ADD_FUNCTION(NAME,FUNC,TYPE,FLAGS);
00057 
00058 #endif
00059 
00060 #ifdef ERR_CLEANUP
00061 #define DECLARE_ERROR(NAME, SCNAME, INHERIT, DECL) \
00062   if(PIKE_CONCAT(NAME,_error_program)) {\
00063     free_program(PIKE_CONCAT(NAME,_error_program)); \
00064     PIKE_CONCAT(NAME,_error_program)=0;\
00065   }
00066 #endif
00067 
00068 
00069 #ifndef ERR_INHERIT
00070 #define ERR_INHERIT(NAME)
00071 #endif
00072 
00073 #ifndef ERR_VAR
00074 #define ERR_VAR(TYPE,CTYPE,RUNTYPE,NAME)
00075 #endif
00076 
00077 #ifndef ERR_FUNC
00078 #define ERR_FUNC(NAME,FUNC,TYPE,FLAGS)
00079 #endif
00080 
00081 DECLARE_ERROR(generic, Generic, EMPTY ,
00082   ERR_VAR(struct pike_string *,tStr,PIKE_T_STRING,error_message)
00083   ERR_VAR(struct array *,tArray,PIKE_T_ARRAY,error_backtrace)
00084   ERR_FUNC("cast",f_error_cast,tFunc(tString,tArray),ID_STATIC)
00085   ERR_FUNC("`[]",f_error_index,tFunc(tInt01,tMixed),ID_STATIC)
00086   ERR_FUNC("describe",f_error_describe,tFunc(tVoid,tString),0)
00087   ERR_FUNC("message", f_error_message, tFunc(tVoid,tString), 0)
00088   ERR_FUNC("backtrace",f_error_backtrace,tFunc(tVoid,tArr(tMixed)),0)
00089   ERR_FUNC("_sprintf", f_error__sprintf,
00090            tFunc(tOr(tInt,tVoid) tOr(tMapping,tVoid),tString), ID_STATIC)
00091   ERR_FUNC("create",f_error_create,tFunc(tStr tOr(tVoid,tArr(tMixed)),tVoid),ID_STATIC)
00092 )
00093 
00094 #define GENERIC_ERROR_THIS ((struct generic_error_struct *)CURRENT_STORAGE)
00095 
00096 DECLARE_ERROR(index, Index,
00097               ERR_INHERIT(generic),
00098   ERR_VAR(struct svalue, tMix, PIKE_T_MIXED, value)
00099   ERR_VAR(struct svalue, tMix, PIKE_T_MIXED, index)
00100 )
00101 
00102 DECLARE_ERROR(bad_argument, BadArgument,
00103               ERR_INHERIT(generic),
00104   ERR_VAR(INT_TYPE, tInt, PIKE_T_INT, which_argument)
00105   ERR_VAR(struct pike_string *, tStr,PIKE_T_STRING,expected_type)
00106   ERR_VAR(struct svalue, tMix, PIKE_T_MIXED, got_value)
00107 )
00108 
00109 DECLARE_ERROR(math, Math,
00110               ERR_INHERIT(generic),
00111   ERR_VAR(struct svalue, tMix, PIKE_T_MIXED, number)
00112 )
00113 
00114 DECLARE_ERROR(resource, Resource,
00115               ERR_INHERIT(generic),
00116   ERR_VAR(struct pike_string *, tStr, PIKE_T_STRING,resource_type)
00117   ERR_VAR(INT_TYPE, tInt, PIKE_T_INT, howmuch)
00118 )
00119 
00120 DECLARE_ERROR(permission, Permission,
00121               ERR_INHERIT(generic),
00122   ERR_VAR(struct pike_string *, tStr, PIKE_T_STRING,permission_type)
00123 )
00124 
00125 DECLARE_ERROR(cpp, Cpp, ERR_INHERIT(generic), EMPTY)
00126 
00127 DECLARE_ERROR(compilation, Compilation, ERR_INHERIT(generic), EMPTY)
00128 
00129 DECLARE_ERROR(master_load, MasterLoad, ERR_INHERIT (generic), EMPTY)
00130 
00131 DECLARE_ERROR (module_load, ModuleLoad,
00132                ERR_INHERIT (generic),
00133   ERR_VAR (struct pike_string *, tStr, PIKE_T_STRING, path)
00134   ERR_VAR (struct pike_string *, tStr, PIKE_T_STRING, reason)
00135 )
00136 
00137 #undef DECLARE_ERROR
00138 #undef ERR_INHERIT
00139 #undef ERR_VAR
00140 #undef EMPTY
00141 #undef ERR_FUNC
00142 
00143 #undef ERR_DECLARE
00144 #undef ERR_EXT_DECLARE
00145 #undef ERR_SETUP
00146 #undef ERR_CLEANUP

Generated on Fri Jul 22 23:44:24 2005 for Pike by  doxygen 1.3.9.1