4 * Copyright (c) Tuomo Valkonen 1999-2002.
6 * You may distribute and modify this library under the terms of either
7 * the Clarified Artistic License or the GNU LGPL, version 2.1 or later.
10 #if HAS_SYSTEM_ASPRINTF
25 #if !HAS_SYSTEM_ASPRINTF
26 #include "snprintf_2.2/snprintf.c"
30 static void default_warn_handler(const char *message
);
33 static bool verbose_mode
=FALSE
;
34 static int verbose_indent_lvl
=0;
35 static bool progname_enable
=TRUE
;
36 static WarnHandler
*current_warn_handler
=default_warn_handler
;
38 #define INDENTATOR_LENGTH 4
40 static char indentator
[]={' ', ' ', ' ', ' '};
42 static void do_dispatch_message(const char *message
);
45 void verbose(const char *p
, ...)
57 void verbose_v(const char *p
, va_list args
)
62 for(i
=0; i
<verbose_indent_lvl
; i
++)
63 writef(stdout
, indentator
, INDENTATOR_LENGTH
);
71 void verbose_enable(bool enable
)
77 int verbose_indent(int depth
)
79 int old
=verbose_indent_lvl
;
82 verbose_indent_lvl
=depth
;
88 void warn_progname_enable(bool enable
)
90 progname_enable
=enable
;
94 static void put_prog_name()
101 progname
=libtu_progname();
106 fprintf(stderr
, "%s: ", (char*)progname
);
113 static void fallback_warn()
116 fprintf(stderr
, TR("Oops. Error string compilation failed: %s"),
121 #define CALL_V(NAME, ARGS) \
122 do { va_list args; va_start(args, p); NAME ARGS; va_end(args); } while(0)
124 #define DO_DISPATCH(NAME, ARGS) \
127 if((msg=NAME ARGS)!=NULL){ \
128 do_dispatch_message(msg); \
136 void libtu_asprintf(char **ret
, const char *p
, ...)
139 CALL_V(vasprintf
, (ret
, p
, args
));
145 void libtu_vasprintf(char **ret
, const char *p
, va_list args
)
148 vasprintf(ret
, p
, args
);
154 void warn(const char *p
, ...)
156 CALL_V(warn_v
, (p
, args
));
160 void warn_obj(const char *obj
, const char *p
, ...)
162 CALL_V(warn_obj_v
, (obj
, p
, args
));
166 void warn_obj_line(const char *obj
, int line
, const char *p
, ...)
168 CALL_V(warn_obj_line_v
, (obj
, line
, p
, args
));
172 void warn_obj_v(const char *obj
, const char *p
, va_list args
)
174 warn_obj_line_v(obj
, -1, p
, args
);
178 void warn_v(const char *p
, va_list args
)
180 DO_DISPATCH(errmsg_v
, (p
, args
));
184 void warn_obj_line_v(const char *obj
, int line
, const char *p
, va_list args
)
186 DO_DISPATCH(errmsg_obj_line_v
, (obj
, line
, p
, args
));
192 DO_DISPATCH(errmsg_err
, ());
196 void warn_err_obj(const char *obj
)
198 DO_DISPATCH(errmsg_err_obj
, (obj
));
201 void warn_err_obj_line(const char *obj
, int line
)
203 DO_DISPATCH(errmsg_err_obj_line
, (obj
, line
));
210 #define CALL_V_RET(NAME, ARGS) \
211 char *ret; va_list args; va_start(args, p); ret=NAME ARGS; \
212 va_end(args); return ret;
215 char* errmsg(const char *p
, ...)
217 CALL_V_RET(errmsg_v
, (p
, args
));
221 char *errmsg_obj(const char *obj
, const char *p
, ...)
223 CALL_V_RET(errmsg_obj_v
, (obj
, p
, args
));
227 char *errmsg_obj_line(const char *obj
, int line
, const char *p
, ...)
229 CALL_V_RET(errmsg_obj_line_v
, (obj
, line
, p
, args
));
233 char* errmsg_obj_v(const char *obj
, const char *p
, va_list args
)
235 return errmsg_obj_line_v(obj
, -1, p
, args
);
239 char *errmsg_v(const char *p
, va_list args
)
242 libtu_vasprintf(&res
, p
, args
);
247 char *errmsg_obj_line_v(const char *obj
, int line
, const char *p
, va_list args
)
249 char *res1
=NULL
, *res2
, *res3
;
253 libtu_asprintf(&res1
, "%s:%d: ", obj
, line
);
255 libtu_asprintf(&res1
, "%s: ", obj
);
258 libtu_asprintf(&res1
, "%d: ", line
);
260 libtu_vasprintf(&res2
, p
, args
);
264 res3
=scat(res1
, res2
);
276 libtu_asprintf(&res
, "%s\n", strerror(errno
));
281 char *errmsg_err_obj(const char *obj
)
285 libtu_asprintf(&res
, "%s: %s\n", obj
, strerror(errno
));
287 libtu_asprintf(&res
, "%s\n", strerror(errno
));
292 char *errmsg_err_obj_line(const char *obj
, int line
)
297 libtu_asprintf(&res
, "%s:%d: %s\n", obj
, line
, strerror(errno
));
299 libtu_asprintf(&res
, "%s: %s\n", obj
, strerror(errno
));
302 libtu_asprintf(&res
, "%d: %s\n", line
, strerror(errno
));
304 libtu_asprintf(&res
, "%s\n", strerror(errno
));
314 void die(const char *p
, ...)
316 set_warn_handler(NULL
);
317 CALL_V(die_v
, (p
, args
));
321 void die_v(const char *p
, va_list args
)
323 set_warn_handler(NULL
);
329 void die_obj(const char *obj
, const char *p
, ...)
331 set_warn_handler(NULL
);
332 CALL_V(die_obj_v
, (obj
, p
, args
));
336 void die_obj_line(const char *obj
, int line
, const char *p
, ...)
338 set_warn_handler(NULL
);
339 CALL_V(die_obj_line_v
, (obj
, line
, p
, args
));
343 void die_obj_v(const char *obj
, const char *p
, va_list args
)
345 set_warn_handler(NULL
);
346 warn_obj_v(obj
, p
, args
);
351 void die_obj_line_v(const char *obj
, int line
, const char *p
, va_list args
)
353 set_warn_handler(NULL
);
354 warn_obj_line_v(obj
, line
, p
, args
);
361 set_warn_handler(NULL
);
367 void die_err_obj(const char *obj
)
369 set_warn_handler(NULL
);
375 void die_err_obj_line(const char *obj
, int line
)
377 set_warn_handler(NULL
);
378 warn_err_obj_line(obj
, line
);
383 static void default_warn_handler(const char *message
)
386 fprintf(stderr
, "%s", message
);
391 static void do_dispatch_message(const char *message
)
393 if(current_warn_handler
!=NULL
)
394 current_warn_handler(message
);
396 default_warn_handler(message
);
400 WarnHandler
*set_warn_handler(WarnHandler
*handler
)
402 WarnHandler
*old
=current_warn_handler
;
403 current_warn_handler
=(handler
!=NULL
? handler
: default_warn_handler
);