Method code for $compiler.do_switch()

[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

Tlon