§1. Definitions.

§2.

    inter_symbol *unchecked_interk = NULL;
    inter_symbol *unchecked_function_interk = NULL;
    inter_symbol *int_interk = NULL;
    inter_symbol *string_interk = NULL;

    inter_repository *Emit::repository(void) {
        return Packaging::at()->read_into;
    }

    inter_t Emit::baseline(inter_reading_state *IRS) {
        if (IRS == NULL) return 0;
        if (IRS->current_package == NULL) return 0;
        if (IRS->current_package->codelike_package) return IRS->current_package->parent_package->I7_baseline;
        return IRS->current_package->I7_baseline;
    }

    inter_reading_state Emit::bookmark(void) {
        inter_reading_state b = Inter::Bookmarks::snapshot(Packaging::at());
        return b;
    }

    inter_reading_state Emit::bookmark_bubble(void) {
        Emit::guard(Inter::Nop::new(Packaging::at(), Emit::baseline(Packaging::at()), NULL));
        inter_reading_state b = Emit::bookmark();
        Emit::guard(Inter::Nop::new(Packaging::at(), Emit::baseline(Packaging::at()), NULL));
        return b;
    }

    inter_reading_state pragmas_bookmark;
    inter_reading_state package_types_bookmark;
    inter_reading_state holdings_bookmark;

    dictionary *extern_symbols = NULL;

    int glob_count = 0;

    void Emit::begin(void) {
        inter_repository *repo = Inter::create(1, 4096);
        Packaging::initialise_IRS(repo);

        Emit::guard(Inter::Version::new(Packaging::at(), 1, Emit::baseline(Packaging::at()), NULL));

        Emit::comment(I"Package types:");
        package_types_bookmark = Emit::bookmark_bubble();
        PackageTypes::get(I"_plain");
        PackageTypes::get(I"_code");

        Emit::comment(I"Pragmas:");
        pragmas_bookmark = Emit::bookmark_bubble();

        Emit::comment(I"Primitives:");
        Primitives::emit();

        Packaging::enter_home_of(NULL);     Enters main, which we never exit

        inter_name *KU = Hierarchy::find(K_UNCHECKED_HL);
        packaging_state save = Packaging::enter_home_of(KU);
        unchecked_interk = InterNames::to_symbol(KU);
        Emit::kind_inner(Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), unchecked_interk), UNCHECKED_IDT, 0, BASE_ICON, 0, NULL);
        Packaging::exit(save);

        inter_name *KUF = Hierarchy::find(K_UNCHECKED_FUNCTION_HL);
        save = Packaging::enter_home_of(KUF);
        unchecked_function_interk = InterNames::to_symbol(KUF);
        inter_t operands[2];
        operands[0] = Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), unchecked_interk);
        operands[1] = Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), unchecked_interk);
        Emit::kind_inner(Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), unchecked_function_interk), ROUTINE_IDT, 0, FUNCTION_ICON, 2, operands);
        Packaging::exit(save);

        inter_name *KTI = Hierarchy::find(K_TYPELESS_INT_HL);
        save = Packaging::enter_home_of(KTI);
        int_interk = InterNames::to_symbol(KTI);
        Emit::kind_inner(Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), int_interk), INT32_IDT, 0, BASE_ICON, 0, NULL);
        Packaging::exit(save);

        inter_name *KTS = Hierarchy::find(K_TYPELESS_STRING_HL);
        save = Packaging::enter_home_of(KTS);
        string_interk = InterNames::to_symbol(KTS);
        Emit::kind_inner(Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), string_interk), TEXT_IDT, 0, BASE_ICON, 0, NULL);
        Packaging::exit(save);

        VirtualMachines::emit_fundamental_constants();
        NewVerbs::ConjugateVerbDefinitions();

        holdings_bookmark = Emit::bookmark_bubble();

        Packaging::incarnate(Hierarchy::resources());
        Packaging::incarnate(Hierarchy::template());

        Hierarchy::main()->write_position = Emit::bookmark_bubble();
    }

    inter_symbol *Emit::packagetype(text_stream *name, int enclosing) {
        inter_symbol *pt = Emit::new_symbol(Inter::get_global_symbols(Emit::repository()), name);
        Emit::guard(Inter::PackageType::new_packagetype(&package_types_bookmark, pt, Emit::baseline(&package_types_bookmark), NULL));
        if (enclosing) Emit::annotate_symbol_i(pt, ENCLOSING_IANN, 1);
        return pt;
    }

    void Emit::comment(text_stream *text) {
        inter_t ID = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID), text);
        Emit::guard(Inter::Comment::new(Packaging::at(), Emit::baseline(Packaging::at()), NULL, ID));
    }

    inter_symbol *Emit::kind_to_symbol(kind *K) {
        if (K == NULL) return unchecked_interk;
        if (K == K_value) return unchecked_interk;     for error recovery
        return InterNames::to_symbol(Kinds::RunTime::iname(K));
    }

    inter_symbol *Emit::extern(text_stream *name, kind *K) {
        if (extern_symbols == NULL) extern_symbols = Dictionaries::new(1024, FALSE);
        if (Dictionaries::find(extern_symbols, name))
            return Dictionaries::read_value(extern_symbols, name);
        inter_symbol *symb = Emit::new_symbol(Emit::main_scope(), name);
        Inter::Symbols::extern(symb);
        Dictionaries::create(extern_symbols, name);
        Dictionaries::write_value(extern_symbols, name, symb);
        return symb;
    }

    inter_symbol *Emit::response(inter_name *iname, rule *R, int marker, inter_name *val_iname) {
        packaging_state save = Packaging::enter_home_of(iname);
        inter_symbol *symb = InterNames::to_symbol(iname);
        inter_symbol *rsymb = InterNames::to_symbol(Rules::iname(R));
        inter_symbol *vsymb = InterNames::to_symbol(val_iname);
        inter_t val1 = 0, val2 = 0;
        Inter::Symbols::to_data(Packaging::at()->read_into, Packaging::at()->current_package, vsymb, &val1, &val2);
        Emit::guard(Inter::Response::new(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), symb), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), rsymb), (inter_t) marker, val1, val2, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
        return symb;
    }

The function Emit::repository is used in §3, §4, 1/mr (§4.15), 27/pc (§2, §9), 27/in (§8).

The function Emit::baseline is used in §3, §4.

The function Emit::bookmark is used in §3.

The function Emit::bookmark_bubble is used in 27/pc (§8, §9).

The function Emit::begin is used in 1/mr (§4.7).

The function Emit::packagetype is used in 27/pt (§1).

The function Emit::comment is used in 6/rlt (§29), 8/ef (§16), 21/rl (§21), 21/rb (§22), 22/pu (§17), 22/tp (§10), 25/ci (§3.2), 26/ct (§7).

The function Emit::kind_to_symbol is used in §3, §4.

The function Emit::extern is used in 27/in (§5).

The function Emit::response is used in 17/rs (§7.1).

§3. The Inter language allows pragmas, or code-generation hints, to be passed through. These are specific to the target of compilation. Here we generate only I6-target pragmas, which are commands in Inform Control Language.

