summaryrefslogtreecommitdiffstats
path: root/private/crt32/stdio/swprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/stdio/swprintf.c')
-rw-r--r--private/crt32/stdio/swprintf.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/private/crt32/stdio/swprintf.c b/private/crt32/stdio/swprintf.c
new file mode 100644
index 000000000..b50550edf
--- /dev/null
+++ b/private/crt32/stdio/swprintf.c
@@ -0,0 +1,115 @@
+/***
+*swprintf.c - print formatted to string
+*
+* Copyright (c) 1985-1992, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* defines swprintf() and _snwprintf() - print formatted data to string
+*
+*Revision History:
+* 05-16-92 KRS Created from sprintf.c
+* 02-18-93 SRW Make FILE a local and remove lock usage.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <internal.h>
+#include <limits.h>
+#include <os2dll.h>
+
+#define MAXSTR INT_MAX
+
+
+/***
+#ifndef _COUNT_
+*int swprintf(string, format, ...) - print formatted data to string
+#else
+*int _snwprintf(string, cnt, format, ...) - print formatted data to string
+#endif
+*
+*Purpose:
+* Prints formatted data to the using the format string to
+* format data and getting as many arguments as called for
+* Sets up a FILE so file i/o operations can be used, make
+* string look like a huge buffer to it, but _flsbuf will
+* refuse to flush it if it fills up. Appends '\0' to make
+* it a true string. _output does the real work here
+*
+* Allocate the 'fake' _iob[] entry statically instead of on
+* the stack so that other routines can assume that _iob[]
+* entries are in are in DGROUP and, thus, are near.
+*
+#ifdef _COUNT_
+* The _snwprintf() flavor takes a count argument that is
+* the max number of wide characters that should be written to the
+* user's buffer.
+#endif
+*
+* Multi-thread: (1) Since there is no stream, this routine must
+* never try to get the stream lock (i.e., there is no stream
+* lock either). (2) Also, since there is only one statically
+* allocated 'fake' iob, we must lock/unlock to prevent collisions.
+*
+*Entry:
+* wchar_t *string - pointer to place to put output
+#ifdef _COUNT_
+* size_t count - max number of wide characters to put in buffer
+#endif
+* wchar_t *format - format string to control data format/number
+* of arguments followed by list of arguments, number and type
+* controlled by format string
+*
+*Exit:
+* returns number of wide characters printed
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+#ifndef _COUNT_
+
+int _CALLTYPE2 swprintf (
+ wchar_t *string,
+ const wchar_t *format,
+ ...
+ )
+#else
+
+int _CALLTYPE2 _snwprintf (
+ wchar_t *string,
+ size_t count,
+ const wchar_t *format,
+ ...
+ )
+#endif
+
+{
+ FILE str;
+ REG1 FILE *outfile = &str;
+ va_list arglist;
+ REG2 int retval;
+
+ va_start(arglist, format);
+
+ assert(string != NULL);
+ assert(format != NULL);
+
+ outfile->_flag = _IOWRT|_IOSTRG;
+ outfile->_ptr = outfile->_base = (char *) string;
+#ifndef _COUNT_
+ outfile->_cnt = MAXSTR;
+#else
+ outfile->_cnt = count*sizeof(wchar_t);
+#endif
+
+ retval = _woutput(outfile,format,arglist);
+
+ _putc_lk('\0',outfile); /* no-lock version */
+ _putc_lk('\0',outfile); /* 2nd null byte for wchar_t version */
+
+ return(retval);
+}