[Turn on line numbering]
arg name, branch;
var parser, name, def, b, parts, x, yes, m, mb, full, varkeys;
if (!(def = (| .msg_definer(name) |))) {
name = (> ._parse_msg_part(name, .all_msgs().keys()) <);
def = (> .msg_definer(name) <);
}
if (!branch)
return [def, name, "general"];
if (listlen(branch) > 2)
throw(~badmsg, "Too many message branches");
m = [];
varkeys = (| def.get_msg_attr(name, 'varkeys) |) || #[];
for b in ((> def.get_msg_attr(name, 'branches) <)) {
parts = explode(b, ".", "b");
full = [];
if (dict_contains(varkeys, parts[1])) {
if ((mb = (| ._parse_msg_part(branch[1], [parts[1]]) |)))
full += [mb] + sublist(branch, 2);
} else if ((mb = (| ._parse_msg_part(branch[1], [parts[1]]) |))) {
full += [mb];
}
if (full)
m += [full];
}
branch = branch.join(".");
if (listlen(m) == 1)
full = m[1];
else if (listlen(m) > 1)
throw(~ambig, "Multiple branches match the name '" + branch + "'", m);
else
throw(~nomatch, "No branches of " + name + " match '" + branch + "'");
if ((parser = (| def.get_msg_attr(name, 'parser) |)))
return .(parser)(def, name, @full);
return [def, name, join(full, ".")];
["// Created 26-Mar-1995 as a part of ColdCore, see: @help Credit"]