ReactOS 0.4.16-dev-1007-g2e85425
corecrt_internal_securecrt.h
Go to the documentation of this file.
1/***
2*corecrt_internal_securecrt.h - contains declarations of internal routines and variables for securecrt
3*
4* Copyright (c) Microsoft Corporation. All rights reserved.
5*
6*Purpose:
7* Declares routines and variables used internally in the SecureCRT implementation.
8* In this include file we define the macros needed to implement the secure functions
9* inlined in the *.inl files like tcscpy_s.inl, etc.
10*
11* [Internal]
12*
13****/
14
15#pragma once
16
17#ifndef _INC_INTERNAL_SECURECRT
18#define _INC_INTERNAL_SECURECRT
19
20#include <corecrt_internal.h>
21#include <errno.h>
22
23/* string resetting */
24#define _FILL_STRING _SECURECRT__FILL_STRING
25
26#define _FILL_BYTE _SECURECRT__FILL_BYTE
27
28#define _RESET_STRING(_String, _Size) \
29 *(_String) = 0; \
30 _FILL_STRING((_String), (_Size), 1);
31
32/* validations */
33#define _VALIDATE_STRING_ERROR(_String, _Size, _Ret) \
34 _VALIDATE_RETURN((_String) != NULL && (_Size) > 0, EINVAL, (_Ret))
35
36#define _VALIDATE_STRING(_String, _Size) \
37 _VALIDATE_STRING_ERROR((_String), (_Size), EINVAL)
38
39#define _VALIDATE_POINTER_ERROR_RETURN(_Pointer, _ErrorCode, _Ret) \
40 _VALIDATE_RETURN((_Pointer) != NULL, (_ErrorCode), (_Ret))
41
42#define _VALIDATE_POINTER_ERROR(_Pointer, _Ret) \
43 _VALIDATE_POINTER_ERROR_RETURN((_Pointer), EINVAL, (_Ret))
44
45#define _VALIDATE_POINTER(_Pointer) \
46 _VALIDATE_POINTER_ERROR((_Pointer), EINVAL)
47
48#define _VALIDATE_CONDITION_ERROR_RETURN(_Condition, _ErrorCode, _Ret) \
49 _VALIDATE_RETURN((_Condition), (_ErrorCode), (_Ret))
50
51#define _VALIDATE_CONDITION_ERROR(_Condition, _Ret) \
52 _VALIDATE_CONDITION_ERROR_RETURN((_Condition), EINVAL, (_Ret))
53
54#define _VALIDATE_POINTER_RESET_STRING_ERROR(_Pointer, _String, _Size, _Ret) \
55 if ((_Pointer) == NULL) \
56 { \
57 _RESET_STRING((_String), (_Size)); \
58 _VALIDATE_POINTER_ERROR_RETURN((_Pointer), EINVAL, (_Ret)) \
59 }
60
61#define _VALIDATE_POINTER_RESET_STRING(_Pointer, _String, _Size) \
62 _VALIDATE_POINTER_RESET_STRING_ERROR((_Pointer), (_String), (_Size), EINVAL)
63
64#define _RETURN_BUFFER_TOO_SMALL_ERROR(_String, _Size, _Ret) \
65 _VALIDATE_RETURN((L"Buffer is too small" && 0), ERANGE, _Ret)
66
67#define _RETURN_BUFFER_TOO_SMALL(_String, _Size) \
68 _RETURN_BUFFER_TOO_SMALL_ERROR((_String), (_Size), ERANGE)
69
70#define _RETURN_DEST_NOT_NULL_TERMINATED(_String, _Size) \
71 _VALIDATE_RETURN((L"String is not null terminated" && 0), EINVAL, EINVAL)
72
73#define _RETURN_EINVAL \
74 _VALIDATE_RETURN((L"Invalid parameter", 0), EINVAL, EINVAL)
75
76#define _RETURN_ERROR(_Msg, _Ret) \
77 _VALIDATE_RETURN(((_Msg), 0), EINVAL, _Ret)
78
79/* returns without calling _invalid_parameter */
80#define _RETURN_NO_ERROR \
81 return 0
82
83/* Note that _RETURN_TRUNCATE does not set errno */
84#define _RETURN_TRUNCATE \
85 return STRUNCATE
86
87#define _SET_MBCS_ERROR \
88 (errno = EILSEQ)
89
90#define _RETURN_MBCS_ERROR \
91 return _SET_MBCS_ERROR
92
93/* locale dependent */
94#define _LOCALE_ARG \
95 _LocInfo
96
97#define _LOCALE_ARG_DECL \
98 _locale_t _LOCALE_ARG
99
100#define _LOCALE_UPDATE \
101 _LocaleUpdate _LocUpdate(_LOCALE_ARG)
102
103#define _ISMBBLEAD(_Character) \
104 _ismbblead_l((_Character), _LocUpdate.GetLocaleT())
105
106#define _ISMBBLEADPREFIX(_Result, _StringStart, _BytePtr) \
107 { \
108 unsigned char *_Tmp_VAR, *_StringStart_VAR, *_BytePtr_VAR; \
109 \
110 _StringStart_VAR = (_StringStart); \
111 _BytePtr_VAR = (_BytePtr); \
112 _Tmp_VAR = _BytePtr_VAR; \
113 while ((_Tmp_VAR >= _StringStart_VAR) && _ISMBBLEAD(*_Tmp_VAR)) \
114 { \
115 _Tmp_VAR--; \
116 } \
117 (_Result) = ((_BytePtr_VAR - _Tmp_VAR) & 1) != 0; \
118 }
119
120#define _LOCALE_SHORTCUT_TEST \
121 _LocUpdate.GetLocaleT()->mbcinfo->ismbcodepage == 0
122
123/* misc */
124#define _ASSIGN_IF_NOT_NULL(_Pointer, _Value) \
125 if ((_Pointer) != NULL) \
126 { \
127 *(_Pointer) = (_Value); \
128 }
129
130#endif /* _INC_INTERNAL_SECURECRT */