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>
16 #pragma clang diagnostic push
17 #pragma clang diagnostic ignored "-Wignored-attributes"
20 #ifndef _SIZE_T_DEFINED
21 #define _SIZE_T_DEFINED
24 __MINGW_EXTENSION
typedef unsigned __int64
size_t;
26 typedef unsigned int size_t;
30 #ifndef _SSIZE_T_DEFINED
31 #define _SSIZE_T_DEFINED
34 __MINGW_EXTENSION
typedef __int64 ssize_t
;
40 #ifndef _WCHAR_T_DEFINED
41 #define _WCHAR_T_DEFINED
42 typedef unsigned short wchar_t;
45 #ifndef _HRESULT_DEFINED
46 #define _HRESULT_DEFINED
51 #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0)
55 #define FAILED(hr) ((HRESULT)(hr) < 0)
59 #define S_OK ((HRESULT)0x00000000L)
64 # define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
66 # define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1])
71 #define _STRSAFE_EXTERN_C extern "C"
73 #define _STRSAFE_EXTERN_C extern
77 #define WINAPI __stdcall
80 #define STRSAFEAPI static __inline HRESULT WINAPI
81 #define STRSAFE_INLINE_API __CRT_INLINE HRESULT WINAPI
83 #define STRSAFE_MAX_CCH 2147483647
85 #ifndef _NTSTRSAFE_H_INCLUDED_
86 #define STRSAFE_IGNORE_NULLS 0x00000100
87 #define STRSAFE_FILL_BEHIND_NULL 0x00000200
88 #define STRSAFE_FILL_ON_FAILURE 0x00000400
89 #define STRSAFE_NULL_ON_FAILURE 0x00000800
90 #define STRSAFE_NO_TRUNCATION 0x00001000
91 #define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000
92 #define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000
94 #define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
95 #define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED)
97 #define STRSAFE_FILL_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
98 #define STRSAFE_FAILURE_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
100 #define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)((dwFlags) & 0x000000FF))
103 #define STRSAFE_E_INSUFFICIENT_BUFFER ((HRESULT)0x8007007AL)
104 #define STRSAFE_E_INVALID_PARAMETER ((HRESULT)0x80070057L)
105 #define STRSAFE_E_END_OF_FILE ((HRESULT)0x80070026L)
107 typedef char *STRSAFE_LPSTR
;
108 typedef const char *STRSAFE_LPCSTR
;
109 typedef wchar_t *STRSAFE_LPWSTR
;
110 typedef const wchar_t *STRSAFE_LPCWSTR
;
112 typedef ULONG STRSAFE_DWORD
;
114 STRSAFEAPI
StringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
115 STRSAFEAPI
StringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
116 STRSAFEAPI
StringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
117 STRSAFEAPI
StringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
118 STRSAFEAPI
StringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
119 STRSAFEAPI
StringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
120 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
);
121 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
);
122 STRSAFEAPI
StringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
123 STRSAFEAPI
StringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
124 STRSAFEAPI
StringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
125 STRSAFEAPI
StringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
126 STRSAFEAPI
StringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
127 STRSAFEAPI
StringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
128 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
);
129 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
);
130 STRSAFEAPI
StringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
131 STRSAFEAPI
StringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
132 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
);
133 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
);
134 STRSAFEAPI
StringLengthWorkerA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
);
135 STRSAFEAPI
StringLengthWorkerW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
);
136 STRSAFE_INLINE_API
StringGetsExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
137 STRSAFE_INLINE_API
StringGetsExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
139 #define StringCchCopy __MINGW_NAME_AW(StringCchCopy)
141 STRSAFEAPI
StringCchCopyA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
142 STRSAFEAPI
StringCchCopyW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
144 #ifndef __CRT__NO_INLINE
145 STRSAFEAPI
StringCchCopyA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
) {
146 return (cchDest
> STRSAFE_MAX_CCH
? STRSAFE_E_INVALID_PARAMETER
: StringCopyWorkerA(pszDest
,cchDest
,pszSrc
));
149 STRSAFEAPI
StringCchCopyW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
) {
150 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
151 return StringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
153 #endif /* !__CRT__NO_INLINE */
155 #define StringCbCopy __MINGW_NAME_AW(StringCbCopy)
157 STRSAFEAPI
StringCbCopyA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
);
158 STRSAFEAPI
StringCbCopyW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
);
160 #ifndef __CRT__NO_INLINE
161 STRSAFEAPI
StringCbCopyA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
) {
162 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
163 return StringCopyWorkerA(pszDest
,cbDest
,pszSrc
);
166 STRSAFEAPI
StringCbCopyW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
) {
167 size_t cchDest
= cbDest
/ sizeof(wchar_t);
168 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
169 return StringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
171 #endif /* !__CRT__NO_INLINE */
173 #define StringCchCopyEx __MINGW_NAME_AW(StringCchCopyEx)
175 STRSAFEAPI
StringCchCopyExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
176 STRSAFEAPI
StringCchCopyExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
178 #ifndef __CRT__NO_INLINE
179 STRSAFEAPI
StringCchCopyExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
180 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
181 return StringCopyExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
184 STRSAFEAPI
StringCchCopyExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
186 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
187 cbDest
= cchDest
* sizeof(wchar_t);
188 return StringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
190 #endif /* !__CRT__NO_INLINE */
192 #define StringCbCopyEx __MINGW_NAME_AW(StringCbCopyEx)
194 STRSAFEAPI
StringCbCopyExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
195 STRSAFEAPI
StringCbCopyExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
197 #ifndef __CRT__NO_INLINE
198 STRSAFEAPI
StringCbCopyExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
200 size_t cchRemaining
= 0;
201 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
202 hr
= StringCopyExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
203 if(SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) {
205 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
210 STRSAFEAPI
StringCbCopyExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
212 size_t cchDest
= cbDest
/ sizeof(wchar_t);
213 size_t cchRemaining
= 0;
215 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
216 hr
= StringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
217 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
219 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
223 #endif /* !__CRT__NO_INLINE */
225 STRSAFEAPI
StringCchCopyNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
226 STRSAFEAPI
StringCchCopyNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
227 #define StringCchCopyN __MINGW_NAME_AW(StringCchCopyN)
229 #ifndef __CRT__NO_INLINE
230 STRSAFEAPI
StringCchCopyNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
) {
231 if(cchDest
> STRSAFE_MAX_CCH
|| cchToCopy
> STRSAFE_MAX_CCH
)
232 return STRSAFE_E_INVALID_PARAMETER
;
233 return StringCopyNWorkerA(pszDest
,cchDest
,pszSrc
,cchToCopy
);
236 STRSAFEAPI
StringCchCopyNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
) {
237 if(cchDest
> STRSAFE_MAX_CCH
|| cchToCopy
> STRSAFE_MAX_CCH
)
238 return STRSAFE_E_INVALID_PARAMETER
;
239 return StringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
241 #endif /* !__CRT__NO_INLINE */
243 STRSAFEAPI
StringCbCopyNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
);
244 STRSAFEAPI
StringCbCopyNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
);
246 #define StringCbCopyN __MINGW_NAME_AW(StringCbCopyN)
248 #ifndef __CRT__NO_INLINE
249 STRSAFEAPI
StringCbCopyNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
) {
250 if(cbDest
> STRSAFE_MAX_CCH
|| cbToCopy
> STRSAFE_MAX_CCH
)
251 return STRSAFE_E_INVALID_PARAMETER
;
252 return StringCopyNWorkerA(pszDest
,cbDest
,pszSrc
,cbToCopy
);
255 STRSAFEAPI
StringCbCopyNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
) {
256 size_t cchDest
= cbDest
/ sizeof(wchar_t);
257 size_t cchToCopy
= cbToCopy
/ sizeof(wchar_t);
258 if(cchDest
> STRSAFE_MAX_CCH
|| cchToCopy
> STRSAFE_MAX_CCH
)
259 return STRSAFE_E_INVALID_PARAMETER
;
260 return StringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
262 #endif /* !__CRT__NO_INLINE */
264 STRSAFEAPI
StringCchCopyNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
265 STRSAFEAPI
StringCchCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
267 #define StringCchCopyNEx __MINGW_NAME_AW(StringCchCopyNEx)
269 #ifndef __CRT__NO_INLINE
270 STRSAFEAPI
StringCchCopyNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
271 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
272 return StringCopyNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
275 STRSAFEAPI
StringCchCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
276 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
277 return StringCopyNExWorkerW(pszDest
,cchDest
,cchDest
* sizeof(wchar_t),pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
279 #endif /* !__CRT__NO_INLINE */
281 STRSAFEAPI
StringCbCopyNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
282 STRSAFEAPI
StringCbCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
284 #define StringCbCopyNEx __MINGW_NAME_AW(StringCbCopyNEx)
286 #ifndef __CRT__NO_INLINE
287 STRSAFEAPI
StringCbCopyNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
289 size_t cchRemaining
= 0;
290 if(cbDest
> STRSAFE_MAX_CCH
)
291 hr
= STRSAFE_E_INVALID_PARAMETER
;
293 hr
= StringCopyNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
294 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
295 *pcbRemaining
= cchRemaining
;
299 STRSAFEAPI
StringCbCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
303 size_t cchRemaining
= 0;
304 cchDest
= cbDest
/ sizeof(wchar_t);
305 cchToCopy
= cbToCopy
/ sizeof(wchar_t);
306 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
307 else hr
= StringCopyNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
308 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
309 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
312 #endif /* !__CRT__NO_INLINE */
314 STRSAFEAPI
StringCchCatA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
315 STRSAFEAPI
StringCchCatW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
317 #define StringCchCat __MINGW_NAME_AW(StringCchCat)
319 #ifndef __CRT__NO_INLINE
320 STRSAFEAPI
StringCchCatA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
) {
321 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
322 return StringCatWorkerA(pszDest
,cchDest
,pszSrc
);
325 STRSAFEAPI
StringCchCatW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
) {
326 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
327 return StringCatWorkerW(pszDest
,cchDest
,pszSrc
);
329 #endif /* !__CRT__NO_INLINE */
331 STRSAFEAPI
StringCbCatA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
);
332 STRSAFEAPI
StringCbCatW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
);
334 #define StringCbCat __MINGW_NAME_AW(StringCbCat)
336 #ifndef __CRT__NO_INLINE
337 STRSAFEAPI
StringCbCatA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
) {
338 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
339 return StringCatWorkerA(pszDest
,cbDest
,pszSrc
);
342 STRSAFEAPI
StringCbCatW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
) {
343 size_t cchDest
= cbDest
/ sizeof(wchar_t);
344 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
345 return StringCatWorkerW(pszDest
,cchDest
,pszSrc
);
347 #endif /* !__CRT__NO_INLINE */
349 STRSAFEAPI
StringCchCatExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
350 STRSAFEAPI
StringCchCatExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
352 #define StringCchCatEx __MINGW_NAME_AW(StringCchCatEx)
354 #ifndef __CRT__NO_INLINE
355 STRSAFEAPI
StringCchCatExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
356 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
357 return StringCatExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
360 STRSAFEAPI
StringCchCatExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
361 size_t cbDest
= cchDest
*sizeof(wchar_t);
362 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
363 return StringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
365 #endif /* !__CRT__NO_INLINE */
367 STRSAFEAPI
StringCbCatExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
368 STRSAFEAPI
StringCbCatExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
370 #define StringCbCatEx __MINGW_NAME_AW(StringCbCatEx)
372 #ifndef __CRT__NO_INLINE
373 STRSAFEAPI
StringCbCatExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
375 size_t cchRemaining
= 0;
376 if(cbDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
377 else hr
= StringCatExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
378 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
379 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
383 STRSAFEAPI
StringCbCatExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
385 size_t cchDest
= cbDest
/ sizeof(wchar_t);
386 size_t cchRemaining
= 0;
388 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
389 else hr
= StringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
390 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
391 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
394 #endif /* !__CRT__NO_INLINE */
396 STRSAFEAPI
StringCchCatNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
397 STRSAFEAPI
StringCchCatNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
399 #define StringCchCatN __MINGW_NAME_AW(StringCchCatN)
401 #ifndef __CRT__NO_INLINE
402 STRSAFEAPI
StringCchCatNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
) {
403 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
404 return StringCatNWorkerA(pszDest
,cchDest
,pszSrc
,cchToAppend
);
407 STRSAFEAPI
StringCchCatNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
) {
408 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
409 return StringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
411 #endif /* !__CRT__NO_INLINE */
413 STRSAFEAPI
StringCbCatNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
);
414 STRSAFEAPI
StringCbCatNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
);
416 #define StringCbCatN __MINGW_NAME_AW(StringCbCatN)
418 #ifndef __CRT__NO_INLINE
419 STRSAFEAPI
StringCbCatNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
) {
420 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
421 return StringCatNWorkerA(pszDest
,cbDest
,pszSrc
,cbToAppend
);
424 STRSAFEAPI
StringCbCatNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
) {
425 size_t cchDest
= cbDest
/ sizeof(wchar_t);
426 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
428 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
429 return StringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
431 #endif /* !__CRT__NO_INLINE */
433 STRSAFEAPI
StringCchCatNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
434 STRSAFEAPI
StringCchCatNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
436 #define StringCchCatNEx __MINGW_NAME_AW(StringCchCatNEx)
438 #ifndef __CRT__NO_INLINE
439 STRSAFEAPI
StringCchCatNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
440 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
441 return StringCatNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
444 STRSAFEAPI
StringCchCatNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
445 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
446 return StringCatNExWorkerW(pszDest
,cchDest
,(cchDest
*sizeof(wchar_t)),pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
450 STRSAFEAPI
StringCbCatNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
451 STRSAFEAPI
StringCbCatNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
453 #define StringCbCatNEx __MINGW_NAME_AW(StringCbCatNEx)
455 #ifndef __CRT__NO_INLINE
456 STRSAFEAPI
StringCbCatNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
458 size_t cchRemaining
= 0;
459 if(cbDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
460 else hr
= StringCatNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
461 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
462 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
466 STRSAFEAPI
StringCbCatNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
468 size_t cchDest
= cbDest
/ sizeof(wchar_t);
469 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
470 size_t cchRemaining
= 0;
471 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
472 else hr
= StringCatNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
473 if((SUCCEEDED(hr
) || hr
== STRSAFE_E_INSUFFICIENT_BUFFER
) && pcbRemaining
)
474 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
477 #endif /* !__CRT__NO_INLINE */
479 STRSAFEAPI
StringCchVPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
480 STRSAFEAPI
StringCchVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
482 #define StringCchVPrintf __MINGW_NAME_AW(StringCchVPrintf)
484 #ifndef __CRT__NO_INLINE
485 STRSAFEAPI
StringCchVPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
486 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
487 return StringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
490 STRSAFEAPI
StringCchVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
491 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
492 return StringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
494 #endif /* !__CRT__NO_INLINE */
496 STRSAFEAPI
StringCbVPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
497 STRSAFEAPI
StringCbVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
499 #define StringCbVPrintf __MINGW_NAME_AW(StringCbVPrintf)
501 #ifndef __CRT__NO_INLINE
502 STRSAFEAPI
StringCbVPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
503 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
504 return StringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
507 STRSAFEAPI
StringCbVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
508 size_t cchDest
= cbDest
/ sizeof(wchar_t);
509 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
510 return StringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
512 #endif /* !__CRT__NO_INLINE */
514 STRSAFEAPI
StringCchPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,...);
515 STRSAFEAPI
StringCchPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,...);
517 #define StringCchPrintf __MINGW_NAME_AW(StringCchPrintf)
519 #ifndef __CRT__NO_INLINE
520 STRSAFEAPI
StringCchPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,...) {
523 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
524 va_start(argList
,pszFormat
);
525 hr
= StringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
530 STRSAFEAPI
StringCchPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,...) {
533 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
534 va_start(argList
,pszFormat
);
535 hr
= StringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
539 #endif /* !__CRT__NO_INLINE */
541 STRSAFEAPI
StringCbPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,...);
542 STRSAFEAPI
StringCbPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,...);
544 #define StringCbPrintf __MINGW_NAME_AW(StringCbPrintf)
546 #ifndef __CRT__NO_INLINE
547 STRSAFEAPI
StringCbPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,...) {
550 if(cbDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
551 va_start(argList
,pszFormat
);
552 hr
= StringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
557 STRSAFEAPI
StringCbPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,...) {
560 size_t cchDest
= cbDest
/ sizeof(wchar_t);
561 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
562 va_start(argList
,pszFormat
);
563 hr
= StringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
567 #endif /* !__CRT__NO_INLINE */
569 STRSAFEAPI
StringCchPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...);
570 STRSAFEAPI
StringCchPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...);
572 #define StringCchPrintfEx __MINGW_NAME_AW(StringCchPrintfEx)
574 #ifndef __CRT__NO_INLINE
575 STRSAFEAPI
StringCchPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...) {
578 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
579 va_start(argList
,pszFormat
);
580 hr
= StringVPrintfExWorkerA(pszDest
,cchDest
,cchDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
585 STRSAFEAPI
StringCchPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...) {
587 size_t cbDest
= cchDest
* sizeof(wchar_t);
589 if(cchDest
> STRSAFE_MAX_CCH
) return STRSAFE_E_INVALID_PARAMETER
;
590 va_start(argList
,pszFormat
);
591 hr
= StringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
595 #endif /* !__CRT__NO_INLINE */
597 STRSAFEAPI
StringCbPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...);
598 STRSAFEAPI
StringCbPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...);
600 #define StringCbPrintfEx __MINGW_NAME_AW(StringCbPrintfEx)
602 #ifndef __CRT__NO_INLINE
603 STRSAFEAPI
StringCbPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...) {
606 size_t cchRemaining
= 0;
607 cchDest
= cbDest
/ sizeof(char);
608 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
611 va_start(argList
,pszFormat
);
612 hr
= StringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
615 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
617 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
623 STRSAFEAPI
StringCbPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...) {
626 size_t cchRemaining
= 0;
627 cchDest
= cbDest
/ sizeof(wchar_t);
628 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
631 va_start(argList
,pszFormat
);
632 hr
= StringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
635 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
637 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
642 #endif /* !__CRT__NO_INLINE */
644 STRSAFEAPI
StringCchVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
645 STRSAFEAPI
StringCchVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
647 #define StringCchVPrintfEx __MINGW_NAME_AW(StringCchVPrintfEx)
649 #ifndef __CRT__NO_INLINE
650 STRSAFEAPI
StringCchVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
652 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
655 cbDest
= cchDest
*sizeof(char);
656 hr
= StringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
661 STRSAFEAPI
StringCchVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
663 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
666 cbDest
= cchDest
*sizeof(wchar_t);
667 hr
= StringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
671 #endif /* !__CRT__NO_INLINE */
673 STRSAFEAPI
StringCbVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
674 STRSAFEAPI
StringCbVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
676 #define StringCbVPrintfEx __MINGW_NAME_AW(StringCbVPrintfEx)
678 #ifndef __CRT__NO_INLINE
679 STRSAFEAPI
StringCbVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
682 size_t cchRemaining
= 0;
683 cchDest
= cbDest
/ sizeof(char);
684 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
685 else hr
= StringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
686 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
688 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
694 STRSAFEAPI
StringCbVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
697 size_t cchRemaining
= 0;
698 cchDest
= cbDest
/ sizeof(wchar_t);
699 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
700 else hr
= StringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
701 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
703 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
708 #endif /* !__CRT__NO_INLINE */
710 STRSAFE_INLINE_API
StringCchGetsA(STRSAFE_LPSTR pszDest
,size_t cchDest
);
711 STRSAFE_INLINE_API
StringCchGetsW(STRSAFE_LPWSTR pszDest
,size_t cchDest
);
713 #define StringCchGets __MINGW_NAME_AW(StringCchGets)
715 #ifndef __CRT__NO_INLINE
716 STRSAFE_INLINE_API
StringCchGetsA(STRSAFE_LPSTR pszDest
,size_t cchDest
) {
718 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
721 cbDest
= cchDest
*sizeof(char);
722 hr
= StringGetsExWorkerA(pszDest
,cchDest
,cbDest
,NULL
,NULL
,0);
727 STRSAFE_INLINE_API
StringCchGetsW(STRSAFE_LPWSTR pszDest
,size_t cchDest
) {
729 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
732 cbDest
= cchDest
*sizeof(wchar_t);
733 hr
= StringGetsExWorkerW(pszDest
,cchDest
,cbDest
,NULL
,NULL
,0);
737 #endif /* !__CRT__NO_INLINE */
739 STRSAFE_INLINE_API
StringCbGetsA(STRSAFE_LPSTR pszDest
,size_t cbDest
);
740 STRSAFE_INLINE_API
StringCbGetsW(STRSAFE_LPWSTR pszDest
,size_t cbDest
);
742 #define StringCbGets __MINGW_NAME_AW(StringCbGets)
744 #ifndef __CRT__NO_INLINE
745 STRSAFE_INLINE_API
StringCbGetsA(STRSAFE_LPSTR pszDest
,size_t cbDest
) {
748 cchDest
= cbDest
/ sizeof(char);
749 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
750 else hr
= StringGetsExWorkerA(pszDest
,cchDest
,cbDest
,NULL
,NULL
,0);
754 STRSAFE_INLINE_API
StringCbGetsW(STRSAFE_LPWSTR pszDest
,size_t cbDest
) {
757 cchDest
= cbDest
/ sizeof(wchar_t);
758 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
759 else hr
= StringGetsExWorkerW(pszDest
,cchDest
,cbDest
,NULL
,NULL
,0);
762 #endif /* !__CRT__NO_INLINE */
764 STRSAFE_INLINE_API
StringCchGetsExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
765 STRSAFE_INLINE_API
StringCchGetsExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
767 #define StringCchGetsEx __MINGW_NAME_AW(StringCchGetsEx)
769 #ifndef __CRT__NO_INLINE
770 STRSAFE_INLINE_API
StringCchGetsExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
772 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
775 cbDest
= cchDest
*sizeof(char);
776 hr
= StringGetsExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
);
781 STRSAFE_INLINE_API
StringCchGetsExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
783 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
786 cbDest
= cchDest
*sizeof(wchar_t);
787 hr
= StringGetsExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
);
791 #endif /* !__CRT__NO_INLINE */
793 STRSAFE_INLINE_API
StringCbGetsExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
794 STRSAFE_INLINE_API
StringCbGetsExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
796 #define StringCbGetsEx __MINGW_NAME_AW(StringCbGetsEx)
798 #ifndef __CRT__NO_INLINE
799 STRSAFE_INLINE_API
StringCbGetsExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
802 size_t cchRemaining
= 0;
803 cchDest
= cbDest
/ sizeof(char);
804 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
805 else hr
= StringGetsExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
);
806 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
) || (hr
==STRSAFE_E_END_OF_FILE
)) {
807 if(pcbRemaining
) *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
812 STRSAFE_INLINE_API
StringCbGetsExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
) {
815 size_t cchRemaining
= 0;
816 cchDest
= cbDest
/ sizeof(wchar_t);
817 if(cchDest
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
818 else hr
= StringGetsExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
);
819 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
) || (hr
==STRSAFE_E_END_OF_FILE
)) {
820 if(pcbRemaining
) *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
824 #endif /* !__CRT__NO_INLINE */
826 STRSAFEAPI
StringCchLengthA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
);
827 STRSAFEAPI
StringCchLengthW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
);
829 #define StringCchLength __MINGW_NAME_AW(StringCchLength)
831 #ifndef __CRT__NO_INLINE
832 STRSAFEAPI
StringCchLengthA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
) {
834 if(!psz
|| (cchMax
> STRSAFE_MAX_CCH
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
835 else hr
= StringLengthWorkerA(psz
,cchMax
,pcchLength
);
836 if(FAILED(hr
) && pcchLength
) {
842 STRSAFEAPI
StringCchLengthW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
) {
844 if(!psz
|| (cchMax
> STRSAFE_MAX_CCH
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
845 else hr
= StringLengthWorkerW(psz
,cchMax
,pcchLength
);
846 if(FAILED(hr
) && pcchLength
) {
851 #endif /* !__CRT__NO_INLINE */
853 STRSAFEAPI
StringCbLengthA(STRSAFE_LPCSTR psz
,size_t cbMax
,size_t *pcbLength
);
854 STRSAFEAPI
StringCbLengthW(STRSAFE_LPCWSTR psz
,size_t cbMax
,size_t *pcbLength
);
856 #define StringCbLength __MINGW_NAME_AW(StringCbLength)
858 #ifndef __CRT__NO_INLINE
859 STRSAFEAPI
StringCbLengthA(STRSAFE_LPCSTR psz
,size_t cbMax
,size_t *pcbLength
) {
862 size_t cchLength
= 0;
863 cchMax
= cbMax
/ sizeof(char);
864 if(!psz
|| (cchMax
> STRSAFE_MAX_CCH
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
865 else hr
= StringLengthWorkerA(psz
,cchMax
,&cchLength
);
868 *pcbLength
= cchLength
*sizeof(char);
876 STRSAFEAPI
StringCbLengthW(STRSAFE_LPCWSTR psz
,size_t cbMax
,size_t *pcbLength
) {
879 size_t cchLength
= 0;
880 cchMax
= cbMax
/ sizeof(wchar_t);
881 if(!psz
|| (cchMax
> STRSAFE_MAX_CCH
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
882 else hr
= StringLengthWorkerW(psz
,cchMax
,&cchLength
);
885 *pcbLength
= cchLength
*sizeof(wchar_t);
893 STRSAFEAPI
StringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
) {
895 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
897 while(cchDest
&& (*pszSrc
!='\0')) {
898 *pszDest
++ = *pszSrc
++;
903 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
910 STRSAFEAPI
StringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
) {
912 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
914 while(cchDest
&& (*pszSrc
!=L
'\0')) {
915 *pszDest
++ = *pszSrc
++;
920 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
927 STRSAFEAPI
StringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
929 STRSAFE_LPSTR pszDestEnd
= pszDest
;
930 size_t cchRemaining
= 0;
931 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
933 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
935 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
937 if(!pszSrc
) pszSrc
= "";
941 pszDestEnd
= pszDest
;
944 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
945 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
948 pszDestEnd
= pszDest
;
949 cchRemaining
= cchDest
;
950 while(cchRemaining
&& (*pszSrc
!='\0')) {
951 *pszDestEnd
++ = *pszSrc
++;
954 if(cchRemaining
> 0) {
955 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
956 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
961 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
969 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
970 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
971 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
972 pszDestEnd
= pszDest
;
973 cchRemaining
= cchDest
;
974 } else if(cchDest
> 0) {
975 pszDestEnd
= pszDest
+ cchDest
- 1;
980 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
982 pszDestEnd
= pszDest
;
983 cchRemaining
= cchDest
;
989 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
990 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
991 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
996 STRSAFEAPI
StringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
998 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
999 size_t cchRemaining
= 0;
1000 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1002 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1004 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1006 if(!pszSrc
) pszSrc
= L
"";
1010 pszDestEnd
= pszDest
;
1012 if(*pszSrc
!=L
'\0') {
1013 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1014 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1017 pszDestEnd
= pszDest
;
1018 cchRemaining
= cchDest
;
1019 while(cchRemaining
&& (*pszSrc
!=L
'\0')) {
1020 *pszDestEnd
++ = *pszSrc
++;
1023 if(cchRemaining
> 0) {
1024 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1025 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1030 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1032 *pszDestEnd
= L
'\0';
1038 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1039 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1040 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1041 pszDestEnd
= pszDest
;
1042 cchRemaining
= cchDest
;
1043 } else if(cchDest
> 0) {
1044 pszDestEnd
= pszDest
+ cchDest
- 1;
1046 *pszDestEnd
= L
'\0';
1049 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1051 pszDestEnd
= pszDest
;
1052 cchRemaining
= cchDest
;
1053 *pszDestEnd
= L
'\0';
1058 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1059 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1060 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1065 STRSAFEAPI
StringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchSrc
) {
1067 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1069 while(cchDest
&& cchSrc
&& (*pszSrc
!='\0')) {
1070 *pszDest
++ = *pszSrc
++;
1076 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1083 STRSAFEAPI
StringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
) {
1085 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1087 while(cchDest
&& cchToCopy
&& (*pszSrc
!=L
'\0')) {
1088 *pszDest
++ = *pszSrc
++;
1094 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1101 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
) {
1103 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1104 size_t cchRemaining
= 0;
1105 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1106 else if(cchToCopy
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1108 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1110 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1112 if(!pszSrc
) pszSrc
= "";
1116 pszDestEnd
= pszDest
;
1118 if((cchToCopy
!=0) && (*pszSrc
!='\0')) {
1119 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1120 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1123 pszDestEnd
= pszDest
;
1124 cchRemaining
= cchDest
;
1125 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!='\0')) {
1126 *pszDestEnd
++ = *pszSrc
++;
1130 if(cchRemaining
> 0) {
1131 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1132 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1137 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1145 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1146 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1147 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1148 pszDestEnd
= pszDest
;
1149 cchRemaining
= cchDest
;
1150 } else if(cchDest
> 0) {
1151 pszDestEnd
= pszDest
+ cchDest
- 1;
1156 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1158 pszDestEnd
= pszDest
;
1159 cchRemaining
= cchDest
;
1165 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1166 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1167 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1172 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
) {
1174 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1175 size_t cchRemaining
= 0;
1176 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1177 else if(cchToCopy
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1179 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1181 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1183 if(!pszSrc
) pszSrc
= L
"";
1187 pszDestEnd
= pszDest
;
1189 if((cchToCopy
!=0) && (*pszSrc
!=L
'\0')) {
1190 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1191 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1194 pszDestEnd
= pszDest
;
1195 cchRemaining
= cchDest
;
1196 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!=L
'\0')) {
1197 *pszDestEnd
++ = *pszSrc
++;
1201 if(cchRemaining
> 0) {
1202 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1203 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1208 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1210 *pszDestEnd
= L
'\0';
1216 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1217 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1218 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1219 pszDestEnd
= pszDest
;
1220 cchRemaining
= cchDest
;
1221 } else if(cchDest
> 0) {
1222 pszDestEnd
= pszDest
+ cchDest
- 1;
1224 *pszDestEnd
= L
'\0';
1227 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1229 pszDestEnd
= pszDest
;
1230 cchRemaining
= cchDest
;
1231 *pszDestEnd
= L
'\0';
1236 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1237 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1238 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1243 STRSAFEAPI
StringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
) {
1245 size_t cchDestLength
;
1246 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1247 if(SUCCEEDED(hr
)) hr
= StringCopyWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1251 STRSAFEAPI
StringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
) {
1253 size_t cchDestLength
;
1254 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1255 if(SUCCEEDED(hr
)) hr
= StringCopyWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1259 STRSAFEAPI
StringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1261 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1262 size_t cchRemaining
= 0;
1263 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1265 size_t cchDestLength
;
1266 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1268 if((cchDest
==0) && (cbDest
==0)) cchDestLength
= 0;
1269 else hr
= STRSAFE_E_INVALID_PARAMETER
;
1271 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1273 pszDestEnd
= pszDest
+ cchDestLength
;
1274 cchRemaining
= cchDest
- cchDestLength
;
1277 if(!pszSrc
) pszSrc
= "";
1279 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1281 pszDestEnd
= pszDest
+ cchDestLength
;
1282 cchRemaining
= cchDest
- cchDestLength
;
1288 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1289 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1291 } else hr
= StringCopyExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1296 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1297 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1298 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1299 pszDestEnd
= pszDest
;
1300 cchRemaining
= cchDest
;
1301 } else if(cchDest
> 0) {
1302 pszDestEnd
= pszDest
+ cchDest
- 1;
1307 if(dwFlags
& STRSAFE_NULL_ON_FAILURE
) {
1309 pszDestEnd
= pszDest
;
1310 cchRemaining
= cchDest
;
1316 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1317 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1318 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1323 STRSAFEAPI
StringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1325 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1326 size_t cchRemaining
= 0;
1327 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1329 size_t cchDestLength
;
1330 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1332 if((cchDest
==0) && (cbDest
==0)) cchDestLength
= 0;
1333 else hr
= STRSAFE_E_INVALID_PARAMETER
;
1335 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1337 pszDestEnd
= pszDest
+ cchDestLength
;
1338 cchRemaining
= cchDest
- cchDestLength
;
1341 if(!pszSrc
) pszSrc
= L
"";
1343 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1345 pszDestEnd
= pszDest
+ cchDestLength
;
1346 cchRemaining
= cchDest
- cchDestLength
;
1351 if(*pszSrc
!=L
'\0') {
1352 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1353 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1355 } 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
)));
1360 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1361 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1362 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1363 pszDestEnd
= pszDest
;
1364 cchRemaining
= cchDest
;
1365 } else if(cchDest
> 0) {
1366 pszDestEnd
= pszDest
+ cchDest
- 1;
1368 *pszDestEnd
= L
'\0';
1371 if(dwFlags
& STRSAFE_NULL_ON_FAILURE
) {
1373 pszDestEnd
= pszDest
;
1374 cchRemaining
= cchDest
;
1375 *pszDestEnd
= L
'\0';
1380 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1381 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1382 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1387 STRSAFEAPI
StringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
) {
1389 size_t cchDestLength
;
1390 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1391 if(SUCCEEDED(hr
)) hr
= StringCopyNWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
1395 STRSAFEAPI
StringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
) {
1397 size_t cchDestLength
;
1398 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1399 if(SUCCEEDED(hr
)) hr
= StringCopyNWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
1403 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
) {
1405 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1406 size_t cchRemaining
= 0;
1407 size_t cchDestLength
= 0;
1408 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1409 else if(cchToAppend
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1411 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1413 if((cchDest
==0) && (cbDest
==0)) cchDestLength
= 0;
1414 else hr
= STRSAFE_E_INVALID_PARAMETER
;
1416 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1418 pszDestEnd
= pszDest
+ cchDestLength
;
1419 cchRemaining
= cchDest
- cchDestLength
;
1422 if(!pszSrc
) pszSrc
= "";
1424 hr
= StringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1426 pszDestEnd
= pszDest
+ cchDestLength
;
1427 cchRemaining
= cchDest
- cchDestLength
;
1432 if((cchToAppend
!=0) && (*pszSrc
!='\0')) {
1433 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1434 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1436 } else hr
= StringCopyNExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,cchToAppend
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1441 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1442 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1443 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1444 pszDestEnd
= pszDest
;
1445 cchRemaining
= cchDest
;
1446 } else if(cchDest
> 0) {
1447 pszDestEnd
= pszDest
+ cchDest
- 1;
1452 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
)) {
1454 pszDestEnd
= pszDest
;
1455 cchRemaining
= cchDest
;
1461 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1462 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1463 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1468 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
) {
1470 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1471 size_t cchRemaining
= 0;
1472 size_t cchDestLength
= 0;
1473 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1474 else if(cchToAppend
> STRSAFE_MAX_CCH
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1476 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1478 if((cchDest
==0) && (cbDest
==0)) cchDestLength
= 0;
1479 else hr
= STRSAFE_E_INVALID_PARAMETER
;
1481 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1483 pszDestEnd
= pszDest
+ cchDestLength
;
1484 cchRemaining
= cchDest
- cchDestLength
;
1487 if(!pszSrc
) pszSrc
= L
"";
1489 hr
= StringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1491 pszDestEnd
= pszDest
+ cchDestLength
;
1492 cchRemaining
= cchDest
- cchDestLength
;
1497 if((cchToAppend
!=0) && (*pszSrc
!=L
'\0')) {
1498 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1499 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1501 } 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
)));
1506 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1507 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1508 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1509 pszDestEnd
= pszDest
;
1510 cchRemaining
= cchDest
;
1511 } else if(cchDest
> 0) {
1512 pszDestEnd
= pszDest
+ cchDest
- 1;
1514 *pszDestEnd
= L
'\0';
1517 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
)) {
1519 pszDestEnd
= pszDest
;
1520 cchRemaining
= cchDest
;
1521 *pszDestEnd
= L
'\0';
1526 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1527 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1528 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1533 STRSAFEAPI
StringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
) {
1535 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1539 cchMax
= cchDest
- 1;
1540 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
1541 if((iRet
< 0) || (((size_t)iRet
) > cchMax
)) {
1544 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1545 } else if(((size_t)iRet
)==cchMax
) {
1553 STRSAFEAPI
StringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
) {
1555 if(cchDest
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1559 cchMax
= cchDest
- 1;
1560 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
1561 if((iRet
< 0) || (((size_t)iRet
) > cchMax
)) {
1564 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1565 } else if(((size_t)iRet
)==cchMax
) {
1573 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
) {
1575 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1576 size_t cchRemaining
= 0;
1577 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1579 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1581 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1583 if(!pszFormat
) pszFormat
= "";
1587 pszDestEnd
= pszDest
;
1589 if(*pszFormat
!='\0') {
1590 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1591 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1596 cchMax
= cchDest
- 1;
1597 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
1598 if((iRet
< 0) || (((size_t)iRet
) > cchMax
)) {
1599 pszDestEnd
= pszDest
+ cchMax
;
1602 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1603 } else if(((size_t)iRet
)==cchMax
) {
1604 pszDestEnd
= pszDest
+ cchMax
;
1607 } else if(((size_t)iRet
) < cchMax
) {
1608 pszDestEnd
= pszDest
+ iRet
;
1609 cchRemaining
= cchDest
- iRet
;
1610 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1611 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1619 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1620 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1621 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1622 pszDestEnd
= pszDest
;
1623 cchRemaining
= cchDest
;
1624 } else if(cchDest
> 0) {
1625 pszDestEnd
= pszDest
+ cchDest
- 1;
1630 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1632 pszDestEnd
= pszDest
;
1633 cchRemaining
= cchDest
;
1639 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1640 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1641 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1646 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
) {
1648 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1649 size_t cchRemaining
= 0;
1650 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1652 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1654 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1656 if(!pszFormat
) pszFormat
= L
"";
1660 pszDestEnd
= pszDest
;
1662 if(*pszFormat
!=L
'\0') {
1663 if(!pszDest
) hr
= STRSAFE_E_INVALID_PARAMETER
;
1664 else hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1669 cchMax
= cchDest
- 1;
1670 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
1671 if((iRet
< 0) || (((size_t)iRet
) > cchMax
)) {
1672 pszDestEnd
= pszDest
+ cchMax
;
1674 *pszDestEnd
= L
'\0';
1675 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1676 } else if(((size_t)iRet
)==cchMax
) {
1677 pszDestEnd
= pszDest
+ cchMax
;
1679 *pszDestEnd
= L
'\0';
1680 } else if(((size_t)iRet
) < cchMax
) {
1681 pszDestEnd
= pszDest
+ iRet
;
1682 cchRemaining
= cchDest
- iRet
;
1683 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1684 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1692 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1693 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1694 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1695 pszDestEnd
= pszDest
;
1696 cchRemaining
= cchDest
;
1697 } else if(cchDest
> 0) {
1698 pszDestEnd
= pszDest
+ cchDest
- 1;
1700 *pszDestEnd
= L
'\0';
1703 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1705 pszDestEnd
= pszDest
;
1706 cchRemaining
= cchDest
;
1707 *pszDestEnd
= L
'\0';
1712 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
)) {
1713 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1714 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1719 STRSAFEAPI
StringLengthWorkerA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
) {
1721 size_t cchMaxPrev
= cchMax
;
1722 while(cchMax
&& (*psz
!='\0')) {
1726 if(cchMax
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1728 if(SUCCEEDED(hr
)) *pcchLength
= cchMaxPrev
- cchMax
;
1729 else *pcchLength
= 0;
1734 STRSAFEAPI
StringLengthWorkerW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
) {
1736 size_t cchMaxPrev
= cchMax
;
1737 while(cchMax
&& (*psz
!=L
'\0')) {
1741 if(cchMax
==0) hr
= STRSAFE_E_INVALID_PARAMETER
;
1743 if(SUCCEEDED(hr
)) *pcchLength
= cchMaxPrev
- cchMax
;
1744 else *pcchLength
= 0;
1749 STRSAFE_INLINE_API
StringGetsExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1751 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1752 size_t cchRemaining
= 0;
1754 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1756 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1758 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1763 pszDestEnd
= pszDest
;
1764 cchRemaining
= cchDest
;
1765 if(cchDest
==1) *pszDestEnd
= '\0';
1766 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1768 pszDestEnd
= pszDest
;
1769 cchRemaining
= cchDest
;
1770 while(cchRemaining
> 1) {
1772 int i
= getc(stdin
);
1774 if(pszDestEnd
==pszDest
) hr
= STRSAFE_E_END_OF_FILE
;
1783 if(cchRemaining
> 0) {
1784 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1785 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1794 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1795 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1796 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1797 pszDestEnd
= pszDest
;
1798 cchRemaining
= cchDest
;
1799 } else if(cchDest
> 0) {
1800 pszDestEnd
= pszDest
+ cchDest
- 1;
1805 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1807 pszDestEnd
= pszDest
;
1808 cchRemaining
= cchDest
;
1814 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
) || (hr
==STRSAFE_E_END_OF_FILE
)) {
1815 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1816 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1821 STRSAFE_INLINE_API
StringGetsExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
) {
1823 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1824 size_t cchRemaining
= 0;
1825 if(dwFlags
& (~STRSAFE_VALID_FLAGS
)) {
1826 hr
= STRSAFE_E_INVALID_PARAMETER
;
1828 if(dwFlags
& STRSAFE_IGNORE_NULLS
) {
1830 if((cchDest
!=0) || (cbDest
!=0)) hr
= STRSAFE_E_INVALID_PARAMETER
;
1835 pszDestEnd
= pszDest
;
1836 cchRemaining
= cchDest
;
1837 if(cchDest
==1) *pszDestEnd
= L
'\0';
1838 hr
= STRSAFE_E_INSUFFICIENT_BUFFER
;
1840 pszDestEnd
= pszDest
;
1841 cchRemaining
= cchDest
;
1842 while(cchRemaining
> 1) {
1843 wchar_t ch
= getwc(stdin
);
1845 if(pszDestEnd
==pszDest
) hr
= STRSAFE_E_END_OF_FILE
;
1848 if(ch
==L
'\n') break;
1853 if(cchRemaining
> 0) {
1854 if(dwFlags
& STRSAFE_FILL_BEHIND_NULL
) {
1855 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1858 *pszDestEnd
= L
'\0';
1864 if(dwFlags
& STRSAFE_FILL_ON_FAILURE
) {
1865 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1866 if(STRSAFE_GET_FILL_PATTERN(dwFlags
)==0) {
1867 pszDestEnd
= pszDest
;
1868 cchRemaining
= cchDest
;
1869 } else if(cchDest
> 0) {
1870 pszDestEnd
= pszDest
+ cchDest
- 1;
1872 *pszDestEnd
= L
'\0';
1875 if(dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) {
1877 pszDestEnd
= pszDest
;
1878 cchRemaining
= cchDest
;
1879 *pszDestEnd
= L
'\0';
1884 if(SUCCEEDED(hr
) || (hr
==STRSAFE_E_INSUFFICIENT_BUFFER
) || (hr
==STRSAFE_E_END_OF_FILE
)) {
1885 if(ppszDestEnd
) *ppszDestEnd
= pszDestEnd
;
1886 if(pcchRemaining
) *pcchRemaining
= cchRemaining
;
1890 #endif /* !__CRT__NO_INLINE */
1892 #define StringCopyWorkerA StringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
1893 #define StringCopyWorkerW StringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
1894 #define StringCopyExWorkerA StringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
1895 #define StringCopyExWorkerW StringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
1896 #define StringCatWorkerA StringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
1897 #define StringCatWorkerW StringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
1898 #define StringCatExWorkerA StringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
1899 #define StringCatExWorkerW StringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
1900 #define StringCatNWorkerA StringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
1901 #define StringCatNWorkerW StringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
1902 #define StringCatNExWorkerA StringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
1903 #define StringCatNExWorkerW StringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
1904 #define StringVPrintfWorkerA StringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
1905 #define StringVPrintfWorkerW StringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
1906 #define StringVPrintfExWorkerA StringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
1907 #define StringVPrintfExWorkerW StringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
1908 #define StringLengthWorkerA StringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
1909 #define StringLengthWorkerW StringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
1910 #define StringGetsExWorkerA StringGetsExWorkerA_instead_use_StringCchGetsA_or_StringCbGetsA
1911 #define StringGetsExWorkerW StringGetsExWorkerW_instead_use_StringCchGetsW_or_StringCbGetsW
1913 /* Some Wine modules include us, don't specify STRSAFE_NO_DEPRECATE, and use deprecated functions */
1914 #ifndef STRSAFE_NO_DEPRECATE
1915 #define STRSAFE_NO_DEPRECATE
1918 #ifndef STRSAFE_NO_DEPRECATE
1921 #define strcpy strcpy_instead_use_StringCbCopyA_or_StringCchCopyA;
1924 #define wcscpy wcscpy_instead_use_StringCbCopyW_or_StringCchCopyW;
1927 #define strcat strcat_instead_use_StringCbCatA_or_StringCchCatA;
1930 #define wcscat wcscat_instead_use_StringCbCatW_or_StringCchCatW;
1933 #define sprintf sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA;
1936 #define swprintf swprintf_instead_use_StringCbPrintfW_or_StringCchPrintfW;
1939 #define vsprintf vsprintf_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
1942 #define vswprintf vswprintf_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
1945 #define _snprintf _snprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA;
1948 #define _snwprintf _snwprintf_instead_use_StringCbPrintfW_or_StringCchPrintfW;
1951 #define _vsnprintf _vsnprintf_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
1954 #define _vsnwprintf _vsnwprintf_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
1957 #define strcpyA strcpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
1960 #define strcpyW strcpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
1963 #define lstrcpy lstrcpy_instead_use_StringCbCopy_or_StringCchCopy;
1966 #define lstrcpyA lstrcpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
1969 #define lstrcpyW lstrcpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
1972 #define StrCpy StrCpy_instead_use_StringCbCopy_or_StringCchCopy;
1975 #define StrCpyA StrCpyA_instead_use_StringCbCopyA_or_StringCchCopyA;
1978 #define StrCpyW StrCpyW_instead_use_StringCbCopyW_or_StringCchCopyW;
1981 #define _tcscpy _tcscpy_instead_use_StringCbCopy_or_StringCchCopy;
1984 #define _ftcscpy _ftcscpy_instead_use_StringCbCopy_or_StringCchCopy;
1987 #define lstrcat lstrcat_instead_use_StringCbCat_or_StringCchCat;
1990 #define lstrcatA lstrcatA_instead_use_StringCbCatA_or_StringCchCatA;
1993 #define lstrcatW lstrcatW_instead_use_StringCbCatW_or_StringCchCatW;
1996 #define StrCat StrCat_instead_use_StringCbCat_or_StringCchCat;
1999 #define StrCatA StrCatA_instead_use_StringCbCatA_or_StringCchCatA;
2002 #define StrCatW StrCatW_instead_use_StringCbCatW_or_StringCchCatW;
2005 #define StrNCat StrNCat_instead_use_StringCbCatN_or_StringCchCatN;
2008 #define StrNCatA StrNCatA_instead_use_StringCbCatNA_or_StringCchCatNA;
2011 #define StrNCatW StrNCatW_instead_use_StringCbCatNW_or_StringCchCatNW;
2014 #define StrCatN StrCatN_instead_use_StringCbCatN_or_StringCchCatN;
2017 #define StrCatNA StrCatNA_instead_use_StringCbCatNA_or_StringCchCatNA;
2020 #define StrCatNW StrCatNW_instead_use_StringCbCatNW_or_StringCchCatNW;
2023 #define _tcscat _tcscat_instead_use_StringCbCat_or_StringCchCat;
2026 #define _ftcscat _ftcscat_instead_use_StringCbCat_or_StringCchCat;
2029 #define wsprintf wsprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
2032 #define wsprintfA wsprintfA_instead_use_StringCbPrintfA_or_StringCchPrintfA;
2035 #define wsprintfW wsprintfW_instead_use_StringCbPrintfW_or_StringCchPrintfW;
2038 #define wvsprintf wvsprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
2041 #define wvsprintfA wvsprintfA_instead_use_StringCbVPrintfA_or_StringCchVPrintfA;
2044 #define wvsprintfW wvsprintfW_instead_use_StringCbVPrintfW_or_StringCchVPrintfW;
2047 #define _vstprintf _vstprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
2050 #define _vsntprintf _vsntprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf;
2053 #define _stprintf _stprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
2056 #define _sntprintf _sntprintf_instead_use_StringCbPrintf_or_StringCchPrintf;
2059 #define _getts _getts_instead_use_StringCbGets_or_StringCchGets;
2062 #define gets _gets_instead_use_StringCbGetsA_or_StringCchGetsA;
2065 #define _getws _getws_instead_use_StringCbGetsW_or_StringCchGetsW;
2069 #pragma clang diagnostic pop
2072 #endif /* _STRSAFE_H_INCLUDED_ */