]> mj.ucw.cz Git - libucw.git/blob - ucw/bbuf.c
Logging: Let log_close_all() ASSERT that all references are gone.
[libucw.git] / ucw / bbuf.c
1 /*
2  *      UCW Library -- A simple growing buffers for byte-sized items
3  *
4  *      (c) 2006 Pavel Charvat <pchar@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU Lesser General Public License.
8  */
9
10 #include "ucw/lib.h"
11 #include "ucw/bbuf.h"
12
13 #include <stdio.h>
14
15 char *
16 bb_vprintf_at(bb_t *bb, uns ofs, const char *fmt, va_list args)
17 {
18   bb_grow(bb, ofs + 1);
19   va_list args2;
20   va_copy(args2, args);
21   int cnt = vsnprintf(bb->ptr + ofs, bb->len - ofs, fmt, args2);
22   va_end(args2);
23   if (cnt < 0)
24     {
25       /* Our C library doesn't support C99 return value of vsnprintf, so we need to iterate */
26       do
27         {
28           bb_do_grow(bb, bb->len + 1);
29           va_copy(args2, args);
30           cnt = vsnprintf(bb->ptr + ofs, bb->len - ofs, fmt, args2);
31           va_end(args2);
32         }
33       while (cnt < 0);
34     }
35   else if ((uns)cnt >= bb->len - ofs)
36     {
37       bb_do_grow(bb, ofs + cnt + 1);
38       va_copy(args2, args);
39       int cnt2 = vsnprintf(bb->ptr + ofs, bb->len - ofs, fmt, args2);
40       va_end(args2);
41       ASSERT(cnt2 == cnt);
42     }
43   return bb->ptr + ofs;
44 }
45
46 char *
47 bb_printf_at(bb_t *bb, uns ofs, const char *fmt, ...)
48 {
49   va_list args;
50   va_start(args, fmt);
51   char *res = bb_vprintf_at(bb, ofs, fmt, args);
52   va_end(args);
53   return res;
54 }
55
56 char *
57 bb_vprintf(bb_t *bb, const char *fmt, va_list args)
58 {
59   return bb_vprintf_at(bb, 0, fmt, args);
60 }
61
62 char *
63 bb_printf(bb_t *bb, const char *fmt, ...)
64 {
65   va_list args;
66   va_start(args, fmt);
67   char *res = bb_vprintf_at(bb, 0, fmt, args);
68   va_end(args);
69   return res;
70 }
71
72 #ifdef TEST
73
74 int main(void)
75 {
76   bb_t bb;
77   bb_init(&bb);
78   char *x = bb_printf(&bb, "<Hello, %s!>", "World");
79   fputs(x, stdout);
80   x = bb_printf_at(&bb, 5, "<Hello, %50s!>\n", "World");
81   fputs(x, stdout);
82   bb_done(&bb);
83   return 0;
84 }
85
86 #endif