| /* |
| * 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; |
| } |