From 0fcb09840c756fc67ba5e572c25f5304e639f54c Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 27 Oct 2002 13:16:03 +0000 Subject: [PATCH] Added printf on fastbuf streams. The current implementation is not too optimized for anything else than simplicity. --- lib/Makefile | 2 +- lib/fastbuf.h | 6 +++++ lib/fb-printf.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 lib/fb-printf.c diff --git a/lib/Makefile b/lib/Makefile index 7e1f5b83..e8784f67 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -8,7 +8,7 @@ LIBSH_MODS=alloc alloc_str ctmatch db fastbuf fb-file fb-mem lists \ prime random realloc regex timer url wildmatch \ wordsplit str_ctype str_upper bucket conf object sorter \ finger proctitle ipaccess profile bitsig randomkey \ - hashfunc base64 base224 fb-temp printf fb-mmap + hashfunc base64 base224 fb-temp printf fb-mmap fb-printf LIBSH_MOD_PATHS=$(addprefix obj/lib/,$(LIBSH_MODS)) $(CUSTOM_MODULES) obj/lib/libsh.a: $(addsuffix .o,$(LIBSH_MOD_PATHS)) diff --git a/lib/fastbuf.h b/lib/fastbuf.h index ebc69955..a370c45b 100644 --- a/lib/fastbuf.h +++ b/lib/fastbuf.h @@ -15,6 +15,7 @@ #endif #include +#include #include "lib/unaligned.h" @@ -345,4 +346,9 @@ bdirect_write_commit(struct fastbuf *f, byte *pos) f->bptr = pos; } +/* Formatted output */ + +int bprintf(struct fastbuf *b, byte *msg, ...); +int vbprintf(struct fastbuf *b, byte *msg, va_list args); + #endif diff --git a/lib/fb-printf.c b/lib/fb-printf.c new file mode 100644 index 00000000..395e04b2 --- /dev/null +++ b/lib/fb-printf.c @@ -0,0 +1,59 @@ +/* + * Sherlock Library -- Printf on Fastbuf Streams + * + * (c) 2002 Martin Mares + * + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. + */ + +#include "lib/lib.h" +#include "lib/fastbuf.h" + +#include + +int +vbprintf(struct fastbuf *b, byte *msg, va_list args) +{ + byte *buf; + int r, len = 256; + + while (1) + { + buf = alloca(len); + r = vsnprintf(buf, len, msg, args); + if (r < 0) + len += len; + else if (r < len) + { + bwrite(b, buf, r); + return r; + } + else + len = r+1; + } +} + +int +bprintf(struct fastbuf *b, byte *msg, ...) +{ + va_list args; + int res; + + va_start(args, msg); + res = vbprintf(b, msg, args); + va_end(args); + return res; +} + +#ifdef TEST + +int main(void) +{ + struct fastbuf *b = bfdopen_shared(1, 65536); + bprintf(b, "13=%d str=<%s> msg=%m\n", 13, "str"); + bclose(b); + return 0; +} + +#endif -- 2.39.2