/* * NAME * strlisttonums * * DESCRIPTION * Converts string of characters representing list of numbers into array of * numbers. Allowed formats are: * 0,1,2,3 * 0-10,20-18 * 1,3,5-8,10,0x10-12 * * Numbers can be in decimal or hexadecimal format. * * PARAMETERS * `s' String representing list of unsigned numbers. * `nums' Array to put converted numeric values into. * `max' Maximum number of elements that nums can accommodate. * * RETURN VALUE * Number of elements placed into nums. */ static size_t strlisttonums(char *s, uint64_t *nums, size_t max) { int ret; size_t index = 0; char *saveptr = NULL; if (s == NULL || nums == NULL || max == 0) return index; for (;;) { char *p = NULL; char *token = NULL; token = strtok_r(s, ",", &saveptr); if (token == NULL) break; s = NULL; while (isspace(*token)) token++; if (*token == '\0') continue; p = strchr(token, '-'); if (p != NULL) { uint64_t n, start, end; *p = '\0'; ret = strtouint64(token, &start); if (ret < 0) return (0); ret = strtouint64(p + 1, &end); if (ret < 0) return (0); if (start > end) { return (0); } for (n = start; n <= end; n++) { if (!(isdup(nums, index, n))) { nums[index] = n; index++; } if (index >= max) return index; } } else { uint64_t val; ret = strtouint64(token, &val); if (ret < 0) return (0); if (!(isdup(nums, index, val))) { nums[index] = val; index++; } if (index >= max) return index; } } return index; }
unsigned strlisttotab(char *s, uint64_t *tab, const unsigned max) { unsigned index = 0; char *saveptr = NULL; if (s == NULL || tab == NULL || max == 0) return index; for (;;) { char *p = NULL; char *token = NULL; token = strtok_r(s, ",", &saveptr); if (token == NULL) break; s = NULL; /* get rid of leading spaces & skip empty tokens */ while (isspace(*token)) token++; if (*token == '\0') continue; p = strchr(token, '-'); if (p != NULL) { /** * range of numbers provided * example: 1-5 or 12-9 */ uint64_t n, start, end; *p = '\0'; start = strtouint64(token); end = strtouint64(p+1); if (start > end) { /** * no big deal just swap start with end */ n = start; start = end; end = n; } for (n = start; n <= end; n++) { if (!(isdup(tab, index, n))) { tab[index] = n; index++; } if (index >= max) return index; } } else { /** * single number provided here * remove duplicates if necessary */ uint64_t val = strtouint64(token); if (!(isdup(tab, index, val))) { tab[index] = val; index++; } if (index >= max) return index; } } return index; }