[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 27-Mar-1995 as a part of ColdCore, see: @help Credit