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 : : #ifdef __cplusplus
15 : : extern "C" {
16 : : #endif
17 : :
18 : : #include <ctype.h>
19 : : #include <stdio.h>
20 : : #include <string.h>
21 : :
22 : : #include <rte_common.h>
23 : : #include <rte_compat.h>
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 [ - + - + : 73098 : 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 : 71335 : rte_strlcat(char *dst, const char *src, size_t size)
73 : : {
74 : 71335 : size_t l = strnlen(dst, size);
75 [ + - ]: 71335 : if (l < size)
76 : 71335 : return l + rte_strlcpy(&dst[l], src, size - l);
77 : 0 : return l + strlen(src);
78 : : }
79 : :
80 : : /* pull in a strlcpy function */
81 : : #ifdef RTE_EXEC_ENV_FREEBSD
82 : : #ifndef __BSD_VISIBLE /* non-standard functions are hidden */
83 : : #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
84 : : #define strlcat(dst, src, size) rte_strlcat(dst, src, size)
85 : : #endif
86 : :
87 : : #else /* non-BSD platforms */
88 : : #ifdef RTE_USE_LIBBSD
89 : : #include <bsd/string.h>
90 : :
91 : : #else /* no BSD header files, create own */
92 : : #define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
93 : : #define strlcat(dst, src, size) rte_strlcat(dst, src, size)
94 : :
95 : : #endif /* RTE_USE_LIBBSD */
96 : : #endif /* FREEBSD */
97 : :
98 : : /**
99 : : * Copy string src to buffer dst of size dsize.
100 : : * At most dsize-1 chars will be copied.
101 : : * Always NUL-terminates, unless (dsize == 0).
102 : : *
103 : : * @param dst
104 : : * The destination string.
105 : : *
106 : : * @param src
107 : : * The input string to be copied.
108 : : *
109 : : * @param dsize
110 : : * Length in bytes of the destination buffer.
111 : : *
112 : : * @return
113 : : * The number of bytes copied (terminating NUL-byte excluded) on success.
114 : : * -E2BIG if the destination buffer is too small.
115 : : * rte_errno is set.
116 : : */
117 : : ssize_t
118 : : rte_strscpy(char *dst, const char *src, size_t dsize);
119 : :
120 : : /**
121 : : * @warning
122 : : * @b EXPERIMENTAL: this API may change without prior notice.
123 : : *
124 : : * Search for the first non whitespace character.
125 : : *
126 : : * @param src
127 : : * The input string to be analysed.
128 : : *
129 : : * @return
130 : : * The address of the first non whitespace character.
131 : : */
132 : : __rte_experimental
133 : : static inline const char *
134 : 3 : rte_str_skip_leading_spaces(const char *src)
135 : : {
136 : : const char *p = src;
137 : :
138 [ + + ]: 9 : while (isspace(*p))
139 : 6 : p++;
140 : :
141 : 3 : return p;
142 : : }
143 : :
144 : :
145 : : #ifdef __cplusplus
146 : : }
147 : : #endif
148 : :
149 : : #endif /* RTE_STRING_FNS_H */
|