Curated source subset assembled by klammertext-dev's doc/make_dist.sh: the Klammermachine (mac), the Standard Klammer Set (sks), the commands (com), editor plugins and install guides (doc), a test subset (tst), and lib/bin placeholders. Builds with 'make -C com'. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
57 lines
2.2 KiB
C++
57 lines
2.2 KiB
C++
#include "deftype.h"
|
|
#include "error.h"
|
|
|
|
defmode_t defmode_from_katom(katom_t type)
|
|
{
|
|
switch (type) {
|
|
case katom_t::klammer_definition:
|
|
case katom_t::klammer_instance:
|
|
return defmode_t::def_create;
|
|
case katom_t::klammer_override:
|
|
return defmode_t::def_override;
|
|
case katom_t::klammer_default:
|
|
return defmode_t::def_default;
|
|
default:
|
|
throw Internal_error("defmode_from_katom: not a definition type");
|
|
}
|
|
}
|
|
|
|
static const std::map<std::pair<defmode_t,defmode_t>, defmode_result> transition_table {
|
|
// create + create = error
|
|
{ {defmode_t::def_create, defmode_t::def_create},
|
|
{false, false, "Klammer NAME already defined at AT"} },
|
|
// create + override = replace with warning
|
|
{ {defmode_t::def_create, defmode_t::def_override},
|
|
{true, true, "Klammer NAME at AT overridden"} },
|
|
// create + default = ignore silently
|
|
{ {defmode_t::def_create, defmode_t::def_default},
|
|
{false, false, ""} },
|
|
// override + create = error
|
|
{ {defmode_t::def_override, defmode_t::def_create},
|
|
{false, false, "Klammer NAME already overridden at AT"} },
|
|
// override + override = replace with warning
|
|
{ {defmode_t::def_override, defmode_t::def_override},
|
|
{true, true, "Klammer NAME at AT overridden again"} },
|
|
// override + default = ignore silently
|
|
{ {defmode_t::def_override, defmode_t::def_default},
|
|
{false, false, ""} },
|
|
// default + create = replace silently
|
|
{ {defmode_t::def_default, defmode_t::def_create},
|
|
{true, false, ""} },
|
|
// default + override = replace with warning
|
|
{ {defmode_t::def_default, defmode_t::def_override},
|
|
{true, true, "Default klammer NAME at AT overridden"} },
|
|
// default + default = error
|
|
{ {defmode_t::def_default, defmode_t::def_default},
|
|
{false, false, "Default klammer NAME already defined at AT"} }
|
|
};
|
|
|
|
const defmode_result& defmode_transition(defmode_t existing, defmode_t incoming)
|
|
{
|
|
auto it = transition_table.find({existing, incoming});
|
|
if (it == transition_table.end()) {
|
|
throw Internal_error("defmode_transition: unknown combination");
|
|
}
|
|
return it->second;
|
|
}
|