• 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 #if defined(_MSC_VER)
89 #define SECUREC_API __declspec(dllexport)
90 #else /* build for linux */
91 #define SECUREC_API __attribute__((visibility("default")))
92 #endif /* end of _MSC_VER and SECUREC_DLL_EXPORT */
93 #elif defined(SECUREC_DLL_IMPORT)
94 #if defined(_MSC_VER)
95 #define SECUREC_API __declspec(dllimport)
96 #else
97 #define SECUREC_API
98 #endif /* end of _MSC_VER and SECUREC_DLL_IMPORT */
99 #else
100 /*
101  * Standardized function declaration. If a security function is declared in the your code,
102  * it may cause a compilation alarm,Please delete the security function you declared.
103  * Adding extern under windows will cause the system to have inline functions to expand,
104  * so do not add the extern in default
105  */
106 #if defined(_MSC_VER)
107 #define SECUREC_API
108 #else
109 #define SECUREC_API extern
110 #endif
111 #endif
112 #endif
113 
114 #ifdef __cplusplus
115 extern "C" {
116 #endif
117 /*
118  * Description: The GetHwSecureCVersion function get SecureC Version string and version number.
119  * Parameter: verNumber - to store version number (for example value is 0x500 | 0xa)
120  * Return:   version string
121  */
122 SECUREC_API const char *GetHwSecureCVersion(unsigned short *verNumber);
123 
124 #if SECUREC_ENABLE_MEMSET
125 /*
126  * Description: The memset_s function copies the value of c (converted to an unsigned char) into each of
127  * the first count characters of the object pointed to by dest.
128  * Parameter: dest - destination address
129  * Parameter: destMax - The maximum length of destination buffer
130  * Parameter: c - the value to be copied
131  * Parameter: count - copies count bytes of value to dest
132  * Return:    EOK if there was no runtime-constraint violation
133  */
134 SECUREC_API errno_t memset_s(void *dest, size_t destMax, int c, size_t count);
135 #endif
136 
137 #ifndef SECUREC_ONLY_DECLARE_MEMSET
138 #define SECUREC_ONLY_DECLARE_MEMSET     0
139 #endif
140 
141 #if !SECUREC_ONLY_DECLARE_MEMSET
142 
143 #if SECUREC_ENABLE_MEMMOVE
144 /*
145  * Description: The memmove_s function copies n characters from the object pointed to by src
146  * into the object pointed to by dest.
147  * Parameter: dest - destination  address
148  * Parameter: destMax - The maximum length of destination buffer
149  * Parameter: src - source address
150  * Parameter: count - copies count bytes from the src
151  * Return:    EOK if there was no runtime-constraint violation
152  */
153 SECUREC_API errno_t memmove_s(void *dest, size_t destMax, const void *src, size_t count);
154 #endif
155 
156 #if SECUREC_ENABLE_MEMCPY
157 /*
158  * Description: The memcpy_s function copies n characters from the object pointed to
159  * by src into the object pointed to by dest.
160  * Parameter: dest - destination  address
161  * Parameter: destMax - The maximum length of destination buffer
162  * Parameter: src - source address
163  * Parameter: count - copies count bytes from the  src
164  * Return:    EOK if there was no runtime-constraint violation
165  */
166 SECUREC_API errno_t memcpy_s(void *dest, size_t destMax, const void *src, size_t count);
167 #endif
168 
169 #if SECUREC_ENABLE_STRCPY
170 /*
171  * Description: The strcpy_s function copies the string pointed to by strSrc (including
172  * the terminating null character) into the array pointed to by strDest
173  * Parameter: strDest - destination  address
174  * Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
175  * Parameter: strSrc - source address
176  * Return:    EOK if there was no runtime-constraint violation
177  */
178 SECUREC_API errno_t strcpy_s(char *strDest, size_t destMax, const char *strSrc);
179 #endif
180 
181 #if SECUREC_ENABLE_STRNCPY
182 /*
183  * Description: The strncpy_s function copies not more than n successive characters (not including
184  * the terminating null character) from the array pointed to by strSrc to the array pointed to by strDest.
185  * Parameter: strDest - destination  address
186  * Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
187  * Parameter: strSrc - source  address
188  * Parameter: count - copies count characters from the src
189  * Return:    EOK if there was no runtime-constraint violation
190  */
191 SECUREC_API errno_t strncpy_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
192 #endif
193 
194 #if SECUREC_ENABLE_STRCAT
195 /*
196  * Description: The strcat_s function appends a copy of the string pointed to by strSrc (including
197  * the terminating null character) to the end of the string pointed to by strDest.
198  * Parameter: strDest - destination  address
199  * Parameter: destMax - The maximum length of destination buffer(including the terminating null wide character)
200  * Parameter: strSrc - source address
201  * Return:    EOK if there was no runtime-constraint violation
202  */
203 SECUREC_API errno_t strcat_s(char *strDest, size_t destMax, const char *strSrc);
204 #endif
205 
206 #if SECUREC_ENABLE_STRNCAT
207 /*
208  * Description: The strncat_s function appends not more than n successive characters (not including
209  * the terminating null character)
210  * from the array pointed to by strSrc to the end of the string pointed to by strDest.
211  * Parameter: strDest - destination address
212  * Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
213  * Parameter: strSrc - source address
214  * Parameter: count - copies count characters from the src
215  * Return:    EOK if there was no runtime-constraint violation
216  */
217 SECUREC_API errno_t strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
218 #endif
219 
220 #if SECUREC_ENABLE_VSPRINTF
221 /*
222  * Description: The vsprintf_s function is equivalent to the vsprintf 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 wide character)
226  * Parameter: format - format string
227  * Parameter: argList - instead of a variable number of arguments
228  * Return:    the number of characters printed(not including the terminating null byte '\0'),
229  * If an error occurred Return: -1.
230  */
231 SECUREC_API int vsprintf_s(char *strDest, size_t destMax, const char *format,
232                            va_list argList) SECUREC_ATTRIBUTE(3, 0);
233 #endif
234 
235 #if SECUREC_ENABLE_SPRINTF
236 /*
237  * Description: The sprintf_s function is equivalent to the sprintf function except for the parameter destMax
238  * and the explicit runtime-constraints violation
239  * Parameter: strDest -  produce output according to a format ,write to the character string strDest.
240  * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
241  * Parameter: format - format string
242  * Return:    the number of characters printed(not including the terminating null byte '\0'),
243  * If an error occurred Return: -1.
244 */
245 SECUREC_API int sprintf_s(char *strDest, size_t destMax, const char *format, ...) SECUREC_ATTRIBUTE(3, 4);
246 #endif
247 
248 #if SECUREC_ENABLE_VSNPRINTF
249 /*
250  * Description: The vsnprintf_s function is equivalent to the vsnprintf function except for
251  * the parameter destMax/count and the explicit runtime-constraints violation
252  * Parameter: strDest -  produce output according to a format ,write to the character string strDest.
253  * Parameter: destMax - The maximum length of destination buffer(including the terminating null  byte '\0')
254  * Parameter: count - do not write more than count bytes to strDest(not including the terminating null  byte '\0')
255  * Parameter: format - format string
256  * Parameter: argList - instead of  a variable number of arguments
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 vsnprintf_s(char *strDest, size_t destMax, size_t count, const char *format,
261                             va_list argList) SECUREC_ATTRIBUTE(4, 0);
262 #endif
263 
264 #if SECUREC_ENABLE_SNPRINTF
265 /*
266  * Description: The snprintf_s function is equivalent to the snprintf function except for
267  * the parameter destMax/count and the explicit runtime-constraints violation
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: count - do not write more than count bytes to strDest(not including the terminating null  byte '\0')
271  * Parameter: format - format string
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 -1 when truncation occurs.
274  */
275 SECUREC_API int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format,
276                            ...) SECUREC_ATTRIBUTE(4, 5);
277 #endif
278 
279 #if SECUREC_SNPRINTF_TRUNCATED
280 /*
281  * Description: The vsnprintf_truncated_s function is equivalent to the vsnprintf_s function except
282  * no count parameter and return value
283  * Parameter: strDest -  produce output according to a format ,write to the character string strDest
284  * Parameter: destMax - The maximum length of destination buffer(including the terminating null  byte '\0')
285  * Parameter: format - format string
286  * Parameter: argList - instead of  a variable  number of arguments
287  * Return:    the number of characters printed(not including the terminating null byte '\0'),
288  * If an error occurred Return: -1.Pay special attention to returning destMax - 1 when truncation occurs
289 */
290 SECUREC_API int vsnprintf_truncated_s(char *strDest, size_t destMax, const char *format,
291                                       va_list argList) SECUREC_ATTRIBUTE(3, 0);
292 
293 /*
294  * Description: The snprintf_truncated_s function is equivalent to the snprintf_s function except
295  * no count parameter and return value
296  * Parameter: strDest - produce output according to a format,write to the character string strDest.
297  * Parameter: destMax - The maximum length of destination buffer(including the terminating null byte '\0')
298  * Parameter: format - format string
299  * Return:    the number of characters printed(not including the terminating null byte '\0'),
300  * If an error occurred Return: -1.Pay special attention to returning destMax - 1 when truncation occurs.
301  */
302 SECUREC_API int snprintf_truncated_s(char *strDest, size_t destMax,
303                                      const char *format, ...) SECUREC_ATTRIBUTE(3, 4);
304 #endif
305 
306 #if SECUREC_ENABLE_SCANF
307 /*
308  * Description: The scanf_s function is equivalent to fscanf_s with the argument stdin
309  * interposed before the arguments to scanf_s
310  * Parameter: format - format string
311  * Return:    the number of input items assigned, If an error occurred Return: -1.
312  */
313 SECUREC_API int scanf_s(const char *format, ...);
314 #endif
315 
316 #if SECUREC_ENABLE_VSCANF
317 /*
318  * Description: The vscanf_s function is equivalent to scanf_s, with the variable argument list replaced by argList
319  * Parameter: format - format string
320  * Parameter: argList - instead of a variable number of arguments
321  * Return:    the number of input items assigned, If an error occurred Return: -1.
322  */
323 SECUREC_API int vscanf_s(const char *format, va_list argList);
324 #endif
325 
326 #if SECUREC_ENABLE_SSCANF
327 /*
328  * Description: The sscanf_s function is equivalent to fscanf_s, except that input is obtained from a
329  * string (specified by the argument buffer) rather than from a stream
330  * Parameter: buffer - read character from buffer
331  * Parameter: format - format string
332  * Return:    the number of input items assigned, If an error occurred Return: -1.
333  */
334 SECUREC_API int sscanf_s(const char *buffer, const char *format, ...);
335 #endif
336 
337 #if SECUREC_ENABLE_VSSCANF
338 /*
339  * Description: The vsscanf_s function is equivalent to sscanf_s, with the variable argument list
340  * replaced by argList
341  * Parameter: buffer -  read character from buffer
342  * Parameter: format - format string
343  * Parameter: argList - instead of a variable number of arguments
344  * Return:    the number of input items assigned, If an error occurred Return: -1.
345  */
346 SECUREC_API int vsscanf_s(const char *buffer, const char *format, va_list argList);
347 #endif
348 
349 #if SECUREC_ENABLE_FSCANF
350 /*
351  * Description: The fscanf_s function is equivalent to fscanf except that the c, s, and [ conversion specifiers
352  * apply to a pair of arguments (unless assignment suppression is indicated by a *)
353  * Parameter: stream - stdio file stream
354  * Parameter: format - format string
355  * Return:    the number of input items assigned, If an error occurred Return: -1.
356  */
357 SECUREC_API int fscanf_s(FILE *stream, const char *format, ...);
358 #endif
359 
360 #if SECUREC_ENABLE_VFSCANF
361 /*
362  * Description: The vfscanf_s function is equivalent to fscanf_s, with the variable argument list
363  * replaced by argList
364  * Parameter: stream - stdio file stream
365  * Parameter: format - format string
366  * Parameter: argList - instead of a variable number of arguments
367  * Return:    the number of input items assigned, If an error occurred Return: -1.
368  */
369 SECUREC_API int vfscanf_s(FILE *stream, const char *format, va_list argList);
370 #endif
371 
372 #if SECUREC_ENABLE_STRTOK
373 /*
374  * Description: The strtok_s function parses a string into a sequence of strToken,
375  * replace all characters in strToken string that match to strDelimit set with 0.
376  * On the first call to strtok_s the string to be parsed should be specified in strToken.
377  * In each subsequent call that should parse the same string, strToken should be NULL
378  * Parameter: strToken - the string to be delimited
379  * Parameter: strDelimit - specifies a set of characters that delimit the tokens in the parsed string
380  * Parameter: context - is a pointer to a char * variable that is used internally by strtok_s function
381  * Return:  On the first call returns the address of the first non \0 character, otherwise NULL is returned.
382  * In subsequent calls, the strtoken is set to NULL, and the context set is the same as the previous call,
383  * return NULL if the *context string length is equal 0, otherwise return *context.
384  */
385 SECUREC_API char *strtok_s(char *strToken, const char *strDelimit, char **context);
386 #endif
387 
388 #if SECUREC_ENABLE_GETS && !SECUREC_IN_KERNEL
389 /*
390  * Description: The gets_s function reads at most one less than the number of characters specified
391  * by destMax from the stream pointed to by stdin, into the array pointed to by buffer
392  * Parameter: buffer - destination address
393  * Parameter: destMax - The maximum length of destination buffer(including the terminating null character)
394  * Return:    buffer if there was no runtime-constraint violation,If an error occurred Return: NULL.
395  */
396 SECUREC_API char *gets_s(char *buffer, size_t destMax);
397 #endif
398 
399 #if SECUREC_ENABLE_WCHAR_FUNC
400 #if SECUREC_ENABLE_MEMCPY
401 /*
402  * Description: The wmemcpy_s function copies n successive wide characters from the object pointed to
403  * by src into the object pointed to by dest.
404  * Parameter: dest - destination  address
405  * Parameter: destMax - The maximum length of destination buffer
406  * Parameter: src - source address
407  * Parameter: count - copies count wide characters from the  src
408  * Return:    EOK if there was no runtime-constraint violation
409  */
410 SECUREC_API errno_t wmemcpy_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count);
411 #endif
412 
413 #if SECUREC_ENABLE_MEMMOVE
414 /*
415  * Description: The wmemmove_s function copies n successive wide characters from the object
416  * pointed to by src into the object pointed to by dest.
417  * Parameter: dest - destination  address
418  * Parameter: destMax - The maximum length of destination buffer
419  * Parameter: src - source address
420  * Parameter: count - copies count wide characters from the  src
421  * Return:    EOK if there was no runtime-constraint violation
422  */
423 SECUREC_API errno_t wmemmove_s(wchar_t *dest, size_t destMax, const wchar_t *src, size_t count);
424 #endif
425 
426 #if SECUREC_ENABLE_STRCPY
427 /*
428  * Description: The wcscpy_s function copies the wide string pointed to by strSrc(including the terminating
429  * null wide character) into the array pointed to by strDest
430  * Parameter: strDest - destination address
431  * Parameter: destMax - The maximum length of destination buffer
432  * Parameter: strSrc - source address
433  * Return:    EOK if there was no runtime-constraint violation
434  */
435 SECUREC_API errno_t wcscpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc);
436 #endif
437 
438 #if SECUREC_ENABLE_STRNCPY
439 /*
440  * Description: The wcsncpy_s function copies not more than n successive wide characters (not including the
441  * terminating null wide character) from the array pointed to by strSrc to the array pointed to by strDest
442  * Parameter: strDest - destination address
443  * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
444  * Parameter: strSrc - source address
445  * Parameter: count - copies count wide characters from the src
446  * Return:    EOK if there was no runtime-constraint violation
447  */
448 SECUREC_API errno_t wcsncpy_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count);
449 #endif
450 
451 #if SECUREC_ENABLE_STRCAT
452 /*
453  * Description: The wcscat_s function appends a copy of the wide string pointed to by strSrc (including the
454  * terminating null wide character) to the end of the wide string pointed to by strDest
455  * Parameter: strDest - destination  address
456  * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
457  * Parameter: strSrc - source address
458  * Return:    EOK if there was no runtime-constraint violation
459  */
460 SECUREC_API errno_t wcscat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc);
461 #endif
462 
463 #if SECUREC_ENABLE_STRNCAT
464 /*
465  * Description: The wcsncat_s function appends not more than n successive wide characters (not including the
466  * terminating null wide character) from the array pointed to by strSrc to the end of the wide string pointed to
467  * by strDest.
468  * Parameter: strDest - destination  address
469  * Parameter: destMax - The maximum length of destination buffer(including the terminating wide character)
470  * Parameter: strSrc - source  address
471  * Parameter: count - copies count wide characters from the  src
472  * Return:    EOK if there was no runtime-constraint violation
473  */
474 SECUREC_API errno_t wcsncat_s(wchar_t *strDest, size_t destMax, const wchar_t *strSrc, size_t count);
475 #endif
476 
477 #if SECUREC_ENABLE_STRTOK
478 /*
479  * Description: The wcstok_s function is the wide-character equivalent of the strtok_s function
480  * Parameter: strToken - the string to be delimited
481  * Parameter: strDelimit - specifies a set of characters that delimit the tokens in the parsed string
482  * Parameter: context - is a pointer to a char * variable that is used internally by strtok_s function
483  * Return:    a pointer to the first character of a token, or a null pointer if there is no token
484  * or there is a runtime-constraint violation.
485  */
486 SECUREC_API wchar_t *wcstok_s(wchar_t *strToken, const wchar_t *strDelimit, wchar_t **context);
487 #endif
488 
489 #if SECUREC_ENABLE_VSPRINTF
490 /*
491  * Description: The vswprintf_s function is the wide-character equivalent of the vsprintf_s function
492  * Parameter: strDest - produce output according to a format,write to the character string strDest
493  * Parameter: destMax - The maximum length of destination buffer(including the terminating null)
494  * Parameter: format - format string
495  * Parameter: argList - instead of a variable number of arguments
496  * Return:    the number of characters printed(not including the terminating null wide character),
497  * If an error occurred Return: -1.
498  */
499 SECUREC_API int vswprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, va_list argList);
500 #endif
501 
502 #if SECUREC_ENABLE_SPRINTF
503 /*
504  * Description: The swprintf_s function is the wide-character equivalent of the sprintf_s function
505  * Parameter: strDest - produce output according to a format,write to the character string strDest
506  * Parameter: destMax - The maximum length of destination buffer(including the terminating null)
507  * Parameter: format - format string
508  * Return:    the number of characters printed(not including the terminating null wide character),
509  * If an error occurred Return: -1.
510  */
511 SECUREC_API int swprintf_s(wchar_t *strDest, size_t destMax, const wchar_t *format, ...);
512 #endif
513 
514 #if SECUREC_ENABLE_FSCANF
515 /*
516  * Description: The fwscanf_s function is the wide-character equivalent of the fscanf_s function
517  * Parameter: stream - stdio file stream
518  * Parameter: format - format string
519  * Return:    the number of input items assigned, If an error occurred Return: -1.
520  */
521 SECUREC_API int fwscanf_s(FILE *stream, const wchar_t *format, ...);
522 #endif
523 
524 #if SECUREC_ENABLE_VFSCANF
525 /*
526  * Description: The vfwscanf_s function is the wide-character equivalent of the vfscanf_s function
527  * Parameter: stream - stdio file stream
528  * Parameter: format - format string
529  * Parameter: argList - instead of  a variable number of arguments
530  * Return:    the number of input items assigned, If an error occurred Return: -1.
531  */
532 SECUREC_API int vfwscanf_s(FILE *stream, const wchar_t *format, va_list argList);
533 #endif
534 
535 #if SECUREC_ENABLE_SCANF
536 /*
537  * Description: The wscanf_s function is the wide-character equivalent of the scanf_s function
538  * Parameter: format - format string
539  * Return:    the number of input items assigned, If an error occurred Return: -1.
540  */
541 SECUREC_API int wscanf_s(const wchar_t *format, ...);
542 #endif
543 
544 #if SECUREC_ENABLE_VSCANF
545 /*
546  * Description: The vwscanf_s function is the wide-character equivalent of the vscanf_s function
547  * Parameter: format - format string
548  * Parameter: argList - instead of  a variable number of arguments
549  * Return:    the number of input items assigned, If an error occurred Return: -1.
550  */
551 SECUREC_API int vwscanf_s(const wchar_t *format, va_list argList);
552 #endif
553 
554 #if SECUREC_ENABLE_SSCANF
555 /*
556  * Description: The swscanf_s function is the wide-character equivalent of the sscanf_s function
557  * Parameter: buffer - read character from buffer
558  * Parameter: format - format string
559  * Return:    the number of input items assigned, If an error occurred Return: -1.
560  */
561 SECUREC_API int swscanf_s(const wchar_t *buffer, const wchar_t *format, ...);
562 #endif
563 
564 #if SECUREC_ENABLE_VSSCANF
565 /*
566  * Description: The vswscanf_s function is the wide-character equivalent of the vsscanf_s function
567  * Parameter: buffer -  read character from  buffer
568  * Parameter: format - format string
569  * Parameter: argList - instead of  a variable number of arguments
570  * Return:    the number of input items assigned, If an error occurred Return: -1.
571  */
572 SECUREC_API int vswscanf_s(const wchar_t *buffer, const wchar_t *format, va_list argList);
573 #endif
574 #endif /* SECUREC_ENABLE_WCHAR_FUNC */
575 #endif
576 
577 /* Those functions are used by macro,must declare hare, also for without function declaration warning */
578 extern errno_t strncpy_error(char *strDest, size_t destMax, const char *strSrc, size_t count);
579 extern errno_t strcpy_error(char *strDest, size_t destMax, const char *strSrc);
580 
581 #if SECUREC_WITH_PERFORMANCE_ADDONS
582 /* Those functions are used by macro */
583 extern errno_t memset_sOptAsm(void *dest, size_t destMax, int c, size_t count);
584 extern errno_t memset_sOptTc(void *dest, size_t destMax, int c, size_t count);
585 extern errno_t memcpy_sOptAsm(void *dest, size_t destMax, const void *src, size_t count);
586 extern errno_t memcpy_sOptTc(void *dest, size_t destMax, const void *src, size_t count);
587 
588 /* The strcpy_sp is a macro, not a function in performance optimization mode. */
589 #define strcpy_sp(dest, destMax, src)  ((__builtin_constant_p((destMax)) && \
590     __builtin_constant_p((src))) ?  \
591     SECUREC_STRCPY_SM((dest), (destMax), (src)) : \
592     strcpy_s((dest), (destMax), (src)))
593 
594 /* The strncpy_sp is a macro, not a function in performance optimization mode. */
595 #define strncpy_sp(dest, destMax, src, count)  ((__builtin_constant_p((count)) && \
596     __builtin_constant_p((destMax)) && \
597     __builtin_constant_p((src))) ?  \
598     SECUREC_STRNCPY_SM((dest), (destMax), (src), (count)) : \
599     strncpy_s((dest), (destMax), (src), (count)))
600 
601 /* The strcat_sp is a macro, not a function in performance optimization mode. */
602 #define strcat_sp(dest, destMax, src) ((__builtin_constant_p((destMax)) && \
603     __builtin_constant_p((src))) ?  \
604     SECUREC_STRCAT_SM((dest), (destMax), (src)) : \
605     strcat_s((dest), (destMax), (src)))
606 
607 /* The strncat_sp is a macro, not a function in performance optimization mode. */
608 #define strncat_sp(dest, destMax, src, count) ((__builtin_constant_p((count)) &&  \
609     __builtin_constant_p((destMax)) && \
610     __builtin_constant_p((src))) ?  \
611     SECUREC_STRNCAT_SM((dest), (destMax), (src), (count)) : \
612     strncat_s((dest), (destMax), (src), (count)))
613 
614 /* The memcpy_sp is a macro, not a function in performance optimization mode. */
615 #define memcpy_sp(dest, destMax, src, count)  (__builtin_constant_p((count)) ? \
616     (SECUREC_MEMCPY_SM((dest), (destMax), (src), (count))) : \
617     (__builtin_constant_p((destMax)) ? \
618     (((size_t)(destMax) > 0 && \
619     (((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \
620     memcpy_sOptTc((dest), (destMax), (src), (count)) : ERANGE) : \
621     memcpy_sOptAsm((dest), (destMax), (src), (count))))
622 
623 /* The memset_sp is a macro, not a function in performance optimization mode. */
624 #define memset_sp(dest, destMax, c, count)  (__builtin_constant_p((count)) ? \
625     (SECUREC_MEMSET_SM((dest), (destMax), (c), (count))) : \
626     (__builtin_constant_p((destMax)) ? \
627     (((((unsigned long long)(destMax) & (unsigned long long)(-2)) < SECUREC_MEM_MAX_LEN)) ? \
628     memset_sOptTc((dest), (destMax), (c), (count)) : ERANGE) : \
629     memset_sOptAsm((dest), (destMax), (c), (count))))
630 
631 #endif
632 
633 #ifdef __cplusplus
634 }
635 #endif
636 #endif
637 
638