• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) Huawei Technologies Co., Ltd. 2014-2021. All rights reserved.
3  * Licensed under Mulan PSL v2.
4  * You can use this software according to the terms and conditions of the Mulan PSL v2.
5  * You may obtain a copy of Mulan PSL v2 at:
6  *          http://license.coscl.org.cn/MulanPSL2
7  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10  * See the Mulan PSL v2 for more details.
11  * Description: The user of this secure c library should include this header file in you source code.
12  *              This header file declare all supported API prototype of the library,
13  *              such as memcpy_s, strcpy_s, wcscpy_s,strcat_s, strncat_s, sprintf_s, scanf_s, and so on.
14  * Create: 2014-02-25
15  * Notes: Do not modify this file by yourself.
16  */
17 
18 #ifndef SECUREC_H_5D13A042_DC3F_4ED9_A8D1_882811274C27
19 #define SECUREC_H_5D13A042_DC3F_4ED9_A8D1_882811274C27
20 
21 #include "securectype.h"
22 #ifndef SECUREC_HAVE_STDARG_H
23 #define SECUREC_HAVE_STDARG_H 1
24 #endif
25 
26 #if SECUREC_HAVE_STDARG_H
27 #include <stdarg.h>
28 #endif
29 
30 #ifndef SECUREC_HAVE_ERRNO_H
31 #define SECUREC_HAVE_ERRNO_H 1
32 #endif
33 
34 /* EINVAL ERANGE may defined in errno.h */
35 #if SECUREC_HAVE_ERRNO_H
36 #if SECUREC_IN_KERNEL
37 #include <linux/errno.h>
38 #else
39 #include <errno.h>
40 #endif
41 #endif
42 
43 /* Define error code */
44 #if defined(SECUREC_NEED_ERRNO_TYPE) || !defined(__STDC_WANT_LIB_EXT1__) || \
45     (defined(__STDC_WANT_LIB_EXT1__) && (!__STDC_WANT_LIB_EXT1__))
46 #ifndef SECUREC_DEFINED_ERRNO_TYPE
47 #define SECUREC_DEFINED_ERRNO_TYPE
48 /* Just check whether macrodefinition exists. */
49 #ifndef errno_t
50 typedef int errno_t;
51 #endif
52 #endif
53 #endif
54 
55 /* Success */
56 #ifndef EOK
57 #define EOK 0
58 #endif
59 
60 #ifndef EINVAL
61 /* The src buffer is not correct and destination buffer can not be reset */
62 #define EINVAL 22
63 #endif
64 
65 #ifndef EINVAL_AND_RESET
66 /* Once the error is detected, the dest buffer must be reset! Value is 22 or 128 */
67 #define EINVAL_AND_RESET 150
68 #endif
69 
70 #ifndef ERANGE
71 /* The destination buffer is not long enough and destination buffer can not be reset */
72 #define ERANGE 34
73 #endif
74 
75 #ifndef ERANGE_AND_RESET
76 /* Once the error is detected, the dest buffer must be reset! Value is 34 or 128 */
77 #define ERANGE_AND_RESET  162
78 #endif
79 
80 #ifndef EOVERLAP_AND_RESET
81 /* Once the buffer overlap is detected, the dest buffer must be reset! Value is 54 or 128 */
82 #define EOVERLAP_AND_RESET 182
83 #endif
84 
85 /* If you need export the function of this library in Win32 dll, use __declspec(dllexport) */
86 #ifndef SECUREC_API
87 #if defined(SECUREC_DLL_EXPORT)
88 #define SECUREC_API __declspec(dllexport)
89 #elif defined(SECUREC_DLL_IMPORT)
90 #define SECUREC_API __declspec(dllimport)
91 #else
92 /*
93  * Standardized function declaration. If a security function is declared in the your code,
94  * it may cause a compilation alarm,Please delete the security function you declared.
95  * Adding extern under windows will cause the system to have inline functions to expand,
96  * so do not add the extern in default
97  */
98 #if defined(_MSC_VER)
99 #define SECUREC_API
100 #else
101 #define SECUREC_API extern
102 #endif
103 #endif
104 #endif
105 
106 #ifdef __cplusplus
107 extern "C" {
108 #endif
109 #if SECUREC_ENABLE_MEMSET
110 /*
111  * Description: The memset_s function copies the value of c (converted to an unsigned char) into each of
112  * the first count characters of the object pointed to by dest.
113  * Parameter: dest - destination address
114  * Parameter: destMax - The maximum length of destination buffer
115  * Parameter: c - the value to be copied
116  * Parameter: count - copies count bytes of value to dest
117  * Return:    EOK if there was no runtime-constraint violation
118  */
119 SECUREC_API errno_t memset_s(void *dest, size_t destMax, int c, size_t count);
120 #endif
121 
122 #ifndef SECUREC_ONLY_DECLARE_MEMSET
123 #define SECUREC_ONLY_DECLARE_MEMSET     0
124 #endif
125 
126 #if !SECUREC_ONLY_DECLARE_MEMSET
127 
128 #if SECUREC_ENABLE_MEMMOVE
129 /*
130  * Description: The memmove_s function copies n characters from the object pointed to by src
131  * into the object pointed to by dest.
132  * Parameter: dest - destination  address
133  * Parameter: destMax - The maximum length of destination buffer
134  * Parameter: src - source address
135  * Parameter: count - copies count bytes from the src
136  * Return:    EOK if there was no runtime-constraint violation
137  */
138 SECUREC_API errno_t memmove_s(void *dest, size_t destMax, const void *src, size_t count);
139 #endif
140 
141 #if SECUREC_ENABLE_MEMCPY
142 /*
143  * Description: The memcpy_s function copies n characters from the object pointed to
144  * by src into the object pointed to by dest.
145  * Parameter: dest - destination  address
146  * Parameter: destMax - The maximum length of destination buffer
147  * Parameter: src - source address
148  * Parameter: count - copies count bytes from the  src
149  * Return:    EOK if there was no runtime-constraint violation
150  */
151 SECUREC_API errno_t memcpy_s(void *dest, size_t destMax, const void *src, size_t count);
152 #endif
153 
154 #if SECUREC_ENABLE_STRCPY
155 /*
156  * Description: The strcpy_s function copies the string pointed to by strSrc (including
157  * the terminating null character) into the array pointed to by strDest
158  * Parameter: strDest - destination  address
159  * Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
160  * Parameter: strSrc - source address
161  * Return:    EOK if there was no runtime-constraint violation
162  */
163 SECUREC_API errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc);
164 #endif
165 
166 #if SECUREC_ENABLE_STRNCPY
167 /*
168  * Description: The strncpy_s function copies not more than n successive characters (not including
169  * the terminating null character) from the array pointed to by strSrc to the array pointed to by strDest.
170  * Parameter: strDest - destination  address
171  * Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
172  * Parameter: strSrc - source  address
173  * Parameter: count - copies count characters from the src
174  * Return:    EOK if there was no runtime-constraint violation
175  */
176 SECUREC_API errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
177 #endif
178 
179 #if SECUREC_ENABLE_STRCAT
180 /*
181  * Description: The strcat_s function appends a copy of the string pointed to by strSrc (including
182  * the terminating null character) to the end of the string pointed to by strDest.
183  * Parameter: strDest - destination  address
184  * Parameter: destMax - The maximum length of destination buffer(including the terminating null wide character)
185  * Parameter: strSrc - source address
186  * Return:    EOK if there was no runtime-constraint violation
187  */
188 SECUREC_API errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc);
189 #endif
190 
191 #if SECUREC_ENABLE_STRNCAT
192 /*
193  * Description: The strncat_s function appends not more than n successive characters (not including
194  * the terminating null character)
195  * from the array pointed to by strSrc to the end of the string pointed to by strDest.
196  * Parameter: strDest - destination address
197  * Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
198  * Parameter: strSrc - source address
199  * Parameter: count - copies count characters from the src
200  * Return:    EOK if there was no runtime-constraint violation
201  */
202 SECUREC_API errno_t strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
203 #endif
204 
205 #if SECUREC_ENABLE_VSPRINTF
206 /*
207  * Description: The vsprintf_s function is equivalent to the vsprintf function except for the parameter destMax
208  * and the explicit runtime-constraints violation
209  * Parameter: strDest -  produce output according to a format,write to the character string strDest.
210  * Parameter: destMax - The maximum length of destination buffer(including the terminating null wide character)
211  * Parameter: format - format string
212  * Parameter: argList - instead of a variable number of arguments
213  * Return:    the number of characters printed(not including the terminating null byte '\0'),
214  * If an error occurred Return: -1.
215  */
216 SECUREC_API int vsprintf_s(char *strDest, size_t destMax, const char *format,
217                            va_list argList) SECUREC_ATTRIBUTE(3, 0);
218 #endif
219 
220 #if SECUREC_ENABLE_SPRINTF
221 /*
222  * Description: The sprintf_s function is equivalent to the sprintf function except for the parameter destMax
223  * and the explicit runtime-constraints violation
224  * Parameter: strDest -  produce output according to a format ,write to the character string strDest.
225  * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
226  * Parameter: format - format string
227  * Return:    the number of characters printed(not including the terminating null byte '\0'),
228  * If an error occurred Return: -1.
229 */
230 SECUREC_API int sprintf_s(char *strDest, size_t destMax, const char *format, ...) SECUREC_ATTRIBUTE(3, 4);
231 #endif
232 
233 #if SECUREC_ENABLE_VSNPRINTF
234 /*
235  * Description: The vsnprintf_s function is equivalent to the vsnprintf function except for
236  * the parameter destMax/count and the explicit runtime-constraints violation
237  * Parameter: strDest -  produce output according to a format ,write to the character string strDest.
238  * Parameter: destMax - The maximum length of destination buffer(including the terminating null  byte '\0')
239  * Parameter: count - do not write more than count bytes to strDest(not including the terminating null  byte '\0')
240  * Parameter: format - format string
241  * Parameter: argList - instead of  a variable number of arguments
242  * Return:    the number of characters printed(not including the terminating null byte '\0'),
243  * If an error occurred Return: -1.Pay special attention to returning -1 when truncation occurs.
244  */
245 SECUREC_API int vsnprintf_s(char *strDest, size_t destMax, size_t count, const char *format,
246                             va_list argList) SECUREC_ATTRIBUTE(4, 0);
247 #endif
248 
249 #if SECUREC_ENABLE_SNPRINTF
250 /*
251  * Description: The snprintf_s function is equivalent to the snprintf function except for
252  * the parameter destMax/count and the explicit runtime-constraints violation
253  * Parameter: strDest - produce output according to a format ,write to the character string strDest.
254  * Parameter: destMax - The maximum length of destination buffer(including the terminating null  byte '\0')
255  * Parameter: count - do not write more than count bytes to strDest(not including the terminating null  byte '\0')
256  * Parameter: format - format string
257  * Return:    the number of characters printed(not including the terminating null byte '\0'),
258  * If an error occurred Return: -1.Pay special attention to returning -1 when truncation occurs.
259  */
260 SECUREC_API int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format,
261                            ...) SECUREC_ATTRIBUTE(4, 5);
262 #endif
263 
264 #if SECUREC_SNPRINTF_TRUNCATED
265 /*
266  * Description: The vsnprintf_truncated_s function is equivalent to the vsnprintf_s function except
267  * no count parameter and return value
268  * Parameter: strDest -  produce output according to a format ,write to the character string strDest
269  * Parameter: destMax - The maximum length of destination buffer(including the terminating null  byte '\0')
270  * Parameter: format - format string
271  * Parameter: argList - instead of  a variable  number of arguments
272  * Return:    the number of characters printed(not including the terminating null byte '\0'),
273  * If an error occurred Return: -1.Pay special attention to returning destMax - 1 when truncation occurs
274 */
275 SECUREC_API int vsnprintf_truncated_s(char *strDest, size_t destMax, const char *format,
276                                       va_list argList) SECUREC_ATTRIBUTE(3, 0);
277 
278 /*
279  * Description: The snprintf_truncated_s function is equivalent to the snprintf_s function except
280  * no count parameter and return value
281  * Parameter: strDest - produce output according to a format,write to the character string strDest.
282  * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
283  * Parameter: format - format string
284  * Return:    the number of characters printed(not including the terminating null byte '\0'),
285  * If an error occurred Return: -1.Pay special attention to returning destMax - 1 when truncation occurs.
286  */
287 SECUREC_API int snprintf_truncated_s(char *strDest, size_t destMax,
288                                      const char *format, ...) SECUREC_ATTRIBUTE(3, 4);
289 #endif
290 
291 #if SECUREC_ENABLE_SCANF
292 /*
293  * Description: The scanf_s function is equivalent to fscanf_s with the argument stdin
294  * interposed before the arguments to scanf_s
295  * Parameter: format - format string
296  * Return:    the number of input items assigned, If an error occurred Return: -1.
297  */
298 SECUREC_API int scanf_s(const char *format, ...);
299 #endif
300 
301 #if SECUREC_ENABLE_VSCANF
302 /*
303  * Description: The vscanf_s function is equivalent to scanf_s, with the variable argument list replaced by argList
304  * Parameter: format - format string
305  * Parameter: argList - instead of a variable number of arguments
306  * Return:    the number of input items assigned, If an error occurred Return: -1.
307  */
308 SECUREC_API int vscanf_s(const char *format, va_list argList);
309 #endif
310 
311 #if SECUREC_ENABLE_SSCANF
312 /*
313  * Description: The sscanf_s function is equivalent to fscanf_s, except that input is obtained from a
314  * string (specified by the argument buffer) rather than from a stream
315  * Parameter: buffer - read character from buffer
316  * Parameter: format - format string
317  * Return:    the number of input items assigned, If an error occurred Return: -1.
318  */
319 SECUREC_API int sscanf_s(const char *buffer, const char *format, ...);
320 #endif
321 
322 #if SECUREC_ENABLE_VSSCANF
323 /*
324  * Description: The vsscanf_s function is equivalent to sscanf_s, with the variable argument list
325  * replaced by argList
326  * Parameter: buffer -  read character from buffer
327  * Parameter: format - format string
328  * Parameter: argList - instead of a variable number of arguments
329  * Return:    the number of input items assigned, If an error occurred Return: -1.
330  */
331 SECUREC_API int vsscanf_s(const char *buffer, const char *format, va_list argList);
332 #endif
333 
334 #if SECUREC_ENABLE_FSCANF
335 /*
336  * Description: The fscanf_s function is equivalent to fscanf except that the c, s, and [ conversion specifiers
337  * apply to a pair of arguments (unless assignment suppression is indicated by a *)
338  * Parameter: stream - stdio file stream
339  * Parameter: format - format string
340  * Return:    the number of input items assigned, If an error occurred Return: -1.
341  */
342 SECUREC_API int fscanf_s(FILE *stream, const char *format, ...);
343 #endif
344 
345 #if SECUREC_ENABLE_VFSCANF
346 /*
347  * Description: The vfscanf_s function is equivalent to fscanf_s, with the variable argument list
348  * replaced by argList
349  * Parameter: stream - stdio file stream
350  * Parameter: format - format string
351  * Parameter: argList - instead of a variable number of arguments
352  * Return:    the number of input items assigned, If an error occurred Return: -1.
353  */
354 SECUREC_API int vfscanf_s(FILE *stream, const char *format, va_list argList);
355 #endif
356 
357 #if SECUREC_ENABLE_STRTOK
358 /*
359  * Description: The strtok_s function parses a string into a sequence of strToken,
360  * replace all characters in strToken string that match to strDelimit set with 0.
361  * On the first call to strtok_s the string to be parsed should be specified in strToken.
362  * In each subsequent call that should parse the same string, strToken should be NULL
363  * Parameter: strToken - the string to be delimited
364  * Parameter: strDelimit - specifies a set of characters that delimit the tokens in the parsed string
365  * Parameter: context - is a pointer to a char * variable that is used internally by strtok_s function
366  * Return:  On the first call returns the address of the first non \0 character, otherwise NULL is returned.
367  * In subsequent calls, the strtoken is set to NULL, and the context set is the same as the previous call,
368  * return NULL if the *context string length is equal 0, otherwise return *context.
369  */
370 SECUREC_API char *strtok_s(char *strToken, const char *strDelimit, char **context);
371 #endif
372 
373 #if SECUREC_ENABLE_GETS && !SECUREC_IN_KERNEL
374 /*
375  * Description: The gets_s function reads at most one less than the number of characters specified
376  * by destMax from the stream pointed to by stdin, into the array pointed to by buffer
377  * Parameter: buffer - destination address
378  * Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
379  * Return:    buffer if there was no runtime-constraint violation,If an error occurred Return: NULL.
380  */
381 SECUREC_API char *gets_s(char *buffer, size_t destMax);
382 #endif
383 
384 #if SECUREC_ENABLE_WCHAR_FUNC
385 #if SECUREC_ENABLE_MEMCPY
386 /*
387  * Description: The wmemcpy_s function copies n successive wide characters from the object pointed to
388  * by src into the object pointed to by dest.
389  * Parameter: dest - destination  address
390  * Parameter: destMax - The maximum length of destination buffer
391  * Parameter: src - source address
392  * Parameter: count - copies count wide characters from the  src
393  * Return:    EOK if there was no runtime-constraint violation
394  */
395 SECUREC_API errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count);
396 #endif
397 
398 #if SECUREC_ENABLE_MEMMOVE
399 /*
400  * Description: The wmemmove_s function copies n successive wide characters from the object
401  * pointed to by src into the object pointed to by dest.
402  * Parameter: dest - destination  address
403  * Parameter: destMax - The maximum length of destination buffer
404  * Parameter: src - source address
405  * Parameter: count - copies count wide characters from the  src
406  * Return:    EOK if there was no runtime-constraint violation
407  */
408 SECUREC_API errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count);
409 #endif
410 
411 #if SECUREC_ENABLE_STRCPY
412 /*
413  * Description: The wcscpy_s function copies the wide string pointed to by strSrc(including the terminating
414  * null wide character) into the array pointed to by strDest
415  * Parameter: strDest - destination address
416  * Parameter: destMax - The maximum length of destination buffer
417  * Parameter: strSrc - source address
418  * Return:    EOK if there was no runtime-constraint violation
419  */
420 SECUREC_API errno_t wcscpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc);
421 #endif
422 
423 #if SECUREC_ENABLE_STRNCPY
424 /*
425  * Description: The wcsncpy_s function copies not more than n successive wide characters (not including the
426  * terminating null wide character) from the array pointed to by strSrc to the array pointed to by strDest
427  * Parameter: strDest - destination address
428  * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
429  * Parameter: strSrc - source address
430  * Parameter: count - copies count wide characters from the src
431  * Return:    EOK if there was no runtime-constraint violation
432  */
433 SECUREC_API errno_t wcsncpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count);
434 #endif
435 
436 #if SECUREC_ENABLE_STRCAT
437 /*
438  * Description: The wcscat_s function appends a copy of the wide string pointed to by strSrc (including the
439  * terminating null wide character) to the end of the wide string pointed to by strDest
440  * Parameter: strDest - destination  address
441  * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
442  * Parameter: strSrc - source address
443  * Return:    EOK if there was no runtime-constraint violation
444  */
445 SECUREC_API errno_t wcscat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc);
446 #endif
447 
448 #if SECUREC_ENABLE_STRNCAT
449 /*
450  * Description: The wcsncat_s function appends not more than n successive wide characters (not including the
451  * terminating null wide character) from the array pointed to by strSrc to the end of the wide string pointed to
452  * by strDest.
453  * Parameter: strDest - destination  address
454  * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
455  * Parameter: strSrc - source  address
456  * Parameter: count - copies count wide characters from the  src
457  * Return:    EOK if there was no runtime-constraint violation
458  */
459 SECUREC_API errno_t wcsncat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count);
460 #endif
461 
462 #if SECUREC_ENABLE_STRTOK
463 /*
464  * Description: The wcstok_s function is the wide-character equivalent of the strtok_s function
465  * Parameter: strToken - the string to be delimited
466  * Parameter: strDelimit - specifies a set of characters that delimit the tokens in the parsed string
467  * Parameter: context - is a pointer to a char * variable that is used internally by strtok_s function
468  * Return:    a pointer to the first character of a token, or a null pointer if there is no token
469  * or there is a runtime-constraint violation.
470  */
471 SECUREC_API wchar_t *wcstok_s(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context);
472 #endif
473 
474 #if SECUREC_ENABLE_VSPRINTF
475 /*
476  * Description: The vswprintf_s function is the wide-character equivalent of the vsprintf_s function
477  * Parameter: strDest - produce output according to a format,write to the character string strDest
478  * Parameter: destMax - The maximum length of destination buffer(including the terminating null)
479  * Parameter: format - format string
480  * Parameter: argList - instead of a variable number of arguments
481  * Return:    the number of characters printed(not including the terminating null wide character),
482  * If an error occurred Return: -1.
483  */
484 SECUREC_API int vswprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, va_list argList);
485 #endif
486 
487 #if SECUREC_ENABLE_SPRINTF
488 /*
489  * Description: The swprintf_s function is the wide-character equivalent of the sprintf_s function
490  * Parameter: strDest - produce output according to a format,write to the character string strDest
491  * Parameter: destMax - The maximum length of destination buffer(including the terminating null)
492  * Parameter: format - format string
493  * Return:    the number of characters printed(not including the terminating null wide character),
494  * If an error occurred Return: -1.
495  */
496 SECUREC_API int swprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, ...);
497 #endif
498 
499 #if SECUREC_ENABLE_FSCANF
500 /*
501  * Description: The fwscanf_s function is the wide-character equivalent of the fscanf_s function
502  * Parameter: stream - stdio file stream
503  * Parameter: format - format string
504  * Return:    the number of input items assigned, If an error occurred Return: -1.
505  */
506 SECUREC_API int fwscanf_s(FILE *stream, const wchar_t *format, ...);
507 #endif
508 
509 #if SECUREC_ENABLE_VFSCANF
510 /*
511  * Description: The vfwscanf_s function is the wide-character equivalent of the vfscanf_s function
512  * Parameter: stream - stdio file stream
513  * Parameter: format - format string
514  * Parameter: argList - instead of  a variable number of arguments
515  * Return:    the number of input items assigned, If an error occurred Return: -1.
516  */
517 SECUREC_API int vfwscanf_s(FILE *stream, const wchar_t *format, va_list argList);
518 #endif
519 
520 #if SECUREC_ENABLE_SCANF
521 /*
522  * Description: The wscanf_s function is the wide-character equivalent of the scanf_s function
523  * Parameter: format - format string
524  * Return:    the number of input items assigned, If an error occurred Return: -1.
525  */
526 SECUREC_API int wscanf_s(const wchar_t *format, ...);
527 #endif
528 
529 #if SECUREC_ENABLE_VSCANF
530 /*
531  * Description: The vwscanf_s function is the wide-character equivalent of the vscanf_s function
532  * Parameter: format - format string
533  * Parameter: argList - instead of  a variable number of arguments
534  * Return:    the number of input items assigned, If an error occurred Return: -1.
535  */
536 SECUREC_API int vwscanf_s(const wchar_t *format, va_list argList);
537 #endif
538 
539 #if SECUREC_ENABLE_SSCANF
540 /*
541  * Description: The swscanf_s function is the wide-character equivalent of the sscanf_s function
542  * Parameter: buffer - read character from buffer
543  * Parameter: format - format string
544  * Return:    the number of input items assigned, If an error occurred Return: -1.
545  */
546 SECUREC_API int swscanf_s(const wchar_t *buffer, const wchar_t *format, ...);
547 #endif
548 
549 #if SECUREC_ENABLE_VSSCANF
550 /*
551  * Description: The vswscanf_s function is the wide-character equivalent of the vsscanf_s function
552  * Parameter: buffer -  read character from  buffer
553  * Parameter: format - format string
554  * Parameter: argList - instead of  a variable number of arguments
555  * Return:    the number of input items assigned, If an error occurred Return: -1.
556  */
557 SECUREC_API int vswscanf_s(const wchar_t *buffer, const wchar_t *format, va_list argList);
558 #endif
559 #endif /* SECUREC_ENABLE_WCHAR_FUNC */
560 #endif
561 
562 /* Those functions are used by macro,must declare hare, also for without function declaration warning */
563 extern errno_t strncpy_error(char *strDest, size_t destMax, const char *strSrc, size_t count);
564 extern errno_t strcpy_error(char *strDest, size_t destMax, const char *strSrc);
565 
566 #if SECUREC_WITH_PERFORMANCE_ADDONS
567 /* Those functions are used by macro */
568 extern errno_t memset_sOptAsm(void *dest, size_t destMax, int c, size_t count);
569 extern errno_t memset_sOptTc(void *dest, size_t destMax, int c, size_t count);
570 extern errno_t memcpy_sOptAsm(void *dest, size_t destMax, const void *src, size_t count);
571 extern errno_t memcpy_sOptTc(void *dest, size_t destMax, const void *src, size_t count);
572 
573 /* The strcpy_sp is a macro, not a function in performance optimization mode. */
574 #define strcpy_sp(dest, destMax, src)  ((__builtin_constant_p((destMax)) && \
575     __builtin_constant_p((src))) ?  \
576     SECUREC_STRCPY_SM((dest), (destMax), (src)) : \
577     strcpy_s((dest), (destMax), (src)))
578 
579 /* The strncpy_sp is a macro, not a function in performance optimization mode. */
580 #define strncpy_sp(dest, destMax, src, count)  ((__builtin_constant_p((count)) && \
581     __builtin_constant_p((destMax)) && \
582     __builtin_constant_p((src))) ?  \
583     SECUREC_STRNCPY_SM((dest), (destMax), (src), (count)) : \
584     strncpy_s((dest), (destMax), (src), (count)))
585 
586 /* The strcat_sp is a macro, not a function in performance optimization mode. */
587 #define strcat_sp(dest, destMax, src) ((__builtin_constant_p((destMax)) && \
588     __builtin_constant_p((src))) ?  \
589     SECUREC_STRCAT_SM((dest), (destMax), (src)) : \
590     strcat_s((dest), (destMax), (src)))
591 
592 /* The strncat_sp is a macro, not a function in performance optimization mode. */
593 #define strncat_sp(dest, destMax, src, count) ((__builtin_constant_p((count)) &&  \
594     __builtin_constant_p((destMax)) && \
595     __builtin_constant_p((src))) ?  \
596     SECUREC_STRNCAT_SM((dest), (destMax), (src), (count)) : \
597     strncat_s((dest), (destMax), (src), (count)))
598 
599 /* The memcpy_sp is a macro, not a function in performance optimization mode. */
600 #define memcpy_sp(dest, destMax, src, count)  (__builtin_constant_p((count)) ? \
601     (SECUREC_MEMCPY_SM((dest), (destMax), (src), (count))) : \
602     (__builtin_constant_p((destMax)) ? \
603     (((size_t)(destMax) > 0 && \
604     (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \
605     memcpy_sOptTc((dest), (destMax), (src), (count)) : ERANGE) : \
606     memcpy_sOptAsm((dest), (destMax), (src), (count))))
607 
608 /* The memset_sp is a macro, not a function in performance optimization mode. */
609 #define memset_sp(dest, destMax, c, count)  (__builtin_constant_p((count)) ? \
610     (SECUREC_MEMSET_SM((dest), (destMax), (c), (count))) : \
611     (__builtin_constant_p((destMax)) ? \
612     (((((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \
613     memset_sOptTc((dest), (destMax), (c), (count)) : ERANGE) : \
614     memset_sOptAsm((dest), (destMax), (c), (count))))
615 
616 #endif
617 
618 #ifdef __cplusplus
619 }
620 #endif
621 #endif
622 
623