Branch data Line data Source code
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 [ - + - + : 82257 : 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 : 80397 : rte_strlcat(char *dst, const char *src, size_t size)
73 : : {
74 : 80397 : size_t l = strnlen(dst, size);
75 [ + - ]: 80397 : if (l < size)
76 : 80397 : return l + rte_strlcpy(&dst[l], src, size - l);
77 : 0 : 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 : 3 : rte_str_skip_leading_spaces(const char *src)
143 : : {
144 : : const char *p = src;
145 : :
146 [ + + ]: 9 : while (isspace(*p))
147 : 6 : p++;
148 : :
149 : 3 : return p;
150 : : }
151 : :
152 : : #ifdef __cplusplus
153 : : }
154 : : #endif
155 : :
156 : : #endif /* RTE_STRING_FNS_H */
|