[Turn off line numbering]
1: arg name, branch;
2: var parser, name, def, b, parts, x, yes, m, mb, full, varkeys;
3:
4: if (!(def = (| .msg_definer(name) |))) {
5: name = (> ._parse_msg_part(name, .all_msgs().keys()) <);
6: def = (> .msg_definer(name) <);
7: }
8: if (!branch)
9: return [def, name, "general"];
10: if (listlen(branch) > 2)
11: throw(~badmsg, "Too many message branches");
12: m = [];
13: varkeys = (| def.get_msg_attr(name, 'varkeys) |) || #[];
14: for b in ((> def.get_msg_attr(name, 'branches) <)) {
15: parts = explode(b, ".", "b");
16: full = [];
17: if (dict_contains(varkeys, parts[1])) {
18: if ((mb = (| ._parse_msg_part(branch[1], [parts[1]]) |)))
19: full += [mb] + sublist(branch, 2);
20: } else if ((mb = (| ._parse_msg_part(branch[1], [parts[1]]) |))) {
21: full += [mb];
22: }
23: if (full)
24: m += [full];
25: }
26: branch = branch.join(".");
27: if (listlen(m) == 1)
28: full = m[1];
29: else if (listlen(m) > 1)
30: throw(~ambig, "Multiple branches match the name '" + branch + "'", m);
31: else
32: throw(~nomatch, "No branches of " + name + " match '" + branch + "'");
33: if ((parser = (| def.get_msg_attr(name, 'parser) |)))
34: return .(parser)(def, name, @full);
35: return [def, name, join(full, ".")];
["// Created 26-Mar-1995 as a part of ColdCore, see: @help Credit"]