diff --git a/src/common/bitstring.c b/src/common/bitstring.c index ed4b78f71b73b5f8fa1ea4ea5d06caf10d2f7824..d29de314d5da2b61a47683d96e5cb7612b508323 100644 --- a/src/common/bitstring.c +++ b/src/common/bitstring.c @@ -1095,43 +1095,65 @@ bit_unfmt(bitstr_t *b, char *str) * output: an array of integers * NOTE: the caller must xfree the returned memory */ -int32_t * -bitfmt2int (char *bit_str_ptr) +int32_t *bitfmt2int(char *bit_str_ptr) { int32_t *bit_int_ptr, i, bit_inx, size, sum, start_val; + char *tmp = NULL; + int32_t start_task_id = -1; + int32_t end_task_id = -1; + int32_t step = -1; if (bit_str_ptr == NULL) return NULL; - size = strlen (bit_str_ptr) + 1; - bit_int_ptr = xmalloc ( sizeof (int32_t) * - (size * 2 + 1)); /* more than enough space */ - - bit_inx = sum = 0; - start_val = -1; - for (i = 0; i < size; i++) { - if (bit_str_ptr[i] >= '0' && - bit_str_ptr[i] <= '9'){ - sum = (sum * 10) + (bit_str_ptr[i] - '0'); - } - - else if (bit_str_ptr[i] == '-') { - start_val = sum; - sum = 0; - } - - else if (bit_str_ptr[i] == ',' || - bit_str_ptr[i] == '\0') { - if (i == 0) - break; - if (start_val == -1) + if (!(xstrchr(bit_str_ptr, ':'))) { + size = strlen(bit_str_ptr) + 1; + /* more than enough space */ + bit_int_ptr = xmalloc(sizeof(int32_t) * (size * 2 + 1)); + + bit_inx = sum = 0; + start_val = -1; + for (i = 0; i < size; i++) { + if (bit_str_ptr[i] >= '0' && + bit_str_ptr[i] <= '9') { + sum = (sum * 10) + (bit_str_ptr[i] - '0'); + } else if (bit_str_ptr[i] == '-') { start_val = sum; - bit_int_ptr[bit_inx++] = start_val; - bit_int_ptr[bit_inx++] = sum; - start_val = -1; - sum = 0; + sum = 0; + } else if (bit_str_ptr[i] == ',' || + bit_str_ptr[i] == '\0') { + if (i == 0) + break; + if (start_val == -1) + start_val = sum; + bit_int_ptr[bit_inx++] = start_val; + bit_int_ptr[bit_inx++] = sum; + start_val = -1; + sum = 0; + } + } + assert(bit_inx < (size * 2 + 1)); + } else { + start_task_id = strtol(bit_str_ptr, &tmp, 10); + if (*tmp != '-') + return NULL; + end_task_id = strtol(tmp + 1, &tmp, 10); + if (*tmp != ':') + return NULL; + step = strtol(tmp + 1, &tmp, 10); + if (*tmp != '\0') + return NULL; + if(end_task_id >= start_task_id && step > 0) { + size=((end_task_id - start_task_id) / step) + 1; + bit_int_ptr = xmalloc(sizeof(int32_t) * (size * 2 + 1)); + bit_inx = 0; + for(i = 0; i < size; i++) { + bit_int_ptr[bit_inx++] = start_task_id + i * step; + bit_int_ptr[bit_inx++] = start_task_id + i * step; + } + } else { + return NULL; } } - assert(bit_inx < (size*2+1)); bit_int_ptr[bit_inx] = -1; return bit_int_ptr; }