This is a mini-language for controlling the I6 compiler, able to set command-line switches, memory settings and so on. I6 ordinarily discards lines beginning with exclamation marks as comments, but at the very top of the file, lines beginning !% are read as ICL commands: as soon as any line (including a blank line) doesn't have this signature, I6 exits ICL mode. This is why we insert them into the Inter stream close to the top.

    void Emit::pragma(text_stream *text) {
        inter_t ID = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID), text);
        inter_symbol *target_name =
            Inter::SymbolsTables::symbol_from_name_creating(
                Inter::get_global_symbols(Emit::repository()), I"target_I6");
        Emit::guard(Inter::Pragma::new(&pragmas_bookmark, target_name, ID, 0, NULL));
    }

    void Emit::append(inter_name *iname, text_stream *text) {
        packaging_state save = Packaging::enter_home_of(iname);
        inter_symbol *symbol = InterNames::to_symbol(iname);
        inter_t ID = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID), text);
        Emit::guard(Inter::Append::new(Packaging::at(), symbol, ID, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    void Emit::import(inter_name *iname, wording W) {
        inter_symbol *symbol = InterNames::to_symbol(iname);
        inter_t ID = Inter::create_text(Emit::repository());
        WRITE_TO(Inter::get_text(Emit::repository(), ID), "%W", W);
        Emit::guard(Inter::Import::new(Packaging::at(), symbol, ID, Emit::baseline(Packaging::at()), NULL));
    }

    void Emit::export(inter_name *iname, wording W) {
        inter_symbol *symbol = InterNames::to_symbol(iname);
        inter_t ID = Inter::create_text(Emit::repository());
        WRITE_TO(Inter::get_text(Emit::repository(), ID), "%W", W);
        Emit::guard(Inter::Export::new(Packaging::at(), symbol, ID, Emit::baseline(Packaging::at()), NULL));
    }

    void Emit::primitive(text_stream *prim, text_stream *category, inter_symbol **to) {
        if (to == NULL) internal_error("no symbol");
        TEMPORARY_TEXT(prim_command);
        WRITE_TO(prim_command, "primitive %S %S", prim, category);
        Emit::guard(Inter::Defn::read_construct_text(prim_command, NULL, Packaging::at()));
        inter_error_message *E = NULL;
        *to = Inter::Textual::find_symbol(Emit::repository(), NULL, Inter::get_global_symbols(Emit::repository()), prim, PRIMITIVE_IST, &E);
        Emit::guard(E);
        DISCARD_TEXT(prim_command);
    }

    inter_symbols_table *Emit::main_scope(void) {
        return Inter::Packages::scope(Inter::Packages::main(Emit::repository()));
    }

    inter_symbols_table *Emit::global_scope(void) {
        return Inter::get_global_symbols(Emit::repository());
    }

    void Emit::main_render_unique(inter_symbols_table *T, text_stream *name) {
        Inter::SymbolsTables::render_identifier_unique(T, name);
    }

    inter_symbol *Emit::seek_symbol(inter_symbols_table *T, text_stream *name) {
        return Inter::SymbolsTables::symbol_from_name(T, name);
    }

    inter_symbol *Emit::new_symbol(inter_symbols_table *T, text_stream *name) {
        inter_symbol *symb = Inter::SymbolsTables::symbol_from_name(T, name);
        if ((symb) && (Inter::Symbols::read_annotation(symb, HOLDING_IANN) == 1)) {
            Emit::annotate_symbol_i(symb, DELENDA_EST_IANN, 1);
            Inter::Nop::nop_out(Emit::repository(), Inter::Symbols::defining_frame(symb));
            Inter::Symbols::undefine(symb);
            return symb;
        }
        return Inter::SymbolsTables::create_with_unique_name(T, name);
    }

    inter_symbol *Emit::holding_symbol(inter_symbols_table *T, text_stream *name) {
        inter_symbol *symb = Inter::SymbolsTables::symbol_from_name(T, name);
        if (symb == NULL) {
            symb = Emit::new_symbol(T, name);
            Emit::guard(Inter::Constant::new_numerical(&holdings_bookmark, Inter::SymbolsTables::id_from_IRS_and_symbol(&holdings_bookmark, symb), Inter::SymbolsTables::id_from_IRS_and_symbol(&holdings_bookmark, int_interk), LITERAL_IVAL, 0, Emit::baseline(&holdings_bookmark), NULL));
            Emit::annotate_symbol_i(symb, HOLDING_IANN, 1);
        }
        return symb;
    }

    inter_symbol *Emit::new_local_symbol(inter_symbol *rsymb, text_stream *name) {
        return Inter::SymbolsTables::create_with_unique_name(Inter::Package::local_symbols(rsymb), name);
    }

    void Emit::annotate_symbol_t(inter_symbol *symb, inter_t annot_ID, text_stream *S) {
        Inter::Symbols::annotate_t(Emit::repository(), symb, annot_ID, S);
    }

    void Emit::annotate_symbol_w(inter_symbol *symb, inter_t annot_ID, wording W) {
        TEMPORARY_TEXT(temp);
        WRITE_TO(temp, "%W", W);
        Inter::Symbols::annotate_t(Emit::repository(), symb, annot_ID, temp);
        DISCARD_TEXT(temp);
    }

    void Emit::annotate_symbol_i(inter_symbol *symb, inter_t annot_ID, inter_t V) {
        Inter::Symbols::annotate_i(Emit::repository(), symb, annot_ID, V);
    }

    void Emit::annotate_iname_i(inter_name *N, inter_t annot_ID, inter_t V) {
        Inter::Symbols::annotate_i(Emit::repository(), InterNames::to_symbol(N), annot_ID, V);
    }

    void Emit::guard(inter_error_message *ERR) {
        if ((ERR) && (problem_count == 0)) { Inter::Errors::issue(ERR); /* internal_error("inter error"); */ }
    }

    void Emit::kind(inter_name *iname, inter_t TID, inter_name *super,
        int constructor, int arity, kind **operand_kinds) {
        packaging_state save = Packaging::enter_home_of(iname);
        inter_symbol *S = InterNames::to_symbol(iname);
        inter_t SID = 0;
        if (S) SID = Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), S);
        inter_symbol *SS = (super)?InterNames::to_symbol(super):NULL;
        inter_t SUP = 0;
        if (SS) SUP = Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), SS);
        inter_t operands[MAX_KIND_ARITY];
        if (arity > MAX_KIND_ARITY) internal_error("kind arity too high");
        for (int i=0; i<arity; i++) {
            if (operand_kinds[i] == K_nil) operands[i] = 0;
            else {
                inter_symbol *S = Emit::kind_to_symbol(operand_kinds[i]);
                operands[i] = Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), S);
            }
        }
        Emit::kind_inner(SID, TID, SUP, constructor, arity, operands);
        InterNames::to_symbol(iname);
        Packaging::exit(save);
    }

    void Emit::kind_inner(inter_t SID, inter_t TID, inter_t SUP,
        int constructor, int arity, inter_t *operands) {
        Emit::guard(Inter::Kind::new(Packaging::at(), SID, TID, SUP, constructor, arity, operands, Emit::baseline(Packaging::at()), NULL));
    }

    inter_symbol *Emit::variable(inter_name *name, kind *K, inter_t v1, inter_t v2, text_stream *rvalue) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *var_name = Emit::define_symbol(name);
        inter_symbol *var_kind = Emit::kind_to_symbol(K);
        Emit::guard(Inter::Variable::new(Packaging::at(),
            Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), var_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), var_kind), v1, v2, Emit::baseline(Packaging::at()), NULL));
        if (rvalue) Emit::annotate_symbol_i(var_name, EXPLICIT_VARIABLE_IANN, 1);
        Packaging::exit(save);
        return var_name;
    }

    void Emit::marker(text_stream *mark) {
        inter_symbol *mark_name = Emit::new_symbol(Emit::main_scope(), Str::duplicate(mark));
        Emit::guard(Inter::Marker::new(Packaging::at(), mark_name, Emit::baseline(Packaging::at()), NULL));
    }

    void Emit::property(inter_name *name, kind *K) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *prop_name = Emit::define_symbol(name);
        inter_symbol *prop_kind = Emit::kind_to_symbol(K);
        Emit::guard(Inter::Property::new(Packaging::at(),
            Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), prop_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), prop_kind), Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    void Emit::permission(property *prn, kind *K, inter_name *name) {
        packaging_state save = Packaging::enter(Kinds::Behaviour::package(K));
        inter_name *prop_name = Properties::iname(prn);
        inter_symbol *owner_kind = Emit::kind_to_symbol(K);
        inter_symbol *store = (name)?InterNames::to_symbol(name):NULL;
        Emit::basic_permission(Packaging::at(), prop_name, owner_kind, store);
        Packaging::exit(save);
    }

    void Emit::instance_permission(property *prn, inter_name *inst_iname) {
        inter_name *prop_name = Properties::iname(prn);
        inter_symbol *inst_name = InterNames::to_symbol(inst_iname);
        packaging_state save = Packaging::enter_home_of(inst_iname);
        Emit::basic_permission(Packaging::at(), prop_name, inst_name, NULL);
        Packaging::exit(save);
    }

    int ppi7_counter = 0;
    void Emit::basic_permission(inter_reading_state *at, inter_name *name, inter_symbol *owner_name, inter_symbol *store) {
        inter_symbol *prop_name = Emit::define_symbol(name);
        inter_error_message *E = NULL;
        TEMPORARY_TEXT(ident);
        WRITE_TO(ident, "pp_i7_%d", ppi7_counter++);
        inter_symbol *pp_name = Inter::Textual::new_symbol(NULL, Inter::Bookmarks::scope(at), ident, &E);
        DISCARD_TEXT(ident);
        Emit::guard(E);
        Emit::guard(Inter::Permission::new(at,
            Inter::SymbolsTables::id_from_IRS_and_symbol(at, prop_name), Inter::SymbolsTables::id_from_IRS_and_symbol(at, owner_name), Inter::SymbolsTables::id_from_IRS_and_symbol(at, pp_name), (store)?(Inter::SymbolsTables::id_from_IRS_and_symbol(at, store)):0, Emit::baseline(at), NULL));
    }

    typedef struct dval_written {
        kind *K_written;
        inter_t v1;
        inter_t v2;
        MEMORY_MANAGEMENT
    } dval_written;

    void Emit::ensure_defaultvalue(kind *K) {
        if (K == K_value) return;
        dval_written *dw;
        LOOP_OVER(dw, dval_written)
            if (Kinds::Compare::eq(K, dw->K_written))
                return;
        dw = CREATE(dval_written);
        dw->K_written = K; dw->v1 = 0; dw->v2 = 0;
        Kinds::RunTime::get_default_value(&(dw->v1), &(dw->v2), K);
        if (dw->v1 != 0)
            Emit::defaultvalue(K, dw->v1, dw->v2);
    }

    void Emit::defaultvalue(kind *K, inter_t v1, inter_t v2) {
        packaging_state save = Packaging::enter(Kinds::Behaviour::package(K));
        inter_symbol *owner_kind = Emit::kind_to_symbol(K);
        Emit::guard(Inter::DefaultValue::new(Packaging::at(),
            Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), owner_kind), v1, v2, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    void Emit::propertyvalue(property *P, kind *K, inter_t v1, inter_t v2) {
        Properties::emit_single(P);
        inter_symbol *prop_name = InterNames::to_symbol(Properties::iname(P));
        inter_symbol *owner_kind = Emit::kind_to_symbol(K);
        Emit::guard(Inter::PropertyValue::new(Packaging::at(),
            Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), prop_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), owner_kind), v1, v2, Emit::baseline(Packaging::at()), NULL));
    }

    void Emit::instance_propertyvalue(property *P, instance *I, inter_t v1, inter_t v2) {
        Properties::emit_single(P);
        inter_symbol *prop_name = InterNames::to_symbol(Properties::iname(P));
        inter_symbol *owner_kind = InterNames::to_symbol(Instances::emitted_iname(I));
        Emit::guard(Inter::PropertyValue::new(Packaging::at(),
            Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), prop_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), owner_kind), v1, v2, Emit::baseline(Packaging::at()), NULL));
    }

    void Emit::named_string_constant(inter_name *name, text_stream *contents) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_t ID = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID), contents);
        inter_symbol *con_name = Emit::define_symbol(name);
        Emit::guard(Inter::Constant::new_textual(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), string_interk), ID, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    void Emit::instance(inter_name *name, kind *K, int v) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *inst_name = Emit::define_symbol(name);
        inter_symbol *val_kind = Emit::kind_to_symbol(K);
        if (val_kind == NULL) internal_error("no kind for val");
        inter_t v1 = LITERAL_IVAL, v2 = (inter_t) v;
        if (v == 0) { v1 = UNDEF_IVAL; v2 = 0; }
        Emit::guard(Inter::Instance::new(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), inst_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), val_kind), v1, v2, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    void Emit::named_generic_constant_xiname(package_request *PR, inter_name *name, inter_name *xiname) {
        inter_t v1 = 0, v2 = 0;
        Inter::Symbols::to_data(Emit::repository(), Packaging::incarnate(PR), InterNames::to_symbol(xiname), &v1, &v2);
        Emit::named_generic_constant(name, v1, v2);
    }

    void Emit::named_generic_constant(inter_name *name, inter_t val1, inter_t val2) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), unchecked_interk), val1, val2, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    inter_name *Emit::named_numeric_constant(inter_name *name, inter_t val) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), int_interk), LITERAL_IVAL, val, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
        return name;
    }

    void Emit::hold_numeric_constant(inter_name *name, inter_t val) {
        inter_symbol *con_name = InterNames::to_symbol(name);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), int_interk), LITERAL_IVAL, val, Emit::baseline(Packaging::at()), NULL));
    }

    void Emit::named_text_constant(inter_name *name, text_stream *content) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        inter_t v1 = 0, v2 = 0;
        Emit::text_value(&v1, &v2, content);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), int_interk), v1, v2, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    void Emit::named_pseudo_numeric_constant(inter_name *name, kind *K, inter_t val) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        inter_symbol *val_kind = Emit::kind_to_symbol(K);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), val_kind), LITERAL_IVAL, val, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    void Emit::ds_named_pseudo_numeric_constant(inter_name *name, kind *K, inter_t val) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        inter_symbol *val_kind = Emit::kind_to_symbol(K);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), val_kind), LITERAL_IVAL, val, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
    }

    packaging_state Emit::named_late_array_begin(inter_name *name, kind *K) {
        packaging_state save = Emit::named_array_begin(name, K);
        Emit::annotate_iname_i(name, LATE_IANN, 1);
        return save;
    }

    packaging_state Emit::named_byte_array_begin(inter_name *name, kind *K) {
        packaging_state save = Emit::named_array_begin(name, K);
        Emit::annotate_iname_i(name, BYTEARRAY_IANN, 1);
        return save;
    }

    packaging_state Emit::named_table_array_begin(inter_name *name, kind *K) {
        packaging_state save = Emit::named_array_begin(name, K);
        Emit::annotate_iname_i(name, TABLEARRAY_IANN, 1);
        return save;
    }

    packaging_state Emit::named_string_array_begin(inter_name *name, kind *K) {
        packaging_state save = Emit::named_array_begin(name, K);
        Emit::annotate_iname_i(name, STRINGARRAY_IANN, 1);
        return save;
    }

    packaging_state Emit::named_verb_array_begin(inter_name *name, kind *K) {
        packaging_state save = Emit::named_array_begin(name, K);
        Emit::annotate_iname_i(name, VERBARRAY_IANN, 1);
        Emit::annotate_iname_i(name, LATE_IANN, 1);
        return save;
    }

    typedef struct nascent_array {
        struct inter_symbol *array_name_symbol;
        struct kind *entry_kind;
        inter_t array_form;
        int no_entries;
        int capacity;
        inter_t *entry_data1;
        inter_t *entry_data2;
        struct nascent_array *up;
        struct nascent_array *down;
        MEMORY_MANAGEMENT
    } nascent_array;

    nascent_array *first_A = NULL, *current_A = NULL;

    void Emit::push_array(void) {
        nascent_array *A = NULL;

        if (current_A) {
            A = current_A->down;
            if (A == NULL) {
                A = CREATE(nascent_array);
                A->up = current_A;
                A->down = NULL;
                A->capacity = 0;
                current_A->down = A;
            }
        } else {
            if (first_A) A = first_A;
            else {
                A = CREATE(nascent_array);
                A->up = NULL;
                A->down = NULL;
                A->capacity = 0;
                first_A = A;
            }
        }

        A->no_entries = 0;
        A->entry_kind = NULL;
        A->array_name_symbol = NULL;
        A->array_form = CONSTANT_INDIRECT_LIST;
        current_A = A;
    }

    void Emit::pull_array(void) {
        if (current_A == NULL) internal_error("pull array failed");
        current_A = current_A->up;
    }

    void Emit::add_entry(inter_t v1, inter_t v2) {
        if (current_A == NULL) internal_error("no nascent array");
        int N = current_A->no_entries;
        if (N+1 > current_A->capacity) {
            int M = 4*(N+1);
            if (current_A->capacity == 0) M = 256;

            inter_t *old_data1 = current_A->entry_data1;
            inter_t *old_data2 = current_A->entry_data2;

            current_A->entry_data1 = Memory::I7_calloc(M, sizeof(inter_t), EMIT_ARRAY_MREASON);
            current_A->entry_data2 = Memory::I7_calloc(M, sizeof(inter_t), EMIT_ARRAY_MREASON);

            for (int i=0; i<current_A->capacity; i++) {
                current_A->entry_data1[i] = old_data1[i];
                current_A->entry_data2[i] = old_data2[i];
            }

            if (old_data1) Memory::I7_array_free(old_data1, EMIT_ARRAY_MREASON, current_A->capacity, sizeof(inter_t));
            if (old_data2) Memory::I7_array_free(old_data2, EMIT_ARRAY_MREASON, current_A->capacity, sizeof(inter_t));

            current_A->capacity = M;
        }
        current_A->entry_data1[N] = v1;
        current_A->entry_data2[N] = v2;
        current_A->no_entries++;
    }

    packaging_state Emit::sum_constant_begin(inter_name *name, kind *K) {
        packaging_state save = Emit::named_array_begin(name, K);
        current_A->array_form = CONSTANT_SUM_LIST;
        return save;
    }

    packaging_state Emit::named_array_begin(inter_name *N, kind *K) {
        packaging_state save = Packaging::enter_home_of(N);
        inter_symbol *symb = Emit::define_symbol(N);
        Emit::push_array();
        if (K == NULL) K = K_value;
        current_A->entry_kind = K;
        current_A->array_name_symbol = symb;
        return save;
    }

    void Emit::array_iname_entry(inter_name *iname) {
        if (current_A == NULL) internal_error("entry outside of inter array");
        inter_symbol *alias;
        if (iname == NULL) alias = InterNames::to_symbol(Emit::nothing());
        else alias = InterNames::to_symbol(iname);
        inter_t val1 = 0, val2 = 0;
        inter_reading_state *IRS = Emit::array_IRS();
        Inter::Symbols::to_data(IRS->read_into, IRS->current_package, alias, &val1, &val2);
        Emit::add_entry(val1, val2);
    }

    void Emit::array_null_entry(void) {
        Emit::array_iname_entry(Hierarchy::find(NULL_HL));
    }

    void Emit::array_MPN_entry(void) {
        Emit::array_iname_entry(Hierarchy::find(MAX_POSITIVE_NUMBER_HL));
    }

    void Emit::array_generic_entry(inter_t val1, inter_t val2) {
        if (current_A == NULL) internal_error("entry outside of inter array");
        Emit::add_entry(val1, val2);
    }

    #ifdef IF_MODULE
    void Emit::array_action_entry(action_name *an) {
        if (current_A == NULL) internal_error("entry outside of inter array");
        inter_t v1 = 0, v2 = 0;
        inter_symbol *symb = InterNames::to_symbol(PL::Actions::iname(an));
        inter_reading_state *IRS = Emit::array_IRS();
        Inter::Symbols::to_data(IRS->read_into, IRS->current_package, symb, &v1, &v2);
        Emit::add_entry(v1, v2);
    }
    #endif

    void Emit::array_text_entry(text_stream *content) {
        if (current_A == NULL) internal_error("entry outside of inter array");
        inter_t v1 = 0, v2 = 0;
        Emit::text_value(&v1, &v2, content);
        Emit::add_entry(v1, v2);
    }

    void Emit::array_dword_entry(text_stream *content) {
        if (current_A == NULL) internal_error("entry outside of inter array");
        inter_t v1 = 0, v2 = 0;
        Emit::dword_value(&v1, &v2, content);
        Emit::add_entry(v1, v2);
    }

    void Emit::array_plural_dword_entry(text_stream *content) {
        if (current_A == NULL) internal_error("entry outside of inter array");
        inter_t v1 = 0, v2 = 0;
        Emit::plural_dword_value(&v1, &v2, content);
        Emit::add_entry(v1, v2);
    }

    void Emit::array_numeric_entry(inter_t N) {
        if (current_A == NULL) internal_error("entry outside of inter array");
        Emit::add_entry(LITERAL_IVAL, N);
    }

    void Emit::array_divider(text_stream *divider_text) {
        if (current_A == NULL) internal_error("entry outside of inter array");
        inter_t S = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), S), divider_text);
        Emit::add_entry(DIVIDER_IVAL, S);
    }

    inter_reading_state *Emit::array_IRS(void) {
        if (current_A == NULL) internal_error("inter array not opened");
        inter_reading_state *IRS = Packaging::at();
        return IRS;
    }

    void Emit::array_end(packaging_state save) {
        if (current_A == NULL) internal_error("inter array not opened");
        inter_symbol *con_name = current_A->array_name_symbol;
        inter_reading_state *IRS = Packaging::at();
        kind *K = current_A->entry_kind;
        inter_t CID = 0;
        if (K) {
            inter_symbol *con_kind = NULL;
            if (current_A->array_form == CONSTANT_INDIRECT_LIST)
                con_kind = Emit::kind_to_symbol(Kinds::unary_construction(CON_list_of, K));
            else
                con_kind = Emit::kind_to_symbol(K);
            CID = Inter::SymbolsTables::id_from_IRS_and_symbol(IRS, con_kind);
        } else {
            CID = Inter::SymbolsTables::id_from_IRS_and_symbol(IRS, unchecked_interk);
        }
        inter_frame array_in_progress =
            Inter::Frame::fill_3(IRS, CONSTANT_IST, Inter::SymbolsTables::id_from_IRS_and_symbol(IRS, con_name), CID, current_A->array_form, NULL, Emit::baseline(IRS));
        int pos = array_in_progress.extent;
        if (Inter::Frame::extend(&array_in_progress, (unsigned int) (2*current_A->no_entries)) == FALSE)
            internal_error("can't extend frame");
        for (int i=0; i<current_A->no_entries; i++) {
            array_in_progress.data[pos++] = current_A->entry_data1[i];
            array_in_progress.data[pos++] = current_A->entry_data2[i];
        }
        Emit::guard(Inter::Defn::verify_construct(array_in_progress));
        Inter::Frame::insert(array_in_progress, Packaging::at());
        Emit::pull_array();
        Packaging::exit(save);
    }

    inter_name *nothing_iname = NULL;
    inter_name *Emit::nothing(void) {
        if (K_object == NULL) internal_error("too soon for nothing");
        if (nothing_iname == NULL) {
            nothing_iname = Hierarchy::find(NOTHING_HL);
            packaging_state save = Packaging::enter_home_of(nothing_iname);
            Emit::named_pseudo_numeric_constant(nothing_iname, K_object, 0);
            Packaging::exit(save);
        }
        return nothing_iname;
    }

    inter_name *Emit::named_iname_constant(inter_name *name, kind *K, inter_name *iname) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        inter_symbol *val_kind = Emit::kind_to_symbol(K);
        inter_symbol *alias = (iname)?InterNames::to_symbol(iname):NULL;
        if (alias == NULL) {
            if (Kinds::Compare::le(K, K_object)) alias = InterNames::to_symbol(Emit::nothing());
            else internal_error("can't handle a null alias");
        }
        inter_t val1 = 0, val2 = 0;
        Inter::Symbols::to_data(Packaging::at()->read_into, Packaging::at()->current_package, alias, &val1, &val2);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), val_kind), val1, val2, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
        return name;
    }

    inter_name *Emit::named_numeric_constant_hex(inter_name *name, inter_t val) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        Emit::annotate_symbol_i(con_name, HEX_IANN, 0);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), int_interk), LITERAL_IVAL, val, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
        return name;
    }

    inter_name *Emit::named_unchecked_constant_hex(inter_name *name, inter_t val) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        Emit::annotate_symbol_i(con_name, HEX_IANN, 0);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), unchecked_interk), LITERAL_IVAL, val, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
        return name;
    }

    inter_name *Emit::named_numeric_constant_signed(inter_name *name, int val) {
        packaging_state save = Packaging::enter_home_of(name);
        inter_symbol *con_name = Emit::define_symbol(name);
        Emit::annotate_symbol_i(con_name, SIGNED_IANN, 0);
        Emit::guard(Inter::Constant::new_numerical(Packaging::at(), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), con_name), Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), int_interk), LITERAL_IVAL, (inter_t) val, Emit::baseline(Packaging::at()), NULL));
        Packaging::exit(save);
        return name;
    }

    inter_symbol *current_inter_routine = NULL;
    inter_reading_state current_inter_reading_state;
    inter_reading_state locals_bookmark;
    inter_reading_state begin_bookmark;
    inter_reading_state code_bookmark;

    void Emit::early_comment(text_stream *text) {
        inter_t ID = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID), text);
        Emit::guard(Inter::Comment::new(Packaging::at(), Emit::baseline(Packaging::at()) + 1, NULL, ID));
    }

    void Emit::code_comment(text_stream *text) {
        inter_t ID = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID), text);
        Emit::guard(Inter::Comment::new(Emit::at(), (inter_t) Emit::level(), NULL, ID));
    }

    inter_symbol *Emit::package(inter_name *iname, inter_symbol *ptype, inter_package **P) {
        inter_t B = Emit::baseline(Packaging::at());
        inter_symbol *rsymb = Emit::define_symbol(iname);
        if (ptype == NULL) internal_error("no package type");
        inter_package *IP = NULL;
        Emit::guard(Inter::Package::new_package(Packaging::at(), rsymb, ptype, B, NULL, &IP));
        if (IP) {
            IP->I7_baseline = B+1;
            Inter::Defn::set_current_package(Packaging::at(), IP);
            if (P) *P = IP;
        }
        return rsymb;
    }

    inter_symbol *Emit::block(packaging_state *save, inter_name *iname) {
        if (current_inter_routine) internal_error("nested routines");
        if (Packaging::at() == NULL) internal_error("no inter repository");

        if (save) {
            *save = Packaging::enter_home_of(iname);
            package_request *R = InterNames::location(iname);
            if ((R == NULL) || (R == Hierarchy::main())) {
                LOG("Routine outside of package: %n\n", iname);
                internal_error("routine outside of package");
            }
        }

        inter_name *block_iname = NULL;
        if (Packaging::housed_in_function(iname))
            block_iname = Hierarchy::make_block_iname(InterNames::location(iname));
        else internal_error("routine outside function package");
        inter_symbol *rsymb = Emit::package(block_iname, code_packagetype, NULL);

        current_inter_routine = rsymb;
        current_inter_reading_state = Emit::bookmark();
        locals_bookmark = current_inter_reading_state;
        Emit::place_label(Emit::reserve_label(I".begin"), FALSE);
        begin_bookmark = Emit::bookmark();
        Emit::early_comment(I"body:");
        code_bookmark = Emit::bookmark();
        Emit::place_label(Emit::reserve_label(I".end"), FALSE);
        code_insertion_point cip = Emit::new_cip(&code_bookmark);
        Emit::push_code_position(cip);
        return rsymb;
    }

    inter_name *Emit::kernel(inter_name *public_name) {
        if (Packaging::housed_in_function(public_name) == FALSE)
            internal_error("routine not housed in function");
        return Hierarchy::make_kernel_iname(InterNames::location(public_name));
    }

    void Emit::end_main_block(packaging_state save) {
        Packaging::exit(save);
    }

    void Emit::routine(inter_name *rname, kind *rkind, inter_symbol *block_name) {
        if (Packaging::at() == NULL) internal_error("no inter repository");
        inter_symbol *AB_symbol = Emit::kind_to_symbol(rkind);
        inter_symbol *rsymb = Emit::define_symbol(rname);
        Emit::guard(Inter::Constant::new_function(Packaging::at(),
            Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), rsymb),
            Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), AB_symbol),
            Inter::SymbolsTables::id_from_IRS_and_symbol(Packaging::at(), block_name),
            Emit::baseline(Packaging::at()), NULL));
    }

    inter_symbol *Emit::reserve_label(text_stream *lname) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        inter_symbol *lab_name = Emit::local_exists(lname);
        if (lab_name) return lab_name;
        lab_name = Emit::new_local_symbol(current_inter_routine, lname);
        Inter::Symbols::label(lab_name);
        return lab_name;
    }

    void Emit::place_label(inter_symbol *lab_name, int inside) {
        if (inside) {
            Emit::guard(Inter::Label::new(Emit::at(), current_inter_routine, lab_name, (inter_t) Emit::level(), NULL));
        } else {
            Emit::guard(Inter::Label::new(Packaging::at(), current_inter_routine, lab_name, Emit::baseline(Packaging::at()) + 1, NULL));
        }
    }

    inter_symbol *Emit::local_exists(text_stream *lname) {
        return Inter::SymbolsTables::symbol_from_name(Inter::Package::local_symbols(current_inter_routine), lname);
    }

    inter_symbol *Emit::local(kind *K, text_stream *lname, inter_t annot, text_stream *comm) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        if (K == NULL) K = K_number;
        inter_symbol *loc_name = Emit::new_local_symbol(current_inter_routine, lname);
        inter_symbol *loc_kind = Emit::kind_to_symbol(K);
        inter_t ID = 0;
        if ((comm) && (Str::len(comm) > 0)) {
            ID = Inter::create_text(Emit::repository());
            Str::copy(Inter::get_text(Emit::repository(), ID), comm);
        }
        if (annot) Emit::annotate_symbol_i(loc_name, annot, 0);
        Inter::Symbols::local(loc_name);
        Emit::guard(Inter::Local::new(&locals_bookmark, current_inter_routine, loc_name, loc_kind, ID, Emit::baseline(&locals_bookmark) + 1, NULL));
        return loc_name;
    }

    void Emit::inv_primitive(inter_symbol *prim_symb) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        if ((prim_symb == switch_interp) ||
            (prim_symb == if_interp) ||
            (prim_symb == ifelse_interp) ||
            (prim_symb == for_interp) ||
            (prim_symb == while_interp) ||
            (prim_symb == objectloop_interp)) Emit::note_level(prim_symb);

        Emit::guard(Inter::Inv::new_primitive(Emit::at(), current_inter_routine, prim_symb, (inter_t) Emit::level(), NULL));
    }

    void Emit::inv_call(inter_symbol *prim_symb) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        Emit::guard(Inter::Inv::new_call(Emit::at(), current_inter_routine, prim_symb, (inter_t) Emit::level(), NULL));
    }

    void Emit::inv_call_iname(inter_name *iname) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        inter_symbol *prim_symb = InterNames::to_symbol(iname);
        Emit::guard(Inter::Inv::new_call(Emit::at(), current_inter_routine, prim_symb, (inter_t) Emit::level(), NULL));
    }

    void Emit::inv_indirect_call(int arity) {
        switch (arity) {
            case 0: Emit::inv_primitive(indirect0_interp); break;
            case 1: Emit::inv_primitive(indirect1_interp); break;
            case 2: Emit::inv_primitive(indirect2_interp); break;
            case 3: Emit::inv_primitive(indirect3_interp); break;
            case 4: Emit::inv_primitive(indirect4_interp); break;
            default: internal_error("indirect function call with too many arguments");
        }
    }

    void Emit::inv_assembly(text_stream *opcode) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        inter_t SID = Inter::create_text(Emit::repository());
        text_stream *glob_storage = Inter::get_text(Emit::repository(), SID);
        Str::copy(glob_storage, opcode);
        Emit::guard(Inter::Inv::new_assembly(Emit::at(), current_inter_routine, SID, (inter_t) Emit::level(), NULL));
    }

    void Emit::return(kind *K, inter_name *iname) {
        Emit::inv_primitive(return_interp);
        Emit::down();
        Emit::val_iname(K, iname);
        Emit::up();
    }

    void Emit::rtrue(void) {
        Emit::inv_primitive(return_interp);
        Emit::down();
            Emit::val(K_number, LITERAL_IVAL, 1);     that is, return "true"
        Emit::up();
    }

    void Emit::rfalse(void) {
        Emit::inv_primitive(return_interp);
        Emit::down();
            Emit::val(K_number, LITERAL_IVAL, 0);     that is, return "false"
        Emit::up();
    }

    void Emit::push(kind *K, inter_name *iname) {
        Emit::inv_primitive(push_interp);
        Emit::down();
        Emit::val_iname(K, iname);
        Emit::up();
    }

    void Emit::pull(kind *K, inter_name *iname) {
        Emit::inv_primitive(pull_interp);
        Emit::down();
        Emit::ref_iname(K, iname);
        Emit::up();
    }

