1*08ab5237SOystein Eftevaag /* Copyright (c) 2009, Google Inc.
2*08ab5237SOystein Eftevaag * All rights reserved.
3*08ab5237SOystein Eftevaag *
4*08ab5237SOystein Eftevaag * Redistribution and use in source and binary forms, with or without
5*08ab5237SOystein Eftevaag * modification, are permitted provided that the following conditions are
6*08ab5237SOystein Eftevaag * met:
7*08ab5237SOystein Eftevaag *
8*08ab5237SOystein Eftevaag * * Redistributions of source code must retain the above copyright
9*08ab5237SOystein Eftevaag * notice, this list of conditions and the following disclaimer.
10*08ab5237SOystein Eftevaag * * Redistributions in binary form must reproduce the above
11*08ab5237SOystein Eftevaag * copyright notice, this list of conditions and the following disclaimer
12*08ab5237SOystein Eftevaag * in the documentation and/or other materials provided with the
13*08ab5237SOystein Eftevaag * distribution.
14*08ab5237SOystein Eftevaag * * Neither the name of Google Inc. nor the names of its
15*08ab5237SOystein Eftevaag * contributors may be used to endorse or promote products derived from
16*08ab5237SOystein Eftevaag * this software without specific prior written permission.
17*08ab5237SOystein Eftevaag *
18*08ab5237SOystein Eftevaag * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*08ab5237SOystein Eftevaag * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*08ab5237SOystein Eftevaag * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21*08ab5237SOystein Eftevaag * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*08ab5237SOystein Eftevaag * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*08ab5237SOystein Eftevaag * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24*08ab5237SOystein Eftevaag * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*08ab5237SOystein Eftevaag * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*08ab5237SOystein Eftevaag * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*08ab5237SOystein Eftevaag * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28*08ab5237SOystein Eftevaag * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*08ab5237SOystein Eftevaag *
30*08ab5237SOystein Eftevaag * ---
31*08ab5237SOystein Eftevaag * Author: Craig Silverstein
32*08ab5237SOystein Eftevaag */
33*08ab5237SOystein Eftevaag
34*08ab5237SOystein Eftevaag #ifndef _WIN32
35*08ab5237SOystein Eftevaag # error You should only be including windows/port.cc in a windows environment!
36*08ab5237SOystein Eftevaag #endif
37*08ab5237SOystein Eftevaag
38*08ab5237SOystein Eftevaag #include <string.h> // for strlen(), memset(), memcmp()
39*08ab5237SOystein Eftevaag #include <assert.h>
40*08ab5237SOystein Eftevaag #include <stdarg.h> // for va_list, va_start, va_end
41*08ab5237SOystein Eftevaag #include <windows.h>
42*08ab5237SOystein Eftevaag
43*08ab5237SOystein Eftevaag #include "windows_port.h"
44*08ab5237SOystein Eftevaag
45*08ab5237SOystein Eftevaag // These call the windows _vsnprintf, but always NUL-terminate.
46*08ab5237SOystein Eftevaag #if !defined(__MINGW32__) && !defined(__MINGW64__) /* mingw already defines */
47*08ab5237SOystein Eftevaag #if !(defined(_MSC_VER) && _MSC_VER >= 1900) /* msvc 2015 already defines */
48*08ab5237SOystein Eftevaag
49*08ab5237SOystein Eftevaag #ifdef _MSC_VER
50*08ab5237SOystein Eftevaag # pragma warning(push)
51*08ab5237SOystein Eftevaag # pragma warning(disable: 4996) // ignore _vsnprintf security warning
52*08ab5237SOystein Eftevaag #endif
safe_vsnprintf(char * str,size_t size,const char * format,va_list ap)53*08ab5237SOystein Eftevaag int safe_vsnprintf(char *str, size_t size, const char *format, va_list ap) {
54*08ab5237SOystein Eftevaag if (size == 0) // not even room for a \0?
55*08ab5237SOystein Eftevaag return -1; // not what C99 says to do, but what windows does
56*08ab5237SOystein Eftevaag str[size-1] = '\0';
57*08ab5237SOystein Eftevaag return _vsnprintf(str, size-1, format, ap);
58*08ab5237SOystein Eftevaag }
59*08ab5237SOystein Eftevaag #ifdef _MSC_VER
60*08ab5237SOystein Eftevaag # pragma warning(pop)
61*08ab5237SOystein Eftevaag #endif
62*08ab5237SOystein Eftevaag
snprintf(char * str,size_t size,const char * format,...)63*08ab5237SOystein Eftevaag int snprintf(char *str, size_t size, const char *format, ...) {
64*08ab5237SOystein Eftevaag int r;
65*08ab5237SOystein Eftevaag va_list ap;
66*08ab5237SOystein Eftevaag va_start(ap, format);
67*08ab5237SOystein Eftevaag r = vsnprintf(str, size, format, ap);
68*08ab5237SOystein Eftevaag va_end(ap);
69*08ab5237SOystein Eftevaag return r;
70*08ab5237SOystein Eftevaag }
71*08ab5237SOystein Eftevaag
72*08ab5237SOystein Eftevaag #endif /* if !(defined(_MSC_VER) && _MSC_VER >= 1900) */
73*08ab5237SOystein Eftevaag #endif /* #if !defined(__MINGW32__) && !defined(__MINGW64__) */
74