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