[Turn on line numbering]arg vars, flags, args; var current, d, tag, i, m, r; if (listlen(args) == 0) throw(~parse, "[switch] requires arguments."); if (!(| flags["value"] |)) throw(~parse, "Value flag missing."); d = #[]; r = []; tag = (current = 0); // The last default is a dummy - it forces the parser to flush current for i in (args + [$generator.new_tag("default", [], [])]) { if (type(i) == 'frob && class(i) == $generator && i.name() in ["case", "default", "range"]) { if (tag != 0) { if (type(tag) == 'list) r += [[@tag.subrange(2), current]]; else d = d.add(tag, current); } current = []; switch (i.name()) { case "case": if (i.args().length() != 1 || type((tag = (i.args())[1])) != 'string) throw(~parse, "[case:...] takes only a single string as an argument."); case "range": if (i.args().length() != 1 || !(| (m = (i.args())[1].match_pattern("*..*")).length() == 2 |)) throw(~parse, "range tag should look like [range:lower..upper]."); tag = ['range, @m]; case "default": tag = 'default; } } else { if (tag == 0) throw(~parse, "Expression before [case]"); current += [i]; } } if (r) d = d.add('ranges, r); return [$format.new_tag("switch", flags, d), vars];
// Created 17-Jul-1996 as a part of ColdCore, see: @help Credit