Mercurial > repos > clustalomega > clustalomega
comparison clustalomega/clustal-omega-1.0.2/src/clustal/log.c @ 1:bc707542e5de
Uploaded
author | clustalomega |
---|---|
date | Thu, 21 Jul 2011 13:35:08 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:ff1768533a07 | 1:bc707542e5de |
---|---|
1 /* -*- mode: c; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */ | |
2 | |
3 /********************************************************************* | |
4 * Clustal Omega - Multiple sequence alignment | |
5 * | |
6 * Copyright (C) 2010 University College Dublin | |
7 * | |
8 * Clustal-Omega is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU General Public License as | |
10 * published by the Free Software Foundation; either version 2 of the | |
11 * License, or (at your option) any later version. | |
12 * | |
13 * This file is part of Clustal-Omega. | |
14 * | |
15 ********************************************************************/ | |
16 | |
17 /* | |
18 * RCS $Id$ | |
19 */ | |
20 | |
21 #ifdef HAVE_CONFIG_H | |
22 #include "config.h" | |
23 #endif | |
24 | |
25 | |
26 #include <stdio.h> | |
27 #include <stdlib.h> | |
28 #include <stdarg.h> | |
29 #include <assert.h> | |
30 | |
31 #include "log.h" | |
32 | |
33 /* a default standard logger */ | |
34 log_t rLog; | |
35 | |
36 | |
37 | |
38 void | |
39 LogVfprintf(FILE *prFP, char *pcFmt, va_list rVArgList); | |
40 void | |
41 LogWarn(FILE *prFP, char *pcFmt, va_list rVArgList); | |
42 void | |
43 LogError(FILE *prFP, char *pcFmt, va_list rVArgList); | |
44 void | |
45 LogCritical(FILE *prFP, char *pcFmt, va_list rVArgList); | |
46 void | |
47 LogFatal(FILE *prFP, char *pcFmt, va_list rVArgList); | |
48 void | |
49 LogForcedDebug(FILE *prFP, char *pcFmt, va_list rVArgList); | |
50 | |
51 | |
52 | |
53 | |
54 /** | |
55 * @brief Plain, default print function | |
56 * | |
57 * Newline character is automatically appended to message. | |
58 * | |
59 */ | |
60 void | |
61 LogVfprintf(FILE *prFP, char *pcFmt, va_list rVArgList) | |
62 { | |
63 /* print prefix */ | |
64 vfprintf(prFP, pcFmt, rVArgList); | |
65 fprintf(prFP,"\n"); | |
66 | |
67 #ifndef NDEBUG | |
68 fflush(prFP); | |
69 #endif | |
70 } | |
71 /* end of LogVfprintf() */ | |
72 | |
73 | |
74 | |
75 /** | |
76 * @brief | |
77 * | |
78 */ | |
79 void | |
80 LogWarn(FILE *prFP, char *pcFmt, va_list rVArgList) | |
81 { | |
82 fprintf(prFP, "WARNING: "); | |
83 LogVfprintf(prFP, pcFmt, rVArgList); | |
84 } | |
85 /* end of LogWarn() */ | |
86 | |
87 | |
88 | |
89 /** | |
90 * @brief | |
91 * | |
92 */ | |
93 void | |
94 LogError(FILE *prFP, char *pcFmt, va_list rVArgList) | |
95 { | |
96 fprintf(prFP, "ERROR: "); | |
97 LogVfprintf(prFP, pcFmt, rVArgList); | |
98 } | |
99 /* end of LogError() */ | |
100 | |
101 | |
102 | |
103 /** | |
104 * @brief | |
105 * | |
106 */ | |
107 void | |
108 LogCritical(FILE *prFP, char *pcFmt, va_list rVArgList) | |
109 { | |
110 fprintf(prFP, "CRITICAL ERROR: "); | |
111 LogVfprintf(prFP, pcFmt, rVArgList); | |
112 } | |
113 /* end of LogCritical() */ | |
114 | |
115 | |
116 | |
117 /** | |
118 * @brief Will also exit! | |
119 */ | |
120 void | |
121 LogFatal(FILE *prFP, char *pcFmt, va_list rVArgList) | |
122 { | |
123 fprintf(prFP, "FATAL: "); | |
124 LogVfprintf(prFP, pcFmt, rVArgList); | |
125 | |
126 exit(EXIT_FAILURE); | |
127 } | |
128 /* end of LogFatal() */ | |
129 | |
130 | |
131 | |
132 /** | |
133 * @brief | |
134 * | |
135 */ | |
136 void | |
137 LogForcedDebug(FILE *prFP, char *pcFmt, va_list rVArgList) | |
138 { | |
139 fprintf(prFP, "FORCED DEBUG: "); | |
140 LogVfprintf(prFP, pcFmt, rVArgList); | |
141 } | |
142 /* end of LogForcedDebug() */ | |
143 | |
144 | |
145 | |
146 /** | |
147 * | |
148 * @brief Sets up default function pointers | |
149 * | |
150 */ | |
151 void | |
152 LogDefaultSetup(log_t *log) | |
153 { | |
154 log->iLogLevelEnabled = LOG_WARN; | |
155 | |
156 log->prFP[LOG_DEBUG] = stdout; | |
157 log->prFP[LOG_INFO] = stdout; | |
158 log->prFP[LOG_WARN] = stderr; | |
159 log->prFP[LOG_ERROR] = stderr; | |
160 log->prFP[LOG_CRITICAL] = stderr; | |
161 log->prFP[LOG_FATAL] = stderr; | |
162 log->prFP[LOG_FORCED_DEBUG] = stderr; | |
163 | |
164 log->prFunc[LOG_DEBUG] = &LogVfprintf; | |
165 log->prFunc[LOG_INFO] = &LogVfprintf; | |
166 log->prFunc[LOG_WARN] = &LogWarn; | |
167 log->prFunc[LOG_ERROR] = &LogError; | |
168 log->prFunc[LOG_CRITICAL] = &LogCritical; | |
169 log->prFunc[LOG_FATAL] = &LogFatal; | |
170 log->prFunc[LOG_FORCED_DEBUG] = &LogForcedDebug; | |
171 } | |
172 /* end of LogDefaultSetup() */ | |
173 | |
174 | |
175 | |
176 /** | |
177 * @brief Log to certain level | |
178 * | |
179 * See also comp.lang.c FAQ list ยท Question 15.12 | |
180 * http://c-faq.com/varargs/handoff.html How can I write a function which | |
181 * takes a variable number of arguments and passes them to some other function | |
182 * (which takes a variable number of arguments)? | |
183 * | |
184 */ | |
185 void | |
186 Log(log_t *prLog, int iLevel, char *pcFmt, ...) | |
187 { | |
188 va_list rVArgList; | |
189 void (*prFunc) (FILE *prFP, char *pcFormat, va_list rVArgList); | |
190 FILE *prFP; | |
191 | |
192 assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); | |
193 | |
194 /* fprintf(stderr, "DEBUG: iLevel=%d and iLogLevelEnabled=%d\n", iLevel, prLog->iLogLevelEnabled); */ | |
195 | |
196 /* return if below current loglevel */ | |
197 if (iLevel < prLog->iLogLevelEnabled) { | |
198 return; | |
199 } | |
200 | |
201 prFunc = prLog->prFunc[iLevel]; | |
202 prFP = prLog->prFP[iLevel]; | |
203 | |
204 /* return if muted */ | |
205 if (NULL == prFunc) { | |
206 return; | |
207 } | |
208 | |
209 va_start(rVArgList, pcFmt); | |
210 prFunc(prFP, pcFmt, rVArgList); | |
211 va_end(rVArgList); | |
212 } | |
213 /* end of Log() */ | |
214 | |
215 | |
216 | |
217 /** | |
218 * | |
219 * @brief Change file pointer for certain level | |
220 * | |
221 */ | |
222 void | |
223 LogSetFP(log_t *prLog, int iLevel, FILE *prFP) | |
224 { | |
225 assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); | |
226 | |
227 prLog->prFP[iLevel] = prFP; | |
228 } | |
229 /* end of LogSetFP() */ | |
230 | |
231 | |
232 | |
233 /** | |
234 * | |
235 * @brief Return file pointer for certain level | |
236 * | |
237 */ | |
238 FILE * | |
239 LogGetFP(log_t *prLog, int iLevel) | |
240 { | |
241 assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); | |
242 | |
243 return prLog->prFP[iLevel]; | |
244 } | |
245 /* end of LogGetFP() */ | |
246 | |
247 | |
248 | |
249 | |
250 | |
251 /** | |
252 * | |
253 * @brief Change file pointer for all levels | |
254 * | |
255 */ | |
256 void | |
257 LogSetFPForAll(log_t *prLog, FILE *prFP) | |
258 { | |
259 int iAux; | |
260 | |
261 for (iAux=0; iAux<LOG_NUM_LEVELS; iAux++) { | |
262 prLog->prFP[iAux] = prFP; | |
263 } | |
264 } | |
265 /* end of LogSetFP() */ | |
266 | |
267 | |
268 | |
269 /** | |
270 * | |
271 * @brief Mute certain level (i.e set the corresponding function to NULL) | |
272 * | |
273 */ | |
274 void | |
275 LogMute(log_t *prLog, int iLevel) | |
276 { | |
277 assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); | |
278 | |
279 prLog->prFunc[iLevel] = NULL; | |
280 } | |
281 /* end of LogMute() */ | |
282 | |
283 | |
284 /** | |
285 * | |
286 * @brief Mute all channels | |
287 * | |
288 */ | |
289 void | |
290 LogMuteAll(log_t *prLog) | |
291 { | |
292 int iAux; | |
293 | |
294 for (iAux=0; iAux<LOG_NUM_LEVELS; iAux++) { | |
295 LogMute(prLog, iAux); | |
296 } | |
297 } | |
298 /* end of LogMuteAll() */ | |
299 | |
300 | |
301 | |
302 /** | |
303 * @brief | |
304 * | |
305 */ | |
306 void | |
307 LogFuncOverwrite(log_t *prLog, int iLevel, | |
308 void (*Func) (FILE *prFP, char *pcFormat, va_list rVArgList)) | |
309 { | |
310 assert(iLevel>=0 && iLevel<=LOG_NUM_LEVELS); | |
311 | |
312 prLog->prFunc[iLevel] = Func; | |
313 | |
314 } | |
315 /* end of LogFuncOverwrite() */ | |
316 | |
317 | |
318 | |
319 #ifdef LOG_TEST | |
320 | |
321 | |
322 #define TEXT "Lorem ipsum dolor sit amet" | |
323 | |
324 void | |
325 PrintSomeTextToAll(log_t *prLog) { | |
326 int iAux; | |
327 for (iAux=0; iAux<LOG_NUM_LEVELS; iAux++) { | |
328 Log(prLog, iAux, TEXT); | |
329 } | |
330 } | |
331 | |
332 | |
333 int | |
334 main(int argc, char**argv) { | |
335 log_t prLog; | |
336 log_t pr2ndLog; | |
337 FILE *prFP; | |
338 char *pcTmpFileName = "schmock.txt"; | |
339 | |
340 prFP = fopen(pcTmpFileName, "w"); | |
341 | |
342 | |
343 LogDefaultSetup(&prLog); | |
344 LogDefaultSetup(&pr2ndLog); | |
345 | |
346 printf("Printing to log:\n"); | |
347 PrintSomeTextToAll(&prLog); | |
348 printf("---\n"); | |
349 | |
350 printf("Printing to pr2ndLog:\n"); | |
351 PrintSomeTextToAll(&prLog); | |
352 printf("---\n"); | |
353 | |
354 | |
355 | |
356 printf("Changing second log's FP to write to '%s'\n", pcTmpFileName); | |
357 LogSetFPForAll(&pr2ndLog, prFP); | |
358 | |
359 printf("Printing to pr2ndLog:\n"); | |
360 PrintSomeTextToAll(&pr2ndLog); | |
361 printf("---\n"); | |
362 | |
363 | |
364 printf("Changing Info() to new function (Fatal()) in log:\n"); | |
365 LogFuncOverwrite(&prLog, LOG_INFO, &LogFatal); | |
366 | |
367 printf("Printing to log:\n"); | |
368 PrintSomeTextToAll(&prLog); | |
369 printf("---\n"); | |
370 | |
371 | |
372 | |
373 fclose(prFP); | |
374 | |
375 return 0; | |
376 } | |
377 | |
378 | |
379 #endif |