2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the w64 mingw-runtime package.
4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
6 #ifndef _STRSAFE_H_INCLUDED_
7 #define _STRSAFE_H_INCLUDED_
9 #include <_mingw_unicode.h>
13 #include <specstrings.h>
15 #ifndef _SIZE_T_DEFINED
16 #define _SIZE_T_DEFINED
19 __MINGW_EXTENSION
typedef unsigned __int64
size_t;
21 typedef unsigned int size_t;
25 #ifndef _SSIZE_T_DEFINED
26 #define _SSIZE_T_DEFINED
29 __MINGW_EXTENSION
typedef __int64 ssize_t
;
35 #ifndef _WCHAR_T_DEFINED
36 #define _WCHAR_T_DEFINED
37 typedef unsigned short wchar_t;
40 #ifndef _HRESULT_DEFINED
41 #define _HRESULT_DEFINED
46 #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)
50 #define FAILED(hr) ((HRESULT)(hr) < 0)
54 #define S_OK ((HRESULT)0x00000000L)
59 # define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
61 # define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1])
66 #define _STRSAFE_EXTERN_C extern "C"
68 #define _STRSAFE_EXTERN_C extern
72 #define WINAPI __stdcall
75 #define STRSAFEAPI static __inline HRESULT WINAPI
76 #define STRSAFE_INLINE_API __CRT_INLINE HRESULT WINAPI
78 #define STRSAFE_MAX_CCH 2147483647
80 #ifndef _NTSTRSAFE_H_INCLUDED_
81 #define STRSAFE_IGNORE_NULLS 0x00000100
82 #define STRSAFE_FILL_BEHIND_NULL 0x00000200
83 #define STRSAFE_FILL_ON_FAILURE 0x00000400
84 #define STRSAFE_NULL_ON_FAILURE 0x00000800
85 #define STRSAFE_NO_TRUNCATION 0x00001000
86 #define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000
87 #define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000
89 #define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
90 #define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED)
92 #define STRSAFE_FILL_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
93 #define STRSAFE_FAILURE_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
95 #define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)((dwFlags) & 0x000000FF))
98 #define STRSAFE_E_INSUFFICIENT_BUFFER ((HRESULT)0x8007007AL)
99 #define STRSAFE_E_INVALID_PARAMETER ((HRESULT)0x80070057L)
100 #define STRSAFE_E_END_OF_FILE ((HRESULT)0x80070026L)
102 typedef char *STRSAFE_LPSTR
;
103 typedef const char *STRSAFE_LPCSTR
;
104 typedef wchar_t *STRSAFE_LPWSTR
;
105 typedef const wchar_t *STRSAFE_LPCWSTR
;
107 typedef ULONG STRSAFE_DWORD
;
109 STRSAFEAPI
StringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
110 STRSAFEAPI
StringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
111 STRSAFEAPI
StringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
112 STRSAFEAPI
StringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
113 STRSAFEAPI
StringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
114 STRSAFEAPI
StringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
115 STRSAFEAPI
StringCopyNExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
116 STRSAFEAPI
StringCopyNExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
117 STRSAFEAPI
StringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
118 STRSAFEAPI
StringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
119 STRSAFEAPI
StringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
120 STRSAFEAPI
StringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
121 STRSAFEAPI
StringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
122 STRSAFEAPI
StringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
123 STRSAFEAPI
StringCatNExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
124 STRSAFEAPI
StringCatNExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
125 STRSAFEAPI
StringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
126 STRSAFEAPI
StringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
127 STRSAFEAPI
StringVPrintfExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
128 STRSAFEAPI
StringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
129 STRSAFEAPI
StringLengthWorkerA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
);
130 STRSAFEAPI
StringLengthWorkerW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
);
131 STRSAFE_INLINE_API
StringGetsExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
132 STRSAFE_INLINE_API
StringGetsExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
134 #define StringCchCopy __MINGW_NAME_AW(StringCchCopy)
136 STRSAFEAPI
StringCchCopyA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
137 STRSAFEAPI
StringCchCopyW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
139 #ifndef __CRT__NO_INLINE
140 STRSAFEAPI
StringCchCopyA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
) {
141 return (cchDest
> STRSAFE_MAX_CCH
? STRSAFE_E_INVALID_PARAMETER
: StringCopyWorkerA(pszDest
,cchDest
,pszSrc
));
144 STRSAFEAPI
StringCchCopyW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
) {
145 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
146 return StringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
148 #endif /* !__CRT__NO_INLINE */
150 #define StringCbCopy __MINGW_NAME_AW(StringCbCopy)
152 STRSAFEAPI
StringCbCopyA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
);
153 STRSAFEAPI
StringCbCopyW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
);
155 #ifndef __CRT__NO_INLINE
156 STRSAFEAPI
StringCbCopyA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
) {
157 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
158 return StringCopyWorkerA(pszDest
,cbDest
,pszSrc
);
161 STRSAFEAPI
StringCbCopyW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
) {
162 size_t cchDest
= cbDest
/ sizeof(wchar_t);
163 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
164 return StringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
166 #endif /* !__CRT__NO_INLINE */
168 #define StringCchCopyEx __MINGW_NAME_AW(StringCchCopyEx)
170 STRSAFEAPI
StringCchCopyExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
171 STRSAFEAPI
StringCchCopyExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
173 #ifndef __CRT__NO_INLINE
174 STRSAFEAPI
StringCchCopyExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
175 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
176 return StringCopyExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
179 STRSAFEAPI
StringCchCopyExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
181 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
182 cbDest
= cchDest
* sizeof(wchar_t);
183 return StringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
185 #endif /* !__CRT__NO_INLINE */
187 #define StringCbCopyEx __MINGW_NAME_AW(StringCbCopyEx)
189 STRSAFEAPI
StringCbCopyExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
190 STRSAFEAPI
StringCbCopyExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
192 #ifndef __CRT__NO_INLINE
193 STRSAFEAPI
StringCbCopyExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
195 size_t cchRemaining
= 0;
196 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
197 hr
= StringCopyExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
198 if(SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) {
200 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
205 STRSAFEAPI
StringCbCopyExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
207 size_t cchDest
= cbDest
/ sizeof(wchar_t);
208 size_t cchRemaining
= 0;
210 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
211 hr
= StringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
212 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
214 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
218 #endif /* !__CRT__NO_INLINE */
220 STRSAFEAPI
StringCchCopyNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
221 STRSAFEAPI
StringCchCopyNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
222 #define StringCchCopyN __MINGW_NAME_AW(StringCchCopyN)
224 #ifndef __CRT__NO_INLINE
225 STRSAFEAPI
StringCchCopyNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
) {
226 if(cchDest
> STRSAFE_MAX_CCH
|| cchToCopy
> STRSAFE_MAX_CCH
)
227 return STRSAFE_E_INVALID_PARAMETER
;
228 return StringCopyNWorkerA(pszDest
,cchDest
,pszSrc
,cchToCopy
);
231 STRSAFEAPI
StringCchCopyNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
) {
232 if(cchDest
> STRSAFE_MAX_CCH
|| cchToCopy
> STRSAFE_MAX_CCH
)
233 return STRSAFE_E_INVALID_PARAMETER
;
234 return StringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
236 #endif /* !__CRT__NO_INLINE */
238 STRSAFEAPI
StringCbCopyNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
);
239 STRSAFEAPI
StringCbCopyNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
);
241 #define StringCbCopyN __MINGW_NAME_AW(StringCbCopyN)
243 #ifndef __CRT__NO_INLINE
244 STRSAFEAPI
StringCbCopyNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
) {
245 if(cbDest
> STRSAFE_MAX_CCH
|| cbToCopy
> STRSAFE_MAX_CCH
)
246 return STRSAFE_E_INVALID_PARAMETER
;
247 return StringCopyNWorkerA(pszDest
,cbDest
,pszSrc
,cbToCopy
);
250 STRSAFEAPI
StringCbCopyNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
) {
251 size_t cchDest
= cbDest
/ sizeof(wchar_t);
252 size_t cchToCopy
= cbToCopy
/ sizeof(wchar_t);
253 if(cchDest
> STRSAFE_MAX_CCH
|| cchToCopy
> STRSAFE_MAX_CCH
)
254 return STRSAFE_E_INVALID_PARAMETER
;
255 return StringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
257 #endif /* !__CRT__NO_INLINE */
259 STRSAFEAPI
StringCchCopyNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
260 STRSAFEAPI
StringCchCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
262 #define StringCchCopyNEx __MINGW_NAME_AW(StringCchCopyNEx)
264 #ifndef __CRT__NO_INLINE
265 STRSAFEAPI
StringCchCopyNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
266 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
267 return StringCopyNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
270 STRSAFEAPI
StringCchCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
271 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
272 return StringCopyNExWorkerW(pszDest
,cchDest
,cchDest
* sizeof(wchar_t),pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
274 #endif /* !__CRT__NO_INLINE */
276 STRSAFEAPI
StringCbCopyNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
277 STRSAFEAPI
StringCbCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
279 #define StringCbCopyNEx __MINGW_NAME_AW(StringCbCopyNEx)
281 #ifndef __CRT__NO_INLINE
282 STRSAFEAPI
StringCbCopyNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
284 size_t cchRemaining
= 0;
285 if(cbDest
> STRSAFE_MAX_CCH
)
286 hr
= STRSAFE_E_INVALID_PARAMETER
;
288 hr
= StringCopyNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
289 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
290 *pcbRemaining
= cchRemaining
;
294 STRSAFEAPI
StringCbCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
298 size_t cchRemaining
= 0;
299 cchDest
= cbDest
/ sizeof(wchar_t);
300 cchToCopy
= cbToCopy
/ sizeof(wchar_t);
301 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
302 else hr
= StringCopyNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
303 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
304 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
307 #endif /* !__CRT__NO_INLINE */
309 STRSAFEAPI
StringCchCatA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
310 STRSAFEAPI
StringCchCatW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
312 #define StringCchCat __MINGW_NAME_AW(StringCchCat)
314 #ifndef __CRT__NO_INLINE
315 STRSAFEAPI
StringCchCatA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
) {
316 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
317 return StringCatWorkerA(pszDest
,cchDest
,pszSrc
);
320 STRSAFEAPI
StringCchCatW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
) {
321 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
322 return StringCatWorkerW(pszDest
,cchDest
,pszSrc
);
324 #endif /* !__CRT__NO_INLINE */
326 STRSAFEAPI
StringCbCatA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
);
327 STRSAFEAPI
StringCbCatW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
);
329 #define StringCbCat __MINGW_NAME_AW(StringCbCat)
331 #ifndef __CRT__NO_INLINE
332 STRSAFEAPI
StringCbCatA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
) {
333 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
334 return StringCatWorkerA(pszDest
,cbDest
,pszSrc
);
337 STRSAFEAPI
StringCbCatW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
) {
338 size_t cchDest
= cbDest
/ sizeof(wchar_t);
339 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
340 return StringCatWorkerW(pszDest
,cchDest
,pszSrc
);
342 #endif /* !__CRT__NO_INLINE */
344 STRSAFEAPI
StringCchCatExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
345 STRSAFEAPI
StringCchCatExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
347 #define StringCchCatEx __MINGW_NAME_AW(StringCchCatEx)
349 #ifndef __CRT__NO_INLINE
350 STRSAFEAPI
StringCchCatExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
351 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
352 return StringCatExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
355 STRSAFEAPI
StringCchCatExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
356 size_t cbDest
= cchDest
*sizeof(wchar_t);
357 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
358 return StringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
360 #endif /* !__CRT__NO_INLINE */
362 STRSAFEAPI
StringCbCatExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
363 STRSAFEAPI
StringCbCatExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
365 #define StringCbCatEx __MINGW_NAME_AW(StringCbCatEx)
367 #ifndef __CRT__NO_INLINE
368 STRSAFEAPI
StringCbCatExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
370 size_t cchRemaining
= 0;
371 if(cbDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
372 else hr
= StringCatExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
373 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
374 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
378 STRSAFEAPI
StringCbCatExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
380 size_t cchDest
= cbDest
/ sizeof(wchar_t);
381 size_t cchRemaining
= 0;
383 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
384 else hr
= StringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
385 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
386 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
389 #endif /* !__CRT__NO_INLINE */
391 STRSAFEAPI
StringCchCatNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
392 STRSAFEAPI
StringCchCatNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
394 #define StringCchCatN __MINGW_NAME_AW(StringCchCatN)
396 #ifndef __CRT__NO_INLINE
397 STRSAFEAPI
StringCchCatNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
) {
398 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
399 return StringCatNWorkerA(pszDest
,cchDest
,pszSrc
,cchToAppend
);
402 STRSAFEAPI
StringCchCatNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
) {
403 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
404 return StringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
406 #endif /* !__CRT__NO_INLINE */
408 STRSAFEAPI
StringCbCatNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
);
409 STRSAFEAPI
StringCbCatNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
);
411 #define StringCbCatN __MINGW_NAME_AW(StringCbCatN)
413 #ifndef __CRT__NO_INLINE
414 STRSAFEAPI
StringCbCatNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
) {
415 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
416 return StringCatNWorkerA(pszDest
,cbDest
,pszSrc
,cbToAppend
);
419 STRSAFEAPI
StringCbCatNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
) {
420 size_t cchDest
= cbDest
/ sizeof(wchar_t);
421 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
423 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
424 return StringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
426 #endif /* !__CRT__NO_INLINE */
428 STRSAFEAPI
StringCchCatNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
429 STRSAFEAPI
StringCchCatNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
431 #define StringCchCatNEx __MINGW_NAME_AW(StringCchCatNEx)
433 #ifndef __CRT__NO_INLINE
434 STRSAFEAPI
StringCchCatNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
435 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
436 return StringCatNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
439 STRSAFEAPI
StringCchCatNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
440 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
441 return StringCatNExWorkerW(pszDest
,cchDest
,(cchDest
*sizeof(wchar_t)),pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
445 STRSAFEAPI
StringCbCatNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
446 STRSAFEAPI
StringCbCatNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
448 #define StringCbCatNEx __MINGW_NAME_AW(StringCbCatNEx)
450 #ifndef __CRT__NO_INLINE
451 STRSAFEAPI
StringCbCatNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
453 size_t cchRemaining
= 0;
454 if(cbDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
455 else hr
= StringCatNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
456 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
457 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
461 STRSAFEAPI
StringCbCatNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
463 size_t cchDest
= cbDest
/ sizeof(wchar_t);
464 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
465 size_t cchRemaining
= 0;
466 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
467 else hr
= StringCatNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
468 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
469 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
472 #endif /* !__CRT__NO_INLINE */
474 STRSAFEAPI
StringCchVPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
475 STRSAFEAPI
StringCchVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
477 #define StringCchVPrintf __MINGW_NAME_AW(StringCchVPrintf)
479 #ifndef __CRT__NO_INLINE
480 STRSAFEAPI
StringCchVPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
481 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
482 return StringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
485 STRSAFEAPI
StringCchVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
486 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
487 return StringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
489 #endif /* !__CRT__NO_INLINE */
491 STRSAFEAPI
StringCbVPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
492 STRSAFEAPI
StringCbVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
494 #define StringCbVPrintf __MINGW_NAME_AW(StringCbVPrintf)
496 #ifndef __CRT__NO_INLINE
497 STRSAFEAPI
StringCbVPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
498 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
499 return StringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
502 STRSAFEAPI
StringCbVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
503 size_t cchDest
= cbDest
/ sizeof(wchar_t);
504 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
505 return StringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
507 #endif /* !__CRT__NO_INLINE */
509 STRSAFEAPI
StringCchPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,...);
510 STRSAFEAPI
StringCchPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,...);
512 #define StringCchPrintf __MINGW_NAME_AW(StringCchPrintf)
514 #ifndef __CRT__NO_INLINE
515 STRSAFEAPI
StringCchPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,...) {
518 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
519 va_start(argList
,pszFormat
);
520 hr
= StringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
525 STRSAFEAPI
StringCchPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,...) {
528 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
529 va_start(argList
,pszFormat
);
530 hr
= StringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
534 #endif /* !__CRT__NO_INLINE */
536 STRSAFEAPI
StringCbPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,...);
537 STRSAFEAPI
StringCbPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,...);
539 #define StringCbPrintf __MINGW_NAME_AW(StringCbPrintf)
541 #ifndef __CRT__NO_INLINE
542 STRSAFEAPI
StringCbPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,...) {
545 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
546 va_start(argList
,pszFormat
);
547 hr
= StringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
552 STRSAFEAPI
StringCbPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,...) {
555 size_t cchDest
= cbDest
/ sizeof(wchar_t);
556 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
557 va_start(argList
,pszFormat
);
558 hr
= StringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
562 #endif /* !__CRT__NO_INLINE */
564 STRSAFEAPI
StringCchPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...);
565 STRSAFEAPI
StringCchPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...);
567 #define StringCchPrintfEx __MINGW_NAME_AW(StringCchPrintfEx)
569 #ifndef __CRT__NO_INLINE
570 STRSAFEAPI
StringCchPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...) {
573 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
574 va_start(argList
,pszFormat
);
575 hr
= StringVPrintfExWorkerA(pszDest
,cchDest
,cchDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
580 STRSAFEAPI
StringCchPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...) {
582 size_t cbDest
= cchDest
* sizeof(wchar_t);
584 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
585 va_start(argList
,pszFormat
);
586 hr
= StringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
590 #endif /* !__CRT__NO_INLINE */
592 STRSAFEAPI
StringCbPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...);
593 STRSAFEAPI
StringCbPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...);
595 #define StringCbPrintfEx __MINGW_NAME_AW(StringCbPrintfEx)
597 #ifndef __CRT__NO_INLINE
598 STRSAFEAPI
StringCbPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...) {
601 size_t cchRemaining
= 0;
602 cchDest
= cbDest
/ sizeof(char);
603 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
606 va_start(argList
,pszFormat
);
607 hr
= StringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
610 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
612 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
618 STRSAFEAPI
StringCbPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...) {
621 size_t cchRemaining
= 0;
622 cchDest
= cbDest
/ sizeof(wchar_t);
623 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
626 va_start(argList
,pszFormat
);
627 hr
= StringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
630 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
632 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
637 #endif /* !__CRT__NO_INLINE */
639 STRSAFEAPI
StringCchVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
640 STRSAFEAPI
StringCchVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
642 #define StringCchVPrintfEx __MINGW_NAME_AW(StringCchVPrintfEx)
644 #ifndef __CRT__NO_INLINE
645 STRSAFEAPI
StringCchVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
647 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
650 cbDest
= cchDest
*sizeof(char);
651 hr
= StringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
656 STRSAFEAPI
StringCchVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
658 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
661 cbDest
= cchDest
*sizeof(wchar_t);
662 hr
= StringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
666 #endif /* !__CRT__NO_INLINE */
668 STRSAFEAPI
StringCbVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
669 STRSAFEAPI
StringCbVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
671 #define StringCbVPrintfEx __MINGW_NAME_AW(StringCbVPrintfEx)
673 #ifndef __CRT__NO_INLINE
674 STRSAFEAPI
StringCbVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
677 size_t cchRemaining
= 0;
678 cchDest
= cbDest
/ sizeof(char);
679 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
680 else hr
= StringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
681 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
683 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
689 STRSAFEAPI
StringCbVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
692 size_t cchRemaining
= 0;
693 cchDest
= cbDest
/ sizeof(wchar_t);
694 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
695 else hr
= StringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
696 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
698 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
703 #endif /* !__CRT__NO_INLINE */
705 STRSAFE_INLINE_API
StringCchGetsA(STRSAFE_LPSTR pszDest
,size_t cchDest
);
706 STRSAFE_INLINE_API
StringCchGetsW(STRSAFE_LPWSTR pszDest
,size_t cchDest
);
708 #define StringCchGets __MINGW_NAME_AW(StringCchGets)
710 #ifndef __CRT__NO_INLINE
711 STRSAFE_INLINE_API
StringCchGetsA(STRSAFE_LPSTR pszDest
,size_t cchDest
) {
713 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
716 cbDest
= cchDest
*sizeof(char);
717 hr
= StringGetsExWorkerA(pszDest
,cchDest
,cbDest
,NULL
,NULL
,0);
722 STRSAFE_INLINE_API
StringCchGetsW(STRSAFE_LPWSTR pszDest
,size_t cchDest
) {
724 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
727 cbDest
= cchDest
*sizeof(wchar_t);
728 hr
= StringGetsExWorkerW(pszDest
,cchDest
,cbDest
,NULL
,NULL
,0);
732 #endif /* !__CRT__NO_INLINE */
734 STRSAFE_INLINE_API
StringCbGetsA(STRSAFE_LPSTR pszDest
,size_t cbDest
);
735 STRSAFE_INLINE_API
StringCbGetsW(STRSAFE_LPWSTR pszDest
,size_t cbDest
);
737 #define StringCbGets __MINGW_NAME_AW(StringCbGets)
739 #ifndef __CRT__NO_INLINE
740 STRSAFE_INLINE_API
StringCbGetsA(STRSAFE_LPSTR pszDest
,size_t cbDest
) {
743 cchDest
= cbDest
/ sizeof(char);
744 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
745 else hr
= StringGetsExWorkerA(pszDest
,cchDest
,cbDest
,NULL
,NULL
,0);
749 STRSAFE_INLINE_API
StringCbGetsW(STRSAFE_LPWSTR pszDest
,size_t cbDest
) {
752 cchDest
= cbDest
/ sizeof(wchar_t);
753 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
754 else hr
= StringGetsExWorkerW(pszDest
,cchDest
,cbDest
,NULL
,NULL
,0);
757 #endif /* !__CRT__NO_INLINE */
759 STRSAFE_INLINE_API
StringCchGetsExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
760 STRSAFE_INLINE_API
StringCchGetsExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
762 #define StringCchGetsEx __MINGW_NAME_AW(StringCchGetsEx)
764 #ifndef __CRT__NO_INLINE
765 STRSAFE_INLINE_API
StringCchGetsExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
767 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
770 cbDest
= cchDest
*sizeof(char);
771 hr
= StringGetsExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
);
776 STRSAFE_INLINE_API
StringCchGetsExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
778 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
781 cbDest
= cchDest
*sizeof(wchar_t);
782 hr
= StringGetsExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
);
786 #endif /* !__CRT__NO_INLINE */
788 STRSAFE_INLINE_API
StringCbGetsExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
789 STRSAFE_INLINE_API
StringCbGetsExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
791 #define StringCbGetsEx __MINGW_NAME_AW(StringCbGetsEx)
793 #ifndef __CRT__NO_INLINE
794 STRSAFE_INLINE_API
StringCbGetsExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
797 size_t cchRemaining
= 0;
798 cchDest
= cbDest
/ sizeof(char);
799 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
800 else hr
= StringGetsExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
);
801 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
) || (hr
==STRSAFE_E_END_OF_FILE
)) {
802 if(pcbRemaining
) *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
807 STRSAFE_INLINE_API
StringCbGetsExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
810 size_t cchRemaining
= 0;
811 cchDest
= cbDest
/ sizeof(wchar_t);
812 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
813 else hr
= StringGetsExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
);
814 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
) || (hr
==STRSAFE_E_END_OF_FILE
)) {
815 if(pcbRemaining
) *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
819 #endif /* !__CRT__NO_INLINE */
821 STRSAFEAPI
StringCchLengthA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
);
822 STRSAFEAPI
StringCchLengthW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
);
824 #define StringCchLength __MINGW_NAME_AW(StringCchLength)
826 #ifndef __CRT__NO_INLINE
827 STRSAFEAPI
StringCchLengthA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
) {
829 if(!psz
|| (cchMax
> STRSAFE_MAX_CCH
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
830 else hr
= StringLengthWorkerA(psz
,cchMax
,pcchLength
);
831 if(FAILED(hr
) && pcchLength
) {
837 STRSAFEAPI
StringCchLengthW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
) {
839 if(!psz
|| (cchMax
> STRSAFE_MAX_CCH
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
840 else hr
= StringLengthWorkerW(psz
,cchMax
,pcchLength
);
841 if(FAILED(hr
) && pcchLength
) {
846 #endif /* !__CRT__NO_INLINE */
848 STRSAFEAPI
StringCbLengthA(STRSAFE_LPCSTR psz
,size_t cbMax
,size_t *pcbLength
);
849 STRSAFEAPI
StringCbLengthW(STRSAFE_LPCWSTR psz
,size_t cbMax
,size_t *pcbLength
);
851 #define StringCbLength __MINGW_NAME_AW(StringCbLength)
853 #ifndef __CRT__NO_INLINE
854 STRSAFEAPI
StringCbLengthA(STRSAFE_LPCSTR psz
,size_t cbMax
,size_t *pcbLength
) {
857 size_t cchLength
= 0;
858 cchMax
= cbMax
/ sizeof(char);
859 if(!psz
|| (cchMax
> STRSAFE_MAX_CCH
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
860 else hr
= StringLengthWorkerA(psz
,cchMax
,&cchLength
);
863 *pcbLength
= cchLength
*sizeof(char);
871 STRSAFEAPI
StringCbLengthW(STRSAFE_LPCWSTR psz
,size_t cbMax
,size_t *pcbLength
) {
874 size_t cchLength
= 0;
875 cchMax
= cbMax
/ sizeof(wchar_t);
876 if(!psz
|| (cchMax
> STRSAFE_MAX_CCH
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
877 else hr
= StringLengthWorkerW(psz
,cchMax
,&cchLength
);
880 *pcbLength
= cchLength
*sizeof(wchar_t);
888 STRSAFEAPI
StringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
) {
890 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
892 while(cchDest
&& (*pszSrc
!='\0')) {
893 *pszDest
++ = *pszSrc
++;
898 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
905 STRSAFEAPI
StringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
) {
907 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
909 while(cchDest
&& (*pszSrc
!=L
'\0')) {
910 *pszDest
++ = *pszSrc
++;
915 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
922 STRSAFEAPI
StringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
924 STRSAFE_LPSTR pszDestEnd
= pszDest
;
925 size_t cchRemaining
= 0;
926 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
928 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
930 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
932 if(!pszSrc
) pszSrc
= "";
936 pszDestEnd
= pszDest
;
939 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
940 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
943 pszDestEnd
= pszDest
;
944 cchRemaining
= cchDest
;
945 while(cchRemaining
&& (*pszSrc
!='\0')) {
946 *pszDestEnd
++ = *pszSrc
++;
949 if(cchRemaining
> 0) {
950 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
951 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
956 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
964 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
965 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
966 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
967 pszDestEnd
= pszDest
;
968 cchRemaining
= cchDest
;
969 } else if(cchDest
> 0) {
970 pszDestEnd
= pszDest
+ cchDest
- 1;
975 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
977 pszDestEnd
= pszDest
;
978 cchRemaining
= cchDest
;
984 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
985 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
986 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
991 STRSAFEAPI
StringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
993 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
994 size_t cchRemaining
= 0;
995 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
997 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
999 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1001 if(!pszSrc
) pszSrc
= L
"";
1005 pszDestEnd
= pszDest
;
1007 if(*pszSrc
!=L
'\0') {
1008 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1009 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1012 pszDestEnd
= pszDest
;
1013 cchRemaining
= cchDest
;
1014 while(cchRemaining
&& (*pszSrc
!=L
'\0')) {
1015 *pszDestEnd
++ = *pszSrc
++;
1018 if(cchRemaining
> 0) {
1019 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1020 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1025 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1027 *pszDestEnd
= L
'\0';
1033 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1034 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1035 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1036 pszDestEnd
= pszDest
;
1037 cchRemaining
= cchDest
;
1038 } else if(cchDest
> 0) {
1039 pszDestEnd
= pszDest
+ cchDest
- 1;
1041 *pszDestEnd
= L
'\0';
1044 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1046 pszDestEnd
= pszDest
;
1047 cchRemaining
= cchDest
;
1048 *pszDestEnd
= L
'\0';
1053 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1054 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1055 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1060 STRSAFEAPI
StringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchSrc
) {
1062 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1064 while(cchDest
&& cchSrc
&& (*pszSrc
!='\0')) {
1065 *pszDest
++ = *pszSrc
++;
1071 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1078 STRSAFEAPI
StringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
) {
1080 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1082 while(cchDest
&& cchToCopy
&& (*pszSrc
!=L
'\0')) {
1083 *pszDest
++ = *pszSrc
++;
1089 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1096 STRSAFEAPI
StringCopyNExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1098 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1099 size_t cchRemaining
= 0;
1100 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1101 else if(cchToCopy
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1103 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1105 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1107 if(!pszSrc
) pszSrc
= "";
1111 pszDestEnd
= pszDest
;
1113 if((cchToCopy
!=0) && (*pszSrc
!='\0')) {
1114 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1115 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1118 pszDestEnd
= pszDest
;
1119 cchRemaining
= cchDest
;
1120 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!='\0')) {
1121 *pszDestEnd
++ = *pszSrc
++;
1125 if(cchRemaining
> 0) {
1126 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1127 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1132 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1140 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1141 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1142 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1143 pszDestEnd
= pszDest
;
1144 cchRemaining
= cchDest
;
1145 } else if(cchDest
> 0) {
1146 pszDestEnd
= pszDest
+ cchDest
- 1;
1151 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1153 pszDestEnd
= pszDest
;
1154 cchRemaining
= cchDest
;
1160 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1161 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1162 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1167 STRSAFEAPI
StringCopyNExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1169 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1170 size_t cchRemaining
= 0;
1171 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1172 else if(cchToCopy
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1174 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1176 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1178 if(!pszSrc
) pszSrc
= L
"";
1182 pszDestEnd
= pszDest
;
1184 if((cchToCopy
!=0) && (*pszSrc
!=L
'\0')) {
1185 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1186 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1189 pszDestEnd
= pszDest
;
1190 cchRemaining
= cchDest
;
1191 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!=L
'\0')) {
1192 *pszDestEnd
++ = *pszSrc
++;
1196 if(cchRemaining
> 0) {
1197 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1198 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1203 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1205 *pszDestEnd
= L
'\0';
1211 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1212 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1213 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1214 pszDestEnd
= pszDest
;
1215 cchRemaining
= cchDest
;
1216 } else if(cchDest
> 0) {
1217 pszDestEnd
= pszDest
+ cchDest
- 1;
1219 *pszDestEnd
= L
'\0';
1222 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1224 pszDestEnd
= pszDest
;
1225 cchRemaining
= cchDest
;
1226 *pszDestEnd
= L
'\0';
1231 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1232 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1233 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1238 STRSAFEAPI
StringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
) {
1240 size_t cchDestLength
;
1241 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1242 if(SUCCEEDED(hr
)) hr
= StringCopyWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1246 STRSAFEAPI
StringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
) {
1248 size_t cchDestLength
;
1249 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1250 if(SUCCEEDED(hr
)) hr
= StringCopyWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1254 STRSAFEAPI
StringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1256 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1257 size_t cchRemaining
= 0;
1258 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1260 size_t cchDestLength
;
1261 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1263 if((cchDest
==0) && (cbDest
==0)) cchDestLength
= 0;
1264 else hr
= STRSAFE_E_INVALID_PARAMETER
;
1266 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1268 pszDestEnd
= pszDest
+ cchDestLength
;
1269 cchRemaining
= cchDest
- cchDestLength
;
1272 if(!pszSrc
) pszSrc
= "";
1274 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1276 pszDestEnd
= pszDest
+ cchDestLength
;
1277 cchRemaining
= cchDest
- cchDestLength
;
1283 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1284 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1286 } else hr
= StringCopyExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1291 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1292 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1293 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1294 pszDestEnd
= pszDest
;
1295 cchRemaining
= cchDest
;
1296 } else if(cchDest
> 0) {
1297 pszDestEnd
= pszDest
+ cchDest
- 1;
1302 if(dwFlags
& STRSAFE_NULL_ON_FAILURE
) {
1304 pszDestEnd
= pszDest
;
1305 cchRemaining
= cchDest
;
1311 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1312 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1313 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1318 STRSAFEAPI
StringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1320 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1321 size_t cchRemaining
= 0;
1322 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1324 size_t cchDestLength
;
1325 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1327 if((cchDest
==0) && (cbDest
==0)) cchDestLength
= 0;
1328 else hr
= STRSAFE_E_INVALID_PARAMETER
;
1330 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1332 pszDestEnd
= pszDest
+ cchDestLength
;
1333 cchRemaining
= cchDest
- cchDestLength
;
1336 if(!pszSrc
) pszSrc
= L
"";
1338 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1340 pszDestEnd
= pszDest
+ cchDestLength
;
1341 cchRemaining
= cchDest
- cchDestLength
;
1346 if(*pszSrc
!=L
'\0') {
1347 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1348 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1350 } else hr
= StringCopyExWorkerW(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1355 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1356 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1357 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1358 pszDestEnd
= pszDest
;
1359 cchRemaining
= cchDest
;
1360 } else if(cchDest
> 0) {
1361 pszDestEnd
= pszDest
+ cchDest
- 1;
1363 *pszDestEnd
= L
'\0';
1366 if(dwFlags
& STRSAFE_NULL_ON_FAILURE
) {
1368 pszDestEnd
= pszDest
;
1369 cchRemaining
= cchDest
;
1370 *pszDestEnd
= L
'\0';
1375 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1376 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1377 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1382 STRSAFEAPI
StringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
) {
1384 size_t cchDestLength
;
1385 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1386 if(SUCCEEDED(hr
)) hr
= StringCopyNWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
1390 STRSAFEAPI
StringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
) {
1392 size_t cchDestLength
;
1393 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1394 if(SUCCEEDED(hr
)) hr
= StringCopyNWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
1398 STRSAFEAPI
StringCatNExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1400 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1401 size_t cchRemaining
= 0;
1402 size_t cchDestLength
= 0;
1403 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1404 else if(cchToAppend
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1406 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1408 if((cchDest
==0) && (cbDest
==0)) cchDestLength
= 0;
1409 else hr
= STRSAFE_E_INVALID_PARAMETER
;
1411 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1413 pszDestEnd
= pszDest
+ cchDestLength
;
1414 cchRemaining
= cchDest
- cchDestLength
;
1417 if(!pszSrc
) pszSrc
= "";
1419 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1421 pszDestEnd
= pszDest
+ cchDestLength
;
1422 cchRemaining
= cchDest
- cchDestLength
;
1427 if((cchToAppend
!=0) && (*pszSrc
!='\0')) {
1428 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1429 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1431 } else hr
= StringCopyNExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,cchToAppend
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1436 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1437 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1438 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1439 pszDestEnd
= pszDest
;
1440 cchRemaining
= cchDest
;
1441 } else if(cchDest
> 0) {
1442 pszDestEnd
= pszDest
+ cchDest
- 1;
1447 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
)) {
1449 pszDestEnd
= pszDest
;
1450 cchRemaining
= cchDest
;
1456 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1457 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1458 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1463 STRSAFEAPI
StringCatNExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1465 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1466 size_t cchRemaining
= 0;
1467 size_t cchDestLength
= 0;
1468 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1469 else if(cchToAppend
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1471 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1473 if((cchDest
==0) && (cbDest
==0)) cchDestLength
= 0;
1474 else hr
= STRSAFE_E_INVALID_PARAMETER
;
1476 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1478 pszDestEnd
= pszDest
+ cchDestLength
;
1479 cchRemaining
= cchDest
- cchDestLength
;
1482 if(!pszSrc
) pszSrc
= L
"";
1484 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1486 pszDestEnd
= pszDest
+ cchDestLength
;
1487 cchRemaining
= cchDest
- cchDestLength
;
1492 if((cchToAppend
!=0) && (*pszSrc
!=L
'\0')) {
1493 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1494 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1496 } else hr
= StringCopyNExWorkerW(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)),pszSrc
,cchToAppend
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1501 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1502 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1503 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1504 pszDestEnd
= pszDest
;
1505 cchRemaining
= cchDest
;
1506 } else if(cchDest
> 0) {
1507 pszDestEnd
= pszDest
+ cchDest
- 1;
1509 *pszDestEnd
= L
'\0';
1512 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
)) {
1514 pszDestEnd
= pszDest
;
1515 cchRemaining
= cchDest
;
1516 *pszDestEnd
= L
'\0';
1521 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1522 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1523 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1528 STRSAFEAPI
StringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
1530 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1534 cchMax
= cchDest
- 1;
1535 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
1536 if((iRet
< 0) || (((size_t)iRet
) > cchMax
)) {
1539 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1540 } else if(((size_t)iRet
)==cchMax
) {
1548 STRSAFEAPI
StringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
1550 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1554 cchMax
= cchDest
- 1;
1555 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
1556 if((iRet
< 0) || (((size_t)iRet
) > cchMax
)) {
1559 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1560 } else if(((size_t)iRet
)==cchMax
) {
1568 STRSAFEAPI
StringVPrintfExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
1570 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1571 size_t cchRemaining
= 0;
1572 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1574 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1576 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1578 if(!pszFormat
) pszFormat
= "";
1582 pszDestEnd
= pszDest
;
1584 if(*pszFormat
!='\0') {
1585 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1586 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1591 cchMax
= cchDest
- 1;
1592 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
1593 if((iRet
< 0) || (((size_t)iRet
) > cchMax
)) {
1594 pszDestEnd
= pszDest
+ cchMax
;
1597 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1598 } else if(((size_t)iRet
)==cchMax
) {
1599 pszDestEnd
= pszDest
+ cchMax
;
1602 } else if(((size_t)iRet
) < cchMax
) {
1603 pszDestEnd
= pszDest
+ iRet
;
1604 cchRemaining
= cchDest
- iRet
;
1605 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1606 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1614 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1615 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1616 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1617 pszDestEnd
= pszDest
;
1618 cchRemaining
= cchDest
;
1619 } else if(cchDest
> 0) {
1620 pszDestEnd
= pszDest
+ cchDest
- 1;
1625 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1627 pszDestEnd
= pszDest
;
1628 cchRemaining
= cchDest
;
1634 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1635 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1636 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1641 STRSAFEAPI
StringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
1643 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1644 size_t cchRemaining
= 0;
1645 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1647 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1649 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1651 if(!pszFormat
) pszFormat
= L
"";
1655 pszDestEnd
= pszDest
;
1657 if(*pszFormat
!=L
'\0') {
1658 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1659 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1664 cchMax
= cchDest
- 1;
1665 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
1666 if((iRet
< 0) || (((size_t)iRet
) > cchMax
)) {
1667 pszDestEnd
= pszDest
+ cchMax
;
1669 *pszDestEnd
= L
'\0';
1670 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1671 } else if(((size_t)iRet
)==cchMax
) {
1672 pszDestEnd
= pszDest
+ cchMax
;
1674 *pszDestEnd
= L
'\0';
1675 } else if(((size_t)iRet
) < cchMax
) {
1676 pszDestEnd
= pszDest
+ iRet
;
1677 cchRemaining
= cchDest
- iRet
;
1678 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1679 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1687 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1688 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1689 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1690 pszDestEnd
= pszDest
;
1691 cchRemaining
= cchDest
;
1692 } else if(cchDest
> 0) {
1693 pszDestEnd
= pszDest
+ cchDest
- 1;
1695 *pszDestEnd
= L
'\0';
1698 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1700 pszDestEnd
= pszDest
;
1701 cchRemaining
= cchDest
;
1702 *pszDestEnd
= L
'\0';
1707 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1708 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1709 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1714 STRSAFEAPI
StringLengthWorkerA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
) {
1716 size_t cchMaxPrev
= cchMax
;
1717 while(cchMax
&& (*psz
!='\0')) {
1721 if(cchMax
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1723 if(SUCCEEDED(hr
)) *pcchLength
= cchMaxPrev
- cchMax
;
1724 else *pcchLength
= 0;
1729 STRSAFEAPI
StringLengthWorkerW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
) {
1731 size_t cchMaxPrev
= cchMax
;
1732 while(cchMax
&& (*psz
!=L
'\0')) {
1736 if(cchMax
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1738 if(SUCCEEDED(hr
)) *pcchLength
= cchMaxPrev
- cchMax
;
1739 else *pcchLength
= 0;
1744 STRSAFE_INLINE_API
StringGetsExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1746 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1747 size_t cchRemaining
= 0;
1749 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1751 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1753 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1758 pszDestEnd
= pszDest
;
1759 cchRemaining
= cchDest
;
1760 if(cchDest
==1) *pszDestEnd
= '\0';
1761 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1763 pszDestEnd
= pszDest
;
1764 cchRemaining
= cchDest
;
1765 while(cchRemaining
> 1) {
1767 int i
= getc(stdin
);
1769 if(pszDestEnd
==pszDest
) hr
= STRSAFE_E_END_OF_FILE
;
1778 if(cchRemaining
> 0) {
1779 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1780 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1789 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1790 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1791 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1792 pszDestEnd
= pszDest
;
1793 cchRemaining
= cchDest
;
1794 } else if(cchDest
> 0) {
1795 pszDestEnd
= pszDest
+ cchDest
- 1;
1800 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1802 pszDestEnd
= pszDest
;
1803 cchRemaining
= cchDest
;
1809 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
) || (hr
==STRSAFE_E_END_OF_FILE
)) {
1810 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1811 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1816 STRSAFE_INLINE_API
StringGetsExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1818 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1819 size_t cchRemaining
= 0;
1820 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) {
1821 hr
= STRSAFE_E_INVALID_PARAMETER
;
1823 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1825 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1830 pszDestEnd
= pszDest
;
1831 cchRemaining
= cchDest
;
1832 if(cchDest
==1) *pszDestEnd
= L
'\0';
1833 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1835 pszDestEnd
= pszDest
;
1836 cchRemaining
= cchDest
;
1837 while(cchRemaining
> 1) {
1838 wchar_t ch
= getwc(stdin
);
1840 if(pszDestEnd
==pszDest
) hr
= STRSAFE_E_END_OF_FILE
;
1843 if(ch
==L
'\n') break;
1848 if(cchRemaining
> 0) {
1849 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1850 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1853 *pszDestEnd
= L
'\0';
1859 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1860 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1861 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1862 pszDestEnd
= pszDest
;
1863 cchRemaining
= cchDest
;
1864 } else if(cchDest
> 0) {
1865 pszDestEnd
= pszDest
+ cchDest
- 1;
1867 *pszDestEnd
= L
'\0';
1870 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1872 pszDestEnd
= pszDest
;
1873 cchRemaining
= cchDest
;
1874 *pszDestEnd
= L
'\0';
1879 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
) || (hr
==STRSAFE_E_END_OF_FILE
)) {
1880 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1881 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1885 #endif /* !__CRT__NO_INLINE */
1887 #define StringCopyWorkerA StringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
1888 #define StringCopyWorkerW StringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
1889 #define StringCopyExWorkerA StringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
1890 #define StringCopyExWorkerW StringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
1891 #define StringCatWorkerA StringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
1892 #define StringCatWorkerW StringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
1893 #define StringCatExWorkerA StringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
1894 #define StringCatExWorkerW StringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
1895 #define StringCatNWorkerA StringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
1896 #define StringCatNWorkerW StringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
1897 #define StringCatNExWorkerA StringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
1898 #define StringCatNExWorkerW StringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
1899 #define StringVPrintfWorkerA StringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
1900 #define StringVPrintfWorkerW StringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
1901 #define StringVPrintfExWorkerA StringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
1902 #define StringVPrintfExWorkerW StringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
1903 #define StringLengthWorkerA StringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
1904 #define StringLengthWorkerW StringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
1905 #define StringGetsExWorkerA StringGetsExWorkerA_instead_use_StringCchGetsA_or_StringCbGetsA
1906 #define StringGetsExWorkerW StringGetsExWorkerW_instead_use_StringCchGetsW_or_StringCbGetsW
1908 /* Some Wine modules include us, don't specify STRSAFE_NO_DEPRECATE, and use deprecated functions */
1909 #ifndef STRSAFE_NO_DEPRECATE
1910 #define STRSAFE_NO_DEPRECATE
1913 #ifndef STRSAFE_NO_DEPRECATE
1916 #define strcpy strcpy_instead_use_StringCbCopyA_or_StringCchCopyA;
1919 #define wcscpy wcscpy_instead_use_StringCbCopyW_or_StringCchCopyW;
1922 #define strcat strcat_instead_use_StringCbCatA_or_StringCchCatA;
1925 #define wcscat wcscat_instead_use_StringCbCatW_or_StringCchCatW;
1928 #define sprintf sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA;
1931 #define swprintf swprintf_instead_use_StringCbPrintfW_or_StringCchPrintfW;
1934 #define vsprintf vsprintf_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
1937 #define vswprintf vswprintf_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
1940 #define _snprintf _snprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA;
1943 #define _snwprintf _snwprintf_instead_use_StringCbPrintfW_or_StringCchPrintfW;
1946 #define _vsnprintf _vsnprintf_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
1949 #define _vsnwprintf _vsnwprintf_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
1952 #define strcpyA strcpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
1955 #define strcpyW strcpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
1958 #define lstrcpy lstrcpy_instead_use_StringCbCopy_or_StringCchCopy;
1961 #define lstrcpyA lstrcpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
1964 #define lstrcpyW lstrcpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
1967 #define StrCpy StrCpy_instead_use_StringCbCopy_or_StringCchCopy;
1970 #define StrCpyA StrCpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
1973 #define StrCpyW StrCpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
1976 #define _tcscpy _tcscpy_instead_use_StringCbCopy_or_StringCchCopy;
1979 #define _ftcscpy _ftcscpy_instead_use_StringCbCopy_or_StringCchCopy;
1982 #define lstrcat lstrcat_instead_use_StringCbCat_or_StringCchCat;
1985 #define lstrcatA lstrcatA_instead_use_StringCbCatA_or_StringCchCatA;
1988 #define lstrcatW lstrcatW_instead_use_StringCbCatW_or_StringCchCatW;
1991 #define StrCat StrCat_instead_use_StringCbCat_or_StringCchCat;
1994 #define StrCatA StrCatA_instead_use_StringCbCatA_or_StringCchCatA;
1997 #define StrCatW StrCatW_instead_use_StringCbCatW_or_StringCchCatW;
2000 #define StrNCat StrNCat_instead_use_StringCbCatN_or_StringCchCatN;
2003 #define StrNCatA StrNCatA_instead_use_StringCbCatNA_or_StringCchCatNA;
2006 #define StrNCatW StrNCatW_instead_use_StringCbCatNW_or_StringCchCatNW;
2009 #define StrCatN StrCatN_instead_use_StringCbCatN_or_StringCchCatN;
2012 #define StrCatNA StrCatNA_instead_use_StringCbCatNA_or_StringCchCatNA;
2015 #define StrCatNW StrCatNW_instead_use_StringCbCatNW_or_StringCchCatNW;
2018 #define _tcscat _tcscat_instead_use_StringCbCat_or_StringCchCat;
2021 #define _ftcscat _ftcscat_instead_use_StringCbCat_or_StringCchCat;
2024 #define wsprintf wsprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
2027 #define wsprintfA wsprintfA_instead_use_StringCbPrintfA_or_StringCchPrintfA;
2030 #define wsprintfW wsprintfW_instead_use_StringCbPrintfW_or_StringCchPrintfW;
2033 #define wvsprintf wvsprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
2036 #define wvsprintfA wvsprintfA_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
2039 #define wvsprintfW wvsprintfW_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
2042 #define _vstprintf _vstprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
2045 #define _vsntprintf _vsntprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
2048 #define _stprintf _stprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
2051 #define _sntprintf _sntprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
2054 #define _getts _getts_instead_use_StringCbGets_or_StringCchGets;
2057 #define gets _gets_instead_use_StringCbGetsA_or_StringCchGetsA;
2060 #define _getws _getws_instead_use_StringCbGetsW_or_StringCchGetsW;