Extend the regular expression parsing support
This commit was SVN r31088.
Этот коммит содержится в:
родитель
0257d32eeb
Коммит
7bb8dbade6
@ -683,6 +683,84 @@ int orte_regex_extract_ppn(int num_nodes, char *regexp, int **ppn)
|
|||||||
return ORTE_SUCCESS;
|
return ORTE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int orte_regex_extract_name_range(char *regexp, char ***names)
|
||||||
|
{
|
||||||
|
char *tmp, *b, *b2, **rngs, *t, *pre, *post;
|
||||||
|
int i;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
/* protect input */
|
||||||
|
tmp = strdup(regexp);
|
||||||
|
/* look for bracket */
|
||||||
|
if (NULL == (b = strchr(tmp, '['))) {
|
||||||
|
/* just one value */
|
||||||
|
opal_argv_append_nosize(names, regexp);
|
||||||
|
free(tmp);
|
||||||
|
return ORTE_SUCCESS;
|
||||||
|
}
|
||||||
|
if (b == tmp) {
|
||||||
|
/* bracket at very beginning */
|
||||||
|
pre = NULL;
|
||||||
|
} else {
|
||||||
|
*b = '\0';
|
||||||
|
pre = tmp;
|
||||||
|
}
|
||||||
|
/* step over the bracket */
|
||||||
|
b++;
|
||||||
|
/* look for closing bracket */
|
||||||
|
if (NULL == (b2 = strrchr(tmp, ']'))) {
|
||||||
|
ORTE_ERROR_LOG(ORTE_ERR_BAD_PARAM);
|
||||||
|
free(tmp);
|
||||||
|
return ORTE_ERR_BAD_PARAM;
|
||||||
|
}
|
||||||
|
*b2 = '\0';
|
||||||
|
b2++;
|
||||||
|
if ('\0' == *b2) {
|
||||||
|
/* bracket was at end */
|
||||||
|
post = NULL;
|
||||||
|
} else {
|
||||||
|
post = b2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* split on commas */
|
||||||
|
rngs = opal_argv_split(b, ',');
|
||||||
|
for (i=0; NULL != rngs[i]; i++) {
|
||||||
|
/* look for a range */
|
||||||
|
if (NULL == strchr(rngs[i], '-')) {
|
||||||
|
/* just one value */
|
||||||
|
if (NULL == pre && NULL == post) {
|
||||||
|
t = strdup(rngs[i]);
|
||||||
|
} else if (NULL == pre) {
|
||||||
|
asprintf(&t, "%s%s", rngs[i], post);
|
||||||
|
} else if (NULL == post) {
|
||||||
|
asprintf(&t, "%s%s", pre, rngs[i]);
|
||||||
|
} else {
|
||||||
|
asprintf(&t, "%s%s%s", pre, rngs[i], post);
|
||||||
|
}
|
||||||
|
opal_argv_append_nosize(names, t);
|
||||||
|
free(t);
|
||||||
|
} else {
|
||||||
|
/* has to be <char>-<char> */
|
||||||
|
for (c=rngs[i][0]; c <= rngs[i][2]; c++) {
|
||||||
|
if (NULL == pre && NULL == post) {
|
||||||
|
asprintf(&t, "%c", c);
|
||||||
|
} else if (NULL == pre) {
|
||||||
|
asprintf(&t, "%c%s", c, post);
|
||||||
|
} else if (NULL == post) {
|
||||||
|
asprintf(&t, "%s%c", pre, c);
|
||||||
|
} else {
|
||||||
|
asprintf(&t, "%s%c%s", pre, c, post);
|
||||||
|
}
|
||||||
|
opal_argv_append_nosize(names, t);
|
||||||
|
free(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
opal_argv_free(rngs);
|
||||||
|
free(tmp);
|
||||||
|
return ORTE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static void range_construct(orte_regex_range_t *ptr)
|
static void range_construct(orte_regex_range_t *ptr)
|
||||||
{
|
{
|
||||||
ptr->start = 0;
|
ptr->start = 0;
|
||||||
|
@ -59,5 +59,7 @@ ORTE_DECLSPEC int orte_regex_extract_node_names(char *regexp, char ***names);
|
|||||||
|
|
||||||
ORTE_DECLSPEC int orte_regex_extract_ppn(int num_nodes, char *regexp, int **ppn);
|
ORTE_DECLSPEC int orte_regex_extract_ppn(int num_nodes, char *regexp, int **ppn);
|
||||||
|
|
||||||
|
ORTE_DECLSPEC int orte_regex_extract_name_range(char *regexp, char ***names);
|
||||||
|
|
||||||
END_C_DECLS
|
END_C_DECLS
|
||||||
#endif
|
#endif
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user