Method code for $compiler.do_switch()

[Turn off line numbering]
  1: arg vars, flags, args;
  2: var current, d, tag, i, m, r;
  3: 
  4: if (listlen(args) == 0)
  5:     throw(~parse, "[switch] requires arguments.");
  6: if (!(| flags["value"] |))
  7:     throw(~parse, "Value flag missing.");
  8: d = #[];
  9: r = [];
 10: tag = (current = 0);
 11: 
 12: // The last default is a dummy - it forces the parser to flush current
 13: for i in (args + [$generator.new_tag("default", [], [])]) {
 14:     if (type(i) == 'frob && class(i) == $generator && i.name() in ["case", "default", "range"]) {
 15:         if (tag != 0) {
 16:             if (type(tag) == 'list)
 17:                 r += [[@tag.subrange(2), current]];
 18:             else
 19:                 d = d.add(tag, current);
 20:         }
 21:         current = [];
 22:         switch (i.name()) {
 23:             case "case":
 24:                 if (i.args().length() != 1 || type((tag = (i.args())[1])) != 'string)
 25:                     throw(~parse, "[case:...] takes only a single string as an argument.");
 26:             case "range":
 27:                 if (i.args().length() != 1 || !(| (m = (i.args())[1].match_pattern("*..*")).length() == 2 |))
 28:                     throw(~parse, "range tag should look like [range:lower..upper].");
 29:                 tag = ['range, @m];
 30:             case "default":
 31:                 tag = 'default;
 32:         }
 33:     } else {
 34:         if (tag == 0)
 35:             throw(~parse, "Expression before [case]");
 36:         current += [i];
 37:     }
 38: }
 39: if (r)
 40:     d = d.add('ranges, r);
 41: return [$format.new_tag("switch", flags, d), vars];

// Created 17-Jul-1996 as a part of ColdCore, see: @help Credit

Tlon