#include "data.h" void PgfFlag::release(ref flag) { pgf_literal_release(flag->value); PgfDB::free(flag, flag->name.size+1); } void PgfAbsFun::release(ref absfun) { pgf_type_release(absfun->type); if (absfun->bytecode != 0) { PgfDB::free(absfun->bytecode); } PgfDB::free(absfun, absfun->name.size+1); } void PgfAbsCat::release(ref abscat) { pgf_context_release(abscat->context); PgfDB::free(abscat, abscat->name.size+1); } void PgfPGF::release(ref pgf) { namespace_release(pgf->gflags); text_db_release(pgf->abstract.name); namespace_release(pgf->abstract.aflags); namespace_release(pgf->abstract.funs); namespace_release(pgf->abstract.cats); probspace_release(pgf->abstract.funs_by_cat); namespace_release(pgf->concretes); PgfDB::free(pgf); } void PgfConcr::release(ref concr) { namespace_release(concr->cflags); namespace_release(concr->lins); namespace_release(concr->lincats); namespace_release(concr->printnames); PgfDB::free(concr, concr->name.size+1); } void PgfConcrLincat::release(ref lincat) { for (ref field : lincat->fields) { text_db_release(field); } vector>::release(lincat->fields); for (ref rule : lincat->rules) { PgfConcrRule::release(rule); } vector>::release(lincat->rules); PgfDB::free(lincat, lincat->name.size+1); } void PgfLParam::release(ref param) { PgfDB::free(param, param->n_terms*sizeof(param->terms[0])); } void PgfPResult::release(ref res) { if (res->vars != 0) vector::release(res->vars); PgfDB::free(res, res->param.n_terms*sizeof(res->param.terms[0])); } static void symbols_release(vector syms) { for (PgfSymbol sym : syms) { switch (ref::get_tag(sym)) { case PgfSymbolCat::tag: { auto sym_cat = ref::untagged(sym); PgfDB::free(sym_cat, sym_cat->r.n_terms*sizeof(sym_cat->r.terms[0])); break; } case PgfSymbolLit::tag: { auto sym_lit = ref::untagged(sym); PgfDB::free(sym_lit, sym_lit->r.n_terms*sizeof(sym_lit->r.terms[0])); break; } case PgfSymbolVar::tag: PgfDB::free(ref::untagged(sym)); break; case PgfSymbolKS::tag: { auto sym_ks = ref::untagged(sym); PgfDB::free(sym_ks, sym_ks->token.size+1); break; } case PgfSymbolKP::tag: { auto sym_kp = ref::untagged(sym); symbols_release(sym_kp->default_form); vector::release(sym_kp->default_form); for (size_t i = 0; i < sym_kp->alts.size(); i++) { symbols_release(sym_kp->alts[i].form); vector::release(sym_kp->alts[i].form); for (size_t j = 0; j < sym_kp->alts[i].prefixes.size(); j++) { text_db_release(sym_kp->alts[i].prefixes[j]); } } inline_vector::release(&PgfSymbolKP::alts, sym_kp); break; } case PgfSymbolBIND::tag: case PgfSymbolSOFTBIND::tag: case PgfSymbolNE::tag: case PgfSymbolSOFTSPACE::tag: case PgfSymbolCAPIT::tag: case PgfSymbolALLCAPIT::tag: break; default: throw pgf_error("Unknown symbol tag"); } } } void PgfConcrRule::release(ref rule) { vector::release(rule->vars); PgfLParam::release(rule->res); for (ref arg : rule->args) { PgfLParam::release(arg); } vector>::release(rule->args); PgfLParam::release(rule->lin_idx); symbols_release(rule->syms.as_vector()); inline_vector::release(&PgfConcrRule::syms, rule); } void PgfConcrLin::release(ref lin) { for (ref rule : lin->rules) { PgfConcrRule::release(rule); } vector>::release(lin->rules); PgfDB::free(lin, lin->name.size+1); } void PgfConcrPrintname::release(ref printname) { text_db_release(printname->printname); PgfDB::free(printname, printname->name.size+1); }