# HG changeset patch # User tuomov # Date 972652647 -7200 # Node ID 9d41e36110506b18d86016dcfb3d6d4b96e6edc1 # Parent c3fa6c2785dd030c8d9a25b88546c250d749c290 trunk: changeset 28 Added errmsg_* functions alike warn_* -- asprintf and vasprintf required now. diff -r c3fa6c2785dd -r 9d41e3611050 Makefile --- a/Makefile Mon Oct 02 17:57:46 2000 +0200 +++ b/Makefile Fri Oct 27 15:17:27 2000 +0200 @@ -12,6 +12,12 @@ OBJS= misc.o output.o util.o optparser.o parser.o tokenizer.o +ifndef HAS_SYSTEM_ASPRINTF +OBJS += ../snprintf_2.2/snprintf.o +else +CFLAGS += -DHAS_SYSTEM_ASPRINTF +endif + LIBDIR=$(PREFIX)/lib INCDIR=$(PREFIX)/include/libtu diff -r c3fa6c2785dd -r 9d41e3611050 README --- a/README Mon Oct 02 17:57:46 2000 +0200 +++ b/README Fri Oct 27 15:17:27 2000 +0200 @@ -20,3 +20,12 @@ If you want to use it in your programs, you may try to figure out how by reading the header files (include/*.h) and test programs (tester*.c). Or you could try urging me to write some sort of a manual. + +--- + +Libtu needs the functions asprintf and vasprintf. These do not +exist on most platforms. One implementation is available at +, which is used by default +and is supposed to be found at ../snprintf_2.2. To use the +system's versions, if available, modify system.mk. + diff -r c3fa6c2785dd -r 9d41e3611050 include/libtu/output.h --- a/include/libtu/output.h Mon Oct 02 17:57:46 2000 +0200 +++ b/include/libtu/output.h Fri Oct 27 15:17:27 2000 +0200 @@ -45,4 +45,17 @@ extern void warn_err_obj(const char *obj); extern void warn_err_obj_line(const char *obj, int line); + +extern char *errmsg(const char *p, ...); +extern char *errmsg_v(const char *p, va_list args); + +extern char *errmsg_obj(const char *obj, const char *p, ...); +extern char *errmsg_obj_v(const char *obj, const char *p, va_list args); +extern char *errmsg_obj_line(const char *obj, int line, const char *p, ...); +extern char *errmsg_obj_line_v(const char *obj, int line, const char *p, va_list args); + +extern char *errmsg_err(); +extern char *errmsg_err_obj(const char *obj); +extern char *errmsg_err_obj_line(const char *obj, int line); + #endif /* LIBTU_OUTPUT_H */ diff -r c3fa6c2785dd -r 9d41e3611050 output.c --- a/output.c Mon Oct 02 17:57:46 2000 +0200 +++ b/output.c Fri Oct 27 15:17:27 2000 +0200 @@ -15,6 +15,12 @@ #include #include +#ifndef HAS_SYSTEM_ASPRINTF +#define NEED_ASPRINTF +#define NEED_VASPRINTF +#include "../snprintf_2.2/snprintf.h" +#endif + /* verbose */ @@ -96,15 +102,56 @@ } +#define CALL_V(NAME, ARGS) \ + va_list args; va_start(args, p); NAME ARGS; va_end(args); +#define CALL_V_RET(NAME, ARGS) \ + char *ret; va_list args; va_start(args, p); ret=NAME ARGS; va_end(args); return ret; + void warn(const char *p, ...) { - va_list args; - - va_start(args, p); - - warn_v(p, args); - - va_end(args); + CALL_V(warn_v, (p, args)); +} + + +char* errmsg(const char *p, ...) +{ + CALL_V_RET(errmsg_v, (p, args)); +} + + +void warn_obj(const char *obj, const char *p, ...) +{ + CALL_V(warn_obj_v, (obj, p, args)); +} + + +char *errmsg_obj(const char *obj, const char *p, ...) +{ + CALL_V_RET(errmsg_obj_v, (obj, p, args)); +} + + +void warn_obj_line(const char *obj, int line, const char *p, ...) +{ + CALL_V(warn_obj_line_v, (obj, line, p, args)); +} + + +char *errmsg_obj_line(const char *obj, int line, const char *p, ...) +{ + CALL_V_RET(errmsg_obj_line_v, (obj, line, p, args)); +} + + +void warn_obj_v(const char *obj, const char *p, va_list args) +{ + warn_obj_line_v(obj, -1, p, args); +} + + +char* errmsg_obj_v(const char *obj, const char *p, va_list args) +{ + return errmsg_obj_line_v(obj, -1, p, args); } @@ -116,37 +163,11 @@ } -void warn_obj(const char *obj, const char *p, ...) -{ - va_list args; - - va_start(args, p); - - warn_obj_v(obj, p, args); - - va_end(args); -} - - -void warn_obj_line(const char *obj, int line, const char *p, ...) +char *errmsg_v(const char *p, va_list args) { - va_list args; - - va_start(args, p); - - warn_obj_line_v(obj, line, p, args); - - va_end(args); -} - - -void warn_obj_v(const char *obj, const char *p, va_list args) -{ - put_prog_name(); - if(obj!=NULL) - fprintf(stderr,"%s: ", obj); - vfprintf(stderr, p, args); - putc('\n', stderr); + char *res; + vasprintf(&res, p, args); + return res; } @@ -167,6 +188,31 @@ } +char *errmsg_obj_line_v(const char *obj, int line, const char *p, va_list args) +{ + char *res1=NULL, *res2, *res3; + if(obj!=NULL){ + if(line>0) + asprintf(&res1, TR("%s:%d: "), obj, line); + else + asprintf(&res1, "%s: ", obj); + }else{ + if(line>0) + asprintf(&res1, TR("%d: "), line); + } + asprintf(&res2, p, args); + if(res1!=NULL){ + if(res2==NULL) + return NULL; + res3=scat(res1, res2); + free(res1); + free(res2); + return res3; + } + return res2; +} + + void warn_err() { put_prog_name(); @@ -174,6 +220,14 @@ } +char *errmsg_err() +{ + char *res; + asprintf(&res, "%s\n", strerror(errno)); + return res; +} + + void warn_err_obj(const char *obj) { put_prog_name(); @@ -181,7 +235,17 @@ fprintf(stderr, "%s: %s\n", obj, strerror(errno)); else fprintf(stderr, "%s\n", strerror(errno)); +} + +char *errmsg_err_obj(const char *obj) +{ + char *res; + if(obj!=NULL) + asprintf(&res, "%s: %s\n", obj, strerror(errno)); + else + asprintf(&res, "%s\n", strerror(errno)); + return res; } @@ -203,18 +267,30 @@ } +char *errmsg_err_obj_line(const char *obj, int line) +{ + char *res; + if(obj!=NULL){ + if(line>0) + asprintf(&res, TR("%s:%d: %s\n"), obj, line, strerror(errno)); + else + asprintf(&res, "%s: %s\n", obj, strerror(errno)); + }else{ + if(line>0) + asprintf(&res, TR("%d: %s\n"), line, strerror(errno)); + else + asprintf(&res, TR("%s\n"), strerror(errno)); + } + return res; +} + + /* die */ void die(const char *p, ...) { - va_list args; - - va_start(args, p); - - die_v(p, args); - - va_end(args); + CALL_V(die_v, (p, args)); } @@ -227,21 +303,13 @@ void die_obj(const char *obj, const char *p, ...) { - va_list args; - - va_start(args, p); - die_obj_v(obj, p, args); - va_end(args); + CALL_V(die_obj_v, (obj, p, args)); } void die_obj_line(const char *obj, int line, const char *p, ...) { - va_list args; - - va_start(args, p); - die_obj_line_v(obj, line, p, args); - va_end(args); + CALL_V(die_obj_line_v, (obj, line, p, args)); }