1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2012 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Eclipse Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.eclipse.org/org/documents/epl-v10.html *
11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
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
sfvprints(const char * form,va_list args)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 Sfnotify_f notify = _Sfnotify;
41 static Sfio_t* f;
42
43 if(!f) /* make a string stream to write into */
44 { _Sfnotify = 0;
45 f = sfnew(NIL(Sfio_t*),NIL(char*),(size_t)SF_UNBOUND, -1,SF_WRITE|SF_STRING);
46 _Sfnotify = notify;
47 if(!f)
48 return NIL(char*);
49 }
50
51 sfseek(f,(Sfoff_t)0,SEEK_SET);
52 rv = sfvprintf(f,form,args);
53
54 if(rv < 0 || sfputc(f,'\0') < 0)
55 return NIL(char*);
56
57 _Sfi = (f->next - f->data) - 1;
58 return (char*)f->data;
59 }
60
61 #if __STD_C
sfprints(const char * form,...)62 char* sfprints(const char* form, ...)
63 #else
64 char* sfprints(va_alist)
65 va_dcl
66 #endif
67 {
68 char* s;
69 va_list args;
70
71 #if __STD_C
72 va_start(args,form);
73 #else
74 char *form;
75 va_start(args);
76 form = va_arg(args,char*);
77 #endif
78 s = sfvprints(form, args);
79 va_end(args);
80
81 return s;
82 }
83
84 #if __STD_C
sfvaprints(char ** sp,const char * form,va_list args)85 ssize_t sfvaprints(char** sp, const char* form, va_list args)
86 #else
87 ssize_t sfvaprints(sp, form, args)
88 char** sp;
89 char* form;
90 va_list args;
91 #endif
92 {
93 char *s;
94 ssize_t n;
95
96 if(!sp || !(s = sfvprints(form,args)) )
97 return -1;
98 else
99 { if(!(*sp = (char*)malloc(n = strlen(s)+1)) )
100 return -1;
101 memcpy(*sp, s, n);
102 return n-1;
103 }
104 }
105
106 #if __STD_C
sfaprints(char ** sp,const char * form,...)107 ssize_t sfaprints(char** sp, const char* form, ...)
108 #else
109 ssize_t sfaprints(va_alist)
110 va_dcl
111 #endif
112 {
113 ssize_t n;
114 va_list args;
115
116 #if __STD_C
117 va_start(args,form);
118 #else
119 char **sp, *form;
120 va_start(args);
121 sp = va_arg(args, char**);
122 form = va_arg(args, char*);
123 #endif
124 n = sfvaprints(sp, form, args);
125 va_end(args);
126
127 return n;
128 }
129