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: snprintf_s function
12 * Create: 2014-02-25
13 */
14
15 #include "securec.h"
16
17 #if SECUREC_ENABLE_SNPRINTF
18 /*
19 * <FUNCTION DESCRIPTION>
20 * The snprintf_s function is equivalent to the snprintf function
21 * except for the parameter destMax/count and the explicit runtime-constraints violation
22 * The snprintf_s function formats and stores count or fewer characters in
23 * strDest and appends a terminating null. Each argument (if any) is converted
24 * and output according to the corresponding format specification in format.
25 * The formatting is consistent with the printf family of functions; If copying
26 * occurs between strings that overlap, the behavior is undefined.
27 *
28 * <INPUT PARAMETERS>
29 * strDest Storage location for the output.
30 * destMax The size of the storage location for output. Size
31 * in bytes for snprintf_s or size in words for snwprintf_s.
32 * count Maximum number of character to store.
33 * format Format-control string.
34 * ... Optional arguments.
35 *
36 * <OUTPUT PARAMETERS>
37 * strDest is updated
38 *
39 * <RETURN VALUE>
40 * return the number of characters written, not including the terminating null
41 * return -1 if an error occurs.
42 * return -1 if count < destMax and the output string has been truncated
43 *
44 * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
45 *
46 */
snprintf_s(char * strDest,size_t destMax,size_t count,const char * format,...)47 int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format, ...)
48 {
49 int ret; /* If initialization causes e838 */
50 va_list argList;
51
52 va_start(argList, format);
53 ret = vsnprintf_s(strDest, destMax, count, format, argList);
54 va_end(argList);
55 (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
56
57 return ret;
58 }
59 #if SECUREC_EXPORT_KERNEL_SYMBOL
60 EXPORT_SYMBOL(snprintf_s);
61 #endif
62 #endif
63
64 #if SECUREC_SNPRINTF_TRUNCATED
65 /*
66 * <FUNCTION DESCRIPTION>
67 * The snprintf_truncated_s function is equivalent to the snprintf function
68 * except for the parameter destMax/count and the explicit runtime-constraints violation
69 * The snprintf_truncated_s function formats and stores count or fewer characters in
70 * strDest and appends a terminating null. Each argument (if any) is converted
71 * and output according to the corresponding format specification in format.
72 * The formatting is consistent with the printf family of functions; If copying
73 * occurs between strings that overlap, the behavior is undefined.
74 *
75 * <INPUT PARAMETERS>
76 * strDest Storage location for the output.
77 * destMax The size of the storage location for output. Size
78 * in bytes for snprintf_truncated_s or size in words for snwprintf_s.
79 * format Format-control string.
80 * ... Optional arguments.
81 *
82 * <OUTPUT PARAMETERS>
83 * strDest is updated
84 *
85 * <RETURN VALUE>
86 * return the number of characters written, not including the terminating null
87 * return -1 if an error occurs.
88 * return destMax-1 if output string has been truncated
89 *
90 * If there is a runtime-constraint violation, strDest[0] will be set to the '\0' when strDest and destMax valid
91 *
92 */
snprintf_truncated_s(char * strDest,size_t destMax,const char * format,...)93 int snprintf_truncated_s(char *strDest, size_t destMax, const char *format, ...)
94 {
95 int ret; /* If initialization causes e838 */
96 va_list argList;
97
98 va_start(argList, format);
99 ret = vsnprintf_truncated_s(strDest, destMax, format, argList);
100 va_end(argList);
101 (void)argList; /* To clear e438 last value assigned not used , the compiler will optimize this code */
102
103 return ret;
104 }
105 #if SECUREC_EXPORT_KERNEL_SYMBOL
106 EXPORT_SYMBOL(snprintf_truncated_s);
107 #endif
108
109 #endif
110
111