1 /* -------------------------------------------------------------------- */
2 /* */
3 /* */
4 /* */
5 /* Copyright (C) 2000 Angelo Masci */
6 /* */
7 /* This program 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 2 of the License, or */
10 /* (at your option) any later version. */
11 /* */
12 /* This program 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. */
16 /* */
17 /* You should have received a copy of the GNU General Public License */
18 /* along with this program; if not, write to the Free Software */
19 /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20 /* */
21 /* You can contact the author at this e-mail address: */
22 /* */
23 /* angelo@styx.demon.co.uk */
24 /* */
25 /* --------------------------------------------------------------------
26 $Id$
27 -------------------------------------------------------------------- */
28
29 #include <stdio.h>
30 #include <stdarg.h>
31
32 #include "common.h"
33 #include "format.h"
34
35 /* -------------------------------------------------------------------- */
36 /* -------------------------------------------------------------------- */
37 struct charbuf_struct
38 {
39 char *buf,
40 *ptr;
41 int len;
42 };
43
44 /* -------------------------------------------------------------------- */
45 /* -------------------------------------------------------------------- */
copytobuf(void * cfarg,char * str,int len)46 static int copytobuf(void *cfarg, char *str, int len)
47 {
48 struct charbuf_struct
49 *cbuf;
50 int n;
51
52
53 cbuf = (struct charbuf_struct *)cfarg;
54
55 n = 0;
56 while (len--)
57 {
58 if (cbuf->len == -1)
59 {
60 *cbuf->ptr++ = *str++;
61 n++;
62 }
63 else
64 if (cbuf->len == 0)
65 {
66 *cbuf->ptr = '\0';
67 }
68 else
69 { cbuf->len--;
70 *cbuf->ptr++ = *str++;
71 n++;
72 }
73 }
74
75 return n;
76 }
77
78
79 /* -------------------------------------------------------------------- */
80 /* -------------------------------------------------------------------- */
libcommon_vsnprintf(char * buf,int len,char * fmt,va_list args)81 int libcommon_vsnprintf(char *buf, int len, char *fmt, va_list args)
82 {
83 struct charbuf_struct cbuf;
84
85 cbuf.buf = buf;
86 cbuf.ptr = buf;
87 cbuf.len = len;
88
89 return format(copytobuf, NULL, &cbuf, fmt, args);
90 }
91
92
93
94