summaryrefslogtreecommitdiff
path: root/src/lib/libast/stdio/vfwprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libast/stdio/vfwprintf.c')
-rw-r--r--src/lib/libast/stdio/vfwprintf.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/lib/libast/stdio/vfwprintf.c b/src/lib/libast/stdio/vfwprintf.c
new file mode 100644
index 0000000..b396792
--- /dev/null
+++ b/src/lib/libast/stdio/vfwprintf.c
@@ -0,0 +1,68 @@
+/***********************************************************************
+* *
+* 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> *
+* *
+***********************************************************************/
+#pragma prototyped
+
+#include "stdhdr.h"
+
+int
+vfwprintf(Sfio_t* f, const wchar_t* fmt, va_list args)
+{
+ char* m;
+ char* x;
+ wchar_t*w;
+ size_t n;
+ int v;
+ Sfio_t* t;
+
+ STDIO_INT(f, "vfwprintf", int, (Sfio_t*, const wchar_t*, va_list), (f, fmt, args))
+
+ FWIDE(f, WEOF);
+ n = wcstombs(NiL, fmt, 0);
+ if (m = malloc(n + 1))
+ {
+ if (t = sfstropen())
+ {
+ wcstombs(m, fmt, n + 1);
+ sfvprintf(t, m, args);
+ free(m);
+ if (!(x = sfstruse(t)))
+ v = -1;
+ else
+ {
+ n = mbstowcs(NiL, x, 0);
+ if (w = (wchar_t*)sfreserve(f, n * sizeof(wchar_t) + 1, 0))
+ v = mbstowcs(w, x, n + 1);
+ else
+ v = -1;
+ }
+ sfstrclose(t);
+ }
+ else
+ {
+ free(m);
+ v = -1;
+ }
+ }
+ else
+ v = -1;
+ return v;
+}