-
Notifications
You must be signed in to change notification settings - Fork 28
/
S52utils.h
132 lines (98 loc) · 4.06 KB
/
S52utils.h
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
// S52utils.h: utility
//
// Project: OpENCview
/*
This file is part of the OpENCview project, a viewer of ENC.
Copyright (C) 2000-2018 Sylvain Duclos sduclos@users.sourceforge.net
OpENCview is free software: you can redistribute it and/or modify
it under the terms of the Lesser GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpENCview 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
Lesser GNU General Public License for more details.
You should have received a copy of the Lesser GNU General Public License
along with OpENCview. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _S52UTILS_H_
#define _S52UTILS_H_
#include "S52.h" // S52_log_cb
#ifdef SOLARIS
// well should be cc
#define PRINTF printf(__FILE__":%i: : ", __LINE__),printf
#else // SOLARIS
#if defined(S52_DEBUG) || defined(S52_USE_LOGFILE)
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
// EFTE editor trick - when prog run in efte, printf is highlighted
// and jump back to source:line when clicked
//printf("%s(%i):\n", __FILE__, __LINE__);
// FIXME: if backtrace dont printf
// FIXME: filter msg type: NOTE:, DEBUG:, FIXME:, WARNING:, ERROR:
void S52_utils_printf(const char *file, int line, const char *function, const char *frmt, ...);
#define PRINTF(...) S52_utils_printf(__FILE__, __LINE__, __func__, __VA_ARGS__)
//#define PRINTF(...) (__VA_ARGS__)
//#define PRINTF(...)
#else // S52_DEBUG | S52_USE_LOGFILE
#define PRINTF(...)
#endif // S52_DEBUG | S52_USE_LOGFILE
#endif // SOLARIS
#define SNPRINTF(b,n,f, ...) if (n <= g_snprintf(b,n,f,__VA_ARGS__)) {PRINTF("WARNING: str overflow\n");g_assert(0);}
#define return_if_null(ptr) \
if (NULL==ptr) { \
PRINTF("WARNING: '%s' is NULL\n", #ptr); \
g_assert(0); \
return FALSE; \
}
#define CCHAR const char
// debug: valid label in .cfg file
#define CFG_CATALOG "CATALOG"
#define CFG_PLIB "PLIB"
#define CFG_CHART "CHART"
#define CFG_WORLD "WORLD"
#define CFG_TTF "TTF"
#define MAXL 1024 // MAX lenght of buffer _including_ '\0'
typedef char valueBuf[MAXL];
int S52_utils_getConfig(CCHAR *label, char *vbuf);
CCHAR *S52_utils_version(void);
int S52_utils_initLog(S52_log_cb log_cb);
int S52_utils_doneLog(void);
int S52_atoi(CCHAR *str);
double S52_atof(CCHAR *str);
// debug
#define _g_new0(s,n) (s*)S52_utils_new0(sizeof(s), n)
char *S52_utils_new0(size_t sz, int n);
// trap
int S52_utils_initSIG(void);
int S52_utils_backtrace(void);
int S52_utils_getAtomicInt(void);
void S52_utils_setAtomicInt(int newVal);
int S52_utils_mtrace(void);
int S52_utils_muntrace(void);
void S52_utils_gdbBreakPoint(void);
///////////////////////////////////////////////////////////////////////////
//
// Other trick that could be usefull
//
// quiet compiler warning on unused param
#define UNUSED(expr) do { (void)(expr); } while (0)
/*
* Helper macros to use CONFIG_ options in C/CPP expressions. Note that
* these only work with boolean and tristate options.
*/
/*
* Getting something that works in C and CPP for an arg that may or may
* not be defined is tricky. Here, if we have "#define CONFIG_BOOGER 1"
* we match on the placeholder define, insert the "0," for arg1 and generate
* the triplet (0, 1, 0). Then the last step cherry picks the 2nd arg (a one).
* When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when
* the last step cherry picks the 2nd arg, we get a zero.
*/
#define __ARG_PLACEHOLDER_1 0,
#define config_enabled(cfg) _config_enabled(cfg)
#define _config_enabled(value) __config_enabled(__ARG_PLACEHOLDER_##value)
#define __config_enabled(arg1_or_junk) ___config_enabled(arg1_or_junk 1, 0)
#define ___config_enabled(__ignored, val, ...) val
#endif // _S52UTILS_H_