void snode_free(snode *c) { if (NULL == c) return; switch (c->type) { case SNODE_APPLICATION: snode_free(c->left); snode_free(c->right); break; case SNODE_LAMBDA: snode_free(c->body); break; case SNODE_LETREC: { letrec *rec = c->bindings; while (rec) { letrec *next = rec->next; free_letrec(rec); rec = next; } snode_free(c->body); break; } case SNODE_BUILTIN: case SNODE_SYMBOL: case SNODE_SCREF: case SNODE_NIL: case SNODE_NUMBER: case SNODE_STRING: // case SNODE_EXTFUNC: break; default: abort(); } free(c->value); free(c->name); free(c); }
void http_destruct(http_t *ctx) { DO_FREE(ctx->range_set); mem_chunk_free(ctx->host, ctx->host_size); ctx->host = NULL; /* Free the extra headers, if any */ while (ctx->extra_headers) { snode_t *next; next = ctx->extra_headers->next; snode_free(ctx->extra_headers); ctx->extra_headers = next; } }
void free_letrec(letrec *rec) { snode_free(rec->value); free(rec->name); free(rec); }