diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
commit | 3950ffe2a485479f6561c27364d3d7df5a21d124 (patch) | |
tree | 468c6e14449d1b1e279222ec32f676b0311917d2 /src/lib/libast/sfio/sfprintf.c | |
download | ksh-3950ffe2a485479f6561c27364d3d7df5a21d124.tar.gz |
Imported Upstream version 93u+upstream
Diffstat (limited to 'src/lib/libast/sfio/sfprintf.c')
-rw-r--r-- | src/lib/libast/sfio/sfprintf.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/lib/libast/sfio/sfprintf.c b/src/lib/libast/sfio/sfprintf.c new file mode 100644 index 0000000..50b0804 --- /dev/null +++ b/src/lib/libast/sfio/sfprintf.c @@ -0,0 +1,114 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2011 AT&T Intellectual Property * +* and is licensed under the * +* Eclipse Public License, Version 1.0 * +* by AT&T Intellectual Property * +* * +* A copy of the License is available at * +* http://www.eclipse.org/org/documents/epl-v10.html * +* (with md5 checksum b35adb5213ca9657e911e9befb180842) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* Phong Vo <kpv@research.att.com> * +* * +***********************************************************************/ +#include "sfhdr.h" + +/* Print data with a given format +** +** Written by Kiem-Phong Vo. +*/ + +#if __STD_C +int sfprintf(Sfio_t* f, const char* form, ...) +#else +int sfprintf(va_alist) +va_dcl +#endif +{ + va_list args; + reg int rv; + +#if __STD_C + va_start(args,form); +#else + reg Sfio_t* f; + reg char* form; + va_start(args); + f = va_arg(args,Sfio_t*); + form = va_arg(args,char*); +#endif + rv = sfvprintf(f,form,args); + + va_end(args); + return rv; +} + +#if __STD_C +ssize_t sfvsprintf(char* s, size_t n, const char* form, va_list args) +#else +ssize_t sfvsprintf(s, n, form, args) +char* s; +size_t n; +char* form; +va_list args; +#endif +{ + Sfio_t *f; + ssize_t rv; + + /* make a temp stream */ + if(!(f = sfnew(NIL(Sfio_t*),NIL(char*),(size_t)SF_UNBOUND, + -1,SF_WRITE|SF_STRING)) ) + return -1; + + if((rv = sfvprintf(f,form,args)) >= 0 && s && n > 0) + { if((rv+1) >= n) + n--; + else + n = rv; + memcpy(s, f->data, n); + s[n] = 0; + } + + sfclose(f); + + _Sfi = rv; + + return rv; +} + +#if __STD_C +ssize_t sfsprintf(char* s, size_t n, const char* form, ...) +#else +ssize_t sfsprintf(va_alist) +va_dcl +#endif +{ + va_list args; + ssize_t rv; + +#if __STD_C + va_start(args,form); +#else + reg char* s; + reg size_t n; + reg char* form; + va_start(args); + s = va_arg(args,char*); + n = va_arg(args,size_t); + form = va_arg(args,char*); +#endif + + rv = sfvsprintf(s,n,form,args); + va_end(args); + + return rv; +} |