The function Emit::pragma is used in 26/uo (§18).

The function Emit::append is used in 15/epv (§1.1.2).

The function Emit::import is used in 21/rl (§22).

The function Emit::export is used in 21/rl (§26).

The function Emit::primitive is used in 27/ip (§2).

The function Emit::main_scope is used in §2, 13/rsfk (§5, §24), 27/is (§32).

The function Emit::global_scope appears nowhere else.

The function Emit::main_render_unique is used in 13/rsfk (§24).

The function Emit::seek_symbol is used in 13/rsfk (§5), 27/is (§32).

The function Emit::new_symbol is used in §2, 27/in (§8).

The function Emit::holding_symbol is used in 13/rsfk (§5).

The function Emit::new_local_symbol appears nowhere else.

The function Emit::annotate_symbol_t is used in §5.

The function Emit::annotate_symbol_w is used in §5.

The function Emit::annotate_symbol_i is used in §2, §5.

The function Emit::annotate_iname_i appears nowhere else.

The function Emit::guard is used in §2, §4.

The function Emit::kind is used in 13/rsfk (§22, §24).

The function Emit::kind_inner is used in §2.

The function Emit::variable is used in 5/nv (§16), 27/hr (§4).

The function Emit::marker appears nowhere else.

The function Emit::property is used in 15/pr (§27).

