File: error.h

package info (click to toggle)
fractalnow 0.8.2-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 3,656 kB
  • sloc: ansic: 8,201; cpp: 4,517; sh: 571; makefile: 9
file content (158 lines) | stat: -rw-r--r-- 5,557 bytes parent folder | download | duplicates (3)
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
 *  error.h -- part of FractalNow
 *
 *  Copyright (c) 2011 Marc Pegon <pe.marc@free.fr>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
 
 /**
  * \file error.h
  * \brief Header file containing error macros and stuff.
  * \author Marc Pegon
  */

#ifndef __ERROR_H__
#define __ERROR_H__

#include <stdlib.h>
#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \enum e_TraceLevel
 * \brief Trace level type.
 *
 * Users should understand the difference between application current
 * trace level, and messages trace levels.\n
 * Using FractalNow_message macro, a message is printed if and only
 * application current trace level is greater (>=) than message trace
 * level.
 *
 * For example :
 * - Messages with T_NORMAL trace level will be printed if application
 *   current trace level is T_NORMAL or T_VERBOSE.
 * - Messages with T_VERBOSE trace level will be printed only if
 *   application current trace level is T_VERBOSE.
 *
 * Note that error messages' trace level is T_QUIET, i.e. are always
 * printed, except when application current trace level is
 * T_QUIET_ERROR.
 */
/**
 * \typedef TraceLevel
 * \brief Convenient typedef for enum TraceLevel.
 */
typedef enum e_TraceLevel {
	T_QUIET_ERROR = 0,
 /*<! Quiet errors trace level.*/
	T_QUIET,
 /*<! Quiet trace level.*/
	T_NORMAL,
 /*<! Normal trace level.*/
	T_VERBOSE
 /*<! Verbose trace level.*/
} TraceLevel;

/**
 * \var FractalNow_debug
 * \brief Specifies whether or not debug messages should be printed.
 *
 * 1 if debug messages should be printed (for errors), 0 otherwise.\n
 * This variable has an effect only if library was built in debug mode.
 *
 * \see debug_enabled()
 */
extern int FractalNow_debug;

/**
 * \var FractalNow_traceLevel
 * \brief Specifies application current trace level.
 */
extern TraceLevel FractalNow_traceLevel;

#ifdef DEBUG
#define FractalNow_debug_prefix(output) \
	if (FractalNow_debug) { \
		fprintf(output,"[%s: %s, l.%d] ", __FILE__, __func__, __LINE__); \
	}
#else
#define FractalNow_debug_prefix(output) (void)NULL;
#endif

/**
 * \def FractalNow_message(output, msg_trace,...)
 * \brief Print message depending on trace level.
 *
 * Message is printed if and only application current trace level
 * is greater (>=) than message trace level.
 */
#define FractalNow_message(output, msg_trace,...) \
	if (msg_trace <= FractalNow_traceLevel) { \
		FractalNow_debug_prefix(output); \
		fprintf(output, __VA_ARGS__); \
}

#define FractalNow_errmsg(...) \
	FractalNow_message(stderr, T_QUIET, __VA_ARGS__);

#define FractalNow_error(...) \
	FractalNow_errmsg(__VA_ARGS__);\
	exit(EXIT_FAILURE)

#define FractalNow_werror(...) \
	FractalNow_message(stderr, T_QUIET, __VA_ARGS__);\
	res = 1; \
	goto end;

// Common error messages
#define alloc_error_msg(s) "Error occured when allocated memory for %s.\n", s
#define existence_error_msg(fileName) "Error: \'%s\' does not exist.\n", fileName
#define open_error_msg(fileName) "Error occured when opening file \'%s\'.\n", fileName
#define read_error_msg(fileName) "Error occured when reading file \'%s\'.\n", fileName
#define write_error_msg(fileName) "Error occured when writing in file \'%s\'.\n", fileName
#define close_error_msg(fileName) "Error occured when closing file \'%s\'.\n", fileName

#define FractalNow_alloc_errmsg(s) FractalNow_errmsg(alloc_error_msg(s))
#define FractalNow_existence_errmsg(fileName) FractalNow_errmsg(existence_error_msg(fileName))
#define FractalNow_open_errmsg(fileName) FractalNow_errmsg(open_error_msg(fileName))
#define FractalNow_read_errmsg(fileName) FractalNow_errmsg(read_error_msg(fileName))
#define FractalNow_write_errmsg(fileName) FractalNow_errmsg(write_error_msg(fileName))
#define FractalNow_close_errmsg(fileName) FractalNow_errmsg(close_error_msg(fileName))

// Common errors
#define FractalNow_alloc_error(s) FractalNow_error(alloc_error_msg(s))
#define FractalNow_existence_error(fileName) FractalNow_error(existence_error_msg(fileName))
#define FractalNow_open_error(fileName) FractalNow_error(open_error_msg(fileName))
#define FractalNow_read_error(fileName) FractalNow_error(read_error_msg(fileName))
#define FractalNow_write_error(fileName) FractalNow_error(write_error_msg(fileName))
#define FractalNow_close_error(fileName) FractalNow_error(close_error_msg(fileName))

// Weak error
#define FractalNow_alloc_werror(s) FractalNow_werror(alloc_error_msg(s))
#define FractalNow_existence_werror(fileName) FractalNow_werror(existence_error_msg(fileName))
#define FractalNow_open_werror(fileName) FractalNow_werror(open_error_msg(fileName))
#define FractalNow_read_werror(fileName) FractalNow_werror(read_error_msg(fileName))
#define FractalNow_write_werror(fileName) FractalNow_werror(write_error_msg(fileName))
#define FractalNow_close_werror(fileName) FractalNow_werror(close_error_msg(fileName))

#ifdef __cplusplus
}
#endif

#endif