14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*8462SApril.Chin@Sun.COM * Copyright (c) 1985-2008 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 7*8462SApril.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 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 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 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); 994887Schin return n; 1004887Schin } 1014887Schin } 1024887Schin 1034887Schin #if __STD_C 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