note the ft1 change in Changes
[imager.git] / log.c
CommitLineData
835813fd 1#define IMAGER_NO_CONTEXT
696cb85d 2#include "imageri.h"
e11d297f 3#include "imconfig.h"
02d1d628 4#include "log.h"
35891892 5#include <stdlib.h>
10ea52a3 6#include <errno.h>
8d14daab 7#include "imerror.h"
10ea52a3
TC
8
9#ifdef IMAGER_LOG
02d1d628
AMH
10
11#define DTBUFF 50
12#define DATABUFF DTBUFF+3+10+1+5+1+1
13
696cb85d 14#if 0
02d1d628
AMH
15static int log_level = 0;
16static FILE *lg_file = NULL;
02d1d628
AMH
17static char date_buffer[DTBUFF];
18static char data_buffer[DATABUFF];
696cb85d 19#endif
02d1d628 20
696cb85d 21#define LOG_DATE_FORMAT "%Y/%m/%d %H:%M:%S"
a482206e 22
44d86483
TC
23static void
24im_vloog(pIMCTX, int level, const char *fmt, va_list ap);
25
02d1d628
AMH
26/*
27 * Logging is active
28 */
29
10ea52a3 30int
696cb85d 31im_init_log(pIMCTX, const char* name,int level) {
10ea52a3 32 i_clear_error();
696cb85d 33 aIMCTX->log_level = level;
02d1d628 34 if (level < 0) {
696cb85d 35 aIMCTX->lg_file = NULL;
02d1d628
AMH
36 } else {
37 if (name == NULL) {
696cb85d 38 aIMCTX->lg_file = stderr;
02d1d628 39 } else {
696cb85d 40 if (NULL == (aIMCTX->lg_file = fopen(name, "w+")) ) {
835813fd 41 im_push_errorf(aIMCTX, errno, "Cannot open file '%s': (%d)", name, errno);
10ea52a3 42 return 0;
02d1d628
AMH
43 }
44 }
45 }
696cb85d
TC
46 if (aIMCTX->lg_file) {
47 setvbuf(aIMCTX->lg_file, NULL, _IONBF, BUFSIZ);
835813fd 48 im_log((aIMCTX, 0,"Imager - log started (level = %d)\n", level));
10ea52a3
TC
49 }
50
696cb85d 51 return aIMCTX->lg_file != NULL;
02d1d628
AMH
52}
53
54void
b1e96952 55i_fatal(int exitcode,const char *fmt, ... ) {
02d1d628 56 va_list ap;
835813fd 57 dIMCTX;
44d86483
TC
58
59 if (aIMCTX->lg_file != NULL) {
a482206e 60 va_start(ap,fmt);
44d86483 61 im_vloog(aIMCTX, 0, fmt, ap);
a482206e
TC
62 va_end(ap);
63 }
64 exit(exitcode);
65}
02d1d628 66
44d86483
TC
67void
68im_fatal(pIMCTX, int exitcode,const char *fmt, ... ) {
69 va_list ap;
44d86483
TC
70
71 if (aIMCTX->lg_file != NULL) {
72 va_start(ap,fmt);
73 im_vloog(aIMCTX, 0, fmt, ap);
74 va_end(ap);
75 }
76 exit(exitcode);
77}
d03fd5a4 78
bd8052a6
TC
79/*
80=item i_loog(level, format, ...)
81=category Logging
82
83This is an internal function called by the mm_log() macro.
84
85=cut
86*/
02d1d628 87
696cb85d
TC
88static void
89im_vloog(pIMCTX, int level, const char *fmt, va_list ap) {
90 time_t timi;
91 struct tm *str_tm;
92 char date_buffer[DTBUFF];
93
94 if (!aIMCTX->lg_file || level > aIMCTX->log_level)
95 return;
96
97 timi = time(NULL);
98 str_tm = localtime(&timi);
99 strftime(date_buffer, DTBUFF, LOG_DATE_FORMAT, str_tm);
100 fprintf(aIMCTX->lg_file, "[%s] %10s:%-5d %3d: ", date_buffer,
101 aIMCTX->filename, aIMCTX->line, level);
102 vfprintf(aIMCTX->lg_file, fmt, ap);
103 fflush(aIMCTX->lg_file);
104}
105
02d1d628 106void
bf1573f9 107i_loog(int level,const char *fmt, ... ) {
835813fd 108 dIMCTX;
02d1d628 109 va_list ap;
696cb85d
TC
110
111 if (!aIMCTX->lg_file || level > aIMCTX->log_level)
112 return;
113
114 va_start(ap,fmt);
115 im_vloog(aIMCTX, level, fmt, ap);
116 va_end(ap);
117}
118
119void
120im_loog(pIMCTX, int level,const char *fmt, ... ) {
121 va_list ap;
122
123 if (!aIMCTX->lg_file || level > aIMCTX->log_level)
124 return;
125
126 va_start(ap,fmt);
127 im_vloog(aIMCTX, level, fmt, ap);
128 va_end(ap);
02d1d628
AMH
129}
130
6cfee9d1
TC
131/*
132=item i_lhead(file, line)
133=category Logging
134
135This is an internal function called by the mm_log() macro.
136
137=cut
138*/
02d1d628
AMH
139
140void
696cb85d
TC
141im_lhead(pIMCTX, const char *file, int line) {
142 if (aIMCTX->lg_file != NULL) {
143 aIMCTX->filename = file;
144 aIMCTX->line = line;
02d1d628
AMH
145 }
146}
10ea52a3 147
696cb85d 148void i_lhead(const char *file, int line) {
835813fd 149 dIMCTX;
696cb85d
TC
150
151 im_lhead(aIMCTX, file, line);
152}
153
10ea52a3
TC
154#else
155
156/*
157 * Logging is inactive - insert dummy functions
158 */
159
835813fd 160int im_init_log(pIMCTX, const char* name,int onoff) {
10ea52a3
TC
161 i_clear_error();
162 i_push_error(0, "Logging disabled");
163 return 0;
164}
165
166void i_fatal(int exitcode,const char *fmt, ... ) { exit(exitcode); }
44d86483 167void im_fatal(pIMCTX, int exitcode,const char *fmt, ... ) { exit(exitcode); }
10ea52a3
TC
168
169void
170i_loog(int level,const char *fmt, ... ) {
171}
172
835813fd
TC
173void
174im_loog(pIMCTX, int level,const char *fmt, ... ) {
175}
176
10ea52a3
TC
177void
178i_lhead(const char *file, int line) { }
179
835813fd
TC
180void
181im_lhead(pIMCTX, const char *file, int line) { }
182
10ea52a3 183#endif