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