summaryrefslogtreecommitdiff
blob: 145c838fc5663ef7854917ec6f971aa99b635e81 (plain)
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
137
138
139
140
141
142
143
#ifndef _JH_ERROR_ERROR_H_
#define _JH_ERROR_ERROR_H_

#include <stdio.h>

#include "../pervasive.h"

#ifndef JH_DEBUG_PROGRAM_FLOW
   #define JH_DEBUG_PROGRAM_FLOW   (0 || JH_DEBUG_ALL)
#endif

#ifndef JH_DEBUG_CONFIG
   #define JH_DEBUG_CONFIG         (0 || JH_DEBUG_ALL)
#endif

#ifndef JH_DEBUG_LEARNING
   #define JH_DEBUG_LEARNING       (0 || JH_DEBUG_ALL)
#endif

#ifndef JH_DEBUG_NETWORK
   #define JH_DEBUG_NETWORK  1
#endif

#ifndef JH_DEBUG_NETWORK
   #define JH_DEBUG_NETWORK        (0 || JH_DEBUG_ALL)
#endif

#define JH_ENABLE_WARNINGS_OUTPUT              1
#define JH_ENABLE_RUNTIME_ERRORS_OUTPUT        1
#define JH_ENABLE_PROGRAMMING_ERRORS_OUTPUT    1
#define JH_ENABLE_FATAL_ERROR_OUTPUT           1

#ifdef JH_ENABLE_ERROR_LOCATION
   #define JH_LOCATION " [" __FILE__ "][" JH_TO_STRING(__LINE__) "]"
#else
   #define JH_LOCATION ""
#endif

#define JH_PRINT_STDERR(io, symbol, str, ...)\
   fprintf(io, "[" symbol "]" JH_LOCATION " " str "\n", __VA_ARGS__);

/*
 * Given that we use preprocessor contants as flags, we can expect the compilers
 * to remove the test condition for disabled flags. No need to be shy about
 * allowing many debug options.
 */

#define JH_DEBUG(io, flag, str, ...)\
   JH_ISOLATE\
   (\
      if (flag)\
      {\
         JH_PRINT_STDERR(io, "D", str, __VA_ARGS__);\
      }\
   )


#define JH_WARNING(io, str, ...)\
   JH_ISOLATE\
   (\
      if (JH_ENABLE_WARNINGS_OUTPUT)\
      {\
         JH_PRINT_STDERR(io, "W", str, __VA_ARGS__);\
      }\
   )

#define JH_ERROR(io, str, ...)\
   JH_ISOLATE\
   (\
      if (JH_ENABLE_RUNTIME_ERRORS_OUTPUT)\
      {\
         JH_PRINT_STDERR(io, "E", str, __VA_ARGS__);\
      }\
   )

#define JH_PROG_ERROR(io, str, ...)\
   JH_ISOLATE\
   (\
      if (JH_ENABLE_PROGRAMMING_ERRORS_OUTPUT)\
      {\
         JH_PRINT_STDERR(io, "P", str, __VA_ARGS__);\
      }\
   )

#define JH_FATAL(io, str, ...)\
   JH_ISOLATE\
   (\
     if (JH_ENABLE_FATAL_ERROR_OUTPUT)\
      {\
         JH_PRINT_STDERR(io, "F", str, __VA_ARGS__);\
      }\
   )

/* For outputs without dynamic content (static). ******************************/

#define JH_PRINT_S_STDERR(io, symbol, str)\
   fprintf(io, "[" symbol "]" JH_LOCATION " " str "\n");

#define JH_S_DEBUG(io, flag, str)\
   JH_ISOLATE\
   (\
      if (flag)\
      {\
         JH_PRINT_S_STDERR(io, "D", str);\
      }\
   )

#define JH_S_WARNING(io, str)\
   JH_ISOLATE\
   (\
      if (JH_ENABLE_WARNINGS_OUTPUT)\
      {\
         JH_PRINT_S_STDERR(io, "W", str);\
      }\
   )

#define JH_S_ERROR(io, str)\
   JH_ISOLATE\
   (\
      if (JH_ENABLE_RUNTIME_ERRORS_OUTPUT)\
      {\
         JH_PRINT_S_STDERR(io, "E", str);\
      }\
   )

#define JH_S_PROG_ERROR(io, str)\
   JH_ISOLATE\
   (\
      if (JH_ENABLE_PROGRAMMING_ERRORS_OUTPUT)\
      {\
         JH_PRINT_S_STDERR(io, "P", str);\
      }\
   )

#define JH_S_FATAL(io, str)\
   JH_ISOLATE\
   (\
     if (JH_ENABLE_FATAL_ERROR_OUTPUT)\
      {\
         JH_PRINT_S_STDERR(io, "F", str);\
      }\
   )
#endif