blob: 15aab17f8b0a45a214c2dd59d61c2388458217b0 [file] [log] [blame]
/*
* Copyright (c) 2009-2010 Intel Corporation. All rights reserved.
*
* This software is available to you under the OpenIB.org BSD license
* below:
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "acm_util.h"
static char *expand(char *basename, char *args, int *str_cnt, int *str_size)
{
char buf[256];
char *str_buf = NULL;
char *token, *tmp;
int from, to, width;
int size = 0, cnt = 0;
token = strtok(args, ",");
do {
from = atoi(token);
tmp = index(token, '-');
if (tmp) {
to = atoi(tmp+1);
width = tmp - token;
} else {
to = from;
width = strlen(token);
}
while (from <= to) {
snprintf(buf, sizeof buf, "%s%0*d", basename, width, from);
str_buf = realloc(str_buf, size + strlen(buf)+1);
strcpy(&str_buf[size], buf);
from++;
cnt++;
size += strlen(buf)+1;
}
token = strtok(NULL, ",");
} while (token);
*str_size = size;
*str_cnt = cnt;
return str_buf;
}
char **parse(const char *args, int *count)
{
char **ptrs = NULL;
char *str_buf, *cpy, *token, *next;
int cnt = 0, str_size = 0;
int i;
/* make a copy that strtok can modify */
cpy = strdup(args);
if (!cpy)
return NULL;
if (args[0] == '[') {
cpy[0] = '\0';
token = cpy;
next = strtok(cpy + 1, "]");
} else {
token = strtok(cpy, "[");
next = strtok(NULL, "]");
}
if (!next) {
str_size = strlen(token) + 1;
str_buf = malloc(str_size);
if (!str_buf)
goto out_cpy;
strcpy(str_buf, token);
cnt = 1;
} else {
str_buf = expand(cpy, next, &cnt, &str_size);
}
ptrs = malloc((sizeof str_buf * (cnt + 1)) + str_size);
if (!ptrs)
goto out_str_buf;
memcpy(&ptrs[cnt + 1], str_buf, str_size);
ptrs[0] = (char*) &ptrs[cnt + 1];
for (i = 1; i < cnt; i++)
ptrs[i] = index(ptrs[i - 1], 0) + 1;
ptrs[i] = NULL;
if (count)
*count = cnt;
out_str_buf:
free(str_buf);
out_cpy:
free(cpy);
return ptrs;
}