00001
00002
00003
00004
00005
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
00027 #define EMPTY ERR_VAR(INT_TYPE, int, PIKE_T_INT, ignored__)
00028
00029 #endif
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