The function Emit::permission is used in 15/pr (§27).

The function Emit::instance_permission is used in 15/pr (§27).

The function Emit::basic_permission appears nowhere else.

The function Emit::ensure_defaultvalue is used in 15/pr (§27).

The function Emit::defaultvalue appears nowhere else.

The function Emit::propertyvalue is used in 15/epv (§2.1).

The function Emit::instance_propertyvalue is used in 15/epv (§2.1).

The function Emit::named_string_constant is used in 12/cdp (§2.1.1), 17/tl (§14.1), 21/fao (§10), 26/iti (§10).

The function Emit::instance is used in 5/ins (§34).

The function Emit::named_generic_constant_xiname is used in 21/rl (§9).

The function Emit::named_generic_constant appears nowhere else.

The function Emit::named_numeric_constant is used in 6/rlt (§20.3), 13/kak (§5), 13/rsfk (§24), 21/ac (§6), 22/cs (§8), 24/ch (§8), 26/vm (§8), 26/uo (§21), 26/pl (§12), 26/ts (§10), 27/hr (§4).

The function Emit::hold_numeric_constant appears nowhere else.

The function Emit::named_text_constant appears nowhere else.

The function Emit::named_pseudo_numeric_constant appears nowhere else.

The function Emit::ds_named_pseudo_numeric_constant appears nowhere else.

The function Emit::named_late_array_begin is used in 13/rsfk (§4), 17/tl (§16), 17/ts (§8.1), 18/lc (§11).

The function Emit::named_byte_array_begin is used in 6/rlt (§20.3), 19/rsft (§1.2), 21/ac (§14), 26/ts (§10).

The function Emit::named_table_array_begin is used in 19/rsft (§1.1.1.1, §1.1.1.1.1), 22/tp2 (§4).

The function Emit::named_string_array_begin appears nowhere else.

The function Emit::named_verb_array_begin appears nowhere else.

The function Emit::push_array appears nowhere else.

The function Emit::pull_array appears nowhere else.

The function Emit::add_entry appears nowhere else.

The function Emit::sum_constant_begin is used in 6/rlt (§15.1.2).

The function Emit::named_array_begin is used in 6/rlt (§15.1, §16, §20, §20.3), 6/nv (§18), 13/rsfk (§16.1), 17/tl (§14.1), 17/ts (§11), 17/rs (§6.1, §7.3), 18/lc (§12.1, §13), 19/rsft (§1.3), 21/rb (§24.1.1), 21/rl2 (§14, §20), 21/ac (§8, §14), 22/pav (§8.1, §9.1), 24/ch (§6), 26/lt (§4.1), 26/jl (§6), 26/ts (§10).

The function Emit::array_iname_entry is used in 6/rlt (§15.1.2, §15.1.2.1, §15.1.3, §15.1.6, §16, §20.2), 6/nv (§18), 13/rsfk (§4, §9, §12), 17/tl (§14.1, §16), 17/ts (§8.1, §11), 17/rs (§6.1, §7.3.1.1), 18/lc (§11), 19/rsft (§1.1.1.1, §1.1.1.1.1.5, §1.3), 21/rl2 (§14, §20), 21/ac (§8), 22/pav (§8.1, §9.1), 22/tp2 (§4), 24/ch (§6), 26/lt (§4.1), 26/ts (§10).

The function Emit::array_null_entry is used in 6/rlt (§15.1, §16), 19/rsft (§1.1.1.1.1.3, §1.2), 21/rb (§24.1.5), 21/ac (§14).

The function Emit::array_MPN_entry is used in 13/rsfk (§20).

The function Emit::array_generic_entry is used in 5/nv (§25), 13/rsfk (§4), 14/cfs (§9), 19/rsft (§1.1.1.1.1.4).

The function Emit::array_action_entry is used in 21/rb (§24.1.2).

The function Emit::array_text_entry is used in 6/rlt (§15.1.1, §15.1.5, §16), 17/rs (§7.3.1.1), 21/rl2 (§20), 22/pav (§8.1, §9.1), 26/ts (§10).

The function Emit::array_dword_entry appears nowhere else.

The function Emit::array_plural_dword_entry appears nowhere else.

The function Emit::array_numeric_entry is used in 6/rlt (§15.1, §15.1.3, §16, §19, §20.2, §20.3), 6/nv (§18), 13/rsfk (§4, §9, §16.1.1.1, §16.1.1.2, §20), 17/rs (§7.3, §7.3.1.1, §7.3.1.2), 18/lc (§11, §12.1, §13), 19/rsft (§1.1.1.1.1.3, §1.1.1.1.1.4, §1.2.3, §1.3), 21/rb (§24.1.1, §24.1.2), 21/rl2 (§14, §20), 21/ac (§8, §14), 22/tp2 (§4), 24/ch (§6), 26/jl (§6), 26/ts (§10).

The function Emit::array_divider appears nowhere else.

The function Emit::array_IRS appears nowhere else.

The function Emit::array_end is used in 6/rlt (§15.1, §15.1.2, §16, §20, §20.3), 6/nv (§18), 13/rsfk (§4, §16.1), 17/tl (§14.1, §16), 17/ts (§8.1, §11), 17/rs (§6.1, §7.3), 18/lc (§11, §12.1, §13), 19/rsft (§1.1.1.1, §1.1.1.1.1, §1.2, §1.3), 21/rb (§24.1.5), 21/rl2 (§14, §20), 21/ac (§8, §14), 22/pav (§8.1, §9.1), 22/tp2 (§4), 24/ch (§6), 26/lt (§4.1), 26/jl (§6), 26/ts (§10).

The function Emit::nothing appears nowhere else.

The function Emit::named_iname_constant is used in 6/bp (§42), 16/ic (§10), 17/tl (§14.2), 21/rb (§24).

The function Emit::named_numeric_constant_hex is used in 6/rlt (§14), 26/vm (§8).

The function Emit::named_unchecked_constant_hex is used in 26/vm (§8).

The function Emit::named_numeric_constant_signed is used in 6/nv (§18), 26/vm (§8).

The function Emit::early_comment appears nowhere else.

The function Emit::code_comment is used in 4/am (§34.2), 5/lp (§27, §29, §30), 6/nv (§18.2), 12/cdp (§1), 13/rsfk (§24.1), 20/eq (§47), 25/ci (§3.2.3), 25/cp (§5.1).

The function Emit::package is used in 27/pc (§9).

The function Emit::block is used in 26/rt (§3, §4.1).

The function Emit::kernel is used in 26/rt (§4).

The function Emit::end_main_block is used in 26/rt (§4).

The function Emit::routine is used in 26/rt (§4, §4.1).

The function Emit::reserve_label is used in 5/lp (§19, §28), 12/cdp (§2.1.6.1.2.2.2.1, §2.1.6.1.6), 24/pb (§14, §17), 25/cii (§3.4.1), 25/cp (§5.4.3), 27/is (§31.1).

The function Emit::place_label is used in 5/lp (§19, §27.3), 12/cdp (§2.1.6.1.6), 24/pb (§14), 25/cp (§5.4.3), 27/is (§31.1).

The function Emit::local_exists is used in 24/lv (§47).

The function Emit::local is used in 24/lv (§47), 26/rt (§4.1.1).

