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