diff --git a/src/common/hostlist.c b/src/common/hostlist.c index db8e83f4827f761b8949c361c12fea043da9b9e1..e018e6a79d175633d3debb15624442109d1bec67 100644 --- a/src/common/hostlist.c +++ b/src/common/hostlist.c @@ -503,7 +503,7 @@ static void _error(char *file, int line, char *msg, ...) */ static char * _next_tok(char *sep, char **str) { - char *tok; + char *tok, *parse, *open_bracket, *close_bracket; /* push str past any leading separators */ while ((**str != '\0') && (strchr(sep, **str) != NULL)) @@ -514,32 +514,25 @@ static char * _next_tok(char *sep, char **str) /* assign token ptr */ tok = *str; + parse = tok; - /* push str past token and leave pointing to first separator */ - while ((**str != '\0') && (strchr(sep, **str) == NULL)) - (*str)++; - - /* if _single_ opening bracket exists b/w tok and str, - * push str past first closing bracket */ - if ((memchr(tok, '[', *str - tok) != NULL) && - (memchr(tok, ']', *str - tok) == NULL)) { - char *q = strchr(*str, ']'); - - if (q && (memchr(*str, '[', q - *str) == NULL)) - *str = ++q; - - /* push str past token and leave pointing to next separator */ + while (1) { + /* push str past token and leave pointing to first separator */ while ((**str != '\0') && (strchr(sep, **str) == NULL)) (*str)++; - /* if _second_ opening bracket exists b/w tok and str, - * push str past second closing bracket */ - if ((**str != '\0') && q && - (memchr(tok, '[', *str - q) != NULL) && - (memchr(tok, ']', *str - q) == NULL)) { - q = strchr(*str, ']'); - if (q && (memchr(*str, '[', q - *str) == NULL)) - *str = q + 1; + /* push str past pairs of brackets */ +bracket: open_bracket = strchr(parse, '['); + if ((open_bracket == NULL) || (open_bracket > *str)) + break; + close_bracket = strchr(parse, ']'); + if ((close_bracket == NULL) || (close_bracket < open_bracket)) + break; + if (close_bracket < *str) { + parse = close_bracket + 1; + goto bracket; + } else { + *str = close_bracket; } }