void traverse_info_done() { if (traverse_info.pf != NULL) { coda_close(traverse_info.pf); } if (traverse_info.filter[0] != NULL) { codadump_filter_remove(&traverse_info.filter[0]); } }
static void add_filter(codadump_filter **filter, codadump_filter *new_filter) { assert(filter != NULL); if (new_filter == NULL) { return; } if (*filter == NULL) { *filter = new_filter; return; } if (strcmp((*filter)->fieldname, new_filter->fieldname) == 0) { if ((*filter)->subfilter != NULL) { if (new_filter->subfilter != NULL) { add_filter(&(*filter)->subfilter, new_filter->subfilter); new_filter->subfilter = NULL; } else { codadump_filter_remove(&(*filter)->subfilter); } } codadump_filter_remove(&new_filter); return; } else if ((*filter)->next != NULL) { add_filter(&(*filter)->next, new_filter); } else { (*filter)->next = new_filter; } }
void codadump_filter_remove(codadump_filter **filter) { assert(filter != NULL); if (*filter != NULL) { if ((*filter)->next != NULL) { codadump_filter_remove(&(*filter)->next); } if ((*filter)->subfilter != NULL) { codadump_filter_remove(&(*filter)->subfilter); } if ((*filter)->fieldname != NULL) { free((*filter)->fieldname); (*filter)->fieldname = NULL; } free(*filter); *filter = NULL; } }
static void get_filter(const char *filter_expr, codadump_filter **filter) { codadump_filter *new_filter = NULL; char *expr = (char *)filter_expr; if (filter_expr == NULL) { return; } while (expr[0] != '\0') { get_filter_item(expr, &new_filter, &expr); if (new_filter == NULL) { /* the filter item was incorrect, so we remove the whole filter and terminate the parsing */ codadump_filter_remove(filter); return; } add_filter(filter, new_filter); new_filter = NULL; } }
static void get_filter_item(const char *filter_expr, codadump_filter **filter, char **tail) { int n = 0; assert(filter_expr != NULL); assert(filter != NULL); assert(tail != NULL); /* strip leading spaces */ while (filter_expr[0] == ' ' || filter_expr[0] == '\t' || filter_expr[0] == '\n') { filter_expr = &filter_expr[1]; } /* find end of fieldname */ while (filter_expr[n] != '\0' && filter_expr[n] != '.' && filter_expr[n] != ';' && filter_expr[n] != ',') { n++; } if (n > 0) { int p = n; /* create and initialize new filter item */ *filter = (codadump_filter *)malloc(sizeof(codadump_filter)); if (*filter == NULL) { coda_set_error(CODA_ERROR_OUT_OF_MEMORY, "out of memory (could not allocate %lu bytes) (%s:%u)", sizeof(codadump_filter), __FILE__, __LINE__); handle_coda_error(); } (*filter)->fieldname = (char *)malloc(n + 1); if ((*filter)->fieldname == NULL) { coda_set_error(CODA_ERROR_OUT_OF_MEMORY, "out of memory (could not allocate %u bytes) (%s:%u)", n + 1, __FILE__, __LINE__); handle_coda_error(); } strncpy((*filter)->fieldname, filter_expr, n); (*filter)->subfilter = NULL; (*filter)->next = NULL; /* strip trailing spaces of the fieldname */ while ((*filter)->fieldname[n - 1] == ' ' || (*filter)->fieldname[n - 1] == '\t' || (*filter)->fieldname[n - 1] == '\n') { n--; } (*filter)->fieldname[n] = '\0'; if (filter_expr[p] == '.') { get_filter_item(&(filter_expr[p + 1]), &(*filter)->subfilter, tail); if ((*filter)->subfilter == NULL) { /* the subfilter was incorrect, so we remove the complete filter item */ codadump_filter_remove(filter); } } else if (filter_expr[p] == ';' || filter_expr[p] == ',') { *tail = (char *)&(filter_expr[p + 1]); } else { *tail = (char *)&(filter_expr[p]); } } else { *filter = NULL; } }