]> git.imager.perl.org - imager.git/blob - log.c
don't define mm_log() with IMAGER_NO_CONTEXT
[imager.git] / log.c
1 #define IMAGER_NO_CONTEXT
2 #include "imageri.h"
3 #include "imconfig.h"
4 #include "log.h"
5 #include <stdlib.h>
6 #include <errno.h>
7 #include "imerror.h"
8
9 #ifdef IMAGER_LOG
10
11 #define DTBUFF 50
12 #define DATABUFF DTBUFF+3+10+1+5+1+1
13
14 #if 0
15 static int   log_level   = 0;
16 static FILE *lg_file     = NULL;
17 static char  date_buffer[DTBUFF];
18 static char  data_buffer[DATABUFF];
19 #endif
20
21 #define LOG_DATE_FORMAT "%Y/%m/%d %H:%M:%S"
22
23 static void
24 im_vloog(pIMCTX, int level, const char *fmt, va_list ap);
25
26 /*
27  * Logging is active
28  */
29
30 int
31 im_init_log(pIMCTX, const char* name,int level) {
32   i_clear_error();
33   aIMCTX->log_level = level;
34   if (level < 0) {
35     aIMCTX->lg_file = NULL;
36   } else {
37     if (name == NULL) {
38       aIMCTX->lg_file = stderr;
39     } else {
40       if (NULL == (aIMCTX->lg_file = fopen(name, "w+")) ) { 
41         im_push_errorf(aIMCTX, errno, "Cannot open file '%s': (%d)", name, errno);
42         return 0;
43       }
44     }
45   }
46   if (aIMCTX->lg_file) {
47     setvbuf(aIMCTX->lg_file, NULL, _IONBF, BUFSIZ);
48     im_log((aIMCTX, 0,"Imager - log started (level = %d)\n", level));
49   }
50
51   return aIMCTX->lg_file != NULL;
52 }
53
54 void
55 i_fatal(int exitcode,const char *fmt, ... ) {
56   va_list ap;
57   dIMCTX;
58
59   if (aIMCTX->lg_file != NULL) {
60     va_start(ap,fmt);
61     im_vloog(aIMCTX, 0, fmt, ap);
62     va_end(ap);
63   }
64   exit(exitcode);
65 }
66
67 void
68 im_fatal(pIMCTX, int exitcode,const char *fmt, ... ) {
69   va_list ap;
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 }
78
79 /*
80 =item i_loog(level, format, ...)
81 =category Logging
82
83 This is an internal function called by the mm_log() macro.
84
85 =cut
86 */
87
88 static void
89 im_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
106 void
107 i_loog(int level,const char *fmt, ... ) {
108   dIMCTX;
109   va_list ap;
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
119 void
120 im_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);
129 }
130
131 /*
132 =item i_lhead(file, line)
133 =category Logging
134
135 This is an internal function called by the mm_log() macro.
136
137 =cut
138 */
139
140 void
141 im_lhead(pIMCTX, const char *file, int line) {
142   if (aIMCTX->lg_file != NULL) {
143     aIMCTX->filename = file;
144     aIMCTX->line = line;
145   }
146 }
147
148 void i_lhead(const char *file, int line) {
149   dIMCTX;
150
151   im_lhead(aIMCTX, file, line);
152 }
153
154 #else
155
156 /*
157  * Logging is inactive - insert dummy functions
158  */
159
160 int im_init_log(pIMCTX, const char* name,int onoff) {
161   i_clear_error();
162   i_push_error(0, "Logging disabled");
163   return 0;
164 }
165
166 void i_fatal(int exitcode,const char *fmt, ... ) { exit(exitcode); }
167 void im_fatal(pIMCTX, int exitcode,const char *fmt, ... ) { exit(exitcode); }
168
169 void
170 i_loog(int level,const char *fmt, ... ) {
171 }
172
173 void
174 im_loog(pIMCTX, int level,const char *fmt, ... ) {
175 }
176
177 void
178 i_lhead(const char *file, int line) { }
179
180 void
181 im_lhead(pIMCTX, const char *file, int line) { }
182
183 #endif