summaryrefslogtreecommitdiffstats
path: root/private/crt32/stdio/vsprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/stdio/vsprintf.c')
-rw-r--r--private/crt32/stdio/vsprintf.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/private/crt32/stdio/vsprintf.c b/private/crt32/stdio/vsprintf.c
new file mode 100644
index 000000000..e19ee5064
--- /dev/null
+++ b/private/crt32/stdio/vsprintf.c
@@ -0,0 +1,126 @@
+/***
+*vsprintf.c - print formatted data into a string from var arg list
+*
+* Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* defines vsprintf() and _vsnprintf() - print formatted output to
+* a string, get the data from an argument ptr instead of explicit
+* arguments.
+*
+*Revision History:
+* 09-02-83 RN original sprintf
+* 06-17-85 TC rewrote to use new varargs macros, and to be vsprintf
+* 04-13-87 JCR added const to declaration
+* 11-07-87 JCR Multi-thread support
+* 12-11-87 JCR Added "_LOAD_DS" to declaration
+* 05-27-88 PHG Merged DLL and normal versions
+* 06-13-88 JCR Fake _iob entry is now static so that other routines
+* can assume _iob entries are in DGROUP.
+* 08-25-88 GJF Define MAXSTR to be INT_MAX (from LIMITS.H).
+* 06-06-89 JCR 386 mthread support
+* 08-18-89 GJF Clean up, now specific to OS/2 2.0 (i.e., 386 flat
+* model). Also fixed copyright and indents.
+* 02-16-90 GJF Fixed copyright
+* 03-20-90 GJF Made calling type _CALLTYPE1, added #include
+* <cruntime.h> and removed #include <register.h>.
+* 07-25-90 SBM Replaced <assertm.h> by <assert.h>, <varargs.h> by
+* <stdarg.h>
+* 10-03-90 GJF New-style function declarator.
+* 09-24-91 JCR Added _vsnprintf()
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdarg.h>
+#include <internal.h>
+#include <limits.h>
+#include <os2dll.h>
+
+#define MAXSTR INT_MAX
+
+
+/***
+#ifndef _COUNT_
+*int vsprintf(string, format, ap) - print formatted data to string from arg ptr
+#else
+*int _vsnprintf(string, format, ap) - print formatted data to string from arg ptr
+#endif
+*
+*Purpose:
+* Prints formatted data, but to a string and gets data from an argument
+* pointer.
+* 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.
+*
+* Allocate the 'fake' _iob[] entryit 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 _vsnprintf() flavor takes a count argument that is
+* the max number of bytes 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 staticly allocated 'fake' iob, we must
+* lock/unlock to prevent collisions.
+*
+*Entry:
+* char *string - place to put destination string
+#ifdef _COUNT_
+* size_t count - max number of bytes to put in buffer
+#endif
+* char *format - format string, describes format of data
+* va_list ap - varargs argument pointer
+*
+*Exit:
+* returns number of characters in string
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+#ifndef _COUNT_
+
+int _CALLTYPE1 vsprintf (
+ char *string,
+ const char *format,
+ va_list ap
+ )
+#else
+
+int _CALLTYPE1 _vsnprintf (
+ char *string,
+ size_t count,
+ const char *format,
+ va_list ap
+ )
+#endif
+
+{
+ FILE str;
+ REG1 FILE *outfile = &str;
+ REG2 int retval;
+
+ assert(string != NULL);
+ assert(format != NULL);
+
+ outfile->_flag = _IOWRT|_IOSTRG;
+ outfile->_ptr = outfile->_base = string;
+#ifndef _COUNT_
+ outfile->_cnt = MAXSTR;
+#else
+ outfile->_cnt = count;
+#endif
+
+ retval = _output(outfile,format,ap );
+ _putc_lk('\0',outfile);
+
+ return(retval);
+}