include/windows.foundation: Add double reference.
[wine.git] / dlls / ntdll / printf.c
blob37419ea1e83e4a6c20213441c4e6a9047d032ce6
1 /*
2 * ntdll printf functions
4 * Copyright 1999, 2009 Alexandre Julliard
5 * Copyright 2000 Jon Griffiths
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include <assert.h>
23 #include <ctype.h>
24 #include <limits.h>
25 #include <stdarg.h>
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
30 #include "windef.h"
31 #include "winternl.h"
32 #include "ntdll_misc.h"
33 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(ntdll);
37 static const SIZE_T size_max = ~(SIZE_T)0 >> 1;
39 typedef struct pf_flags_t
41 enum { LEN_DEFAULT, LEN_SHORT, LEN_LONG } IntegerLength;
42 BOOLEAN IntegerDouble, IntegerNative, LeftAlign, Alternate, PadZero, WideString;
43 int FieldLength, Precision;
44 char Sign, Format;
45 } pf_flags;
48 #include "printf.h"
49 #define PRINTF_WIDE
50 #include "printf.h"
51 #undef PRINTF_WIDE
53 /*********************************************************************
54 * _vsnprintf (NTDLL.@)
56 int CDECL _vsnprintf( char *str, size_t len, const char *format, va_list args )
58 pf_output_a out = { str, len };
59 int r = pf_vsnprintf_a( &out, format, args );
61 if (out.used < len) str[out.used] = 0;
62 return r;
66 /***********************************************************************
67 * _vsnwprintf (NTDLL.@)
69 int CDECL _vsnwprintf( WCHAR *str, size_t len, const WCHAR *format, va_list args )
71 pf_output_w out = { str, len };
72 int r = pf_vsnprintf_w( &out, format, args );
74 if (out.used < len) str[out.used] = 0;
75 return r;
79 /*********************************************************************
80 * _vscprintf (NTDLL.@)
82 int CDECL _vscprintf( const char *format, va_list valist )
84 return _vsnprintf( NULL, INT_MAX, format, valist );
88 /*********************************************************************
89 * _vscwprintf (NTDLL.@)
91 int CDECL _vscwprintf( const wchar_t *format, va_list args )
93 return _vsnwprintf( NULL, INT_MAX, format, args );
97 /*********************************************************************
98 * _snprintf (NTDLL.@)
100 int WINAPIV NTDLL__snprintf( char *str, size_t len, const char *format, ... )
102 int ret;
103 va_list valist;
105 va_start( valist, format );
106 ret = _vsnprintf( str, len, format, valist );
107 va_end( valist );
108 return ret;
112 /***********************************************************************
113 * _snwprintf (NTDLL.@)
115 int WINAPIV _snwprintf( WCHAR *str, size_t len, const WCHAR *format, ... )
117 int ret;
118 va_list valist;
120 va_start(valist, format);
121 ret = _vsnwprintf( str, len, format, valist );
122 va_end(valist);
123 return ret;
127 /*********************************************************************
128 * _vsnprintf_s (NTDLL.@)
130 int CDECL _vsnprintf_s( char *str, size_t size, size_t len, const char *format, va_list args )
132 pf_output_a out = { str, min( size, len ) };
133 int r = pf_vsnprintf_a( &out, format, args );
135 if (out.used < size) str[out.used] = 0;
136 else str[0] = 0;
137 if (r == size) r = -1;
138 return r;
142 /***********************************************************************
143 * _vsnwprintf_s (NTDLL.@)
145 int CDECL _vsnwprintf_s( WCHAR *str, size_t size, size_t len, const WCHAR *format, va_list args )
147 pf_output_w out = { str, min( size, len ) };
148 int r = pf_vsnprintf_w( &out, format, args );
150 if (out.used < size) str[out.used] = 0;
151 else str[0] = 0;
152 if (r == size) r = -1;
153 return r;
157 /*********************************************************************
158 * _snprintf_s (NTDLL.@)
160 int WINAPIV _snprintf_s( char *str, size_t size, size_t len, const char *format, ... )
162 int ret;
163 va_list valist;
165 va_start( valist, format );
166 ret = _vsnprintf_s( str, size, len, format, valist );
167 va_end( valist );
168 return ret;
172 /*********************************************************************
173 * _snwprintf_s (NTDLL.@)
175 int WINAPIV _snwprintf_s( WCHAR *str, size_t size, size_t len, const WCHAR *format, ... )
177 int ret;
178 va_list valist;
180 va_start( valist, format );
181 ret = _vsnwprintf_s( str, size, len, format, valist );
182 va_end( valist );
183 return ret;
187 /*********************************************************************
188 * vsprintf (NTDLL.@)
190 int CDECL vsprintf( char *str, const char *format, va_list args )
192 return _vsnprintf( str, size_max, format, args );
196 /*********************************************************************
197 * vsprintf_s (NTDLL.@)
199 int CDECL vsprintf_s( char *str, size_t size, const char *format, va_list args )
201 return _vsnprintf_s( str, size, size, format, args );
205 /*********************************************************************
206 * _vswprintf (NTDLL.@)
208 int CDECL _vswprintf( WCHAR *str, const WCHAR *format, va_list args )
210 return _vsnwprintf( str, size_max, format, args );
214 /*********************************************************************
215 * vswprintf_s (NTDLL.@)
217 int CDECL vswprintf_s( WCHAR *str, size_t size, const WCHAR *format, va_list args )
219 return _vsnwprintf_s( str, size, size, format, args );
223 /*********************************************************************
224 * sprintf (NTDLL.@)
226 int WINAPIV NTDLL_sprintf( char *str, const char *format, ... )
228 int ret;
229 va_list valist;
231 va_start( valist, format );
232 ret = _vsnprintf( str, size_max, format, valist );
233 va_end( valist );
234 return ret;
238 /*********************************************************************
239 * sprintf_s (NTDLL.@)
241 int WINAPIV sprintf_s( char *str, size_t size, const char *format, ... )
243 int ret;
244 va_list valist;
246 va_start( valist, format );
247 ret = vsprintf_s( str, size, format, valist );
248 va_end( valist );
249 return ret;
253 /***********************************************************************
254 * swprintf (NTDLL.@)
256 int WINAPIV NTDLL_swprintf( WCHAR *str, const WCHAR *format, ... )
258 int ret;
259 va_list valist;
261 va_start(valist, format);
262 ret = _vsnwprintf( str, size_max, format, valist );
263 va_end(valist);
264 return ret;
268 /***********************************************************************
269 * swprintf_s (NTDLL.@)
271 int WINAPIV swprintf_s( WCHAR *str, size_t size, const WCHAR *format, ... )
273 int ret;
274 va_list valist;
276 va_start(valist, format);
277 ret = vswprintf_s( str, size, format, valist );
278 va_end(valist);
279 return ret;