Я пишу утилиту, которая принимает текстовые файлы с разделителями табуляции и выводит таблицы HTML.Частью функциональности является возможность передавать значения фильтра в командной строке.Так, например, если у нас есть столбец «A», я должен быть в состоянии передать --filter «A» «foo» и видеть только те строки, для которых в столбце «A» содержится «foo».
Это подводит меня к моему вопросу.Я пишу это на C, и, возможно, из-за моей неопытности с языком у меня возникают проблемы с выражением структуры данных моего «фильтра».
Моя первоначальная попытка решить проблему - предварительно сохранить фильтры:
//Parse parameters and values, i.e. --start, --length
for (; i<argc; i++){
if (argv[i][1] == '-'){
argv[i]++; //Strip long options
if (i+1 == argc || argv[i+1][0] == '-'){
fprintf(stderr, "Error: Missing argument to optional parameter!\n");
exit(1);
}
}
if (strcmp(argv[i], "-start")==0)
start = strtol(argv[i+1], NULL, 0);
else if (strcmp(argv[i], "-length")==0)
length = strtol(argv[i+1], NULL, 0);
else if (strcmp(argv[i], "-filter")==0){ //Store the filter arguments for later processing
filters = realloc(filters, sizeof(char*) * (f+2));
filters[f++] = strdup(argv[i+1]);
filters[f++] = strdup(argv[i+2]);
}
}
И затем, как только у меня появятся имена столбцов, для создания малонаселенного массива значений фильтра, который соответствует длине заголовка файла.Итак, если я просматриваю столбец 4, я смотрю четвертое значение массива фильтра и проверяю, заполнено ли оно значением.
Код, который расширяет «начальное» хранилище фильтра доэта таблица поиска выглядит следующим образом:
//Now that we know how many cols we have, create a sparsely populated filter array
for (j=0,i=0; i<ncols; i++){
filtercols = realloc(filtercols, sizeof(char*) * (ncols+1));
filtercols[i] = strdup("");
for (c=0; c<f; c++){
if (strcmp(columns + j, filters[c])==0){
filtercols[i] = strdup(filters[c+1]);
break;
}
}
while (columns[j]){
j++;
}
j++;
}
Кроме того, что это неудобно, я вижу, что если я укажу фильтр, который имеет одинаковое значение как для имени столбца, так и для значения фильтра, это не будет работать.
В чем-то вроде Python я бы справился с этим со словарями.Как лучше всего использовать эту ситуацию при работе в C?
Спасибо за потраченное время.