[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