| /* vsnprintf.c |
| * |
| * $Id: vsnprintf.c,v 1.3 2008/07/28 23:24:20 keithmarshall Exp $ |
| * |
| * Provides an implementation of the "vsnprintf" function, conforming |
| * generally to C99 and SUSv3/POSIX specifications, with extensions |
| * to support Microsoft's non-standard format specifications. This |
| * is included in libmingwex.a, replacing the redirection through |
| * libmoldnames.a, to the MSVCRT standard "_vsnprintf" function; (the |
| * standard MSVCRT function remains available, and may be invoked |
| * directly, using this fully qualified form of its name). |
| * |
| * Written by Keith Marshall <keithmarshall@users.sourceforge.net> |
| * |
| * This is free software. You may redistribute and/or modify it as you |
| * see fit, without restriction of copyright. |
| * |
| * This software is provided "as is", in the hope that it may be useful, |
| * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of |
| * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no |
| * time will the author accept any form of liability for any damages, |
| * however caused, resulting from the use of this software. |
| * |
| */ |
| |
| #include <stdio.h> |
| #include <stdarg.h> |
| |
| #include "mingw_pformat.h" |
| |
| int __cdecl __vsnprintf (APICHAR *, size_t, const APICHAR *fmt, va_list) __MINGW_NOTHROW; |
| int __cdecl __vsnprintf(APICHAR *buf, size_t length, const APICHAR *fmt, va_list argv ) |
| { |
| register int retval; |
| |
| if( length == (size_t)(0) ) |
| /* |
| * No buffer; simply compute and return the size required, |
| * without actually emitting any data. |
| */ |
| return __pformat( 0, buf, 0, fmt, argv); |
| |
| /* If we get to here, then we have a buffer... |
| * Emit data up to the limit of buffer length less one, |
| * then add the requisite NUL terminator. |
| */ |
| retval = __pformat( 0, buf, --length, fmt, argv ); |
| buf[retval < (int) length ? retval : (int)length] = '\0'; |
| |
| return retval; |
| } |
| |