1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                  Common Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*            http://www.opensource.org/licenses/cpl1.0.txt             *
11*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#include	"sfhdr.h"
23
24/*	Construct a string with the given format and data.
25**	These functions allocate space as necessary to store the string.
26**	This avoids overflow problems typical with sprintf() in stdio.
27**
28**	Written by Kiem-Phong Vo.
29*/
30
31#if __STD_C
32char* sfvprints(const char* form, va_list args)
33#else
34char* sfvprints(form, args)
35char*	form;
36va_list	args;
37#endif
38{
39	reg int		rv;
40	static Sfio_t*	f;
41
42	/* make a fake stream */
43	if(!f &&
44	   !(f = sfnew(NIL(Sfio_t*),NIL(char*),(size_t)SF_UNBOUND,
45			-1,SF_WRITE|SF_STRING)) )
46		return NIL(char*);
47
48	sfseek(f,(Sfoff_t)0,SEEK_SET);
49	rv = sfvprintf(f,form,args);
50
51	if(rv < 0 || sfputc(f,'\0') < 0)
52		return NIL(char*);
53
54	_Sfi = (f->next - f->data) - 1;
55	return (char*)f->data;
56}
57
58#if __STD_C
59char* sfprints(const char* form, ...)
60#else
61char* sfprints(va_alist)
62va_dcl
63#endif
64{
65	char*	s;
66	va_list	args;
67
68#if __STD_C
69	va_start(args,form);
70#else
71	char	*form;
72	va_start(args);
73	form = va_arg(args,char*);
74#endif
75	s = sfvprints(form, args);
76	va_end(args);
77
78	return s;
79}
80
81#if __STD_C
82ssize_t sfvaprints(char** sp, const char* form, va_list args)
83#else
84ssize_t sfvaprints(sp, form, args)
85char**	sp;
86char*	form;
87va_list	args;
88#endif
89{
90	char	*s;
91	ssize_t	n;
92
93	if(!sp || !(s = sfvprints(form,args)) )
94		return -1;
95	else
96	{	if(!(*sp = (char*)malloc(n = strlen(s)+1)) )
97			return -1;
98		memcpy(*sp, s, n);
99		return n - 1;
100	}
101}
102
103#if __STD_C
104ssize_t sfaprints(char** sp, const char* form, ...)
105#else
106ssize_t sfaprints(va_alist)
107va_dcl
108#endif
109{
110	ssize_t	n;
111	va_list	args;
112
113#if __STD_C
114	va_start(args,form);
115#else
116	char	**sp, *form;
117	va_start(args);
118	sp = va_arg(args, char**);
119	form = va_arg(args, char*);
120#endif
121	n = sfvaprints(sp, form, args);
122	va_end(args);
123
124	return n;
125}
126