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.10 2009-02-28 13:39:05 Singular Exp $ |
---|
7 | *******************************************************************/ |
---|
8 | |
---|
9 | #include <stdarg.h> |
---|
10 | #include "om_Alloc.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 | {omError_StickyBin, "omError_StickyBin", "wrong handling of sticky bins"}, |
---|
49 | |
---|
50 | {omError_MaxError, NULL} /* this needs to be the last entry */ |
---|
51 | }; |
---|
52 | |
---|
53 | const char* omError2String(omError_t error) |
---|
54 | { |
---|
55 | int i = 0; |
---|
56 | while (! (om_ErrorStrings[i].string == NULL && om_ErrorStrings[i].error == omError_MaxError)) |
---|
57 | { |
---|
58 | if (om_ErrorStrings[i].error == error) return om_ErrorStrings[i].string; |
---|
59 | i++; |
---|
60 | } |
---|
61 | return "undocumented error"; |
---|
62 | } |
---|
63 | |
---|
64 | const char* omError2Serror(omError_t error) |
---|
65 | { |
---|
66 | int i = 0; |
---|
67 | while (! (om_ErrorStrings[i].string == NULL && om_ErrorStrings[i].error == omError_MaxError)) |
---|
68 | { |
---|
69 | if (om_ErrorStrings[i].error == error) return om_ErrorStrings[i].s_error; |
---|
70 | i++; |
---|
71 | } |
---|
72 | return "omError_UnKnown"; |
---|
73 | } |
---|
74 | |
---|
75 | #ifndef OM_NDEBUG |
---|
76 | int om_CallErrorHook = 1; |
---|
77 | #endif |
---|
78 | |
---|
79 | omError_t omReportError(omError_t error, omError_t report_error, OM_FLR_DECL, |
---|
80 | const char* fmt, ...) |
---|
81 | { |
---|
82 | int max_check, max_track; |
---|
83 | |
---|
84 | if (report_error == omError_MaxError) return error; |
---|
85 | /* reset MaxTrack and MaxCheck to prevent infinite loop, in case |
---|
86 | printf allocates memory */ |
---|
87 | max_check = om_Opts.MaxCheck; |
---|
88 | max_track = om_Opts.MaxTrack; |
---|
89 | om_Opts.MaxCheck = 0; |
---|
90 | om_Opts.MaxTrack = 0; |
---|
91 | |
---|
92 | om_InternalErrorStatus = error; |
---|
93 | om_ErrorStatus = (report_error == omError_NoError ? error : report_error); |
---|
94 | |
---|
95 | if (om_Opts.HowToReportErrors && om_ErrorStatus != omError_NoError) |
---|
96 | { |
---|
97 | /* to avoid spurious error msg in 64 bit mode*/ |
---|
98 | if (om_ErrorStatus != omError_StickyBin) |
---|
99 | fprintf(stderr, "***%s: %s", omError2Serror(om_ErrorStatus), omError2String(om_ErrorStatus)); |
---|
100 | |
---|
101 | #ifdef OM_INTERNAL_DEBUG |
---|
102 | if (om_ErrorStatus != error) |
---|
103 | fprintf(stderr, "\n___%s: %s", omError2Serror(error), omError2String(error)); |
---|
104 | #endif |
---|
105 | |
---|
106 | if (om_Opts.HowToReportErrors > 2 && fmt != NULL && *fmt != '\0') |
---|
107 | { |
---|
108 | va_list ap; |
---|
109 | va_start(ap, fmt); |
---|
110 | fprintf(stderr, ": "); |
---|
111 | vfprintf(stderr, fmt, ap); |
---|
112 | va_end(ap); |
---|
113 | } |
---|
114 | |
---|
115 | if (om_Opts.HowToReportErrors > 1) |
---|
116 | { |
---|
117 | #ifndef OM_NDEBUG |
---|
118 | fprintf(stderr, "\n occured at: "); |
---|
119 | if (! _omPrintCurrentBackTrace(stderr, OM_FLR_VAL)) |
---|
120 | fprintf(stderr, " ??"); |
---|
121 | #endif |
---|
122 | } |
---|
123 | fprintf(stderr, "\n"); |
---|
124 | fflush(stderr); |
---|
125 | } |
---|
126 | if (om_CallErrorHook) |
---|
127 | om_Opts.ErrorHook(); |
---|
128 | |
---|
129 | om_Opts.MaxCheck = max_check; |
---|
130 | om_Opts.MaxTrack = max_track; |
---|
131 | return error; |
---|
132 | } |
---|
133 | |
---|
134 | |
---|
135 | /* this is a dummy function and used as default for om_Opts.ErrorHook */ |
---|
136 | extern void omErrorBreak() |
---|
137 | {} |
---|