1 | /******************************************************************* |
---|
2 | * File: omError.c |
---|
3 | * Purpose: implementation of Error handling routines |
---|
4 | * Author: obachman (Olaf Bachmann) |
---|
5 | * Created: 11/99 |
---|
6 | * Version: $Id: omError.c,v 1.6 2000-09-25 12:27:43 obachman Exp $ |
---|
7 | *******************************************************************/ |
---|
8 | |
---|
9 | #include <stdarg.h> |
---|
10 | #include "omAlloc.h" |
---|
11 | |
---|
12 | omError_t om_ErrorStatus = omError_NoError; |
---|
13 | omError_t om_InternalErrorStatus = omError_NoError; |
---|
14 | |
---|
15 | struct omErrorString_s |
---|
16 | { |
---|
17 | omError_t error; |
---|
18 | char* s_error; |
---|
19 | char* string; |
---|
20 | }; |
---|
21 | |
---|
22 | /* strings describing omErrors */ |
---|
23 | static struct omErrorString_s om_ErrorStrings[] = |
---|
24 | { |
---|
25 | {omError_NoError, "omError_NoError", "no error"}, |
---|
26 | {omError_Unknown, "omError_Unknown", "unknown error" }, |
---|
27 | {omError_MemoryCorrupted, "omError_MemoryCorrupted", "memory corrupted"}, |
---|
28 | {omError_InternalBug, "omError_InternalBug", "internal omalloc bug"}, |
---|
29 | {omError_NullAddr, "omError_NullAddr", "addr is NULL"}, |
---|
30 | {omError_InvalidRangeAddr, "omError_InvalidRangeAddr", "addr not in valid range"}, |
---|
31 | {omError_FalseAddr, "omError_FalseAddr", "addr not as returned by omalloc"}, |
---|
32 | {omError_FalseAddrOrMemoryCorrupted, "omError_FalseAddrOrMemoryCorrupted", "addr not as returned by omalloc or memory corrupted", }, |
---|
33 | {omError_WrongSize, "omError_WrongSize", "wrong size specification of addr"}, |
---|
34 | {omError_FreedAddr, "omError_FreedAddr", "addr had previosuly been freed"}, |
---|
35 | {omError_FreedAddrOrMemoryCorrupted, "omError_FreedAddrOrMemoryCorrupted", "addr had previosuly been freed or memory corrupted"}, |
---|
36 | {omError_WrongBin, "omError_WrongBin", "addr is not from given Bin"}, |
---|
37 | {omError_UnknownBin, "omError_UnknownBin", "given Bin is unknown"}, |
---|
38 | {omError_NotBinAddr, "omError_NotBinAddr", "addr is not a BinAddr"}, |
---|
39 | {omError_UnalignedAddr, "omError_UnalignedAddr", "addr is unaligned"}, |
---|
40 | {omError_NullSizeAlloc, "omError_NullSizeAlloc", "alloc of size 0"}, |
---|
41 | {omError_ListCycleError, "omError_ListCycleError", "list has cycles"}, |
---|
42 | {omError_SortedListError, "omError_SortedListError", "sorted list is unsorted"}, |
---|
43 | {omError_KeptAddrListCorrupted, "omError_KeptAddrListCorrupted", "list of kept addresses are corrupted"}, |
---|
44 | {omError_FrontPattern, "omError_FrontPattern", "written to front of addr"}, |
---|
45 | {omError_BackPattern, "omError_BackPattern", "written after end of addr"}, |
---|
46 | {omError_FreePattern, "omError_FreePattern", "written into freed memory"}, |
---|
47 | {omError_NotString, "omError_NotString", "string not null terminated"}, |
---|
48 | |
---|
49 | {omError_MaxError, NULL} /* this needs to be the last entry */ |
---|
50 | }; |
---|
51 | |
---|
52 | const char* omError2String(omError_t error) |
---|
53 | { |
---|
54 | int i = 0; |
---|
55 | while (! (om_ErrorStrings[i].string == NULL && om_ErrorStrings[i].error == omError_MaxError)) |
---|
56 | { |
---|
57 | if (om_ErrorStrings[i].error == error) return om_ErrorStrings[i].string; |
---|
58 | i++; |
---|
59 | } |
---|
60 | return "undocumented error"; |
---|
61 | } |
---|
62 | |
---|
63 | const char* omError2Serror(omError_t error) |
---|
64 | { |
---|
65 | int i = 0; |
---|
66 | while (! (om_ErrorStrings[i].string == NULL && om_ErrorStrings[i].error == omError_MaxError)) |
---|
67 | { |
---|
68 | if (om_ErrorStrings[i].error == error) return om_ErrorStrings[i].s_error; |
---|
69 | i++; |
---|
70 | } |
---|
71 | return "omError_UnKnown"; |
---|
72 | } |
---|
73 | |
---|
74 | #ifndef OM_NDEBUG |
---|
75 | int om_CallErrorHook = 1; |
---|
76 | #endif |
---|
77 | |
---|
78 | omError_t omReportError(omError_t error, omError_t report_error, OM_FLR_DECL, |
---|
79 | const char* fmt, ...) |
---|
80 | { |
---|
81 | int max_check, max_track; |
---|
82 | |
---|
83 | if (report_error == omError_MaxError) return error; |
---|
84 | /* reset MaxTrack and MaxCheck to prevent infinite loop, in case |
---|
85 | printf allocates memory */ |
---|
86 | max_check = om_Opts.MaxCheck; |
---|
87 | max_track = om_Opts.MaxTrack; |
---|
88 | om_Opts.MaxCheck = 0; |
---|
89 | om_Opts.MaxTrack = 0; |
---|
90 | |
---|
91 | om_InternalErrorStatus = error; |
---|
92 | om_ErrorStatus = (report_error == omError_NoError ? error : report_error); |
---|
93 | |
---|
94 | if (om_Opts.HowToReportErrors && om_ErrorStatus != omError_NoError) |
---|
95 | { |
---|
96 | fprintf(stderr, "***%s: %s", omError2Serror(om_ErrorStatus), omError2String(om_ErrorStatus)); |
---|
97 | |
---|
98 | #ifdef OM_INTERNAL_DEBUG |
---|
99 | if (om_ErrorStatus != error) |
---|
100 | fprintf(stderr, "\n___%s: %s", omError2Serror(error), omError2String(error)); |
---|
101 | #endif |
---|
102 | |
---|
103 | if (om_Opts.HowToReportErrors > 2 && fmt != NULL && *fmt != '\0') |
---|
104 | { |
---|
105 | va_list ap; |
---|
106 | va_start(ap, fmt); |
---|
107 | fprintf(stderr, ": "); |
---|
108 | vfprintf(stderr, fmt, ap); |
---|
109 | va_end(ap); |
---|
110 | } |
---|
111 | |
---|
112 | if (om_Opts.HowToReportErrors > 1) |
---|
113 | { |
---|
114 | #ifndef OM_NDEBUG |
---|
115 | fprintf(stderr, "\n occured at: "); |
---|
116 | if (! _omPrintCurrentBackTrace(stderr, OM_FLR_VAL)) |
---|
117 | fprintf(stderr, " ??"); |
---|
118 | #endif |
---|
119 | } |
---|
120 | fprintf(stderr, "\n"); |
---|
121 | fflush(stderr); |
---|
122 | } |
---|
123 | if (om_CallErrorHook) |
---|
124 | om_Opts.ErrorHook(); |
---|
125 | |
---|
126 | om_Opts.MaxCheck = max_check; |
---|
127 | om_Opts.MaxTrack = max_track; |
---|
128 | return error; |
---|
129 | } |
---|
130 | |
---|
131 | |
---|
132 | /* this is a dummy function and used as default for om_Opts.ErrorHook */ |
---|
133 | extern void omErrorBreak() |
---|
134 | {} |
---|
135 | |
---|
136 | |
---|
137 | |
---|
138 | |
---|
139 | |
---|
140 | |
---|
141 | |
---|
142 | |
---|
143 | |
---|
144 | |
---|
145 | |
---|
146 | |
---|
147 | |
---|
148 | |
---|
149 | |
---|
150 | |
---|
151 | |
---|
152 | |
---|
153 | |
---|
154 | |
---|
155 | |
---|
156 | |
---|
157 | |
---|