1 /* @(#) formatted printing into a buffer
3 * Copyright 2008-2011 Pavel V. Cherenkov (pcherenkov@gmail.com)
5 * This file is part of udpxy.
7 * udpxy is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * udpxy is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with udpxy. If not, see <http://www.gnu.org/licenses/>.
21 #include <sys/types.h>
40 prbuf_open( prbuf_t
* pb
, void* buf
, size_t n
)
44 assert( pb
&& buf
&& (n
> (size_t)0) );
46 p
= malloc( sizeof(struct printbuf
) );
47 if( NULL
== p
) return -1;
60 prbuf_rewind( prbuf_t pb
)
71 prbuf_close( prbuf_t pb
)
80 prbuf_len( prbuf_t pb
)
87 prbuf_printf( prbuf_t pb
, const char* format
, ... )
94 assert( pb
&& format
);
96 if( pb
->pos
>= pb
->len
) return 0;
98 left
= pb
->len
- pb
->pos
- 1;
99 p
= pb
->buf
+ pb
->pos
;
101 va_start( ap
, format
);
103 n
= vsnprintf( p
, left
, format
, ap
);
106 if( n
< 0 ) return -1;
108 if( (size_t)n
>= left
) {
113 pb
->pos
+= (size_t)n
;