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 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 /* 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 rte_str_skip_leading_spaces(const char *src) 135 { 136 const char *p = src; 137 138 while (isspace(*p)) 139 p++; 140 141 return p; 142 } 143 144 145 #ifdef __cplusplus 146 } 147 #endif 148 149 #endif /* RTE_STRING_FNS_H */ 150