Udpxy v1.0-Chipmunk-build21
[tomato.git] / release / src / router / udpxy / prbuf.c
blob9c2cded0b346be2c3e385f88435286b8c6d8d594
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>
22 #include <stdarg.h>
23 #include <stdio.h>
24 #include <assert.h>
25 #include <string.h>
26 #include <stdlib.h>
27 #include <errno.h>
29 #include "prbuf.h"
31 struct printbuf
33 char* buf;
34 size_t len,
35 pos;
39 int
40 prbuf_open( prbuf_t* pb, void* buf, size_t n )
42 prbuf_t p = NULL;
44 assert( pb && buf && (n > (size_t)0) );
46 p = malloc( sizeof(struct printbuf) );
47 if( NULL == p ) return -1;
49 *pb = p;
51 p->buf = (char*)buf;
52 p->len = n;
53 p->pos = 0;
55 return 0;
59 void
60 prbuf_rewind( prbuf_t pb )
62 assert( pb );
64 pb->pos = 0;
65 pb->buf[0] = '\0';
70 int
71 prbuf_close( prbuf_t pb )
73 assert( pb );
75 free( pb );
76 return 0;
79 size_t
80 prbuf_len( prbuf_t pb )
82 assert( pb );
83 return pb->pos;
86 int
87 prbuf_printf( prbuf_t pb, const char* format, ... )
89 va_list ap;
90 char* p = NULL;
91 int n = -1;
92 size_t left;
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 );
102 errno = 0;
103 n = vsnprintf( p, left, format, ap );
104 va_end( ap );
106 if( n < 0 ) return -1;
108 if( (size_t)n >= left ) {
109 n = left;
112 p[ n ] = '\0';
113 pb->pos += (size_t)n;
114 return n;
118 /* __EOF__ */