The function Emit::inv_primitive is used in 4/am (§35, §43), 5/lp (§19, §19.1, §19.2, §19.3, §19.3.1, §19.3.1.1, §19.3.2, §19.2.1, §19.2.2, §27, §27.2, §27.3, §27.3.1, §27.3.2, §27.3.3, §27.3.4), 5/ins (§29), 5/nv (§12, §16), 6/bp (§25), 6/rlt (§15, §15.2, §15.2.4, §15.2.5, §15.2.6, §15.2.7, §15.2.8, §15.2.9, §15.2.10, §15.2.11, §15.2.12, §15.2.9.1, §15.2.10.1, §15.2.12.1, §17, §29.1, §29.2, §29.3, §29.4, §29.5, §29.6, §30), 6/nv (§17, §18.1, §18.2, §18.1.2, §18.1.2.1, §18.1.2.2, §19), 8/ef (§19), 12/ca (§5.2), 12/dtd (§7.1, §7.1.1, §8, §9, §9.1, §15, §16, §18, §19, §20, §22, §23, §25, §26, §27), 12/cdp (§2.1.6, §2.1.6.1.2.2, §2.1.6.1.2.3.2, §2.1.6.1.2.3.7, §2.1.6.1.2.4, §2.1.6.1.2.5, §2.1.6.1.2.2.2, §2.1.6.1.2.2.2.1, §2.1.6.1.7, §2.1.6.1.8, §2.1.6.1.2.2.3, §2.1.6.1.9, §2.1.6.1.10, §2.1.6.1.2.2.4, §2.1.6.1.11, §2.1.6.1.2.2.5, §2.1.6.1.13, §2.1.6.1.14, §2.1.6.1.2.2.6, §2.1.6.1.2.2.6.1, §2.1.6.1.15, §2.1.6.1.17, §2.1.6.1.2.2.7, §2.1.6.1.18), 13/kak (§2), 13/ca (§1.2, §1.3, §1.4, §1.10, §1.11, §1.12, §1.13), 13/rsfk (§16.3, §24.1, §24.2, §24.3, §24.4.1, §24.4.2, §24.5, §24.5.1, §24.6.1, §24.6.2, §24.6.3, §24.6.4, §24.6.5, §24.6.6, §25), 14/rv (§24.3), 14/lv (§14.3.2), 14/cn (§16.1, §16.2, §16.3), 15/ma (§13), 15/epv (§4), 17/tl (§14.2), 17/ts (§11.1), 17/rs (§6.2, §7.2), 19/tc (§8), 19/rsft (§2), 21/rl (§11, §11.2, §20, §20.1, §20.2, §22.1), 21/rb (§24.1.1, §24.1.2, §24.1.3, §24.1.5, §24.1.3.1), 21/rl2 (§14.1), 21/fao (§10), 21/sv (§3, §3.1, §3.2), 21/ac (§14), 22/prcd (§10, §10.2, §10.3, §10.4, §10.5, §10.1.1.1), 22/pav (§9.2), 23/abc (§1), 24/lv (§28, §29, §43), 24/pb (§17), 24/ch (§3, §3.1, §6, §7, §7.1, §7.2, §7.3, §7.4, §7.4.1, §7.5), 25/ci (§3, §3.2.3, §3.2.3.2, §3.2.3.1.1, §3.2.3.3.1.2, §3.2.3.4.1.1, §3.2.3.3.1.2.1, §3.2.3.3.1.3, §4.2), 25/ciac (§2), 25/cii (§1.2.1, §3.1.1.4.10, §3.5.3, §3.5.8.1, §3.5.8.2, §3.5.8.3, §3.5.9), 25/cp (§3.3.1, §5.2.1, §5.3.4, §5.3.5, §5.3.5.1, §5.3.5.2, §5.3.5.3), 26/uo (§21.1, §21.2), 26/lt (§4.1), 26/rt (§4.1.3, §4.1.5), 26/ts (§10, §11, §12), 27/is (§31.4, §31.5, §31.6, §31.7, §31.8).

The function Emit::inv_call is used in 27/is (§31.4).

The function Emit::inv_call_iname is used in 4/am (§43), 5/lp (§19, §19.3.1, §19.3.1.1, §19.3.2, §19.2.1), 5/nv (§12), 6/bp (§33), 6/rlt (§15, §15.2.1, §15.2.5.1, §15.2.6, §15.2.10, §15.2.11, §15.2.12, §15.2.9.1, §15.2.10.1, §15.2.12.1, §29.5, §29.6), 6/nv (§17, §18.2), 12/dtd (§7.1.2, §11, §17, §27), 12/cdp (§2.1.6.1.8, §2.1.6.1.2.2.3, §2.1.6.1.9), 13/ca (§1, §1.2, §1.3, §1.4, §1.5, §1.6, §1.7, §1.8, §1.9, §1.11, §1.12), 13/rsfk (§7, §19, §24.6.1, §24.6.2, §24.6.3, §24.6.4, §24.6.5, §24.6.6), 14/lv (§14.3, §14.4, §14.5), 14/cfs (§7), 17/ts (§8), 17/rs (§6.1, §6.2, §7.2), 20/eq (§48), 21/rl (§11.2, §22.1), 21/rb (§24.1.3.1), 21/fao (§10), 21/sv (§3.2), 21/ac (§14), 22/prcd (§10, §10.1.1.1), 22/pav (§9.2), 24/lv (§41), 24/ch (§4), 25/ci (§3.2.3.6), 25/ciac (§2), 25/cii (§3.1.1.4.7.1, §3.1.1.4.9, §3.1.1.4.10, §3.5.3, §3.5.8, §3.5.8.1), 25/cp (§6), 26/rt (§4.1.2, §4.1.3, §4.1.4), 26/ts (§10, §12).

The function Emit::inv_indirect_call appears nowhere else.

The function Emit::inv_assembly is used in 25/cii (§3.5.8.3), 27/is (§31.3).

The function Emit::return appears nowhere else.

The function Emit::rtrue is used in 5/lp (§27, §27.3.4), 6/rlt (§15.2.2, §15.2.3, §15.2.4, §15.2.7, §15.2.9.1, §29.4, §29.5, §29.6), 6/nv (§18.1), 12/cdp (§2.1.6.1.2.2.1), 13/rsfk (§24.6.5), 15/ma (§13), 17/ts (§11.1), 19/rsft (§2), 21/rl (§20.2), 21/fao (§10), 24/ch (§6), 25/cp (§5.4.4), 26/uo (§21.1).

The function Emit::rfalse is used in 4/am (§34.2), 6/bp (§25), 6/rlt (§15.2, §15.2.2, §15.2.3, §15.2.4, §15.2.9.1, §29.4), 6/nv (§18.1), 12/cdp (§2.1.6.1.4), 13/rsfk (§24.6.5, §24.6.6), 15/ma (§13), 20/eq (§43), 21/rb (§23), 21/fao (§10), 24/ch (§6), 26/uo (§21.1), 26/lt (§4.1), 26/ts (§10).

The function Emit::push is used in 26/rt (§4.1.2).

The function Emit::pull is used in 26/rt (§4.1.4).

The structure dval_written is private to this section.

The structure nascent_array is accessed in 5/lp, 5/un, 7/hdn, 7/ns, 7/oaf, 7/rs, 8/ie, 9/tfa, 9/tbath, 9/rpt, 9/tc, 9/ma, 9/rk, 9/ass, 9/imp, 9/pd, 10/aots, 10/teav, 10/varc, 10/cap, 11/bas, 11/tc, 11/sc, 11/sm, 12/dtd, 14/sp, 14/rv, 14/lv, 14/cn, 14/ds, 14/ds2, 15/cp, 17/ts, 18/lc, 19/tb, 19/rsft, 19/tod, 21/rl, 21/rl2, 21/rps, 21/ac, 22/cs, 22/ph, 23/ad, 24/lv, 24/ch, 25/in, 25/pi, 25/cp, 26/uo, 26/tti, 27/cm and here.

