xref: /reactos/sdk/include/ucrt/stdlib.h (revision 04e0dc4a)
1 //
2 // stdlib.h
3 //
4 //      Copyright (c) Microsoft Corporation. All rights reserved.
5 //
6 // The C Standard Library <stdlib.h> header.
7 //
8 #pragma once
9 #ifndef _INC_STDLIB // include guard for 3rd party interop
10 #define _INC_STDLIB
11 
12 #include <corecrt.h>
13 #include <corecrt_malloc.h>
14 #include <corecrt_search.h>
15 #include <corecrt_wstdlib.h>
16 #include <limits.h>
17 
18 #pragma warning(push)
19 #pragma warning(disable: _UCRT_DISABLED_WARNINGS)
20 _UCRT_DISABLE_CLANG_WARNINGS
21 
22 _CRT_BEGIN_C_HEADER
23 
24 
25 
26 #ifndef _countof
27     #define _countof __crt_countof
28 #endif
29 
30 
31 
32 // Minimum and maximum macros
33 #define __max(a,b) (((a) > (b)) ? (a) : (b))
34 #define __min(a,b) (((a) < (b)) ? (a) : (b))
35 
36 
37 
38 _ACRTIMP void __cdecl _swab(
39     _Inout_updates_(_SizeInBytes) _Post_readable_size_(_SizeInBytes) char* _Buf1,
40     _Inout_updates_(_SizeInBytes) _Post_readable_size_(_SizeInBytes) char* _Buf2,
41     _In_                                                             int   _SizeInBytes
42     );
43 
44 
45 
46 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
47 //
48 // Exit and Abort
49 //
50 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51 // Argument values for exit()
52 #define EXIT_SUCCESS 0
53 #define EXIT_FAILURE 1
54 
55 #if _CRT_FUNCTIONS_REQUIRED
56     _ACRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code);
57     _ACRTIMP __declspec(noreturn) void __cdecl _exit(_In_ int _Code);
58     _ACRTIMP __declspec(noreturn) void __cdecl _Exit(_In_ int _Code);
59     _ACRTIMP __declspec(noreturn) void __cdecl quick_exit(_In_ int _Code);
60     _ACRTIMP __declspec(noreturn) void __cdecl abort(void);
61 #endif // _CRT_FUNCTIONS_REQUIRED
62 
63 // Argument values for _set_abort_behavior().
64 #define _WRITE_ABORT_MSG  0x1 // debug only, has no effect in release
65 #define _CALL_REPORTFAULT 0x2
66 
67 _ACRTIMP unsigned int __cdecl _set_abort_behavior(
68     _In_ unsigned int _Flags,
69     _In_ unsigned int _Mask
70     );
71 
72 
73 
74 #ifndef _CRT_ONEXIT_T_DEFINED
75     #define _CRT_ONEXIT_T_DEFINED
76 
77     typedef int (__CRTDECL* _onexit_t)(void);
78     #ifdef _M_CEE
79         typedef int (__clrcall* _onexit_m_t)(void);
80     #endif
81 #endif
82 
83 #if defined(_CRT_INTERNAL_NONSTDC_NAMES) && _CRT_INTERNAL_NONSTDC_NAMES
84     // Non-ANSI name for compatibility
85     #define onexit_t _onexit_t
86 #endif
87 
88 
89 
90 #ifdef _M_CEE
91     #pragma warning (push)
92     #pragma warning (disable: 4985) // Attributes not present on previous declaration
93 
94     _Check_return_ int __clrcall _atexit_m_appdomain(_In_opt_ void (__clrcall* _Function)(void));
95 
96     _onexit_m_t __clrcall _onexit_m_appdomain(_onexit_m_t _Function);
97 
98     #ifdef _M_CEE_MIXED
99         #ifdef __cplusplus
100         [System::Security::SecurityCritical]
101         #endif
102         _Check_return_ int __clrcall _atexit_m(_In_opt_ void (__clrcall* _Function)(void));
103 
104         _onexit_m_t __clrcall _onexit_m(_onexit_m_t _Function);
105     #else
106         #ifdef __cplusplus
107         [System::Security::SecurityCritical]
108         #endif
_atexit_m(_In_opt_ void (__clrcall * _Function)(void))109         _Check_return_ inline int __clrcall _atexit_m(_In_opt_ void (__clrcall* _Function)(void))
110         {
111             return _atexit_m_appdomain(_Function);
112         }
113 
_onexit_m(_onexit_t _Function)114         inline _onexit_m_t __clrcall _onexit_m(_onexit_t _Function)
115         {
116             return _onexit_m_appdomain(_Function);
117         }
118     #endif
119     #pragma warning (pop)
120 #endif
121 
122 
123 
124 #ifdef _M_CEE_PURE
125     // In pure mode, atexit is the same as atexit_m_appdomain
126     extern "C++"
127     {
128 
129     #ifdef __cplusplus
130     [System::Security::SecurityCritical]
131     #endif
atexit(void (__clrcall * _Function)(void))132     inline  int __clrcall atexit(void (__clrcall* _Function)(void))
133     {
134         return _atexit_m_appdomain(_Function);
135     }
136 
_onexit(_onexit_t _Function)137     inline _onexit_t __clrcall _onexit(_onexit_t _Function)
138     {
139         return _onexit_m_appdomain(_Function);
140     }
141 
142     } // extern "C++"
143 #else
144     int       __cdecl atexit(void (__cdecl*)(void));
145     _onexit_t __cdecl _onexit(_In_opt_ _onexit_t _Func);
146 #endif
147 
148 int __cdecl at_quick_exit(void (__cdecl*)(void));
149 
150 
151 
152 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
153 //
154 // Global State (errno, global handlers, etc.)
155 //
156 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
157 #ifndef _M_CEE_PURE
158     // a purecall handler procedure. Never returns normally
159     typedef void (__cdecl* _purecall_handler)(void);
160 
161     // Invalid parameter handler function pointer type
162     typedef void (__cdecl* _invalid_parameter_handler)(
163         wchar_t const*,
164         wchar_t const*,
165         wchar_t const*,
166         unsigned int,
167         uintptr_t
168         );
169 
170     // Establishes a purecall handler
171     _VCRTIMP _purecall_handler __cdecl _set_purecall_handler(
172         _In_opt_ _purecall_handler _Handler
173         );
174 
175     _VCRTIMP _purecall_handler __cdecl _get_purecall_handler(void);
176 
177     // Establishes an invalid parameter handler
178     _ACRTIMP _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(
179         _In_opt_ _invalid_parameter_handler _Handler
180         );
181 
182     _ACRTIMP _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void);
183 
184     _ACRTIMP _invalid_parameter_handler __cdecl _set_thread_local_invalid_parameter_handler(
185         _In_opt_ _invalid_parameter_handler _Handler
186         );
187 
188     _ACRTIMP _invalid_parameter_handler __cdecl _get_thread_local_invalid_parameter_handler(void);
189 #endif
190 
191 
192 #if defined __cplusplus && defined _M_CEE_PURE
193 extern "C++"
194 {
195     typedef void (__clrcall* _purecall_handler)(void);
196     typedef _purecall_handler _purecall_handler_m;
197 
198     _MRTIMP _purecall_handler __cdecl _set_purecall_handler(
199         _In_opt_ _purecall_handler _Handler
200         );
201 } // extern "C++"
202 #endif
203 
204 
205 
206 // Argument values for _set_error_mode().
207 #define _OUT_TO_DEFAULT 0
208 #define _OUT_TO_STDERR  1
209 #define _OUT_TO_MSGBOX  2
210 #define _REPORT_ERRMODE 3
211 
212 _Check_return_opt_ _ACRTIMP int __cdecl _set_error_mode(_In_ int _Mode);
213 
214 
215 
216 #if _CRT_FUNCTIONS_REQUIRED
217     _ACRTIMP int* __cdecl _errno(void);
218     #define errno (*_errno())
219 
220     _ACRTIMP errno_t __cdecl _set_errno(_In_ int _Value);
221     _ACRTIMP errno_t __cdecl _get_errno(_Out_ int* _Value);
222 
223     _ACRTIMP unsigned long* __cdecl __doserrno(void);
224     #define _doserrno (*__doserrno())
225 
226     _ACRTIMP errno_t __cdecl _set_doserrno(_In_ unsigned long _Value);
227     _ACRTIMP errno_t __cdecl _get_doserrno(_Out_ unsigned long * _Value);
228 
229     // This is non-const for backwards compatibility; do not modify it.
230     _ACRTIMP _CRT_INSECURE_DEPRECATE(strerror) char** __cdecl __sys_errlist(void);
231     #define _sys_errlist (__sys_errlist())
232 
233     _ACRTIMP _CRT_INSECURE_DEPRECATE(strerror) int * __cdecl __sys_nerr(void);
234     #define _sys_nerr (*__sys_nerr())
235 
236     _ACRTIMP void __cdecl perror(_In_opt_z_ char const* _ErrMsg);
237 #endif // _CRT_FUNCTIONS_REQUIRED
238 
239 
240 
241 // These point to the executable module name.
242 _CRT_INSECURE_DEPRECATE_GLOBALS(_get_pgmptr ) _ACRTIMP char**    __cdecl __p__pgmptr (void);
243 _CRT_INSECURE_DEPRECATE_GLOBALS(_get_wpgmptr) _ACRTIMP wchar_t** __cdecl __p__wpgmptr(void);
244 _CRT_INSECURE_DEPRECATE_GLOBALS(_get_fmode  ) _ACRTIMP int*      __cdecl __p__fmode  (void);
245 
246 #ifdef _CRT_DECLARE_GLOBAL_VARIABLES_DIRECTLY
247     _CRT_INSECURE_DEPRECATE_GLOBALS(_get_pgmptr ) extern char*    _pgmptr;
248     _CRT_INSECURE_DEPRECATE_GLOBALS(_get_wpgmptr) extern wchar_t* _wpgmptr;
249     #ifndef _CORECRT_BUILD
250         _CRT_INSECURE_DEPRECATE_GLOBALS(_get_fmode  ) extern int      _fmode;
251     #endif
252 #else
253     #define _pgmptr  (*__p__pgmptr ())
254     #define _wpgmptr (*__p__wpgmptr())
255     #define _fmode   (*__p__fmode  ())
256 #endif
257 
258 _Success_(return == 0)
259 _ACRTIMP errno_t __cdecl _get_pgmptr (_Outptr_result_z_ char**    _Value);
260 
261 _Success_(return == 0)
262 _ACRTIMP errno_t __cdecl _get_wpgmptr(_Outptr_result_z_ wchar_t** _Value);
263 
264 _ACRTIMP errno_t __cdecl _set_fmode  (_In_              int       _Mode );
265 
266 _ACRTIMP errno_t __cdecl _get_fmode  (_Out_             int*      _PMode);
267 
268 
269 
270 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
271 //
272 // Math
273 //
274 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
275 typedef struct _div_t
276 {
277     int quot;
278     int rem;
279 } div_t;
280 
281 typedef struct _ldiv_t
282 {
283     long quot;
284     long rem;
285 } ldiv_t;
286 
287 typedef struct _lldiv_t
288 {
289     long long quot;
290     long long rem;
291 } lldiv_t;
292 
293 _Check_return_ int       __cdecl abs   (_In_ int       _Number);
294 _Check_return_ long      __cdecl labs  (_In_ long      _Number);
295 _Check_return_ long long __cdecl llabs (_In_ long long _Number);
296 _Check_return_ __int64   __cdecl _abs64(_In_ __int64   _Number);
297 
298 _Check_return_ unsigned short   __cdecl _byteswap_ushort(_In_ unsigned short   _Number);
299 _Check_return_ unsigned long    __cdecl _byteswap_ulong (_In_ unsigned long    _Number);
300 _Check_return_ unsigned __int64 __cdecl _byteswap_uint64(_In_ unsigned __int64 _Number);
301 
302 _Check_return_ _ACRTIMP div_t   __cdecl div  (_In_ int       _Numerator, _In_ int       _Denominator);
303 _Check_return_ _ACRTIMP ldiv_t  __cdecl ldiv (_In_ long      _Numerator, _In_ long      _Denominator);
304 _Check_return_ _ACRTIMP lldiv_t __cdecl lldiv(_In_ long long _Numerator, _In_ long long _Denominator);
305 
306 // These functions have declspecs in their declarations in the Windows headers,
307 // which cause PREfast to fire 6540.
308 #pragma warning(push)
309 #pragma warning(disable: 6540)
310 
311 unsigned int __cdecl _rotl(
312     _In_ unsigned int _Value,
313     _In_ int          _Shift
314     );
315 
316 _Check_return_
317 unsigned long __cdecl _lrotl(
318     _In_ unsigned long _Value,
319     _In_ int           _Shift
320     );
321 
322 unsigned __int64 __cdecl _rotl64(
323     _In_ unsigned __int64 _Value,
324     _In_ int              _Shift
325     );
326 
327 unsigned int __cdecl _rotr(
328     _In_ unsigned int _Value,
329     _In_ int          _Shift
330     );
331 
332 _Check_return_
333 unsigned long __cdecl _lrotr(
334     _In_ unsigned long _Value,
335     _In_ int           _Shift
336     );
337 
338 unsigned __int64 __cdecl _rotr64(
339     _In_ unsigned __int64 _Value,
340     _In_ int              _Shift
341     );
342 
343 #pragma warning(pop)
344 
345 
346 
347 // Maximum value that can be returned by the rand function:
348 #define RAND_MAX 0x7fff
349 
350 _ACRTIMP void __cdecl srand(_In_ unsigned int _Seed);
351 
352 _Check_return_ _ACRTIMP int __cdecl rand(void);
353 
354 #if defined _CRT_RAND_S || defined _CRTBLD
355     _ACRTIMP errno_t __cdecl rand_s(_Out_ unsigned int* _RandomValue);
356 #endif
357 
358 
359 
360 #ifdef __cplusplus
361 extern "C++"
362 {
abs(long const _X)363     inline long abs(long const _X) throw()
364     {
365         return labs(_X);
366     }
367 
abs(long long const _X)368     inline long long abs(long long const _X) throw()
369     {
370         return llabs(_X);
371     }
372 
div(long const _A1,long const _A2)373     inline ldiv_t div(long const _A1, long const _A2) throw()
374     {
375         return ldiv(_A1, _A2);
376     }
377 
div(long long const _A1,long long const _A2)378     inline lldiv_t div(long long const _A1, long long const _A2) throw()
379     {
380         return lldiv(_A1, _A2);
381     }
382 }
383 #endif // __cplusplus
384 
385 
386 
387 
388 // Structs used to fool the compiler into not generating floating point
389 // instructions when copying and pushing [long] double values
390 #define _CRT_DOUBLE_DEC
391 
392 #ifndef _LDSUPPORT
393 
394     #pragma pack(push, 4)
395     typedef struct
396     {
397         unsigned char ld[10];
398     } _LDOUBLE;
399     #pragma pack(pop)
400 
401     #define _PTR_LD(x) ((unsigned char*)(&(x)->ld))
402 
403 #else // _LDSUPPORT
404 
405     // push and pop long, which is #defined as __int64 by a spec2k test
406     #pragma push_macro("long")
407     #undef long
408     typedef long double _LDOUBLE;
409     #pragma pop_macro("long")
410 
411     #define _PTR_LD(x) ((unsigned char  *)(x))
412 
413 #endif // _LDSUPPORT
414 
415 typedef struct
416 {
417     double x;
418 } _CRT_DOUBLE;
419 
420 typedef struct
421 {
422     float f;
423 } _CRT_FLOAT;
424 
425 // push and pop long, which is #defined as __int64 by a spec2k test
426 #pragma push_macro("long")
427 #undef long
428 
429 typedef struct
430 {
431     long double x;
432 } _LONGDOUBLE;
433 
434 #pragma pop_macro("long")
435 
436 #pragma pack(push, 4)
437 typedef struct
438 {
439     unsigned char ld12[12];
440 } _LDBL12;
441 #pragma pack(pop)
442 
443 
444 
445 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
446 //
447 // Narrow String to Number Conversions
448 //
449 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
450 _Check_return_                    _ACRTIMP double    __cdecl atof   (_In_z_ char const* _String);
451 _Check_return_ _CRT_JIT_INTRINSIC _ACRTIMP int       __cdecl atoi   (_In_z_ char const* _String);
452 _Check_return_                    _ACRTIMP long      __cdecl atol   (_In_z_ char const* _String);
453 _Check_return_                    _ACRTIMP long long __cdecl atoll  (_In_z_ char const* _String);
454 _Check_return_                    _ACRTIMP __int64   __cdecl _atoi64(_In_z_ char const* _String);
455 
456 _Check_return_ _ACRTIMP double    __cdecl _atof_l  (_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
457 _Check_return_ _ACRTIMP int       __cdecl _atoi_l  (_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
458 _Check_return_ _ACRTIMP long      __cdecl _atol_l  (_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
459 _Check_return_ _ACRTIMP long long __cdecl _atoll_l (_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
460 _Check_return_ _ACRTIMP __int64   __cdecl _atoi64_l(_In_z_ char const* _String, _In_opt_ _locale_t _Locale);
461 
462 _Check_return_ _ACRTIMP int __cdecl _atoflt (_Out_ _CRT_FLOAT*  _Result, _In_z_ char const* _String);
463 _Check_return_ _ACRTIMP int __cdecl _atodbl (_Out_ _CRT_DOUBLE* _Result, _In_z_ char*       _String);
464 _Check_return_ _ACRTIMP int __cdecl _atoldbl(_Out_ _LDOUBLE*    _Result, _In_z_ char*       _String);
465 
466 _Check_return_
467 _ACRTIMP int __cdecl _atoflt_l(
468     _Out_    _CRT_FLOAT* _Result,
469     _In_z_   char const* _String,
470     _In_opt_ _locale_t   _Locale
471     );
472 
473 _Check_return_
474 _ACRTIMP int __cdecl _atodbl_l(
475     _Out_    _CRT_DOUBLE* _Result,
476     _In_z_   char*        _String,
477     _In_opt_ _locale_t    _Locale
478     );
479 
480 
481 _Check_return_
482 _ACRTIMP int __cdecl _atoldbl_l(
483     _Out_    _LDOUBLE* _Result,
484     _In_z_   char*     _String,
485     _In_opt_ _locale_t _Locale
486     );
487 
488 _Check_return_
489 _ACRTIMP float __cdecl strtof(
490     _In_z_                   char const* _String,
491     _Out_opt_ _Deref_post_z_ char**      _EndPtr
492     );
493 
494 _Check_return_
495 _ACRTIMP float __cdecl _strtof_l(
496     _In_z_                   char const* _String,
497     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
498     _In_opt_                 _locale_t   _Locale
499     );
500 
501 _Check_return_
502 _ACRTIMP double __cdecl strtod(
503     _In_z_                   char const* _String,
504     _Out_opt_ _Deref_post_z_ char**      _EndPtr
505     );
506 
507 _Check_return_
508 _ACRTIMP double __cdecl _strtod_l(
509     _In_z_                   char const* _String,
510     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
511     _In_opt_                 _locale_t   _Locale
512     );
513 
514 _Check_return_
515 _ACRTIMP long double __cdecl strtold(
516     _In_z_                   char const* _String,
517     _Out_opt_ _Deref_post_z_ char**      _EndPtr
518     );
519 
520 _Check_return_
521 _ACRTIMP long double __cdecl _strtold_l(
522     _In_z_                   char const* _String,
523     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
524     _In_opt_                 _locale_t   _Locale
525     );
526 
527 _Check_return_
528 _ACRTIMP long __cdecl strtol(
529     _In_z_                   char const* _String,
530     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
531     _In_                     int         _Radix
532     );
533 
534 _Check_return_
535 _ACRTIMP long __cdecl _strtol_l(
536     _In_z_                   char const* _String,
537     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
538     _In_                     int         _Radix,
539     _In_opt_                 _locale_t   _Locale
540     );
541 
542 _Check_return_
543 _ACRTIMP long long __cdecl strtoll(
544     _In_z_                   char const* _String,
545     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
546     _In_                     int         _Radix
547     );
548 
549 _Check_return_
550 _ACRTIMP long long __cdecl _strtoll_l(
551     _In_z_                   char const* _String,
552     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
553     _In_                     int         _Radix,
554     _In_opt_                 _locale_t   _Locale
555     );
556 
557 _Check_return_
558 _ACRTIMP unsigned long __cdecl strtoul(
559     _In_z_                   char const* _String,
560     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
561     _In_                     int         _Radix
562     );
563 
564 _Check_return_
565 _ACRTIMP unsigned long __cdecl _strtoul_l(
566     _In_z_                   char const* _String,
567     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
568     _In_                     int         _Radix,
569     _In_opt_                 _locale_t   _Locale
570     );
571 
572 _Check_return_
573 _ACRTIMP unsigned long long __cdecl strtoull(
574     _In_z_                   char const* _String,
575     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
576     _In_                     int         _Radix
577     );
578 
579 _Check_return_
580 _ACRTIMP unsigned long long __cdecl _strtoull_l(
581     _In_z_                   char const* _String,
582     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
583     _In_                     int         _Radix,
584     _In_opt_                 _locale_t   _Locale
585     );
586 
587 _Check_return_
588 _ACRTIMP __int64 __cdecl _strtoi64(
589     _In_z_                   char const* _String,
590     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
591     _In_                     int         _Radix
592     );
593 
594 _Check_return_
595 _ACRTIMP __int64 __cdecl _strtoi64_l(
596     _In_z_                   char const* _String,
597     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
598     _In_                     int         _Radix,
599     _In_opt_                 _locale_t   _Locale
600     );
601 
602 _Check_return_
603 _ACRTIMP unsigned __int64 __cdecl _strtoui64(
604     _In_z_                   char const* _String,
605     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
606     _In_                     int         _Radix
607     );
608 
609 _Check_return_
610 _ACRTIMP unsigned __int64 __cdecl _strtoui64_l(
611     _In_z_                   char const* _String,
612     _Out_opt_ _Deref_post_z_ char**      _EndPtr,
613     _In_                     int         _Radix,
614     _In_opt_                 _locale_t   _Locale
615     );
616 
617 
618 
619 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
620 //
621 // Number to Narrow String Conversions
622 //
623 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
624 _Success_(return == 0)
625 _Check_return_opt_
626 _ACRTIMP errno_t __cdecl _itoa_s(
627     _In_                         int    _Value,
628     _Out_writes_z_(_BufferCount) char*  _Buffer,
629     _In_                         size_t _BufferCount,
630     _In_                         int    _Radix
631     );
632 
633 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_1(
634     _Success_(return == 0)
635     errno_t, _itoa_s,
636     _In_ int,  _Value,
637          char, _Buffer,
638     _In_ int,  _Radix
639     )
640 
641 __DEFINE_CPP_OVERLOAD_STANDARD_FUNC_1_1(
642     char*, __RETURN_POLICY_DST, _ACRTIMP, _itoa,
643     _In_                    int,  _Value,
644     _Pre_notnull_ _Post_z_, char, _Buffer,
645     _In_                    int,  _Radix
646     )
647 
648 _Success_(return == 0)
649 _Check_return_opt_
650 _ACRTIMP errno_t __cdecl _ltoa_s(
651     _In_                         long   _Value,
652     _Out_writes_z_(_BufferCount) char*  _Buffer,
653     _In_                         size_t _BufferCount,
654     _In_                         int    _Radix
655     );
656 
657 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_1(
658     errno_t, _ltoa_s,
659     _In_ long, _Value,
660          char, _Buffer,
661     _In_ int,  _Radix
662     )
663 
664 __DEFINE_CPP_OVERLOAD_STANDARD_FUNC_1_1(
665     char*, __RETURN_POLICY_DST, _ACRTIMP, _ltoa,
666     _In_                    long, _Value,
667     _Pre_notnull_ _Post_z_, char, _Buffer,
668     _In_                    int,  _Radix
669     )
670 
671 _Success_(return == 0)
672 _Check_return_opt_
673 _ACRTIMP errno_t __cdecl _ultoa_s(
674     _In_                         unsigned long _Value,
675     _Out_writes_z_(_BufferCount) char*         _Buffer,
676     _In_                         size_t        _BufferCount,
677     _In_                         int           _Radix
678     );
679 
680 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_1(
681     errno_t, _ultoa_s,
682     _In_ unsigned long, _Value,
683          char,          _Buffer,
684     _In_ int,           _Radix
685     )
686 
687 __DEFINE_CPP_OVERLOAD_STANDARD_FUNC_1_1(
688     char*, __RETURN_POLICY_DST, _ACRTIMP, _ultoa,
689     _In_                    unsigned long, _Value,
690     _Pre_notnull_ _Post_z_, char,          _Buffer,
691     _In_                    int,           _Radix
692     )
693 
694 _Success_(return == 0)
695 _Check_return_opt_
696 _ACRTIMP errno_t __cdecl _i64toa_s(
697     _In_                         __int64 _Value,
698     _Out_writes_z_(_BufferCount) char*   _Buffer,
699     _In_                         size_t  _BufferCount,
700     _In_                         int     _Radix
701     );
702 
703 _Success_(return == 0)
704 _CRT_INSECURE_DEPRECATE(_i64toa_s)
705 _ACRTIMP char* __cdecl _i64toa(
706     _In_                   __int64 _Value,
707     _Pre_notnull_ _Post_z_ char*   _Buffer,
708     _In_                   int     _Radix
709     );
710 
711 _Success_(return == 0)
712 _Check_return_opt_
713 _ACRTIMP errno_t __cdecl _ui64toa_s(
714     _In_                         unsigned __int64 _Value,
715     _Out_writes_z_(_BufferCount) char*            _Buffer,
716     _In_                         size_t           _BufferCount,
717     _In_                         int              _Radix
718     );
719 
720 _CRT_INSECURE_DEPRECATE(_ui64toa_s)
721 _ACRTIMP char* __cdecl _ui64toa(
722     _In_                   unsigned __int64 _Value,
723     _Pre_notnull_ _Post_z_ char*            _Buffer,
724     _In_                   int              _Radix
725     );
726 
727 
728 
729 // _CVTBUFSIZE is the maximum size for the per-thread conversion buffer.  It
730 // should be at least as long as the number of digits in the largest double
731 // precision value (?.?e308 in IEEE arithmetic).  We will use the same size
732 // buffer as is used in the printf support routines.
733 //
734 // (This value actually allows 40 additional decimal places; even though there
735 // are only 16 digits of accuracy in a double precision IEEE number, the user may
736 // ask for more to effect zero padding.)
737 #define _CVTBUFSIZE (309 + 40) // # of digits in max. dp value + slop
738 
739 _Success_(return == 0)
740 _Check_return_wat_
741 _ACRTIMP errno_t __cdecl _ecvt_s(
742     _Out_writes_z_(_BufferCount) char* _Buffer,
743     _In_  size_t                       _BufferCount,
744     _In_  double                       _Value,
745     _In_  int                          _DigitCount,
746     _Out_ int*                         _PtDec,
747     _Out_ int*                         _PtSign
748     );
749 
750 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_4(
751     errno_t, _ecvt_s,
752           char,   _Buffer,
753     _In_  double, _Value,
754     _In_  int,    _DigitCount,
755     _Out_ int*,   _PtDec,
756     _Out_ int*,   _PtSign
757     )
758 
759 _Check_return_ _CRT_INSECURE_DEPRECATE(_ecvt_s)
760 _ACRTIMP char* __cdecl _ecvt(
761     _In_  double _Value,
762     _In_  int    _DigitCount,
763     _Out_ int*   _PtDec,
764     _Out_ int*   _PtSign
765     );
766 
767 _Success_(return == 0)
768 _Check_return_wat_
769 _ACRTIMP errno_t __cdecl _fcvt_s(
770     _Out_writes_z_(_BufferCount) char*  _Buffer,
771     _In_                         size_t _BufferCount,
772     _In_                         double _Value,
773     _In_                         int    _FractionalDigitCount,
774     _Out_                        int*   _PtDec,
775     _Out_                        int*   _PtSign
776     );
777 
778 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_4(
779     _Success_(return == 0)
780     errno_t, _fcvt_s,
781           char,   _Buffer,
782     _In_  double, _Value,
783     _In_  int,    _FractionalDigitCount,
784     _Out_ int*,   _PtDec,
785     _Out_ int*,   _PtSign
786     )
787 
788 _Success_(return == 0)
789 _Check_return_ _CRT_INSECURE_DEPRECATE(_fcvt_s)
790 _ACRTIMP char* __cdecl _fcvt(
791     _In_  double _Value,
792     _In_  int    _FractionalDigitCount,
793     _Out_ int*   _PtDec,
794     _Out_ int*   _PtSign
795     );
796 
797 _Success_(return == 0)
798 _ACRTIMP errno_t __cdecl _gcvt_s(
799     _Out_writes_z_(_BufferCount) char*  _Buffer,
800     _In_                         size_t _BufferCount,
801     _In_                         double _Value,
802     _In_                         int    _DigitCount
803     );
804 
805 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_2(
806     _Success_(return == 0)
807     errno_t, _gcvt_s,
808          char,   _Buffer,
809     _In_ double, _Value,
810     _In_ int,    _DigitCount
811     )
812 
813 _CRT_INSECURE_DEPRECATE(_gcvt_s)
814 _ACRTIMP char* __cdecl _gcvt(
815     _In_                   double _Value,
816     _In_                   int    _DigitCount,
817     _Pre_notnull_ _Post_z_ char*  _Buffer
818     );
819 
820 
821 
822 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
823 //
824 // Multibyte String Operations and Conversions
825 //
826 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
827 // Maximum number of bytes in multi-byte character in the current locale
828 // (also defined in ctype.h).
829 #ifndef MB_CUR_MAX
830     #if defined _CRT_DISABLE_PERFCRIT_LOCKS && !defined _DLL
831         #define MB_CUR_MAX __mb_cur_max
832     #else
833         #define MB_CUR_MAX ___mb_cur_max_func()
834     #endif
835 
836     #ifdef _CRT_DECLARE_GLOBAL_VARIABLES_DIRECTLY
837         extern int __mb_cur_max;
838     #else
839         #define __mb_cur_max (___mb_cur_max_func())
840     #endif
841 
842     _Post_satisfies_(return > 0 && return < MB_LEN_MAX)
843     _ACRTIMP int __cdecl ___mb_cur_max_func(void);
844 
845     _Post_satisfies_(return > 0 && return < MB_LEN_MAX)
846     _ACRTIMP int __cdecl ___mb_cur_max_l_func(_locale_t _Locale);
847 #endif
848 
849 
850 
851 _Check_return_
852 _ACRTIMP int __cdecl mblen(
853     _In_reads_bytes_opt_(_MaxCount) _Pre_opt_z_ char const* _Ch,
854     _In_                                        size_t      _MaxCount
855     );
856 
857 _Check_return_
858 _ACRTIMP int __cdecl _mblen_l(
859     _In_reads_bytes_opt_(_MaxCount) _Pre_opt_z_ char const* _Ch,
860     _In_                                        size_t      _MaxCount,
861     _In_opt_                                    _locale_t   _Locale
862     );
863 
864 _Check_return_
865 _Post_satisfies_(return <= _String_length_(_String))
866 _ACRTIMP size_t __cdecl _mbstrlen(
867     _In_z_ char const* _String
868     );
869 
870 _Check_return_
871 _Post_satisfies_(return <= _String_length_(_String) || return == (size_t)-1)
872 _ACRTIMP size_t __cdecl _mbstrlen_l(
873     _In_z_   char const* _String,
874     _In_opt_ _locale_t   _Locale
875     );
876 
877 _Check_return_
878 _Post_satisfies_((return <= _String_length_(_String) && return <= _MaxCount) || return == (size_t)-1)
879 _ACRTIMP size_t __cdecl _mbstrnlen(
880     _In_z_ char const* _String,
881     _In_   size_t      _MaxCount
882     );
883 
884 _Post_satisfies_((return <= _String_length_(_String) && return <= _MaxCount) || return == (size_t)-1)
885 _Check_return_
886 _ACRTIMP size_t __cdecl _mbstrnlen_l(
887     _In_z_   char const* _String,
888     _In_     size_t      _MaxCount,
889     _In_opt_ _locale_t   _Locale
890     );
891 
892 _Success_(return != -1)
893 _ACRTIMP int __cdecl mbtowc(
894     _Pre_notnull_ _Post_z_               wchar_t*    _DstCh,
895     _In_reads_or_z_opt_(_SrcSizeInBytes) char const* _SrcCh,
896     _In_                                 size_t      _SrcSizeInBytes
897     );
898 
899 _Success_(return != -1)
900 _ACRTIMP int __cdecl _mbtowc_l(
901     _Pre_notnull_ _Post_z_               wchar_t*    _DstCh,
902     _In_reads_or_z_opt_(_SrcSizeInBytes) char const* _SrcCh,
903     _In_                                 size_t      _SrcSizeInBytes,
904     _In_opt_                             _locale_t   _Locale
905     );
906 
907 _Check_return_opt_
908 _ACRTIMP errno_t __cdecl mbstowcs_s(
909     _Out_opt_                                                 size_t*     _PtNumOfCharConverted,
910     _Out_writes_to_opt_(_SizeInWords, *_PtNumOfCharConverted) wchar_t*    _DstBuf,
911     _In_                                                      size_t      _SizeInWords,
912     _In_reads_or_z_(_MaxCount)                                char const* _SrcBuf,
913     _In_                                                      size_t      _MaxCount
914     );
915 
916 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_2(
917     errno_t, mbstowcs_s,
918     _Out_opt_ size_t*,     _PtNumOfCharConverted,
919     _Post_z_  wchar_t,     _Dest,
920     _In_z_    char const*, _Source,
921     _In_      size_t,      _MaxCount
922     )
923 
924 __DEFINE_CPP_OVERLOAD_STANDARD_NFUNC_0_2_SIZE(
925     _ACRTIMP, mbstowcs,
926     _Out_writes_opt_z_(_MaxCount), wchar_t,     _Dest,
927     _In_z_                         char const*, _Source,
928     _In_                           size_t,      _MaxCount
929     )
930 
931 _Check_return_opt_
932 _ACRTIMP errno_t __cdecl _mbstowcs_s_l(
933     _Out_opt_                                                 size_t*     _PtNumOfCharConverted,
934     _Out_writes_to_opt_(_SizeInWords, *_PtNumOfCharConverted) wchar_t*    _DstBuf,
935     _In_                                                      size_t      _SizeInWords,
936     _In_reads_or_z_(_MaxCount)                                char const* _SrcBuf,
937     _In_                                                      size_t      _MaxCount,
938     _In_opt_                                                  _locale_t   _Locale
939     );
940 
941 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_3(
942     errno_t, _mbstowcs_s_l,
943     _Out_opt_ size_t*,     _PtNumOfCharConverted,
944     _Post_z_  wchar_t,     _Dest,
945     _In_z_    char const*, _Source,
946     _In_      size_t,      _MaxCount,
947     _In_opt_  _locale_t,   _Locale
948     )
949 
950 __DEFINE_CPP_OVERLOAD_STANDARD_NFUNC_0_3_SIZE_EX(
951     _ACRTIMP, _mbstowcs_l, _mbstowcs_s_l,
952     _Out_writes_opt_z_(_Size)  wchar_t,
953     _Out_writes_z_(_MaxCount), wchar_t,     _Dest,
954     _In_z_                     char const*, _Source,
955     _In_                       size_t,      _MaxCount,
956     _In_opt_                   _locale_t,   _Locale
957     )
958 
959 
960 
961 
962 _CRT_INSECURE_DEPRECATE(wctomb_s)
963 _ACRTIMP int __cdecl wctomb(
964     _Out_writes_opt_z_(MB_LEN_MAX) char*   _MbCh,
965     _In_                           wchar_t _WCh
966     );
967 
968 _CRT_INSECURE_DEPRECATE(_wctomb_s_l)
969 _ACRTIMP int __cdecl _wctomb_l(
970     _Pre_maybenull_ _Post_z_ char*     _MbCh,
971     _In_                     wchar_t   _WCh,
972     _In_opt_                 _locale_t _Locale
973     );
974 
975 #if __STDC_WANT_SECURE_LIB__
976 
977     _Check_return_wat_
978     _ACRTIMP errno_t __cdecl wctomb_s(
979         _Out_opt_                                                int*    _SizeConverted,
980         _Out_writes_bytes_to_opt_(_SizeInBytes, *_SizeConverted) char*   _MbCh,
981         _In_                                                     rsize_t _SizeInBytes,
982         _In_                                                     wchar_t _WCh
983         );
984 
985 #endif // __STDC_WANT_SECURE_LIB__
986 
987 _Check_return_wat_
988 _ACRTIMP errno_t __cdecl _wctomb_s_l(
989     _Out_opt_                        int*     _SizeConverted,
990     _Out_writes_opt_z_(_SizeInBytes) char*     _MbCh,
991     _In_                             size_t    _SizeInBytes,
992     _In_                             wchar_t   _WCh,
993     _In_opt_                         _locale_t _Locale);
994 
995 _Check_return_wat_
996 _ACRTIMP errno_t __cdecl wcstombs_s(
997     _Out_opt_                                                          size_t*        _PtNumOfCharConverted,
998     _Out_writes_bytes_to_opt_(_DstSizeInBytes, *_PtNumOfCharConverted) char*          _Dst,
999     _In_                                                               size_t         _DstSizeInBytes,
1000     _In_z_                                                             wchar_t const* _Src,
1001     _In_                                                               size_t         _MaxCountInBytes
1002     );
1003 
1004 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_2(
1005     errno_t, wcstombs_s,
1006     _Out_opt_                     size_t*,        _PtNumOfCharConverted,
1007     _Out_writes_bytes_opt_(_Size) char,           _Dest,
1008     _In_z_                        wchar_t const*, _Source,
1009     _In_                          size_t,         _MaxCount
1010     )
1011 
1012 __DEFINE_CPP_OVERLOAD_STANDARD_NFUNC_0_2_SIZE(
1013     _ACRTIMP, wcstombs,
1014     _Out_writes_opt_(_MaxCount),   char,           _Dest,
1015     _In_z_                         wchar_t const*, _Source,
1016     _In_                           size_t,         _MaxCount
1017     )
1018 
1019 _Check_return_wat_
1020 _ACRTIMP errno_t __cdecl _wcstombs_s_l(
1021     _Out_opt_                                                          size_t*        _PtNumOfCharConverted,
1022     _Out_writes_bytes_to_opt_(_DstSizeInBytes, *_PtNumOfCharConverted) char*          _Dst,
1023     _In_                                                               size_t         _DstSizeInBytes,
1024     _In_z_                                                             wchar_t const* _Src,
1025     _In_                                                               size_t         _MaxCountInBytes,
1026     _In_opt_                                                           _locale_t      _Locale
1027     );
1028 
1029 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_3(
1030     errno_t, _wcstombs_s_l,
1031     _Out_opt_               size_t*,        _PtNumOfCharConverted,
1032     _Out_writes_opt_(_Size) char,           _Dest,
1033     _In_z_                  wchar_t const*, _Source,
1034     _In_                    size_t,         _MaxCount,
1035     _In_opt_                _locale_t,      _Locale
1036     )
1037 
1038 __DEFINE_CPP_OVERLOAD_STANDARD_NFUNC_0_3_SIZE_EX(
1039     _ACRTIMP, _wcstombs_l, _wcstombs_s_l,
1040     _Out_writes_opt_z_(_Size)  char,
1041     _Out_writes_(_MaxCount),   char,           _Dest,
1042     _In_z_                     wchar_t const*, _Source,
1043     _In_                       size_t,         _MaxCount,
1044     _In_opt_                   _locale_t,      _Locale
1045     )
1046 
1047 
1048 
1049 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1050 //
1051 // Path Manipulation
1052 //
1053 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1054 // Sizes for buffers used by the _makepath() and _splitpath() functions.
1055 // note that the sizes include space for 0-terminator
1056 #define _MAX_PATH   260 // max. length of full pathname
1057 #define _MAX_DRIVE  3   // max. length of drive component
1058 #define _MAX_DIR    256 // max. length of path component
1059 #define _MAX_FNAME  256 // max. length of file name component
1060 #define _MAX_EXT    256 // max. length of extension component
1061 
1062 
1063 #pragma push_macro("_fullpath")
1064 #undef _fullpath
1065 
1066 _Success_(return != 0)
1067 _Check_return_
1068 _ACRTIMP _CRTALLOCATOR char* __cdecl _fullpath(
1069     _Out_writes_opt_z_(_BufferCount) char*       _Buffer,
1070     _In_z_                           char const* _Path,
1071     _In_                             size_t      _BufferCount
1072     );
1073 
1074 #pragma pop_macro("_fullpath")
1075 
1076 _Check_return_wat_
1077 _ACRTIMP errno_t __cdecl _makepath_s(
1078     _Out_writes_z_(_BufferCount) char*       _Buffer,
1079     _In_                         size_t      _BufferCount,
1080     _In_opt_z_                   char const* _Drive,
1081     _In_opt_z_                   char const* _Dir,
1082     _In_opt_z_                   char const* _Filename,
1083     _In_opt_z_                   char const* _Ext
1084     );
1085 
1086 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_4(
1087     errno_t, _makepath_s,
1088                char,        _Buffer,
1089     _In_opt_z_ char const*, _Drive,
1090     _In_opt_z_ char const*, _Dir,
1091     _In_opt_z_ char const*, _Filename,
1092     _In_opt_z_ char const*, _Ext
1093     )
1094 
1095 __DEFINE_CPP_OVERLOAD_STANDARD_FUNC_0_4(
1096     void, __RETURN_POLICY_VOID, _ACRTIMP, _makepath,
1097     _Pre_notnull_ _Post_z_, char,        _Buffer,
1098     _In_opt_z_              char const*, _Drive,
1099     _In_opt_z_              char const*, _Dir,
1100     _In_opt_z_              char const*, _Filename,
1101     _In_opt_z_              char const*, _Ext
1102     )
1103 
1104 _CRT_INSECURE_DEPRECATE(_splitpath_s)
1105 _ACRTIMP void __cdecl _splitpath(
1106     _In_z_                   char const* _FullPath,
1107     _Pre_maybenull_ _Post_z_ char*       _Drive,
1108     _Pre_maybenull_ _Post_z_ char*       _Dir,
1109     _Pre_maybenull_ _Post_z_ char*       _Filename,
1110     _Pre_maybenull_ _Post_z_ char*       _Ext
1111     );
1112 
1113 _Check_return_wat_
1114 _ACRTIMP errno_t __cdecl _splitpath_s(
1115     _In_z_                             char const* _FullPath,
1116     _Out_writes_opt_z_(_DriveCount)    char*       _Drive,
1117     _In_                               size_t      _DriveCount,
1118     _Out_writes_opt_z_(_DirCount)      char*       _Dir,
1119     _In_                               size_t      _DirCount,
1120     _Out_writes_opt_z_(_FilenameCount) char*       _Filename,
1121     _In_                               size_t      _FilenameCount,
1122     _Out_writes_opt_z_(_ExtCount)      char*       _Ext,
1123     _In_                               size_t      _ExtCount
1124     );
1125 
1126 __DEFINE_CPP_OVERLOAD_SECURE_FUNC_SPLITPATH(errno_t, _splitpath_s, char, _Dest)
1127 
1128 #if __STDC_WANT_SECURE_LIB__
1129 
1130 _Check_return_opt_
1131 _Success_(return == 0)
1132 _DCRTIMP errno_t __cdecl getenv_s(
1133     _Out_                            size_t*     _RequiredCount,
1134     _Out_writes_opt_z_(_BufferCount) char*       _Buffer,
1135     _In_                             rsize_t     _BufferCount,
1136     _In_z_                           char const* _VarName
1137     );
1138 
1139 #endif // __STDC_WANT_SECURE_LIB__
1140 
1141 
1142 
1143 
1144 _ACRTIMP int*       __cdecl __p___argc (void);
1145 _ACRTIMP char***    __cdecl __p___argv (void);
1146 _ACRTIMP wchar_t*** __cdecl __p___wargv(void);
1147 
1148 #ifdef _CRT_DECLARE_GLOBAL_VARIABLES_DIRECTLY
1149     extern int       __argc;
1150     extern char**    __argv;
1151     extern wchar_t** __wargv;
1152 #else
1153     #define __argc  (*__p___argc())  // Pointer to number of command line arguments
1154     #define __argv  (*__p___argv())  // Pointer to table of narrow command line arguments
1155     #define __wargv (*__p___wargv()) // Pointer to table of wide command line arguments
1156 #endif
1157 
1158 _DCRTIMP char***    __cdecl __p__environ (void);
1159 _DCRTIMP wchar_t*** __cdecl __p__wenviron(void);
1160 
1161 #ifndef _CRT_BEST_PRACTICES_USAGE
1162     #define _CRT_V12_LEGACY_FUNCTIONALITY
1163 #endif
1164 
1165 #ifndef _CRT_V12_LEGACY_FUNCTIONALITY
1166     // Deprecated symbol: Do not expose environment global pointers unless
1167     // legacy access is specifically requested
1168     #define _environ    crt_usage_error__do_not_reference_global_pointer_directly__environ
1169     #define _wenviron   crt_usage_error__do_not_reference_global_pointer_directly__wenviron
1170 #else
1171     #define _environ  (*__p__environ())  // Pointer to narrow environment table
1172     #define _wenviron (*__p__wenviron()) // Pointer to wide environment table
1173 #endif
1174 
1175 
1176 
1177 // Sizes for buffers used by the getenv/putenv family of functions.
1178 #define _MAX_ENV 32767
1179 
1180 
1181 #if _CRT_FUNCTIONS_REQUIRED
1182 
1183     _Check_return_ _CRT_INSECURE_DEPRECATE(_dupenv_s)
1184     _DCRTIMP char* __cdecl getenv(
1185         _In_z_ char const* _VarName
1186         );
1187 
1188     __DEFINE_CPP_OVERLOAD_SECURE_FUNC_1_1(
1189         errno_t, getenv_s,
1190         _Out_  size_t*,     _RequiredCount,
1191                char,        _Buffer,
1192         _In_z_ char const*, _VarName
1193         )
1194 
1195     #if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
1196         #pragma push_macro("_dupenv_s")
1197         #undef _dupenv_s
1198     #endif
1199 
1200     _Check_return_opt_
1201     _DCRTIMP errno_t __cdecl _dupenv_s(
1202         _Outptr_result_buffer_maybenull_(*_BufferCount) _Outptr_result_maybenull_z_ char**      _Buffer,
1203         _Out_opt_                                                                   size_t*     _BufferCount,
1204         _In_z_                                                                      char const* _VarName
1205         );
1206 
1207     #if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC)
1208         #pragma pop_macro("_dupenv_s")
1209     #endif
1210 
1211     _DCRTIMP int __cdecl system(
1212         _In_opt_z_ char const* _Command
1213         );
1214 
1215     // The functions below have declspecs in their declarations in the Windows
1216     // headers, causing PREfast to fire 6540 here
1217     #pragma warning(push)
1218     #pragma warning(disable: 6540)
1219 
1220     _Check_return_
1221     _DCRTIMP int __cdecl _putenv(
1222         _In_z_ char const* _EnvString
1223         );
1224 
1225     _Check_return_wat_
1226     _DCRTIMP errno_t __cdecl _putenv_s(
1227         _In_z_ char const* _Name,
1228         _In_z_ char const* _Value
1229         );
1230 
1231     #pragma warning(pop)
1232 
1233     _DCRTIMP errno_t __cdecl _searchenv_s(
1234         _In_z_                       char const* _Filename,
1235         _In_z_                       char const* _VarName,
1236         _Out_writes_z_(_BufferCount) char*       _Buffer,
1237         _In_                         size_t      _BufferCount
1238         );
1239 
1240     __DEFINE_CPP_OVERLOAD_SECURE_FUNC_2_0(
1241         errno_t, _searchenv_s,
1242         _In_z_ char const*, _Filename,
1243         _In_z_ char const*, _VarName,
1244                char,        _Buffer
1245         )
1246 
1247     __DEFINE_CPP_OVERLOAD_STANDARD_FUNC_2_0(
1248         void, __RETURN_POLICY_VOID, _DCRTIMP, _searchenv,
1249         _In_z_                  char const*, _Filename,
1250         _In_z_                  char const*, _VarName,
1251         _Pre_notnull_ _Post_z_, char,        _Buffer
1252         )
1253 
1254     // The Win32 API SetErrorMode, Beep and Sleep should be used instead.
1255     _CRT_OBSOLETE(SetErrorMode)
1256     _DCRTIMP void __cdecl _seterrormode(
1257         _In_ int _Mode
1258         );
1259 
1260     _CRT_OBSOLETE(Beep)
1261     _DCRTIMP void __cdecl _beep(
1262         _In_ unsigned _Frequency,
1263         _In_ unsigned _Duration
1264         );
1265 
1266     _CRT_OBSOLETE(Sleep)
1267     _DCRTIMP void __cdecl _sleep(
1268         _In_ unsigned long _Duration
1269         );
1270 
1271 #endif // _CRT_FUNCTIONS_REQUIRED
1272 
1273 
1274 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1275 //
1276 // Non-ANSI Names for Compatibility
1277 //
1278 //-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1279 #if defined(_CRT_INTERNAL_NONSTDC_NAMES) && _CRT_INTERNAL_NONSTDC_NAMES
1280 
1281     #ifndef __cplusplus
1282         #define max(a,b) (((a) > (b)) ? (a) : (b))
1283         #define min(a,b) (((a) < (b)) ? (a) : (b))
1284     #endif
1285 
1286     #define sys_errlist _sys_errlist
1287     #define sys_nerr    _sys_nerr
1288 
1289     #pragma warning(push)
1290     #pragma warning(disable: 4141) // Using deprecated twice
1291 
1292     _Check_return_ _CRT_NONSTDC_DEPRECATE(_ecvt) _CRT_INSECURE_DEPRECATE(_ecvt_s)
1293     _ACRTIMP char* __cdecl ecvt(
1294         _In_  double _Value,
1295         _In_  int    _DigitCount,
1296         _Out_ int*   _PtDec,
1297         _Out_ int*   _PtSign
1298         );
1299 
1300     _Check_return_ _CRT_NONSTDC_DEPRECATE(_fcvt) _CRT_INSECURE_DEPRECATE(_fcvt_s)
1301     _ACRTIMP char* __cdecl fcvt(
1302         _In_  double _Value,
1303         _In_  int    _FractionalDigitCount,
1304         _Out_ int*   _PtDec,
1305         _Out_ int*   _PtSign
1306         );
1307 
1308     _CRT_NONSTDC_DEPRECATE(_gcvt) _CRT_INSECURE_DEPRECATE(_fcvt_s)
1309     _ACRTIMP char* __cdecl gcvt(
1310         _In_                   double _Value,
1311         _In_                   int    _DigitCount,
1312         _Pre_notnull_ _Post_z_ char*  _DstBuf
1313         );
1314 
1315     _CRT_NONSTDC_DEPRECATE(_itoa) _CRT_INSECURE_DEPRECATE(_itoa_s)
1316     _ACRTIMP char* __cdecl itoa(
1317         _In_                   int   _Value,
1318         _Pre_notnull_ _Post_z_ char* _Buffer,
1319         _In_                   int   _Radix
1320         );
1321 
1322     _CRT_NONSTDC_DEPRECATE(_ltoa) _CRT_INSECURE_DEPRECATE(_ltoa_s)
1323     _ACRTIMP char* __cdecl ltoa(
1324         _In_                   long  _Value,
1325         _Pre_notnull_ _Post_z_ char* _Buffer,
1326         _In_                   int   _Radix
1327         );
1328 
1329 
1330     _CRT_NONSTDC_DEPRECATE(_swab)
1331     _ACRTIMP void __cdecl swab(
1332         _Inout_updates_z_(_SizeInBytes) char* _Buf1,
1333         _Inout_updates_z_(_SizeInBytes) char* _Buf2,
1334         _In_                            int   _SizeInBytes
1335         );
1336 
1337     _CRT_NONSTDC_DEPRECATE(_ultoa) _CRT_INSECURE_DEPRECATE(_ultoa_s)
1338     _ACRTIMP char* __cdecl ultoa(
1339         _In_                   unsigned long _Value,
1340         _Pre_notnull_ _Post_z_ char*         _Buffer,
1341         _In_                   int           _Radix
1342         );
1343 
1344     #define environ _environ
1345 
1346     _Check_return_ _CRT_NONSTDC_DEPRECATE(_putenv)
1347     _DCRTIMP int __cdecl putenv(
1348         _In_z_ char const* _EnvString
1349         );
1350 
1351     #pragma warning(pop)
1352 
1353     onexit_t __cdecl onexit(_In_opt_ onexit_t _Func);
1354 
1355 #endif // _CRT_INTERNAL_NONSTDC_NAMES
1356 
1357 
1358 
1359 _CRT_END_C_HEADER
1360 _UCRT_RESTORE_CLANG_WARNINGS
1361 #pragma warning(pop) // _UCRT_DISABLED_WARNINGS
1362 #endif // _INC_STDLIB
1363