1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1985-2009 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 32 char* sfvprints(const char* form, va_list args) 33 #else 34 char* sfvprints(form, args) 35 char* form; 36 va_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 59 char* sfprints(const char* form, ...) 60 #else 61 char* sfprints(va_alist) 62 va_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 82 ssize_t sfvaprints(char** sp, const char* form, va_list args) 83 #else 84 ssize_t sfvaprints(sp, form, args) 85 char** sp; 86 char* form; 87 va_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 104 ssize_t sfaprints(char** sp, const char* form, ...) 105 #else 106 ssize_t sfaprints(va_alist) 107 va_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