int orte_regex_extract_node_names(char *regexp, char ***names) { int i, j, k, len, ret; char *base; char *orig, *suffix; bool found_range = false; bool more_to_come = false; int num_digits; if (NULL == regexp) { *names = NULL; return ORTE_SUCCESS; } orig = base = strdup(regexp); if (NULL == base) { ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE); return ORTE_ERR_OUT_OF_RESOURCE; } OPAL_OUTPUT_VERBOSE((1, orte_debug_output, "%s regex:extract:nodenames: checking nodelist: %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), regexp)); do { /* Find the base */ len = strlen(base); for (i = 0; i <= len; ++i) { if ('[' == base[i]) { /* we found a range. this gets dealt with below */ base[i] = '\0'; found_range = true; break; } if (',' == base[i]) { /* we found a singleton node, and there are more to come */ base[i] = '\0'; found_range = false; more_to_come = true; break; } if ('\0' == base[i] || ']' == base[i]) { /* we found a singleton node, or we found * a right bracket, but not a left one */ found_range = false; more_to_come = false; break; } } if (0 == i && !found_range) { /* we found a special character, which may be ']', * at the beginning of the string */ orte_show_help("help-regex.txt", "regex:special-char", true, regexp); free(orig); return ORTE_ERR_BAD_PARAM; } if (0 == i && found_range) { /* we found no base at the beginning of a range */ orte_show_help("help-regex.txt", "regex:no-base-range", true, regexp); free(orig); return ORTE_ERR_BAD_PARAM; } if (i <= len && ']' == base[i] && !found_range) { /* we found end of a range but not a start of the range */ orte_show_help("help-regex.txt", "regex:start-range-missing", true, regexp); free(orig); return ORTE_ERR_BAD_PARAM; } if (found_range) { /* If we found a range, get the number of digits in the numbers */ i++; /* step over the [ */ for (j=i; j < len; j++) { if (':' == base[j]) { base[j] = '\0'; break; } } if (j >= len) { /* we didn't find the number of digits */ orte_show_help("help-regex.txt", "regex:num-digits-missing", true, regexp); free(orig); return ORTE_ERR_BAD_PARAM; } num_digits = strtol(&base[i], NULL, 10); if (errno == ERANGE) { orte_show_help("help_regex.txt", "regex:value-out-of-range", true, &base[i]); free(orig); return ORTE_ERR_BAD_PARAM; } i = j + 1; /* step over the : */ /* now find the end of the range */ for (j = i; j < len; ++j) { if (']' == base[j]) { if ((j + 1) < len && '[' == base[j + 1]) { orte_show_help("help-regex.txt", "regex:consecutive-rightleft-brackets", true, regexp); free(orig); return ORTE_ERR_BAD_PARAM; } base[j] = '\0'; break; } } if (j >= len) { /* we didn't find the end of the range */ orte_show_help("help-regex.txt", "regex:end-range-missing", true, regexp); free(orig); return ORTE_ERR_BAD_PARAM; } /* check for a suffix */ if (j+1 < len && ',' != base[j+1]) { /* find the next comma, if present */ for (k=j+1; k < len && ',' != base[k]; k++); if (k < len) { base[k] = '\0'; } suffix = strdup(&base[j+1]); if (k < len) { base[k] = ','; } j = k-1; } else { suffix = NULL; } OPAL_OUTPUT_VERBOSE((1, orte_debug_output, "%s regex:extract:nodenames: parsing range %s %s %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), base, base + i, suffix)); ret = regex_parse_node_ranges(base, base + i, num_digits, suffix, names); if (NULL != suffix) { free(suffix); } if (ORTE_SUCCESS != ret) { orte_show_help("help-regex.txt", "regex:bad-value", true, regexp); free(orig); return ret; } if (j+1 < len && ',' == base[j + 1]) { more_to_come = true; base = &base[j + 2]; } else { more_to_come = false; } } else { /* If we didn't find a range, just add the node */ if(ORTE_SUCCESS != (ret = opal_argv_append_nosize(names, base))) { ORTE_ERROR_LOG(ret); free(orig); return ret; } /* step over the comma */ i++; /* set base equal to the (possible) next base to look at */ base = &base[i]; } } while(more_to_come); free(orig); /* All done */ return ret; }
int orte_regex_extract_node_names(char *regexp, char ***names) { int i, j, len, ret; char *base; char *orig; bool found_range = false; bool more_to_come = false; if (NULL == regexp) { *names = NULL; return ORTE_SUCCESS; } orig = base = strdup(regexp); if (NULL == base) { ORTE_ERROR_LOG(ORTE_ERR_OUT_OF_RESOURCE); return ORTE_ERR_OUT_OF_RESOURCE; } OPAL_OUTPUT_VERBOSE((1, orte_debug_output, "%s regex:extract:nodenames: checking nodelist: %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), regexp)); do { /* Find the base */ len = strlen(base); for (i = 0; i <= len; ++i) { if (base[i] == '[') { /* we found a range. this gets dealt with below */ base[i] = '\0'; found_range = true; break; } if (base[i] == ',') { /* we found a singleton node, and there are more to come */ base[i] = '\0'; found_range = false; more_to_come = true; break; } if (base[i] == '\0') { /* we found a singleton node */ found_range = false; more_to_come = false; break; } } if(i == 0) { /* we found a special character at the beginning of the string */ orte_show_help("help-regex.txt", "regex:special-char", true, regexp); free(orig); return ORTE_ERR_BAD_PARAM; } if (found_range) { /* If we found a range, now find the end of the range */ for (j = i; j < len; ++j) { if (base[j] == ']') { base[j] = '\0'; break; } } if (j >= len) { /* we didn't find the end of the range */ orte_show_help("help-regex.txt", "regex:end-range-missing", true, regexp); free(orig); return ORTE_ERR_BAD_PARAM; } ret = regex_parse_node_ranges(base, base + i + 1, names); if(ORTE_SUCCESS != ret) { orte_show_help("help-regex.txt", "regex:bad-value", true, regexp); free(orig); return ret; } if(base[j + 1] == ',') { more_to_come = true; base = &base[j + 2]; } else { more_to_come = false; } } else { /* If we didn't find a range, just add the node */ OPAL_OUTPUT_VERBOSE((1, orte_debug_output, "%s regex:extract:nodenames: found node: %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), base)); if(ORTE_SUCCESS != (ret = opal_argv_append_nosize(names, base))) { ORTE_ERROR_LOG(ret); free(orig); return ret; } /* set base equal to the (possible) next base to look at */ base = &base[i + 1]; } } while(more_to_come); free(orig); /* All done */ return ret; }