xref: /dpdk/lib/eal/common/eal_common_string_fns.c (revision 347623c9c7cd4ff95c9e734d743e4247e5aaa01a)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #include <stdio.h>
6 #include <errno.h>
7 
8 #include <rte_string_fns.h>
9 #include <rte_errno.h>
10 
11 /* split string into tokens */
12 int
13 rte_strsplit(char *string, int stringlen,
14 	     char **tokens, int maxtokens, char delim)
15 {
16 	int i, tok = 0;
17 	int tokstart = 1; /* first token is right at start of string */
18 
19 	if (string == NULL || tokens == NULL)
20 		goto einval_error;
21 
22 	for (i = 0; i < stringlen; i++) {
23 		if (string[i] == '\0' || tok >= maxtokens)
24 			break;
25 		if (tokstart) {
26 			tokstart = 0;
27 			tokens[tok++] = &string[i];
28 		}
29 		if (string[i] == delim) {
30 			string[i] = '\0';
31 			tokstart = 1;
32 		}
33 	}
34 	return tok;
35 
36 einval_error:
37 	errno = EINVAL;
38 	return -1;
39 }
40 
41 /* Copy src string into dst.
42  *
43  * Return negative value and NUL-terminate if dst is too short,
44  * Otherwise return number of bytes copied.
45  */
46 ssize_t
47 rte_strscpy(char *dst, const char *src, size_t dsize)
48 {
49 	size_t nleft = dsize;
50 	size_t res = 0;
51 
52 	/* Copy as many bytes as will fit. */
53 	while (nleft != 0) {
54 		dst[res] = src[res];
55 		if (src[res] == '\0')
56 			return res;
57 		res++;
58 		nleft--;
59 	}
60 
61 	/* Not enough room in dst, set NUL and return error. */
62 	if (res != 0)
63 		dst[res - 1] = '\0';
64 	rte_errno = E2BIG;
65 	return -rte_errno;
66 }
67 
68 uint64_t
69 rte_str_to_size(const char *str)
70 {
71 	char *endptr;
72 	unsigned long long size;
73 
74 	while (isspace((int)*str))
75 		str++;
76 	if (*str == '-')
77 		return 0;
78 
79 	errno = 0;
80 	size = strtoull(str, &endptr, 0);
81 	if (errno)
82 		return 0;
83 
84 	if (*endptr == ' ')
85 		endptr++; /* allow 1 space gap */
86 
87 	switch (*endptr) {
88 	case 'G': case 'g':
89 		size *= 1024; /* fall-through */
90 	case 'M': case 'm':
91 		size *= 1024; /* fall-through */
92 	case 'K': case 'k':
93 		size *= 1024; /* fall-through */
94 	default:
95 		break;
96 	}
97 	return size;
98 }
99