xref: /onnv-gate/usr/src/lib/libast/common/sfio/sfprints.c (revision 12068:08a39a083754)
14887Schin /***********************************************************************
24887Schin *                                                                      *
34887Schin *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1985-2010 AT&T Intellectual Property          *
54887Schin *                      and is licensed under the                       *
64887Schin *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
84887Schin *                                                                      *
94887Schin *                A copy of the License is available at                 *
104887Schin *            http://www.opensource.org/licenses/cpl1.0.txt             *
114887Schin *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
124887Schin *                                                                      *
134887Schin *              Information and Software Systems Research               *
144887Schin *                            AT&T Research                             *
154887Schin *                           Florham Park NJ                            *
164887Schin *                                                                      *
174887Schin *                 Glenn Fowler <gsf@research.att.com>                  *
184887Schin *                  David Korn <dgk@research.att.com>                   *
194887Schin *                   Phong Vo <kpv@research.att.com>                    *
204887Schin *                                                                      *
214887Schin ***********************************************************************/
224887Schin #include	"sfhdr.h"
234887Schin 
244887Schin /*	Construct a string with the given format and data.
254887Schin **	These functions allocate space as necessary to store the string.
264887Schin **	This avoids overflow problems typical with sprintf() in stdio.
274887Schin **
284887Schin **	Written by Kiem-Phong Vo.
294887Schin */
304887Schin 
314887Schin #if __STD_C
sfvprints(const char * form,va_list args)324887Schin char* sfvprints(const char* form, va_list args)
334887Schin #else
344887Schin char* sfvprints(form, args)
354887Schin char*	form;
364887Schin va_list	args;
374887Schin #endif
384887Schin {
394887Schin 	reg int		rv;
404887Schin 	static Sfio_t*	f;
414887Schin 
424887Schin 	/* make a fake stream */
434887Schin 	if(!f &&
444887Schin 	   !(f = sfnew(NIL(Sfio_t*),NIL(char*),(size_t)SF_UNBOUND,
454887Schin 			-1,SF_WRITE|SF_STRING)) )
464887Schin 		return NIL(char*);
474887Schin 
484887Schin 	sfseek(f,(Sfoff_t)0,SEEK_SET);
494887Schin 	rv = sfvprintf(f,form,args);
504887Schin 
514887Schin 	if(rv < 0 || sfputc(f,'\0') < 0)
524887Schin 		return NIL(char*);
534887Schin 
544887Schin 	_Sfi = (f->next - f->data) - 1;
554887Schin 	return (char*)f->data;
564887Schin }
574887Schin 
584887Schin #if __STD_C
sfprints(const char * form,...)594887Schin char* sfprints(const char* form, ...)
604887Schin #else
614887Schin char* sfprints(va_alist)
624887Schin va_dcl
634887Schin #endif
644887Schin {
654887Schin 	char*	s;
664887Schin 	va_list	args;
674887Schin 
684887Schin #if __STD_C
694887Schin 	va_start(args,form);
704887Schin #else
714887Schin 	char	*form;
724887Schin 	va_start(args);
734887Schin 	form = va_arg(args,char*);
744887Schin #endif
754887Schin 	s = sfvprints(form, args);
764887Schin 	va_end(args);
774887Schin 
784887Schin 	return s;
794887Schin }
804887Schin 
814887Schin #if __STD_C
sfvaprints(char ** sp,const char * form,va_list args)824887Schin ssize_t sfvaprints(char** sp, const char* form, va_list args)
834887Schin #else
844887Schin ssize_t sfvaprints(sp, form, args)
854887Schin char**	sp;
864887Schin char*	form;
874887Schin va_list	args;
884887Schin #endif
894887Schin {
904887Schin 	char	*s;
914887Schin 	ssize_t	n;
924887Schin 
934887Schin 	if(!sp || !(s = sfvprints(form,args)) )
944887Schin 		return -1;
954887Schin 	else
964887Schin 	{	if(!(*sp = (char*)malloc(n = strlen(s)+1)) )
974887Schin 			return -1;
984887Schin 		memcpy(*sp, s, n);
9910898Sroland.mainz@nrubsig.org 		return n - 1;
1004887Schin 	}
1014887Schin }
1024887Schin 
1034887Schin #if __STD_C
sfaprints(char ** sp,const char * form,...)1044887Schin ssize_t sfaprints(char** sp, const char* form, ...)
1054887Schin #else
1064887Schin ssize_t sfaprints(va_alist)
1074887Schin va_dcl
1084887Schin #endif
1094887Schin {
1104887Schin 	ssize_t	n;
1114887Schin 	va_list	args;
1124887Schin 
1134887Schin #if __STD_C
1144887Schin 	va_start(args,form);
1154887Schin #else
1164887Schin 	char	**sp, *form;
1174887Schin 	va_start(args);
1184887Schin 	sp = va_arg(args, char**);
1194887Schin 	form = va_arg(args, char*);
1204887Schin #endif
1214887Schin 	n = sfvaprints(sp, form, args);
1224887Schin 	va_end(args);
1234887Schin 
1244887Schin 	return n;
1254887Schin }
126