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