File: omError.c

package info (click to toggle)
singular 1%3A4.0.3-p3%2Bds-5
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 33,040 kB
  • ctags: 19,347
  • sloc: cpp: 271,589; ansic: 13,500; lisp: 4,242; yacc: 1,656; lex: 1,377; makefile: 1,264; perl: 632; sh: 467; python: 233; xml: 182
file content (136 lines) | stat: -rw-r--r-- 5,545 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*******************************************************************
 *  File:    omError.c
 *  Purpose: implementation of Error handling routines
 *  Author:  obachman (Olaf Bachmann)
 *  Created: 11/99
 *******************************************************************/

#include <stdarg.h>
#include "omalloc.h"

omError_t om_ErrorStatus = omError_NoError;
omError_t om_InternalErrorStatus = omError_NoError;

struct omErrorString_s
{
  omError_t error;
  char* s_error;
  char* string;
};

/* strings describing omErrors */
static struct omErrorString_s om_ErrorStrings[] =
{
  {omError_NoError,                     "omError_NoError",                     "no error"},
  {omError_Unknown,                     "omError_Unknown",                     "unknown error" },
  {omError_MemoryCorrupted,             "omError_MemoryCorrupted",             "memory corrupted"},
  {omError_InternalBug,                 "omError_InternalBug",                 "internal omalloc bug"},
  {omError_NullAddr,                    "omError_NullAddr",                    "addr is NULL"},
  {omError_InvalidRangeAddr,            "omError_InvalidRangeAddr",            "addr not in valid range"},
  {omError_FalseAddr,                   "omError_FalseAddr",                   "addr not as returned by omalloc"},
  {omError_FalseAddrOrMemoryCorrupted,  "omError_FalseAddrOrMemoryCorrupted",  "addr not as returned by omalloc or memory corrupted", },
  {omError_WrongSize,                   "omError_WrongSize",                   "wrong size specification of addr"},
  {omError_FreedAddr,                   "omError_FreedAddr",                   "addr had previosuly been freed"},
  {omError_FreedAddrOrMemoryCorrupted,  "omError_FreedAddrOrMemoryCorrupted",  "addr had previosuly been freed  or memory corrupted"},
  {omError_WrongBin,                    "omError_WrongBin",                    "addr is not from given Bin"},
  {omError_UnknownBin,                  "omError_UnknownBin",                  "given Bin is unknown"},
  {omError_NotBinAddr,                  "omError_NotBinAddr",                  "addr is not a BinAddr"},
  {omError_UnalignedAddr,               "omError_UnalignedAddr",               "addr is unaligned"},
  {omError_NullSizeAlloc,               "omError_NullSizeAlloc",               "alloc of size 0"},
  {omError_ListCycleError,              "omError_ListCycleError",              "list has cycles"},
  {omError_SortedListError,             "omError_SortedListError",             "sorted list is unsorted"},
  {omError_KeptAddrListCorrupted,       "omError_KeptAddrListCorrupted",       "list of kept addresses are corrupted"},
  {omError_FrontPattern,                "omError_FrontPattern",                "written to front of addr"},
  {omError_BackPattern,                 "omError_BackPattern",                 "written after end of addr"},
  {omError_FreePattern,                 "omError_FreePattern",                 "written into freed memory"},
  {omError_NotString,                   "omError_NotString",                   "string not null terminated"},
  {omError_StickyBin,                   "omError_StickyBin",                   "wrong handling of sticky bins"},

  {omError_MaxError, NULL} /* this needs to be the last entry */
};

const char* omError2String(omError_t error)
{
  int i = 0;
  while (! (om_ErrorStrings[i].string == NULL && om_ErrorStrings[i].error == omError_MaxError))
  {
    if (om_ErrorStrings[i].error == error) return om_ErrorStrings[i].string;
    i++;
  }
  return "undocumented error";
}

const char* omError2Serror(omError_t error)
{
  int i = 0;
  while (! (om_ErrorStrings[i].string == NULL && om_ErrorStrings[i].error == omError_MaxError))
  {
    if (om_ErrorStrings[i].error == error) return om_ErrorStrings[i].s_error;
    i++;
  }
  return "omError_UnKnown";
}

#ifndef OM_NDEBUG
int om_CallErrorHook = 1;
#endif

omError_t omReportError(omError_t error, omError_t report_error, OM_FLR_DECL,
                        const char* fmt, ...)
{
  int max_check, max_track;

  if (report_error == omError_MaxError) return error;
  /* reset MaxTrack and MaxCheck to prevent infinite loop, in case
     printf allocates memory */
  max_check = om_Opts.MaxCheck;
  max_track = om_Opts.MaxTrack;
  om_Opts.MaxCheck = 0;
  om_Opts.MaxTrack = 0;

  om_InternalErrorStatus = error;
  om_ErrorStatus = (report_error == omError_NoError ? error : report_error);

  if (om_Opts.HowToReportErrors && om_ErrorStatus != omError_NoError)
  {
    /* to avoid spurious error msg in 64 bit mode*/
    if (om_ErrorStatus == omError_StickyBin) return error;
    fprintf(stderr, "***%s: %s", omError2Serror(om_ErrorStatus), omError2String(om_ErrorStatus));

#ifdef OM_INTERNAL_DEBUG
    if (om_ErrorStatus != error)
      fprintf(stderr, "\n___%s: %s", omError2Serror(error), omError2String(error));
#endif

    if (om_Opts.HowToReportErrors > 2 && fmt != NULL && *fmt != '\0')
    {
      va_list ap;
      va_start(ap, fmt);
      fprintf(stderr, ": ");
      vfprintf(stderr, fmt, ap);
      va_end(ap);
    }

    if (om_Opts.HowToReportErrors > 1)
    {
#ifndef OM_NDEBUG
      fprintf(stderr, "\n occurred at: ");
      if (! _omPrintCurrentBackTrace(stderr, OM_FLR_VAL))
        fprintf(stderr, " ??");
#endif
    }
    fprintf(stderr, "\n");
    fflush(stderr);
  }
  if (om_CallErrorHook)
    om_Opts.ErrorHook();

  om_Opts.MaxCheck = max_check;
  om_Opts.MaxTrack = max_track;
  return error;
}


/* this is a dummy function and used as default for om_Opts.ErrorHook */
extern void omErrorBreak()
{}