xref: /dpdk/app/test-mldev/parser.c (revision 2df20a1d345a5fc0a1b6dc0317d11fc7b1fda7e7)
1ac930a55SSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
2ac930a55SSrikanth Yalavarthi  * Copyright (c) 2016 Intel Corporation.
3ac930a55SSrikanth Yalavarthi  * Copyright (c) 2017 Cavium, Inc.
4ac930a55SSrikanth Yalavarthi  * Copyright (c) 2022 Marvell.
5ac930a55SSrikanth Yalavarthi  */
6ac930a55SSrikanth Yalavarthi 
7ac930a55SSrikanth Yalavarthi #include <ctype.h>
8ac930a55SSrikanth Yalavarthi #include <errno.h>
9ac930a55SSrikanth Yalavarthi #include <stdbool.h>
10ac930a55SSrikanth Yalavarthi #include <stdint.h>
11ac930a55SSrikanth Yalavarthi #include <stdlib.h>
12ac930a55SSrikanth Yalavarthi #include <string.h>
13ac930a55SSrikanth Yalavarthi 
14ac930a55SSrikanth Yalavarthi #include <rte_common.h>
15*2df20a1dSDavid Marchand #include <rte_string_fns.h>
16ac930a55SSrikanth Yalavarthi 
17ac930a55SSrikanth Yalavarthi #include "parser.h"
18ac930a55SSrikanth Yalavarthi 
19ac930a55SSrikanth Yalavarthi static uint32_t
get_hex_val(char c)20ac930a55SSrikanth Yalavarthi get_hex_val(char c)
21ac930a55SSrikanth Yalavarthi {
22ac930a55SSrikanth Yalavarthi 	switch (c) {
23ac930a55SSrikanth Yalavarthi 	case '0':
24ac930a55SSrikanth Yalavarthi 	case '1':
25ac930a55SSrikanth Yalavarthi 	case '2':
26ac930a55SSrikanth Yalavarthi 	case '3':
27ac930a55SSrikanth Yalavarthi 	case '4':
28ac930a55SSrikanth Yalavarthi 	case '5':
29ac930a55SSrikanth Yalavarthi 	case '6':
30ac930a55SSrikanth Yalavarthi 	case '7':
31ac930a55SSrikanth Yalavarthi 	case '8':
32ac930a55SSrikanth Yalavarthi 	case '9':
33ac930a55SSrikanth Yalavarthi 		return c - '0';
34ac930a55SSrikanth Yalavarthi 	case 'A':
35ac930a55SSrikanth Yalavarthi 	case 'B':
36ac930a55SSrikanth Yalavarthi 	case 'C':
37ac930a55SSrikanth Yalavarthi 	case 'D':
38ac930a55SSrikanth Yalavarthi 	case 'E':
39ac930a55SSrikanth Yalavarthi 	case 'F':
40ac930a55SSrikanth Yalavarthi 		return c - 'A' + 10;
41ac930a55SSrikanth Yalavarthi 	case 'a':
42ac930a55SSrikanth Yalavarthi 	case 'b':
43ac930a55SSrikanth Yalavarthi 	case 'c':
44ac930a55SSrikanth Yalavarthi 	case 'd':
45ac930a55SSrikanth Yalavarthi 	case 'e':
46ac930a55SSrikanth Yalavarthi 	case 'f':
47ac930a55SSrikanth Yalavarthi 		return c - 'a' + 10;
48ac930a55SSrikanth Yalavarthi 	default:
49ac930a55SSrikanth Yalavarthi 		return 0;
50ac930a55SSrikanth Yalavarthi 	}
51ac930a55SSrikanth Yalavarthi }
52ac930a55SSrikanth Yalavarthi 
53ac930a55SSrikanth Yalavarthi int
parser_read_arg_bool(const char * p)54ac930a55SSrikanth Yalavarthi parser_read_arg_bool(const char *p)
55ac930a55SSrikanth Yalavarthi {
56*2df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
57ac930a55SSrikanth Yalavarthi 	int result = -EINVAL;
58ac930a55SSrikanth Yalavarthi 
59ac930a55SSrikanth Yalavarthi 	if (((p[0] == 'y') && (p[1] == 'e') && (p[2] == 's')) ||
60ac930a55SSrikanth Yalavarthi 	    ((p[0] == 'Y') && (p[1] == 'E') && (p[2] == 'S'))) {
61ac930a55SSrikanth Yalavarthi 		p += 3;
62ac930a55SSrikanth Yalavarthi 		result = 1;
63ac930a55SSrikanth Yalavarthi 	}
64ac930a55SSrikanth Yalavarthi 
65ac930a55SSrikanth Yalavarthi 	if (((p[0] == 'o') && (p[1] == 'n')) || ((p[0] == 'O') && (p[1] == 'N'))) {
66ac930a55SSrikanth Yalavarthi 		p += 2;
67ac930a55SSrikanth Yalavarthi 		result = 1;
68ac930a55SSrikanth Yalavarthi 	}
69ac930a55SSrikanth Yalavarthi 
70ac930a55SSrikanth Yalavarthi 	if (((p[0] == 'n') && (p[1] == 'o')) || ((p[0] == 'N') && (p[1] == 'O'))) {
71ac930a55SSrikanth Yalavarthi 		p += 2;
72ac930a55SSrikanth Yalavarthi 		result = 0;
73ac930a55SSrikanth Yalavarthi 	}
74ac930a55SSrikanth Yalavarthi 
75ac930a55SSrikanth Yalavarthi 	if (((p[0] == 'o') && (p[1] == 'f') && (p[2] == 'f')) ||
76ac930a55SSrikanth Yalavarthi 	    ((p[0] == 'O') && (p[1] == 'F') && (p[2] == 'F'))) {
77ac930a55SSrikanth Yalavarthi 		p += 3;
78ac930a55SSrikanth Yalavarthi 		result = 0;
79ac930a55SSrikanth Yalavarthi 	}
80ac930a55SSrikanth Yalavarthi 
81*2df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
82ac930a55SSrikanth Yalavarthi 
83ac930a55SSrikanth Yalavarthi 	if (p[0] != '\0')
84ac930a55SSrikanth Yalavarthi 		return -EINVAL;
85ac930a55SSrikanth Yalavarthi 
86ac930a55SSrikanth Yalavarthi 	return result;
87ac930a55SSrikanth Yalavarthi }
88ac930a55SSrikanth Yalavarthi 
89ac930a55SSrikanth Yalavarthi int
parser_read_uint64(uint64_t * value,const char * p)90ac930a55SSrikanth Yalavarthi parser_read_uint64(uint64_t *value, const char *p)
91ac930a55SSrikanth Yalavarthi {
92ac930a55SSrikanth Yalavarthi 	char *next;
93ac930a55SSrikanth Yalavarthi 	uint64_t val;
94ac930a55SSrikanth Yalavarthi 
95*2df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
96ac930a55SSrikanth Yalavarthi 	if (!isdigit(*p))
97ac930a55SSrikanth Yalavarthi 		return -EINVAL;
98ac930a55SSrikanth Yalavarthi 
99ac930a55SSrikanth Yalavarthi 	val = strtoul(p, &next, 10);
100ac930a55SSrikanth Yalavarthi 	if (p == next)
101ac930a55SSrikanth Yalavarthi 		return -EINVAL;
102ac930a55SSrikanth Yalavarthi 
103ac930a55SSrikanth Yalavarthi 	p = next;
104ac930a55SSrikanth Yalavarthi 	switch (*p) {
105ac930a55SSrikanth Yalavarthi 	case 'T':
106ac930a55SSrikanth Yalavarthi 		val *= 1024ULL;
107ac930a55SSrikanth Yalavarthi 		/* fall through */
108ac930a55SSrikanth Yalavarthi 	case 'G':
109ac930a55SSrikanth Yalavarthi 		val *= 1024ULL;
110ac930a55SSrikanth Yalavarthi 		/* fall through */
111ac930a55SSrikanth Yalavarthi 	case 'M':
112ac930a55SSrikanth Yalavarthi 		val *= 1024ULL;
113ac930a55SSrikanth Yalavarthi 		/* fall through */
114ac930a55SSrikanth Yalavarthi 	case 'k':
115ac930a55SSrikanth Yalavarthi 	case 'K':
116ac930a55SSrikanth Yalavarthi 		val *= 1024ULL;
117ac930a55SSrikanth Yalavarthi 		p++;
118ac930a55SSrikanth Yalavarthi 		break;
119ac930a55SSrikanth Yalavarthi 	}
120ac930a55SSrikanth Yalavarthi 
121*2df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
122ac930a55SSrikanth Yalavarthi 	if (*p != '\0')
123ac930a55SSrikanth Yalavarthi 		return -EINVAL;
124ac930a55SSrikanth Yalavarthi 
125ac930a55SSrikanth Yalavarthi 	*value = val;
126ac930a55SSrikanth Yalavarthi 	return 0;
127ac930a55SSrikanth Yalavarthi }
128ac930a55SSrikanth Yalavarthi 
129ac930a55SSrikanth Yalavarthi int
parser_read_int32(int32_t * value,const char * p)130ac930a55SSrikanth Yalavarthi parser_read_int32(int32_t *value, const char *p)
131ac930a55SSrikanth Yalavarthi {
132ac930a55SSrikanth Yalavarthi 	char *next;
133ac930a55SSrikanth Yalavarthi 	int32_t val;
134ac930a55SSrikanth Yalavarthi 
135*2df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
13628a4a819SSrikanth Yalavarthi 	if ((*p != '-') && (!isdigit(*p)))
137ac930a55SSrikanth Yalavarthi 		return -EINVAL;
138ac930a55SSrikanth Yalavarthi 
139ac930a55SSrikanth Yalavarthi 	val = strtol(p, &next, 10);
14028a4a819SSrikanth Yalavarthi 	if ((*next != '\0') || (p == next))
141ac930a55SSrikanth Yalavarthi 		return -EINVAL;
142ac930a55SSrikanth Yalavarthi 
143ac930a55SSrikanth Yalavarthi 	*value = val;
144ac930a55SSrikanth Yalavarthi 	return 0;
145ac930a55SSrikanth Yalavarthi }
146ac930a55SSrikanth Yalavarthi 
147ac930a55SSrikanth Yalavarthi int
parser_read_int16(int16_t * value,const char * p)148ac930a55SSrikanth Yalavarthi parser_read_int16(int16_t *value, const char *p)
149ac930a55SSrikanth Yalavarthi {
150ac930a55SSrikanth Yalavarthi 	char *next;
151ac930a55SSrikanth Yalavarthi 	int16_t val;
152ac930a55SSrikanth Yalavarthi 
153*2df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
15428a4a819SSrikanth Yalavarthi 	if ((*p != '-') && (!isdigit(*p)))
155ac930a55SSrikanth Yalavarthi 		return -EINVAL;
156ac930a55SSrikanth Yalavarthi 
157ac930a55SSrikanth Yalavarthi 	val = strtol(p, &next, 10);
15828a4a819SSrikanth Yalavarthi 	if ((*next != '\0') || (p == next))
159ac930a55SSrikanth Yalavarthi 		return -EINVAL;
160ac930a55SSrikanth Yalavarthi 
161ac930a55SSrikanth Yalavarthi 	*value = val;
162ac930a55SSrikanth Yalavarthi 	return 0;
163ac930a55SSrikanth Yalavarthi }
164ac930a55SSrikanth Yalavarthi 
165ac930a55SSrikanth Yalavarthi int
parser_read_uint64_hex(uint64_t * value,const char * p)166ac930a55SSrikanth Yalavarthi parser_read_uint64_hex(uint64_t *value, const char *p)
167ac930a55SSrikanth Yalavarthi {
168ac930a55SSrikanth Yalavarthi 	char *next;
169ac930a55SSrikanth Yalavarthi 	uint64_t val;
170ac930a55SSrikanth Yalavarthi 
171*2df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(p);
172ac930a55SSrikanth Yalavarthi 
173ac930a55SSrikanth Yalavarthi 	val = strtoul(p, &next, 16);
174ac930a55SSrikanth Yalavarthi 	if (p == next)
175ac930a55SSrikanth Yalavarthi 		return -EINVAL;
176ac930a55SSrikanth Yalavarthi 
177*2df20a1dSDavid Marchand 	p = rte_str_skip_leading_spaces(next);
178ac930a55SSrikanth Yalavarthi 	if (*p != '\0')
179ac930a55SSrikanth Yalavarthi 		return -EINVAL;
180ac930a55SSrikanth Yalavarthi 
181ac930a55SSrikanth Yalavarthi 	*value = val;
182ac930a55SSrikanth Yalavarthi 	return 0;
183ac930a55SSrikanth Yalavarthi }
184ac930a55SSrikanth Yalavarthi 
185ac930a55SSrikanth Yalavarthi int
parser_read_uint32(uint32_t * value,const char * p)186ac930a55SSrikanth Yalavarthi parser_read_uint32(uint32_t *value, const char *p)
187ac930a55SSrikanth Yalavarthi {
188ac930a55SSrikanth Yalavarthi 	uint64_t val = 0;
189ac930a55SSrikanth Yalavarthi 	int ret = parser_read_uint64(&val, p);
190ac930a55SSrikanth Yalavarthi 
191ac930a55SSrikanth Yalavarthi 	if (ret < 0)
192ac930a55SSrikanth Yalavarthi 		return ret;
193ac930a55SSrikanth Yalavarthi 
194ac930a55SSrikanth Yalavarthi 	if (val > UINT32_MAX)
195ac930a55SSrikanth Yalavarthi 		return -ERANGE;
196ac930a55SSrikanth Yalavarthi 
197ac930a55SSrikanth Yalavarthi 	*value = val;
198ac930a55SSrikanth Yalavarthi 	return 0;
199ac930a55SSrikanth Yalavarthi }
200ac930a55SSrikanth Yalavarthi 
201ac930a55SSrikanth Yalavarthi int
parser_read_uint32_hex(uint32_t * value,const char * p)202ac930a55SSrikanth Yalavarthi parser_read_uint32_hex(uint32_t *value, const char *p)
203ac930a55SSrikanth Yalavarthi {
204ac930a55SSrikanth Yalavarthi 	uint64_t val = 0;
205ac930a55SSrikanth Yalavarthi 	int ret = parser_read_uint64_hex(&val, p);
206ac930a55SSrikanth Yalavarthi 
207ac930a55SSrikanth Yalavarthi 	if (ret < 0)
208ac930a55SSrikanth Yalavarthi 		return ret;
209ac930a55SSrikanth Yalavarthi 
210ac930a55SSrikanth Yalavarthi 	if (val > UINT32_MAX)
211ac930a55SSrikanth Yalavarthi 		return -ERANGE;
212ac930a55SSrikanth Yalavarthi 
213ac930a55SSrikanth Yalavarthi 	*value = val;
214ac930a55SSrikanth Yalavarthi 	return 0;
215ac930a55SSrikanth Yalavarthi }
216ac930a55SSrikanth Yalavarthi 
217ac930a55SSrikanth Yalavarthi int
parser_read_uint16(uint16_t * value,const char * p)218ac930a55SSrikanth Yalavarthi parser_read_uint16(uint16_t *value, const char *p)
219ac930a55SSrikanth Yalavarthi {
220ac930a55SSrikanth Yalavarthi 	uint64_t val = 0;
221ac930a55SSrikanth Yalavarthi 	int ret = parser_read_uint64(&val, p);
222ac930a55SSrikanth Yalavarthi 
223ac930a55SSrikanth Yalavarthi 	if (ret < 0)
224ac930a55SSrikanth Yalavarthi 		return ret;
225ac930a55SSrikanth Yalavarthi 
226ac930a55SSrikanth Yalavarthi 	if (val > UINT16_MAX)
227ac930a55SSrikanth Yalavarthi 		return -ERANGE;
228ac930a55SSrikanth Yalavarthi 
229ac930a55SSrikanth Yalavarthi 	*value = val;
230ac930a55SSrikanth Yalavarthi 	return 0;
231ac930a55SSrikanth Yalavarthi }
232ac930a55SSrikanth Yalavarthi 
233ac930a55SSrikanth Yalavarthi int
parser_read_uint16_hex(uint16_t * value,const char * p)234ac930a55SSrikanth Yalavarthi parser_read_uint16_hex(uint16_t *value, const char *p)
235ac930a55SSrikanth Yalavarthi {
236ac930a55SSrikanth Yalavarthi 	uint64_t val = 0;
237ac930a55SSrikanth Yalavarthi 	int ret = parser_read_uint64_hex(&val, p);
238ac930a55SSrikanth Yalavarthi 
239ac930a55SSrikanth Yalavarthi 	if (ret < 0)
240ac930a55SSrikanth Yalavarthi 		return ret;
241ac930a55SSrikanth Yalavarthi 
242ac930a55SSrikanth Yalavarthi 	if (val > UINT16_MAX)
243ac930a55SSrikanth Yalavarthi 		return -ERANGE;
244ac930a55SSrikanth Yalavarthi 
245ac930a55SSrikanth Yalavarthi 	*value = val;
246ac930a55SSrikanth Yalavarthi 	return 0;
247ac930a55SSrikanth Yalavarthi }
248ac930a55SSrikanth Yalavarthi 
249ac930a55SSrikanth Yalavarthi int
parser_read_uint8(uint8_t * value,const char * p)250ac930a55SSrikanth Yalavarthi parser_read_uint8(uint8_t *value, const char *p)
251ac930a55SSrikanth Yalavarthi {
252ac930a55SSrikanth Yalavarthi 	uint64_t val = 0;
253ac930a55SSrikanth Yalavarthi 	int ret = parser_read_uint64(&val, p);
254ac930a55SSrikanth Yalavarthi 
255ac930a55SSrikanth Yalavarthi 	if (ret < 0)
256ac930a55SSrikanth Yalavarthi 		return ret;
257ac930a55SSrikanth Yalavarthi 
258ac930a55SSrikanth Yalavarthi 	if (val > UINT8_MAX)
259ac930a55SSrikanth Yalavarthi 		return -ERANGE;
260ac930a55SSrikanth Yalavarthi 
261ac930a55SSrikanth Yalavarthi 	*value = val;
262ac930a55SSrikanth Yalavarthi 	return 0;
263ac930a55SSrikanth Yalavarthi }
264ac930a55SSrikanth Yalavarthi 
265ac930a55SSrikanth Yalavarthi int
parser_read_uint8_hex(uint8_t * value,const char * p)266ac930a55SSrikanth Yalavarthi parser_read_uint8_hex(uint8_t *value, const char *p)
267ac930a55SSrikanth Yalavarthi {
268ac930a55SSrikanth Yalavarthi 	uint64_t val = 0;
269ac930a55SSrikanth Yalavarthi 	int ret = parser_read_uint64_hex(&val, p);
270ac930a55SSrikanth Yalavarthi 
271ac930a55SSrikanth Yalavarthi 	if (ret < 0)
272ac930a55SSrikanth Yalavarthi 		return ret;
273ac930a55SSrikanth Yalavarthi 
274ac930a55SSrikanth Yalavarthi 	if (val > UINT8_MAX)
275ac930a55SSrikanth Yalavarthi 		return -ERANGE;
276ac930a55SSrikanth Yalavarthi 
277ac930a55SSrikanth Yalavarthi 	*value = val;
278ac930a55SSrikanth Yalavarthi 	return 0;
279ac930a55SSrikanth Yalavarthi }
280ac930a55SSrikanth Yalavarthi 
281ac930a55SSrikanth Yalavarthi int
parse_tokenize_string(char * string,char * tokens[],uint32_t * n_tokens)282ac930a55SSrikanth Yalavarthi parse_tokenize_string(char *string, char *tokens[], uint32_t *n_tokens)
283ac930a55SSrikanth Yalavarthi {
284ac930a55SSrikanth Yalavarthi 	uint32_t i;
285ac930a55SSrikanth Yalavarthi 
286ac930a55SSrikanth Yalavarthi 	if ((string == NULL) || (tokens == NULL) || (*n_tokens < 1))
287ac930a55SSrikanth Yalavarthi 		return -EINVAL;
288ac930a55SSrikanth Yalavarthi 
289ac930a55SSrikanth Yalavarthi 	for (i = 0; i < *n_tokens; i++) {
290ac930a55SSrikanth Yalavarthi 		tokens[i] = strtok_r(string, PARSE_DELIMITER, &string);
291ac930a55SSrikanth Yalavarthi 		if (tokens[i] == NULL)
292ac930a55SSrikanth Yalavarthi 			break;
293ac930a55SSrikanth Yalavarthi 	}
294ac930a55SSrikanth Yalavarthi 
295ac930a55SSrikanth Yalavarthi 	if ((i == *n_tokens) && (strtok_r(string, PARSE_DELIMITER, &string) != NULL))
296ac930a55SSrikanth Yalavarthi 		return -E2BIG;
297ac930a55SSrikanth Yalavarthi 
298ac930a55SSrikanth Yalavarthi 	*n_tokens = i;
299ac930a55SSrikanth Yalavarthi 	return 0;
300ac930a55SSrikanth Yalavarthi }
301ac930a55SSrikanth Yalavarthi 
302ac930a55SSrikanth Yalavarthi int
parse_hex_string(char * src,uint8_t * dst,uint32_t * size)303ac930a55SSrikanth Yalavarthi parse_hex_string(char *src, uint8_t *dst, uint32_t *size)
304ac930a55SSrikanth Yalavarthi {
305ac930a55SSrikanth Yalavarthi 	char *c;
306ac930a55SSrikanth Yalavarthi 	uint32_t len, i;
307ac930a55SSrikanth Yalavarthi 
308ac930a55SSrikanth Yalavarthi 	/* Check input parameters */
309ac930a55SSrikanth Yalavarthi 	if ((src == NULL) || (dst == NULL) || (size == NULL) || (*size == 0))
310ac930a55SSrikanth Yalavarthi 		return -1;
311ac930a55SSrikanth Yalavarthi 
312ac930a55SSrikanth Yalavarthi 	len = strlen(src);
313ac930a55SSrikanth Yalavarthi 	if (((len & 3) != 0) || (len > (*size) * 2))
314ac930a55SSrikanth Yalavarthi 		return -1;
315ac930a55SSrikanth Yalavarthi 	*size = len / 2;
316ac930a55SSrikanth Yalavarthi 
317ac930a55SSrikanth Yalavarthi 	for (c = src; *c != 0; c++) {
318ac930a55SSrikanth Yalavarthi 		if ((((*c) >= '0') && ((*c) <= '9')) || (((*c) >= 'A') && ((*c) <= 'F')) ||
319ac930a55SSrikanth Yalavarthi 		    (((*c) >= 'a') && ((*c) <= 'f')))
320ac930a55SSrikanth Yalavarthi 			continue;
321ac930a55SSrikanth Yalavarthi 
322ac930a55SSrikanth Yalavarthi 		return -1;
323ac930a55SSrikanth Yalavarthi 	}
324ac930a55SSrikanth Yalavarthi 
325ac930a55SSrikanth Yalavarthi 	/* Convert chars to bytes */
326ac930a55SSrikanth Yalavarthi 	for (i = 0; i < *size; i++)
327ac930a55SSrikanth Yalavarthi 		dst[i] = get_hex_val(src[2 * i]) * 16 + get_hex_val(src[2 * i + 1]);
328ac930a55SSrikanth Yalavarthi 
329ac930a55SSrikanth Yalavarthi 	return 0;
330ac930a55SSrikanth Yalavarthi }
331ac930a55SSrikanth Yalavarthi 
332ac930a55SSrikanth Yalavarthi int
parse_lcores_list(bool lcores[],int lcores_num,const char * corelist)333ac930a55SSrikanth Yalavarthi parse_lcores_list(bool lcores[], int lcores_num, const char *corelist)
334ac930a55SSrikanth Yalavarthi {
335ac930a55SSrikanth Yalavarthi 	int i, idx = 0;
336ac930a55SSrikanth Yalavarthi 	int min, max;
337ac930a55SSrikanth Yalavarthi 	char *end = NULL;
338ac930a55SSrikanth Yalavarthi 
339ac930a55SSrikanth Yalavarthi 	if (corelist == NULL)
340ac930a55SSrikanth Yalavarthi 		return -1;
341ac930a55SSrikanth Yalavarthi 	while (isblank(*corelist))
342ac930a55SSrikanth Yalavarthi 		corelist++;
343ac930a55SSrikanth Yalavarthi 	i = strlen(corelist);
344ac930a55SSrikanth Yalavarthi 	while ((i > 0) && isblank(corelist[i - 1]))
345ac930a55SSrikanth Yalavarthi 		i--;
346ac930a55SSrikanth Yalavarthi 
347ac930a55SSrikanth Yalavarthi 	/* Get list of lcores */
348ac930a55SSrikanth Yalavarthi 	min = RTE_MAX_LCORE;
349ac930a55SSrikanth Yalavarthi 	do {
350ac930a55SSrikanth Yalavarthi 		while (isblank(*corelist))
351ac930a55SSrikanth Yalavarthi 			corelist++;
352ac930a55SSrikanth Yalavarthi 		if (*corelist == '\0')
353ac930a55SSrikanth Yalavarthi 			return -1;
354ac930a55SSrikanth Yalavarthi 		idx = strtoul(corelist, &end, 10);
355ac930a55SSrikanth Yalavarthi 		if (idx < 0 || idx > lcores_num)
356ac930a55SSrikanth Yalavarthi 			return -1;
357ac930a55SSrikanth Yalavarthi 
358ac930a55SSrikanth Yalavarthi 		if (end == NULL)
359ac930a55SSrikanth Yalavarthi 			return -1;
360ac930a55SSrikanth Yalavarthi 		while (isblank(*end))
361ac930a55SSrikanth Yalavarthi 			end++;
362ac930a55SSrikanth Yalavarthi 		if (*end == '-') {
363ac930a55SSrikanth Yalavarthi 			min = idx;
364ac930a55SSrikanth Yalavarthi 		} else if ((*end == ',') || (*end == '\0')) {
365ac930a55SSrikanth Yalavarthi 			max = idx;
366ac930a55SSrikanth Yalavarthi 			if (min == RTE_MAX_LCORE)
367ac930a55SSrikanth Yalavarthi 				min = idx;
368ac930a55SSrikanth Yalavarthi 			for (idx = min; idx <= max; idx++) {
369ac930a55SSrikanth Yalavarthi 				if (lcores[idx] == 1)
370ac930a55SSrikanth Yalavarthi 					return -E2BIG;
371ac930a55SSrikanth Yalavarthi 				lcores[idx] = 1;
372ac930a55SSrikanth Yalavarthi 			}
373ac930a55SSrikanth Yalavarthi 
374ac930a55SSrikanth Yalavarthi 			min = RTE_MAX_LCORE;
375ac930a55SSrikanth Yalavarthi 		} else
376ac930a55SSrikanth Yalavarthi 			return -1;
377ac930a55SSrikanth Yalavarthi 		corelist = end + 1;
378ac930a55SSrikanth Yalavarthi 	} while (*end != '\0');
379ac930a55SSrikanth Yalavarthi 
380ac930a55SSrikanth Yalavarthi 	return 0;
381ac930a55SSrikanth Yalavarthi }
382