Пример #1
0
/* rdr_free:
 *   Free all memory used by a reader object including the quark database, so
 *   any string returned by them must not be used after this call.
 */
void rdr_free(rdr_t *rdr) {
	for (uint32_t i = 0; i < rdr->npats; i++)
		pat_free(rdr->pats[i]);
	free(rdr->pats);
	qrk_free(rdr->lbl);
	qrk_free(rdr->obs);
	free(rdr);
}
Пример #2
0
/*
 * Frees the resources allocated to an upstream filter.
 *
 * Arguments:
 *      upFilter        Pointer to the upsteam filter to have its resources 
 *                      freed.
 */
void
upFilter_free(
    UpFilter* const     upFilter)
{
    if (NULL != upFilter) {
        Element*        elt;
        Element*        next;

        for (elt = upFilter->head; elt != NULL; elt = next) {
            next  = elt->next;

            pat_free(elt->okPattern);

            if (elt->notPattern) {
                pat_free(elt->notPattern);
            }

            free(elt);
        }

        strBuf_free(upFilter->strBuf);
        free(upFilter);
    }
}
Пример #3
0
/*
 * Adds a filter-component to an upstream-filter.
 *
 * Arguments:
 *      upFilter        Pointer to the upstream-filter to which to add the 
 *                      component.
 *      feedtype        The feedtype of the filter-component.
 *      okPattern       Pointer to the "OK pattern" of the filter-component to 
 *                      be added.  Caller may free upon return.
 *      notPattern      Pointer to the "not pattern" of the filter-component to
 *                      be added.  May be NULL to indicate that such matching
 *                      should be disabled.  Caller may free upon return.
 * Returns:
 *      NULL            Success.
 *      else            Error object.
 */
ErrorObj*
upFilter_addComponent(
    UpFilter* const             upFilter,
    const feedtypet             feedtype,
    const Pattern* const        okPattern,
    const Pattern* const        notPattern)
{
    ErrorObj*   errObj = NULL;          /* success */
    Element*    elt;

    /*
     * Ensure that the given feedtype is disjoint from all feedtypes already
     * in the filter.
     */
    for (elt = upFilter->head; NULL != elt; elt = elt->next) {
        if (feedtype & elt->ft) {
            char        ftSpec[512];

            (void)sprint_feedtypet(ftSpec, sizeof(ftSpec), feedtype);

            errObj = ERR_NEW2(0, NULL,
                "Feedtype %s overlaps with feedtype %s",
                ftSpec, s_feedtypet(elt->ft));

            break;
        }
    }

    if (NULL == errObj) {
        size_t          nbytes = sizeof(Element);

        elt = (Element*)malloc(nbytes);

        if (NULL == elt) {
            errObj = ERR_NEW2(0, NULL, "Couldn't allocate %lu-bytes: %s",
                (unsigned long)nbytes, strerror(errno));
        }
        else {
            if ((errObj = pat_clone(&elt->okPattern, okPattern))) {
                errObj = ERR_NEW(0, errObj, "Couldn't clone \"OK\" pattern");
                free(elt);
            }
            else {
                if (NULL == notPattern) {
                    elt->notPattern = NULL;
                }
                else {
                    if ((errObj = pat_clone(&elt->notPattern, notPattern))) {
                        errObj = ERR_NEW(0, errObj,
                            "Couldn't clone \"not\" pattern");
                        pat_free(elt->okPattern);
                        free(elt);
                        elt = NULL;
                    }
                }

                if (elt) {
                    elt->ft = feedtype;
                    elt->next = upFilter->head;
                    upFilter->head = elt;
                    upFilter->stringOutOfDate = 1;
                    upFilter->count++;
                }
            }                           /* "elt->okPattern" allocated */
        }                               /* "elt" allocated */
    } // given feedtype is disjoint from those already in filter

    return errObj;
}