From c764520b5aa343c00c3a73633511df039645973c Mon Sep 17 00:00:00 2001 From: smitsohu Date: Fri, 14 Jan 2022 20:19:25 +0100 Subject: keep-fd option (#4845) --- src/lib/common.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'src/lib') diff --git a/src/lib/common.c b/src/lib/common.c index f46e7db1c..91d5125b1 100644 --- a/src/lib/common.c +++ b/src/lib/common.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "../include/common.h" #define BUFLEN 4096 @@ -320,6 +321,55 @@ const char *gnu_basename(const char *path) { return last_slash+1; } +// takes string with comma separated int values, returns int array +int *str_to_int_array(const char *str, size_t *sz) { + assert(str && sz); + + size_t curr_sz = 0; + size_t arr_sz = 16; + int *rv = malloc(arr_sz * sizeof(int)); + if (!rv) + errExit("malloc"); + + char *dup = strdup(str); + if (!dup) + errExit("strdup"); + char *tok = strtok(dup, ","); + if (!tok) { + free(dup); + free(rv); + goto errout; + } + + while (tok) { + char *end; + long val = strtol(tok, &end, 10); + if (end == tok || *end != '\0' || val < INT_MIN || val > INT_MAX) { + free(dup); + free(rv); + goto errout; + } + + if (curr_sz == arr_sz) { + arr_sz *= 2; + rv = realloc(rv, arr_sz * sizeof(int)); + if (!rv) + errExit("realloc"); + } + rv[curr_sz++] = val; + + tok = strtok(NULL, ","); + } + free(dup); + + *sz = curr_sz; + return rv; + +errout: + *sz = 0; + return NULL; +} + //************************** // time trace based on getticks function //************************** -- cgit v1.2.3-54-g00ecf