xref: /dpdk/lib/eal/common/eal_common_string_fns.c (revision b7fe612ac1de393f869c9818d5503633c8e96b36)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #include <string.h>
6 #include <stdio.h>
7 #include <stdarg.h>
8 #include <errno.h>
9 
10 #include <rte_string_fns.h>
11 
12 /* split string into tokens */
13 int
14 rte_strsplit(char *string, int stringlen,
15 	     char **tokens, int maxtokens, char delim)
16 {
17 	int i, tok = 0;
18 	int tokstart = 1; /* first token is right at start of string */
19 
20 	if (string == NULL || tokens == NULL)
21 		goto einval_error;
22 
23 	for (i = 0; i < stringlen; i++) {
24 		if (string[i] == '\0' || tok >= maxtokens)
25 			break;
26 		if (tokstart) {
27 			tokstart = 0;
28 			tokens[tok++] = &string[i];
29 		}
30 		if (string[i] == delim) {
31 			string[i] = '\0';
32 			tokstart = 1;
33 		}
34 	}
35 	return tok;
36 
37 einval_error:
38 	errno = EINVAL;
39 	return -1;
40 }
41 
42 /* Copy src string into dst.
43  *
44  * Return negative value and NUL-terminate if dst is too short,
45  * Otherwise return number of bytes copied.
46  */
47 ssize_t
48 rte_strscpy(char *dst, const char *src, size_t dsize)
49 {
50 	size_t nleft = dsize;
51 	size_t res = 0;
52 
53 	/* Copy as many bytes as will fit. */
54 	while (nleft != 0) {
55 		dst[res] = src[res];
56 		if (src[res] == '\0')
57 			return res;
58 		res++;
59 		nleft--;
60 	}
61 
62 	/* Not enough room in dst, set NUL and return error. */
63 	if (res != 0)
64 		dst[res - 1] = '\0';
65 	return -E2BIG;
66 }
67