1 |
/* |
2 |
openisis - an open implementation of the CDS/ISIS database |
3 |
Version 0.8.x (patchlevel see file Version) |
4 |
Copyright (C) 2001-2003 by Erik Grziwotz, erik@openisis.org |
5 |
|
6 |
This library is free software; you can redistribute it and/or |
7 |
modify it under the terms of the GNU Lesser General Public |
8 |
License as published by the Free Software Foundation; either |
9 |
version 2.1 of the License, or (at your option) any later version. |
10 |
|
11 |
This library is distributed in the hope that it will be useful, |
12 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 |
Lesser General Public License for more details. |
15 |
|
16 |
You should have received a copy of the GNU Lesser General Public |
17 |
License along with this library; if not, write to the Free Software |
18 |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 |
|
20 |
see README for more information |
21 |
EOH */ |
22 |
#ifndef LUTI_H |
23 |
|
24 |
/* |
25 |
$Id: luti.h,v 1.30 2003/04/17 13:14:41 mawag Exp $ |
26 |
common utilities for openisis lib implementation. |
27 |
*/ |
28 |
|
29 |
#include <assert.h> |
30 |
|
31 |
|
32 |
#include "loi.h" |
33 |
|
34 |
|
35 |
extern LogLevel log_lev; |
36 |
#define LOG_DO( lev ) ((lev) <= log_lev) |
37 |
#define LOG_DONT( lev ) ((lev) > log_lev) |
38 |
|
39 |
/** |
40 |
NOTE: unlike sMsg, this directly and immediatly lio_writes to file 2. |
41 |
So this is more expensive, but threadsafe. |
42 |
|
43 |
print some log message to stderr or some configured logdevice. |
44 |
for errors, use one of the LERR_xxx codes or |
45 |
a loglevel of SYSERR or IOERR to determine the error from errno. |
46 |
loglevels FATAL and ERROR, when used w/o error code, |
47 |
assum IDIOT and INVAL, resp. |
48 |
other logging levels do not assume an error (i.e. 0 == -LERR_OK). |
49 |
any error or loglevel code implies stream 2. |
50 |
@param code errorcode (-LERR_xxx) or loglevel as described above |
51 |
@return a non-positive code as described above |
52 |
*/ |
53 |
extern int log_msg ( int code, const char *fmt, ... ); |
54 |
#ifndef NDEBUG |
55 |
# define LOG_DBG log_msg |
56 |
#else |
57 |
# ifdef __GNUC__ |
58 |
# define LOG_DBG( args... ) |
59 |
# else |
60 |
# define LOG_DBG (void) /* compiler should dispose statement off */ |
61 |
# endif |
62 |
#endif |
63 |
|
64 |
#define LOG_OTO( to, args ) do { ret = log_msg args; goto to; } while (0) |
65 |
|
66 |
/* content logging is usually on level LOG_TRACE */ |
67 |
#define LOG_STR( rec, desc ) log_str( LOG_TRACE, rec, desc ) |
68 |
#define LOG_HEX( mem, len ) log_hex( LOG_TRACE, mem, len ) |
69 |
|
70 |
/** |
71 |
dump a record |
72 |
@param level loglevel necessary for output to occurr. |
73 |
*/ |
74 |
extern void log_str ( LogLevel level, int *rec, const char **desc ); |
75 |
|
76 |
/* |
77 |
* print fields of record to stderr |
78 |
* @param level if negative, print msg to stdout |
79 |
* @param delim field delimiter (default '; ') |
80 |
*/ |
81 |
extern void log_rec (int level, |
82 |
Rec *rec, const char *msg, const char *delim); |
83 |
|
84 |
/** |
85 |
hexdump memory |
86 |
@param level loglevel necessary for output to occurr. |
87 |
*/ |
88 |
extern void log_hex ( LogLevel level, const void *mem, int len ); |
89 |
|
90 |
/** |
91 |
do a malloc and print error if out of memory. |
92 |
*/ |
93 |
extern void *lmalloc ( int size ); |
94 |
|
95 |
/* more specific log functions in log.h */ |
96 |
|
97 |
/* printint: optional sign, up to 10 digits, 0 byte. |
98 |
buf must be at least 12 bytes long. |
99 |
return length w/o the 0 byte. |
100 |
*/ |
101 |
extern int lprint ( void *buf, int i ); |
102 |
|
103 |
|
104 |
/* Lookup of id from name */ |
105 |
typedef struct OpenIsisLT *LutiLT; |
106 |
|
107 |
/* create lookup table */ |
108 |
extern LutiLT luti_ltnew (); |
109 |
/* destroy lookup table */ |
110 |
extern void luti_ltdel (LutiLT lt); |
111 |
/* add entry */ |
112 |
extern void luti_ltadd (LutiLT lt, const char *name, int id); |
113 |
/* get id for name */ |
114 |
extern int luti_ltget (LutiLT lt, const char *name); |
115 |
/* remove entry */ |
116 |
extern void luti_ltrmv (LutiLT lt, const char *name); |
117 |
|
118 |
/* get fdt from rec */ |
119 |
extern Fdt* luti_fdt_from_rec (Rec *rec); |
120 |
|
121 |
/* get fd, tag, occurence from path */ |
122 |
extern const char* luti_parse_path ( |
123 |
const char *path, const Fdt *fdt, Fd **fd, int *tag, int *occ); |
124 |
|
125 |
/* extract embedded record from envelope */ |
126 |
extern Rec* luti_unwrap (Rec *env, int *pos, int tag, int dbid); |
127 |
|
128 |
/* extract embedded record from envelope */ |
129 |
extern Rec* luti_getembed ( |
130 |
Rec *env, const char *path, const Fdt *fdt); |
131 |
|
132 |
/* embed record in envelope */ |
133 |
extern Rec* luti_wrap (Rec *env, Rec *rec, int tag); |
134 |
|
135 |
/* append src fields to tgt */ |
136 |
extern Rec* luti_append (Rec *tgt, Rec *src); |
137 |
|
138 |
/** incr base ptr by incr*siz, if 0 < maxnum && *num < maxnum |
139 |
new allocated range is memsetted 0 |
140 |
NOTE: base is address of base for reallocation (whatever_type**) |
141 |
@return index of first new allocated address in array or -1 if out of mem |
142 |
*/ |
143 |
extern int luti_ptrincr ( |
144 |
void *base, int *num, int incr, int siz, int maxnum); |
145 |
|
146 |
/** free pointer array |
147 |
*/ |
148 |
extern void luti_free (void **arr, int num); |
149 |
|
150 |
/** check whether string represents a boolean value |
151 |
@return 0 str is false, |
152 |
1 str is true, |
153 |
-1 str is something else |
154 |
*/ |
155 |
extern int luti_true (const char *str, int len); |
156 |
|
157 |
/** |
158 |
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] |
159 |
forced to non-negative |
160 |
*/ |
161 |
extern int lhash ( const char *str, int len ); |
162 |
|
163 |
extern const char luti_hex[16]; /* '0'..'9','a'..'f' */ |
164 |
|
165 |
#define LUTI_H |
166 |
#endif /* LUTI_H */ |