Пример #1
0
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]);
    }
}
Пример #2
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;
    }
}
Пример #3
0
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;
    }
}
Пример #4
0
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;
    }
}
Пример #5
0
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;
    }
}