Skip to content

Commit 72f3ab6

Browse files
calebsanderigaw
authored andcommittedJul 17, 2024
util: avoid duplication in argconfig_parse_comma_sep_array*()
Use the loop body to convert the first token to an int. Extend the existing macro so it can be used to define all the functions. Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
1 parent 8b902ec commit 72f3ab6

File tree

1 file changed

+17
-146
lines changed

1 file changed

+17
-146
lines changed
 

‎util/argconfig.c

+17-146
Original file line numberDiff line numberDiff line change
@@ -372,133 +372,9 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc,
372372
return ret;
373373
}
374374

375-
int argconfig_parse_comma_sep_array(char *string, int *val, unsigned int max_length)
376-
{
377-
int ret = 0;
378-
unsigned long v;
379-
char *tmp;
380-
char *p;
381-
382-
if (is_null_or_empty(string))
383-
return 0;
384-
385-
tmp = strtok(string, ",");
386-
if (!tmp)
387-
return 0;
388-
389-
v = strtoul(tmp, &p, 0);
390-
if (*p != 0)
391-
return -1;
392-
if (v > UINT_MAX) {
393-
fprintf(stderr, "%s out of range\n", tmp);
394-
return -1;
395-
}
396-
val[ret] = v;
397-
398-
ret++;
399-
while (1) {
400-
tmp = strtok(NULL, ",");
401-
402-
if (tmp == NULL)
403-
return ret;
404-
405-
if (ret >= max_length)
406-
return -1;
407-
408-
v = strtoul(tmp, &p, 0);
409-
if (*p != 0)
410-
return -1;
411-
if (v > UINT_MAX) {
412-
fprintf(stderr, "%s out of range\n", tmp);
413-
return -1;
414-
}
415-
val[ret] = v;
416-
ret++;
417-
}
418-
}
419-
420-
int argconfig_parse_comma_sep_array_short(char *string, unsigned short *val,
421-
unsigned int max_length)
422-
{
423-
int ret = 0;
424-
unsigned long v;
425-
char *tmp;
426-
char *p;
427-
428-
if (is_null_or_empty(string))
429-
return 0;
430-
431-
tmp = strtok(string, ",");
432-
if (!tmp)
433-
return 0;
434-
435-
v = strtoul(tmp, &p, 0);
436-
if (*p != 0)
437-
return -1;
438-
if (v > UINT16_MAX) {
439-
fprintf(stderr, "%s out of range\n", tmp);
440-
return -1;
441-
}
442-
val[ret] = v;
443-
ret++;
444-
445-
while (1) {
446-
tmp = strtok(NULL, ",");
447-
if (tmp == NULL)
448-
return ret;
449-
450-
if (ret >= max_length)
451-
return -1;
452-
453-
v = strtoul(tmp, &p, 0);
454-
if (*p != 0)
455-
return -1;
456-
if (v > UINT16_MAX) {
457-
fprintf(stderr, "%s out of range\n", tmp);
458-
return -1;
459-
}
460-
val[ret] = v;
461-
ret++;
462-
}
463-
}
464-
465-
int argconfig_parse_comma_sep_array_long(char *string, unsigned long long *val,
466-
unsigned int max_length)
467-
{
468-
int ret = 0;
469-
char *tmp;
470-
char *p;
471-
472-
if (is_null_or_empty(string))
473-
return 0;
474-
475-
tmp = strtok(string, ",");
476-
if (tmp == NULL)
477-
return 0;
478-
479-
val[ret] = strtoll(tmp, &p, 0);
480-
if (*p != 0)
481-
return -1;
482-
ret++;
483-
while (1) {
484-
tmp = strtok(NULL, ",");
485-
486-
if (tmp == NULL)
487-
return ret;
488-
489-
if (ret >= max_length)
490-
return -1;
491-
492-
val[ret] = strtoll(tmp, &p, 0);
493-
if (*p != 0)
494-
return -1;
495-
ret++;
496-
}
497-
}
498-
499-
#define DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(size) \
500-
int argconfig_parse_comma_sep_array_u##size(char *string, \
501-
__u##size *val, \
375+
#define DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(name, ret_t, ret_max) \
376+
int argconfig_parse_comma_sep_array ## name(char *string, \
377+
ret_t *val, \
502378
unsigned int max_length) \
503379
{ \
504380
int ret = 0; \
@@ -510,40 +386,35 @@ int argconfig_parse_comma_sep_array_u##size(char *string, \
510386
return 0; \
511387
\
512388
tmp = strtok(string, ","); \
513-
if (!tmp) \
514-
return 0; \
515-
\
516-
v = strtoumax(tmp, &p, 0); \
517-
if (*p != 0) \
518-
return -1; \
519-
if (v > UINT##size##_MAX) { \
520-
fprintf(stderr, "%s out of range\n", tmp); \
521-
return -1; \
522-
} \
523-
val[ret] = v; \
524-
\
525-
ret++; \
526-
while (1) { \
527-
tmp = strtok(NULL, ","); \
528-
\
529-
if (tmp == NULL) \
530-
return ret; \
531389
\
390+
while (tmp) { \
532391
if (ret >= max_length) \
533392
return -1; \
534393
\
535394
v = strtoumax(tmp, &p, 0); \
536395
if (*p != 0) \
537396
return -1; \
538-
if (v > UINT##size##_MAX) { \
397+
if (v > ret_max) { \
539398
fprintf(stderr, "%s out of range\n", tmp); \
540399
return -1; \
541400
} \
542401
val[ret] = v; \
543402
ret++; \
403+
\
404+
tmp = strtok(NULL, ","); \
544405
} \
406+
\
407+
return ret; \
545408
}
546409

410+
DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(, int, UINT_MAX)
411+
DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(_short, unsigned short, UINT16_MAX)
412+
DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(_long, unsigned long long, ULLONG_MAX)
413+
414+
#define DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(size) \
415+
DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(_u ## size, __u ## size, \
416+
UINT ## size ## _MAX)
417+
547418
DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(16);
548419
DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(32);
549420
DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(64);

0 commit comments

Comments
 (0)
Please sign in to comment.