§4.

    define MAX_NESTED_NOTEWORTHY_LEVELS 256
    define MAX_CIP_STACK_SIZE 2
    typedef struct code_insertion_point {
        int inter_level;
        int noted_levels[MAX_NESTED_NOTEWORTHY_LEVELS];
        int noted_sp;
        int error_flag;
        inter_reading_state *insertion_bm;
    } code_insertion_point;

    code_insertion_point cip_stack[MAX_CIP_STACK_SIZE];
    int cip_sp = 0;

    code_insertion_point Emit::new_cip(inter_reading_state *IRS) {
        code_insertion_point cip;
        cip.inter_level = (int) (Emit::baseline(IRS) + 2);
        cip.noted_sp = 2;
        cip.error_flag = FALSE;
        cip.insertion_bm = IRS;
        return cip;
    }

    code_insertion_point Emit::begin_position(void) {
        code_insertion_point cip = Emit::new_cip(&begin_bookmark);
        return cip;
    }

    void Emit::push_code_position(code_insertion_point cip) {
        if (cip_sp >= MAX_CIP_STACK_SIZE) internal_error("CIP overflow");
        cip_stack[cip_sp++] = cip;
    }

    int Emit::level(void) {
        if (cip_sp <= 0) internal_error("CIP level accessed outside routine");
        code_insertion_point *cip = &cip_stack[cip_sp-1];
        return cip->inter_level;
    }

    void Emit::set_level(int N) {
        if (cip_sp <= 0) internal_error("CIP level accessed outside routine");
        code_insertion_point *cip = &cip_stack[cip_sp-1];
        if (N < 2) {
            if (problem_count == 0) cip->error_flag = TRUE;
            N = 2;
        }
        while (cip->noted_sp > 0) {
            if (cip->noted_levels[cip->noted_sp-1] < N) break;
            cip->noted_sp--;
        }
        cip->inter_level = N;
    }

    void Emit::note_level(inter_symbol *from) {
        if (cip_sp <= 0) internal_error("CIP level accessed outside routine");
        code_insertion_point *cip = &cip_stack[cip_sp-1];
        if (cip->noted_sp >= MAX_NESTED_NOTEWORTHY_LEVELS) return;
        cip->noted_levels[cip->noted_sp++] = Emit::level();
    }

    void Emit::to_last_level(int delta) {
        if (cip_sp <= 0) internal_error("CIP level accessed outside routine");
        code_insertion_point *cip = &cip_stack[cip_sp-1];
        if (cip->noted_sp <= 0) {
            if (problem_count == 0) cip->error_flag = TRUE;
        } else {
            Emit::set_level(cip->noted_levels[cip->noted_sp-1] + delta);
        }
    }

    inter_reading_state *Emit::at(void) {
        if (cip_sp <= 0) internal_error("CIP level accessed outside routine");
        return cip_stack[cip_sp-1].insertion_bm;
    }

    void Emit::down(void) {
        Emit::set_level(Emit::level() + 1);
        if (trace_inter_insertion) LOG("Down to %d\n", Emit::level());
    }

    void Emit::up(void) {
        Emit::set_level(Emit::level() - 1);
        if (trace_inter_insertion) LOG("Up to %d\n", Emit::level());
    }

    void Emit::pop_code_position(void) {
        if (cip_sp <= 0) internal_error("CIP underflow");
        if (cip_stack[cip_sp-1].error_flag) {
            internal_error("bad inter hierarchy");
        }
        cip_sp--;
    }

    void Emit::code(void) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        Emit::guard(Inter::Code::new(Emit::at(), current_inter_routine, Emit::level(), NULL));
    }

    void Emit::evaluation(void) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        Emit::guard(Inter::Evaluation::new(Emit::at(), current_inter_routine, Emit::level(), NULL));
    }

    void Emit::reference(void) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        Emit::guard(Inter::Reference::new(Emit::at(), current_inter_routine, Emit::level(), NULL));
    }

    void Emit::val(kind *K, inter_t val1, inter_t val2) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        inter_symbol *val_kind = Emit::kind_to_symbol(K);
        if (val_kind == NULL) internal_error("no kind for val");
        Emit::guard(Inter::Val::new(Emit::at(), current_inter_routine, val_kind, Emit::level(), val1, val2, NULL));
    }

    void Emit::val_nothing(void) {
        Emit::val(K_number, LITERAL_IVAL, 0);
    }

    void Emit::lab(inter_symbol *L) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        Emit::guard(Inter::Lab::new(Emit::at(), current_inter_routine, L, (inter_t) Emit::level(), NULL));
    }

    void Emit::ref(kind *K, inter_t val1, inter_t val2) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        inter_symbol *val_kind = Emit::kind_to_symbol(K);
        if (val_kind == NULL) internal_error("no kind for ref");
        Emit::guard(Inter::Ref::new(Emit::at(), current_inter_routine, val_kind, Emit::level(), val1, val2, NULL));
    }

    void Emit::val_iname(kind *K, inter_name *iname) {
        if (iname == NULL) {
            if (problem_count == 0) internal_error("no iname");
            else Emit::val(K_value, LITERAL_IVAL, 0);
        } else {
            Emit::val_symbol(K, InterNames::to_symbol(iname));
        }
    }

    void Emit::val_symbol(kind *K, inter_symbol *s) {
        inter_t val1 = 0, val2 = 0;
        inter_reading_state *IRS = Packaging::at();
        Inter::Symbols::to_data(IRS->read_into, IRS->current_package, s, &val1, &val2);
        Emit::val(K, val1, val2);
    }

    void Emit::val_text(text_stream *S) {
        inter_t v1 = 0, v2 = 0;
        Emit::text_value(&v1, &v2, S);
        Emit::val(K_value, v1, v2);
    }

    void Emit::val_char(wchar_t c) {
        Emit::val(K_number, LITERAL_IVAL, (inter_t) c);
    }

    void Emit::val_real(double g) {
        inter_t v1 = 0, v2 = 0;
        Emit::real_value(&v1, &v2, g);
        Emit::val(K_real_number, v1, v2);
    }

    void Emit::val_real_from_text(text_stream *S) {
        inter_t v1 = 0, v2 = 0;
        Emit::real_value_from_text(&v1, &v2, S);
        Emit::val(K_real_number, v1, v2);
    }

    void Emit::val_dword(text_stream *S) {
        inter_t v1 = 0, v2 = 0;
        Emit::dword_value(&v1, &v2, S);
        Emit::val(K_value, v1, v2);
    }

    void Emit::ref_iname(kind *K, inter_name *iname) {
        Emit::ref_symbol(K, InterNames::to_symbol(iname));
    }

    void Emit::ref_symbol(kind *K, inter_symbol *s) {
        inter_t val1 = 0, val2 = 0;
        inter_reading_state *IRS = Packaging::at();
        Inter::Symbols::to_data(IRS->read_into, IRS->current_package, s, &val1, &val2);
        Emit::ref(K, val1, val2);
    }

    void Emit::cast(kind *F, kind *T) {
        inter_symbol *from_kind = Emit::kind_to_symbol(F);
        inter_symbol *to_kind = Emit::kind_to_symbol(T);
        Emit::guard(Inter::Cast::new(Emit::at(), current_inter_routine, from_kind, to_kind, (inter_t) Emit::level(), NULL));
    }

    void Emit::end_block(inter_symbol *rsymb) {
        if (current_inter_routine == NULL) internal_error("not in an inter routine");
        if (current_inter_routine != rsymb) internal_error("wrong inter routine ended");
        Emit::guard(Inter::Defn::pass2(Emit::repository(), FALSE, &current_inter_reading_state, TRUE, (int) Emit::baseline(&current_inter_reading_state)));
        current_inter_routine = NULL;
        Emit::pop_code_position();
        inter_reading_state *IRS = Packaging::at();
        IRS->current_package = IRS->current_package->parent_package;
    }

    int Emit::emitting_routine(void) {
        if (current_inter_routine) return TRUE;
        return FALSE;
    }

    text_stream *current_splat = NULL;

    text_stream *Emit::begin_splat(void) {
        Emit::end_splat();
        if (current_splat == NULL) current_splat = Str::new();
        return current_splat;
    }

    void Emit::end_splat(void) {
        if (current_splat) {
            int L = Str::len(current_splat);
            if ((L > 1) ||
                ((L == 1) && (Str::get_first_char(current_splat) != '\n'))) {
                Emit::entire_splat(current_splat, 0);
            }
            Str::clear(current_splat);
        }
    }

    void Emit::entire_splat(text_stream *content, inter_t level) {
        if (Str::len(content) == 0) return;
        inter_t SID = Inter::create_text(Emit::repository());
        text_stream *glob_storage = Inter::get_text(Emit::repository(), SID);
        Str::copy(glob_storage, content);

        if (level > Emit::baseline(Packaging::at())) {
            Emit::guard(Inter::Splat::new(Emit::at(), current_inter_routine, SID, 0, level, 0, NULL));
        } else {
            Emit::guard(Inter::Splat::new(Packaging::at(), current_inter_routine, SID, 0, level, 0, NULL));
        }
    }

    void Emit::entire_splat_code(text_stream *content) {
        Emit::entire_splat(content, (inter_t) Emit::level());
    }

    void Emit::write_bytecode(filename *F) {
        if (Packaging::at() == NULL) internal_error("no inter repository");
        Inter::Binary::write(F, Emit::repository());
    }

    void Emit::glob_value(inter_t *v1, inter_t *v2, text_stream *glob, char *clue) {
        inter_t ID = Inter::create_text(Emit::repository());
        text_stream *glob_storage = Inter::get_text(Emit::repository(), ID);
        Str::copy(glob_storage, glob);
        *v1 = GLOB_IVAL;
        *v2 = ID;
        LOG("Glob (I7/%s): %S\n", clue, glob);
        glob_count++;
    }

    void Emit::text_value(inter_t *v1, inter_t *v2, text_stream *text) {
        inter_t ID = Inter::create_text(Emit::repository());
        text_stream *text_storage = Inter::get_text(Emit::repository(), ID);
        Str::copy(text_storage, text);
        *v1 = LITERAL_TEXT_IVAL;
        *v2 = ID;
    }

    int Emit::glob_count(void) {
        return glob_count;
    }

    void Emit::real_value(inter_t *v1, inter_t *v2, double g) {
        inter_t ID = Inter::create_text(Emit::repository());
        text_stream *glob_storage = Inter::get_text(Emit::repository(), ID);
        if (g > 0) WRITE_TO(glob_storage, "+");
        WRITE_TO(glob_storage, "%g", g);
        *v1 = REAL_IVAL;
        *v2 = ID;
    }

    void Emit::real_value_from_text(inter_t *v1, inter_t *v2, text_stream *S) {
        inter_t ID = Inter::create_text(Emit::repository());
        text_stream *glob_storage = Inter::get_text(Emit::repository(), ID);
        LOOP_THROUGH_TEXT(pos, S)
            if (Str::get(pos) != '$')
                PUT_TO(glob_storage, Str::get(pos));
        *v1 = REAL_IVAL;
        *v2 = ID;
    }

    void Emit::dword_value(inter_t *v1, inter_t *v2, text_stream *glob) {
        inter_t ID = Inter::create_text(Emit::repository());
        text_stream *glob_storage = Inter::get_text(Emit::repository(), ID);
        Str::copy(glob_storage, glob);
        *v1 = DWORD_IVAL;
        *v2 = ID;
    }

    void Emit::plural_dword_value(inter_t *v1, inter_t *v2, text_stream *glob) {
        inter_t ID = Inter::create_text(Emit::repository());
        text_stream *glob_storage = Inter::get_text(Emit::repository(), ID);
        Str::copy(glob_storage, glob);
        *v1 = PDWORD_IVAL;
        *v2 = ID;
    }

    void Emit::intervention(int stage, text_stream *segment, text_stream *part, text_stream *i6, text_stream *seg) {
        inter_t ID1 = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID1), segment);

        inter_t ID2 = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID2), part);

        inter_t ID3 = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID3), i6);

        inter_t ID4 = Inter::create_text(Emit::repository());
        Str::copy(Inter::get_text(Emit::repository(), ID4), seg);

        inter_t ref = Inter::create_ref(Emit::repository());
        Inter::set_ref(Emit::repository(), ref, (void *) current_sentence);

        Emit::guard(Inter::Link::new(Packaging::at(), (inter_t) stage, ID1, ID2, ID3, ID4, ref, Emit::baseline(Packaging::at()), NULL));
    }

The function Emit::new_cip is used in §3.

The function Emit::begin_position is used in 17/ts (§11).

The function Emit::push_code_position is used in §3, 17/ts (§11).

The function Emit::level is used in §3, 12/dtd (§16), 12/cdp (§2.1.6.1, §2.1.6.1.2.3.5, §2.1.6.1.2.3.3.1, §2.1.6.1.2.6), 25/ci (§3.2.3, §3.2.3.4.1), 25/cp (§5, §5.4.5).

The function Emit::set_level appears nowhere else.

The function Emit::note_level is used in §3.

The function Emit::to_last_level is used in 27/is (§30, §31.2, §31.8).

The function Emit::at is used in §3.

The function Emit::down is used in §3, 4/am (§35, §43), 5/lp (§19, §19.1, §19.2, §19.3, §19.3.1, §19.3.1.1, §19.3.2, §19.2.1, §19.2.2, §27, §27.2, §27.3, §27.3.1, §27.3.2, §27.3.3, §27.3.4), 5/ins (§29), 5/nv (§12, §16), 6/bp (§25, §33), 6/rlt (§15, §15.2, §15.2.1, §15.2.4, §15.2.5, §15.2.5.1, §15.2.6, §15.2.7, §15.2.8, §15.2.9, §15.2.10, §15.2.11, §15.2.12, §15.2.9.1, §15.2.10.1, §15.2.12.1, §17, §29.1, §29.2, §29.3, §29.4, §29.5, §29.6, §30), 6/nv (§17, §18.1, §18.2, §18.1.2, §18.1.2.1, §18.1.2.2, §19), 8/ef (§19), 12/ca (§5.2), 12/dtd (§7.1, §7.1.1, §7.1.2, §8, §9, §9.1, §11, §15, §16, §17, §18, §19, §20, §22, §23, §25, §26, §27), 12/cdp (§2.1.6, §2.1.6.1.2.2, §2.1.6.1.2.3.2, §2.1.6.1.2.3.7, §2.1.6.1.2.4, §2.1.6.1.2.5, §2.1.6.1.2.3.3.1, §2.1.6.1.2.2.2, §2.1.6.1.2.2.2.1, §2.1.6.1.7, §2.1.6.1.8, §2.1.6.1.2.2.3, §2.1.6.1.9, §2.1.6.1.10, §2.1.6.1.2.2.4, §2.1.6.1.11, §2.1.6.1.2.2.5, §2.1.6.1.13, §2.1.6.1.14, §2.1.6.1.2.2.6, §2.1.6.1.2.2.6.1, §2.1.6.1.15, §2.1.6.1.17, §2.1.6.1.2.2.7, §2.1.6.1.18), 13/kak (§2), 13/ca (§1, §1.2, §1.3, §1.4, §1.5, §1.6, §1.7, §1.8, §1.9, §1.10, §1.11, §1.12, §1.13), 13/rsfk (§7, §16.3, §19, §24.1, §24.2, §24.3, §24.4.1, §24.4.2, §24.5, §24.5.1, §24.6.1, §24.6.2, §24.6.3, §24.6.4, §24.6.5, §24.6.6, §25), 14/rv (§24.3), 14/lv (§14.3, §14.3.2, §14.4, §14.5), 14/cn (§16.1, §16.2, §16.3), 14/cfs (§7), 15/ma (§13), 15/epv (§4), 17/tl (§14.2), 17/ts (§8, §11.1), 17/rs (§6.1, §6.2, §7.2), 19/tc (§8), 19/rsft (§2), 20/eq (§48), 21/rl (§11, §11.2, §20, §20.1, §20.2, §22.1), 21/rb (§24.1.1, §24.1.2, §24.1.3, §24.1.4, §24.1.5, §24.1.3.1), 21/rl2 (§14.1), 21/fao (§10), 21/sv (§3, §3.1, §3.2), 21/ac (§14), 22/prcd (§10, §10.2, §10.3, §10.4, §10.5, §10.1.1.1), 22/pav (§9.2), 23/abc (§1), 24/lv (§28, §29, §41, §43), 24/pb (§17), 24/ch (§3, §4, §6, §7, §7.1, §7.2, §7.3, §7.4, §7.4.1, §7.5), 25/ci (§3, §3.2.3, §3.2.3.2, §3.2.3.1.1, §3.2.3.3, §3.2.3.6, §3.2.3.3.1.2, §3.2.3.4.1.1, §3.2.3.3.1.2.1, §3.2.3.3.1.3, §4.2), 25/ciac (§2), 25/cii (§1.2.1, §3.1.1.4.7.1, §3.1.1.4.9, §3.1.1.4.10, §3.5.3, §3.5.8, §3.5.8.1, §3.5.8.2, §3.5.8.3, §3.5.9), 25/cp (§3.3.1, §5.2.1, §5.3.4, §5.3.5, §5.3.5.1, §5.3.5.2, §5.3.5.3), 26/uo (§21.1, §21.2), 26/lt (§4.1), 26/rt (§4.1.2, §4.1.3, §4.1.4, §4.1.5), 26/iti (§9), 26/ts (§10, §11, §12), 27/is (§31.2, §31.3, §31.4, §31.5, §31.6, §31.7, §31.8, §31.9).

