xref: /dpdk/lib/eal/include/rte_string_fns.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2019 Intel Corporation
3  */
4 
5 /**
6  * @file
7  *
8  * String-related functions as replacement for libc equivalents
9  */
10 
11 #ifndef _RTE_STRING_FNS_H_
12 #define _RTE_STRING_FNS_H_
13 
14 #include <ctype.h>
15 #include <stdio.h>
16 #include <string.h>
17 
18 #include <rte_common.h>
19 #include <rte_compat.h>
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 /**
26  * Takes string "string" parameter and splits it at character "delim"
27  * up to maxtokens-1 times - to give "maxtokens" resulting tokens. Like
28  * strtok or strsep functions, this modifies its input string, by replacing
29  * instances of "delim" with '\\0'. All resultant tokens are returned in the
30  * "tokens" array which must have enough entries to hold "maxtokens".
31  *
32  * @param string
33  *   The input string to be split into tokens
34  *
35  * @param stringlen
36  *   The max length of the input buffer
37  *
38  * @param tokens
39  *   The array to hold the pointers to the tokens in the string
40  *
41  * @param maxtokens
42  *   The number of elements in the tokens array. At most, maxtokens-1 splits
43  *   of the string will be done.
44  *
45  * @param delim
46  *   The character on which the split of the data will be done
47  *
48  * @return
49  *   The number of tokens in the tokens array.
50  */
51 int
52 rte_strsplit(char *string, int stringlen,
53              char **tokens, int maxtokens, char delim);
54 
55 /**
56  * @internal
57  * DPDK-specific version of strlcpy for systems without
58  * libc or libbsd copies of the function
59  */
60 static inline size_t
61 rte_strlcpy(char *dst, const char *src, size_t size)
62 {
63 	return (size_t)snprintf(dst, size, "%s", src);
64 }
65 
66 /**
67  * @internal
68  * DPDK-specific version of strlcat for systems without
69  * libc or libbsd copies of the function
70  */
71 static inline size_t
72 rte_strlcat(char *dst, const char *src, size_t size)
73 {
74 	size_t l = strnlen(dst, size);
75 	if (l < size)
76 		return l + rte_strlcpy(&dst[l], src, size - l);
77 	return l + strlen(src);
78 }
79 
80 #ifdef __cplusplus
81 }
82 #endif
83 
84 /* pull in a strlcpy function */
85 #ifdef RTE_EXEC_ENV_FREEBSD
86 #ifndef __BSD_VISIBLE /* non-standard functions are hidden */
87 #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
88 #define strlcat(dst, src, size) rte_strlcat(dst, src, size)
89 #endif
90 
91 #else /* non-BSD platforms */
92 #ifdef RTE_USE_LIBBSD
93 #include <bsd/string.h>
94 
95 #else /* no BSD header files, create own */
96 #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
97 #define strlcat(dst, src, size) rte_strlcat(dst, src, size)
98 
99 #endif /* RTE_USE_LIBBSD */
100 #endif /* FREEBSD */
101 
102 #ifdef __cplusplus
103 extern "C" {
104 #endif
105 
106 /**
107  * Copy string src to buffer dst of size dsize.
108  * At most dsize-1 chars will be copied.
109  * Always NUL-terminates, unless (dsize == 0).
110  *
111  * @param dst
112  *   The destination string.
113  *
114  * @param src
115  *   The input string to be copied.
116  *
117  * @param dsize
118  *   Length in bytes of the destination buffer.
119  *
120  * @return
121  *   The number of bytes copied (terminating NUL-byte excluded) on success.
122  *   -E2BIG if the destination buffer is too small.
123  *   rte_errno is set.
124  */
125 ssize_t
126 rte_strscpy(char *dst, const char *src, size_t dsize);
127 
128 /**
129  * @warning
130  * @b EXPERIMENTAL: this API may change without prior notice.
131  *
132  * Search for the first non whitespace character.
133  *
134  * @param src
135  *   The input string to be analysed.
136  *
137  * @return
138  *  The address of the first non whitespace character.
139  */
140 __rte_experimental
141 static inline const char *
142 rte_str_skip_leading_spaces(const char *src)
143 {
144 	const char *p = src;
145 
146 	while (isspace(*p))
147 		p++;
148 
149 	return p;
150 }
151 
152 #ifdef __cplusplus
153 }
154 #endif
155 
156 #endif /* RTE_STRING_FNS_H */
157