| 479 | } |
| 480 | |
| 481 | static int |
| 482 | parse_xstats_list(const char *in_str, struct rte_eth_xstat_name **xstats, |
| 483 | unsigned int *xstats_num) |
| 484 | { |
| 485 | int max_names_nb, names_nb, nonempty_names_nb; |
| 486 | int name, nonempty_name; |
| 487 | int stringlen; |
| 488 | char **names; |
| 489 | char *str; |
| 490 | int ret; |
| 491 | int i; |
| 492 | |
| 493 | names = NULL; |
| 494 | str = strdup(in_str); |
| 495 | if (str == NULL) { |
| 496 | ret = -ENOMEM; |
| 497 | goto out; |
| 498 | } |
| 499 | stringlen = strlen(str); |
| 500 | |
| 501 | for (i = 0, max_names_nb = 1; str[i] != '\0'; i++) { |
| 502 | if (str[i] == ',') |
| 503 | max_names_nb++; |
| 504 | } |
| 505 | |
| 506 | names = calloc(max_names_nb, sizeof(*names)); |
| 507 | if (names == NULL) { |
| 508 | ret = -ENOMEM; |
| 509 | goto out; |
| 510 | } |
| 511 | |
| 512 | names_nb = rte_strsplit(str, stringlen, names, max_names_nb, ','); |
| 513 | if (names_nb < 0) { |
| 514 | ret = -EINVAL; |
| 515 | goto out; |
| 516 | } |
| 517 | |
| 518 | nonempty_names_nb = 0; |
| 519 | for (i = 0; i < names_nb; i++) { |
| 520 | if (names[i][0] == '\0') |
| 521 | continue; |
| 522 | nonempty_names_nb++; |
| 523 | } |
| 524 | *xstats = calloc(nonempty_names_nb, sizeof(**xstats)); |
| 525 | if (*xstats == NULL) { |
| 526 | ret = -ENOMEM; |
| 527 | goto out; |
| 528 | } |
| 529 | |
| 530 | for (name = nonempty_name = 0; name < names_nb; name++) { |
| 531 | if (names[name][0] == '\0') |
| 532 | continue; |
| 533 | rte_strscpy((*xstats)[nonempty_name].name, names[name], |
| 534 | sizeof((*xstats)[nonempty_name].name)); |
| 535 | nonempty_name++; |
| 536 | } |
| 537 | |
| 538 | *xstats_num = nonempty_names_nb; |
no test coverage detected