The function Emit::up is used in §3, 4/am (§35, §43), 5/lp (§19, §19.1, §19.2, §19.3, §19.3.1, §19.3.1.1, §19.3.2, §19.2.1, §19.2.2, §27, §27.2, §27.3, §27.3.1, §27.3.2, §27.3.3, §27.3.4), 5/ins (§29), 5/nv (§12, §16), 6/bp (§25, §33), 6/rlt (§15, §15.2, §15.2.1, §15.2.4, §15.2.5, §15.2.5.1, §15.2.6, §15.2.7, §15.2.8, §15.2.9, §15.2.10, §15.2.11, §15.2.12, §15.2.9.1, §15.2.10.1, §15.2.12.1, §17, §29.1, §29.2, §29.3, §29.4, §29.5, §29.6, §30), 6/nv (§17, §18.1, §18.2, §18.1.2, §18.1.2.1, §18.1.2.2, §19), 8/ef (§19), 12/is (§8), 12/ca (§5.2), 12/dtd (§7.1, §7.1.2, §8, §9, §9.1, §11, §15, §16, §17, §18, §19, §20, §22, §23, §25, §26, §27), 12/cdp (§2.1.6, §2.1.6.1, §2.1.6.1.2.2, §2.1.6.1.2.3.3, §2.1.6.1.2.3.7, §2.1.6.1.2.4, §2.1.6.1.2.5, §2.1.6.1.2.6, §2.1.6.1.2.2.2, §2.1.6.1.2.2.2.1, §2.1.6.1.7, §2.1.6.1.8, §2.1.6.1.2.2.3, §2.1.6.1.9, §2.1.6.1.10, §2.1.6.1.2.2.4, §2.1.6.1.11, §2.1.6.1.2.2.5, §2.1.6.1.13, §2.1.6.1.14, §2.1.6.1.2.2.6, §2.1.6.1.2.2.6.1, §2.1.6.1.15, §2.1.6.1.17, §2.1.6.1.2.2.7, §2.1.6.1.18), 13/kak (§2), 13/ca (§1, §1.2, §1.3, §1.4, §1.5, §1.6, §1.7, §1.8, §1.9, §1.10, §1.11, §1.12, §1.13), 13/rsfk (§16.3, §19, §24.1, §24.2, §24.3, §24.4.1, §24.4.2, §24.5, §24.5.1, §24.6.1, §24.6.2, §24.6.3, §24.6.4, §24.6.5, §24.6.6, §25), 14/rv (§24.3), 14/lv (§14.3, §14.3.2, §14.4, §14.5), 14/cn (§16.1, §16.2, §16.3), 14/cfs (§7, §8), 15/ma (§13), 15/epv (§4), 17/tl (§14.2), 17/ts (§8, §11.1), 17/rs (§6.1, §6.2, §7.2, §12.1.1), 19/tc (§8), 19/rsft (§2), 20/eq (§48), 21/rl (§11, §11.2, §20, §20.1, §20.2, §22.1), 21/rb (§24.1.1, §24.1.2, §24.1.3, §24.1.4, §24.1.5, §24.1.3.1), 21/rl2 (§14.1), 21/fao (§10), 21/sv (§3, §3.1, §3.2), 21/ac (§14), 22/prcd (§10, §10.3, §10.4, §10.1.1.1), 22/pav (§9.2), 23/abc (§1), 24/lv (§28, §29, §41, §43), 24/pb (§17), 24/ch (§3, §4, §6, §7, §7.1, §7.2, §7.3, §7.4, §7.4.1, §7.5), 25/ci (§3, §3.2.3, §3.2.3.2, §3.2.3.1.1, §3.2.3.3, §3.2.3.6, §3.2.3.4.1, §3.2.3.3.1.2.1, §3.2.3.3.1.3, §4.2), 25/ciac (§2), 25/cii (§1.2.1, §3.1.1.4.7.1, §3.1.1.4.9, §3.1.1.4.10, §3.5.3, §3.5.8, §3.5.8.1, §3.5.8.2, §3.5.8.3, §3.5.9), 25/cp (§3.3.1, §5.2.1, §5.3.4, §5.3.5, §5.3.5.1, §5.3.5.2, §5.3.5.3, §5.4.5), 26/uo (§21.1, §21.2), 26/lt (§4.1), 26/rt (§4.1.2, §4.1.3, §4.1.4, §4.1.5), 26/iti (§9), 26/ts (§10, §11, §12), 27/is (§31.2, §31.3, §31.4, §31.5, §31.6, §31.7, §31.8, §31.9).

The function Emit::pop_code_position is used in 17/ts (§11).

The function Emit::code is used in 4/am (§35, §43), 5/lp (§19, §19.1, §19.2, §19.3, §19.3.1, §19.3.1.1, §19.3.2, §19.2.1, §19.2.2, §27, §27.2, §27.3.3, §27.3.4), 6/bp (§25), 6/rlt (§15.2, §15.2.4, §15.2.9, §15.2.12, §15.2.9.1, §15.2.10.1, §15.2.12.1, §29.1, §29.2, §29.3, §29.4, §29.5, §29.6), 6/nv (§18.1, §18.2, §18.1.2, §18.1.2.1, §18.1.2.2, §19), 8/ef (§19), 12/dtd (§23, §27), 12/cdp (§2.1.6, §2.1.6.1.2.3.3.1, §2.1.6.1.2.2.3, §2.1.6.1.10, §2.1.6.1.2.2.4, §2.1.6.1.11, §2.1.6.1.14, §2.1.6.1.2.2.6, §2.1.6.1.17), 13/rsfk (§16.3, §24.3, §24.5, §24.6.1, §24.6.2, §24.6.3, §24.6.4, §24.6.5, §24.6.6, §25), 15/ma (§13), 17/ts (§11.1), 17/rs (§6.2, §7.2), 19/tc (§8), 19/rsft (§2), 21/rl (§11, §20, §20.2), 21/rb (§24.1.2, §24.1.3, §24.1.4, §24.1.3.1), 21/rl2 (§14.1), 21/fao (§10), 21/sv (§3), 22/prcd (§10, §10.2, §10.3, §10.4, §10.5, §10.1.1.1), 24/ch (§6, §7, §7.4, §7.5), 25/ci (§3.2.3.3, §3.2.3.6, §3.2.3.3.1.2), 25/cii (§3.5.9), 25/cp (§5.3.4, §5.3.5, §5.3.5.1, §5.3.5.2, §5.3.5.3), 26/uo (§21.1, §21.2), 26/lt (§4.1), 26/ts (§10), 27/is (§31.2).

The function Emit::evaluation is used in 26/iti (§9), 27/is (§31.9).

The function Emit::reference is used in 13/ca (§1.10), 27/is (§31.6, §31.9).

The function Emit::val is used in §3, 4/am (§43), 5/lp (§19, §19.2, §19.3, §19.3.1, §19.3.1.1, §19.3.2, §19.2.1, §19.2.2, §27, §27.2, §27.3.3, §27.3.4), 5/nv (§12), 6/rlt (§15, §15.2.1, §15.2.4, §15.2.6, §15.2.7, §15.2.8, §15.2.10, §15.2.11, §15.2.12, §15.2.12.1), 6/nv (§17, §18.1, §18.1.2, §18.1.2.1, §18.1.2.2, §19), 8/ef (§19), 12/is (§7.3), 12/dtd (§7, §8, §9, §9.1, §10, §15, §18, §19, §20, §22, §23, §25, §26, §27), 12/cdp (§2.1.6, §2.1.6.1.2.3.7, §2.1.6.1.2.5, §2.1.6.1.2.2.3, §2.1.6.1.10, §2.1.6.1.11, §2.1.6.1.14, §2.1.6.1.2.2.6, §2.1.6.1.17), 13/rsfk (§9, §16.3, §19, §24.4.1, §24.4.2, §24.5, §24.5.1, §24.6.2, §24.6.3, §24.6.4), 14/vh (§3), 14/lv (§14.5), 14/cn (§16, §16.3), 15/epv (§4), 16/is (§29), 17/rs (§6.2, §7.2), 19/tc (§8), 21/rl (§11.1, §11.2, §20), 21/rb (§24.1.3, §24.1.5), 21/rl2 (§14.1), 21/fao (§10), 21/sv (§3), 21/ac (§14), 22/prcd (§10, §10.5, §10.1.1.1), 22/pav (§9.2), 24/lv (§28, §29, §43), 24/ch (§3, §4, §7.1, §7.2, §7.3, §7.4, §7.5), 25/ci (§3.2.3.1.1, §3.2.3.6, §3.2.3.3.1.3), 25/ciac (§2, §2.1), 25/cii (§3.1, §3.4.2, §3.1.1.4.10, §3.1.1.4.11, §3.6.1), 25/cp (§3.3.1, §5.2.1), 26/uo (§21.1, §21.2), 26/lt (§4.1), 26/rt (§4.1.2, §4.1.4), 26/iti (§9), 26/ts (§10, §12), 27/is (§31.5, §31.9).

The function Emit::val_nothing is used in 4/am (§43), 6/rlt (§29.1, §29.2, §29.3), 12/cdp (§2.1.6.1.11, §2.1.6.1.18).

The function Emit::lab is used in 5/lp (§19, §19.1, §19.2, §19.3, §19.3.1, §19.3.2, §27.2), 12/cdp (§2.1.6.1.2.2.2.1), 24/pb (§17), 25/cii (§3.4.1).

The function Emit::ref appears nowhere else.

The function Emit::val_iname is used in §3, 4/am (§30, §43), 5/lp (§19, §19.3.1, §19.3.2, §19.2.1), 5/ins (§29), 5/nv (§12, §16), 6/bp (§25, §33), 6/rlt (§15, §15.2, §15.2.1, §15.2.5, §15.2.5.1, §15.2.6, §15.2.7, §15.2.8, §15.2.9, §15.2.12, §15.2.9.1, §15.2.10.1, §15.2.12.1, §17, §29.2, §29.3, §29.4, §29.5, §29.6), 6/nv (§17, §18.1, §18.2), 12/is (§8), 12/dtd (§9, §9.1, §13, §16, §18, §19, §22, §26), 12/cdp (§2.1.6.1.2.5, §2.1.6.1.8, §2.1.6.1.2.2.3, §2.1.6.1.2.2.5, §2.1.6.1.14, §2.1.6.1.2.2.6, §2.1.6.1.2.2.6.1), 13/kak (§2), 13/rsfk (§9, §12, §16.3, §24.3, §24.5, §24.5.1, §24.6.3, §24.6.6, §25), 14/lv (§14.3, §14.4, §14.5), 15/epv (§4), 17/ts (§8, §11.1), 17/rs (§5, §6.1, §6.2, §7.2), 19/tc (§8), 19/rsft (§2), 20/eq (§48), 21/rl (§20, §20.1, §20.2), 21/rb (§24.1.1, §24.1.2, §24.1.3, §24.1.3.1), 21/rl2 (§14.1), 21/fao (§10), 21/sv (§3.1, §3.2), 21/ac (§14), 22/prcd (§10, §10.3, §10.4, §10.1.1.1), 24/lv (§28, §29), 24/ch (§3, §7.1, §7.2, §7.3), 25/ci (§3, §3.2.3), 25/cii (§3.2.3, §3.2.4, §3.2.5, §3.2.6, §3.4.3, §3.1.1.4.7.1, §3.1.1.4.10, §3.5.8.3, §3.6.2, §3.6.3), 26/lt (§4.1), 26/iti (§9), 26/ts (§10, §11), 27/is (§31.8.1).

