From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- private/crt32/stdio/sprintf.c | 130 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 private/crt32/stdio/sprintf.c (limited to 'private/crt32/stdio/sprintf.c') diff --git a/private/crt32/stdio/sprintf.c b/private/crt32/stdio/sprintf.c new file mode 100644 index 000000000..7f1577586 --- /dev/null +++ b/private/crt32/stdio/sprintf.c @@ -0,0 +1,130 @@ +/*** +*sprintf.c - print formatted to string +* +* Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved. +* +*Purpose: +* defines sprintf() and _snprintf() - print formatted data to string +* +*Revision History: +* 09-02-83 RN initial version +* 04-13-87 JCR added const to declaration +* 06-24-87 JCR (1) Made declaration conform to ANSI prototype and use +* the va_ macros; (2) removed SS_NE_DS conditionals. +* 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-19-90 GJF Made calling type _CALLTYPE2, added #include +* and removed #include . +* 07-23-90 SBM Replaced by +* 10-03-90 GJF New-style function declarator. +* 09-24-91 JCR Added _snprintf() +* +*******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define MAXSTR INT_MAX + + +/*** +#ifndef _COUNT_ +*int sprintf(string, format, ...) - print formatted data to string +#else +*int _snprintf(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 _snprintf() 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 statically +* allocated 'fake' iob, we must lock/unlock to prevent collisions. +* +*Entry: +* char *string - pointer to place to put output +#ifdef _COUNT_ +* size_t count - max number of bytes to put in buffer +#endif +* char *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 characters printed +* +*Exceptions: +* +*******************************************************************************/ + +#ifndef _COUNT_ + +int _CALLTYPE2 sprintf ( + char *string, + const char *format, + ... + ) +#else + +int _CALLTYPE2 _snprintf ( + char *string, + size_t count, + const char *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 = string; +#ifndef _COUNT_ + outfile->_cnt = MAXSTR; +#else + outfile->_cnt = count; +#endif + + retval = _output(outfile,format,arglist); + + _putc_lk('\0',outfile); /* no-lock version */ + + return(retval); +} -- cgit v1.2.3