The function Emit::val_symbol is used in 4/am (§43), 5/lp (§19, §19.1, §19.2, §19.3, §19.3.1, §19.3.1.1, §19.3.2, §19.2.1, §19.2.2, §27, §27.2, §27.3.3, §27.3.4), 5/ins (§29), 6/bp (§25), 6/rlt (§15.2, §15.2.1, §15.2.4, §15.2.5, §15.2.5.1, §15.2.6, §15.2.7, §15.2.8, §15.2.9, §15.2.10, §15.2.11, §15.2.12, §15.2.9.1, §15.2.10.1, §15.2.12.1, §17, §29.1, §29.2, §29.3, §29.4, §29.5, §29.6), 6/nv (§18.1, §18.2, §18.1.2.1, §18.1.2.2, §19), 8/ef (§19), 11/tr (§10), 12/dtd (§23, §25, §26, §27), 12/cad (§7), 12/cdp (§2.1.6, §2.1.6.1.7, §2.1.6.1.8, §2.1.6.1.2.2.3, §2.1.6.1.9, §2.1.6.1.2.2.4, §2.1.6.1.11, §2.1.6.1.2.2.5, §2.1.6.1.13, §2.1.6.1.2.2.6, §2.1.6.1.2.2.6.1, §2.1.6.1.15, §2.1.6.1.17, §2.1.6.1.2.2.7), 13/kak (§2), 13/rsfk (§16.3, §24.1, §24.2, §24.3, §24.4.1, §24.4.2, §24.5, §24.5.1, §24.6.1, §24.6.2, §24.6.3, §24.6.4, §24.6.5, §24.6.6, §25), 14/lv (§14.1, §14.5), 14/cn (§16.3), 15/epv (§4), 17/rs (§6.2, §7.2), 19/tc (§8), 19/rsft (§2), 20/eq (§48), 21/rl (§20, §20.1, §20.2), 21/rb (§24.1.3, §24.1.3.1), 21/rl2 (§14.1), 21/fao (§10), 21/sv (§3, §3.1, §3.2), 24/lv (§28, §41, §45), 24/ch (§7, §7.1, §7.2, §7.3, §7.4, §7.5), 25/cii (§3.5.1, §3.5.3, §3.6.2), 26/uo (§21.1, §21.2), 26/rt (§4.1.3, §4.1.5), 27/is (§31.9).

The function Emit::val_text is used in 4/am (§43), 5/lp (§19, §27.3, §27.3.1, §27.3.2, §27.3.3), 6/rlt (§15), 6/nv (§18.2, §19), 8/ef (§19), 13/rsfk (§24.3, §25), 17/tl (§14.2), 17/ts (§11.1), 17/rs (§7.2), 19/rsft (§2), 21/rl (§20.1, §20.2), 21/fao (§10), 24/ch (§7.4), 25/ci (§4.2), 25/cii (§3.5.8.1), 26/uo (§21.2), 26/ts (§10, §11, §12), 27/is (§31.9).

The function Emit::val_char is used in 27/is (§31.9).

The function Emit::val_real appears nowhere else.

The function Emit::val_real_from_text is used in 27/is (§31.9).

The function Emit::val_dword is used in 5/lp (§19.1), 26/ts (§10), 27/is (§31.9).

The function Emit::ref_iname is used in §3, 4/am (§43), 5/lp (§19, §19.1, §19.3.1, §19.3.2, §19.2.2), 6/nv (§17), 12/dtd (§19, §22), 14/lv (§14.3.2), 17/rs (§6.2), 21/rb (§24.1.3), 22/prcd (§10.3), 25/ci (§3, §3.2.3.1.1, §3.2.3.3.1.3), 25/cii (§3.1.1.4.10, §3.5.8.2, §3.5.8.3), 25/cp (§5.2.1), 26/lt (§4.1).

The function Emit::ref_symbol is used in 4/am (§43), 5/lp (§19, §19.2, §19.3, §19.3.1, §19.3.1.1, §19.3.2, §19.2.1, §19.2.2, §27.3.3), 6/nv (§18.2), 12/dtd (§9, §23, §27), 12/cdp (§2.1.6, §2.1.6.1.2.2, §2.1.6.1.2.3.7, §2.1.6.1.2.4, §2.1.6.1.2.2.2, §2.1.6.1.8, §2.1.6.1.2.2.3, §2.1.6.1.10, §2.1.6.1.2.2.4, §2.1.6.1.11, §2.1.6.1.2.2.5, §2.1.6.1.14, §2.1.6.1.2.2.6, §2.1.6.1.17), 13/rsfk (§24.6.1, §24.6.2, §24.6.3, §24.6.4, §24.6.5, §24.6.6), 17/rs (§6.2), 21/rb (§24.1.1, §24.1.3), 21/sv (§3.1, §3.2), 24/lv (§29, §43), 24/ch (§7.1, §7.2, §7.4, §7.4.1), 25/cii (§1.2.1, §3.5.1, §3.5.3), 25/cp (§5.3.5), 26/rt (§4.1.3).

The function Emit::cast is used in 13/rsfk (§24.4.1, §24.4.2).

The function Emit::end_block is used in 26/rt (§4, §4.1).

The function Emit::emitting_routine is used in 24/lv (§10).

The function Emit::begin_splat appears nowhere else.

The function Emit::end_splat appears nowhere else.

The function Emit::entire_splat appears nowhere else.

The function Emit::entire_splat_code appears nowhere else.

The function Emit::write_bytecode appears nowhere else.

The function Emit::glob_value appears nowhere else.

The function Emit::text_value is used in §3.

The function Emit::glob_count appears nowhere else.

The function Emit::real_value appears nowhere else.

The function Emit::real_value_from_text appears nowhere else.

The function Emit::dword_value is used in §3.

The function Emit::plural_dword_value is used in §3.

The function Emit::intervention is used in 26/i6i (§7), 26/uo (§17).

The structure code_insertion_point is private to this section.

§5.



    void Emit::change_translation(inter_name *iname, text_stream *new_text) {
        Inter::Symbols::set_translate(InterNames::to_symbol(iname), new_text);
    }

    text_stream *Emit::get_translation(inter_name *iname) {
        return Inter::Symbols::get_translate(InterNames::to_symbol(iname));
    }

    text_stream *Emit::to_text(inter_name *iname) {
        if (iname == NULL) return NULL;
        return InterNames::to_symbol(iname)->symbol_name;
    }

    inter_symbol *Emit::define_symbol(inter_name *iname) {
        InterNames::to_symbol(iname);
        if (iname->symbol) {
            if (Inter::Symbols::is_predeclared(iname->symbol)) {
                Inter::Symbols::undefine(iname->symbol);
            }
        }
        if ((iname->symbol) && (Inter::Symbols::read_annotation(iname->symbol, HOLDING_IANN) == 1)) {
            if (Inter::Symbols::read_annotation(iname->symbol, DELENDA_EST_IANN) != 1) {
                Emit::annotate_symbol_i(iname->symbol, DELENDA_EST_IANN, 1);
                Inter::Symbols::strike_definition(iname->symbol);
            }
            return iname->symbol;
        }
        return iname->symbol;
    }

    inter_symbol *Emit::destroy_symbol(inter_name *iname) {
        InterNames::to_symbol(iname);
        if (iname->symbol) {
            if (Inter::Symbols::is_predeclared(iname->symbol)) {
                Inter::Symbols::undefine(iname->symbol);
            }
        }
        if ((iname->symbol) && (Inter::Symbols::read_annotation(iname->symbol, HOLDING_IANN) == 1)) {
            if (Inter::Symbols::read_annotation(iname->symbol, DELENDA_EST_IANN) != 1) {
                Emit::annotate_symbol_i(iname->symbol, DELENDA_EST_IANN, 1);
                Inter::Symbols::strike_definition(iname->symbol);
            }
            return iname->symbol;
        } else if (Inter::Symbols::read_annotation(iname->symbol, DELENDA_EST_IANN) != 1) internal_error("Bang");
        return iname->symbol;
    }

    void Emit::set_flag(inter_name *iname, int f) {
        Inter::Symbols::set_flag(InterNames::to_symbol(iname), f);
    }

    void Emit::clear_flag(inter_name *iname, int f) {
        Inter::Symbols::clear_flag(InterNames::to_symbol(iname), f);
    }

    void Emit::annotate_i(inter_name *iname, inter_t annot_ID, inter_t V) {
        if (iname) Emit::annotate_symbol_i(InterNames::to_symbol(iname), annot_ID, V);
    }

    void Emit::annotate_t(inter_name *iname, inter_t annot_ID, text_stream *text) {
        if (iname) Emit::annotate_symbol_t(InterNames::to_symbol(iname), annot_ID, text);
    }

    void Emit::annotate_w(inter_name *iname, inter_t annot_ID, wording W) {
        if (iname) Emit::annotate_symbol_w(InterNames::to_symbol(iname), annot_ID, W);
    }

    int Emit::read_annotation(inter_name *iname, inter_t annot) {
        return Inter::Symbols::read_annotation(InterNames::to_symbol(iname), annot);
    }

    void Emit::holster(value_holster *VH, inter_name *iname) {
        if (Holsters::data_acceptable(VH)) {
            inter_t v1 = 0, v2 = 0;
            Emit::to_ival(&v1, &v2, iname);
            Holsters::holster_pair(VH, v1, v2);
        }
    }

    void Emit::symbol_to_ival(inter_t *val1, inter_t *val2, inter_symbol *S) {
        inter_reading_state *IRS = Packaging::at();
        if (S) { Inter::Symbols::to_data(IRS->read_into, IRS->current_package, S, val1, val2); return; }
        *val1 = LITERAL_IVAL; *val2 = 0;
    }

    void Emit::to_ival(inter_t *val1, inter_t *val2, inter_name *iname) {
        inter_reading_state *IRS = Packaging::at();
        inter_symbol *S = InterNames::to_symbol(iname);
        if (S) { Inter::Symbols::to_data(IRS->read_into, IRS->current_package, S, val1, val2); return; }
        *val1 = LITERAL_IVAL; *val2 = 0;
    }

    void Emit::to_ival_in_context(inter_name *context, inter_t *val1, inter_t *val2, inter_name *iname) {
        package_request *PR = InterNames::location(context);
        inter_package *pack = Packaging::incarnate(PR);
        inter_symbol *S = InterNames::to_symbol(iname);
        if (S) { Inter::Symbols::to_data(pack->stored_in, pack, S, val1, val2); return; }
        *val1 = LITERAL_IVAL; *val2 = 0;
    }

    int Emit::defined(inter_name *iname) {
        if (iname == NULL) return FALSE;
        inter_symbol *S = InterNames::to_symbol(iname);
        if (Inter::Symbols::is_defined(S)) return TRUE;
        return FALSE;
    }

    typedef struct ival_emission {
        value_holster emission_VH;
        packaging_state saved_PS;
    } ival_emission;

    ival_emission Emit::begin_ival_emission(inter_name *iname) {
        ival_emission IE;
        IE.emission_VH = Holsters::new(INTER_DATA_VHMODE);
        IE.saved_PS = Packaging::enter_home_of(iname);
        return IE;
    }

    value_holster *Emit::ival_holster(ival_emission *IE) {
        return &(IE->emission_VH);
    }

    void Emit::end_ival_emission(ival_emission *IE, inter_t *v1, inter_t *v2) {
        Holsters::unholster_pair(&(IE->emission_VH), v1, v2);
        Packaging::exit(IE->saved_PS);
    }

    package_request *Emit::current_enclosure(void) {
        return Packaging::enclosure();
    }

    packaging_state Emit::unused_packaging_state(void) {
        return Packaging::stateless();
    }

The function Emit::change_translation is used in 5/un (§1), 13/rsfk (§24), 15/pr (§21), 27/hl (§1, §1.1), 27/pc (§11).

The function Emit::get_translation is used in 15/pr (§22.1).

The function Emit::to_text is used in 15/vp (§3), 27/hr (§5).

The function Emit::define_symbol is used in §3.

The function Emit::destroy_symbol appears nowhere else.

The function Emit::set_flag is used in 27/hr (§5), 27/hl (§1).

The function Emit::clear_flag is used in 5/un (§1).

The function Emit::annotate_i is used in 13/rsfk (§24), 15/pr (§27), 15/epv (§1, §1.1.1), 17/tl (§7).

The function Emit::annotate_t appears nowhere else.

The function Emit::annotate_w is used in 15/pr (§27).

The function Emit::read_annotation appears nowhere else.

The function Emit::holster is used in 13/rsfk (§4), 14/rv (§24.2, §24.3, §24.3.1), 17/tl (§10, §10.2.1, §16), 17/ts (§8, §8.1), 17/rs (§12).

The function Emit::symbol_to_ival is used in 13/rsfk (§5).

The function Emit::to_ival is used in 13/rsfk (§5).

The function Emit::to_ival_in_context is used in 17/tl (§13).

The function Emit::defined is used in 13/rsfk (§24).

The function Emit::begin_ival_emission is used in 5/nv (§25).

The function Emit::ival_holster is used in 5/nv (§25).

The function Emit::end_ival_emission is used in 5/nv (§25).

The function Emit::current_enclosure is used in 17/ts (§8, §8.1), 18/lc (§5), 26/iti (§9).

The function Emit::unused_packaging_state is used in 21/rb (§24.1), 26/rt (§3).

The structure ival_emission is private to this section.