[Turn off line numbering]1: arg line, @defaults; 2: var out, newlist, part, v, opt, t, keys, key, x; 3: 4: // submit: [["template", value], [...]]; 5: // => if value is 1, it will take the next part of the string 6: // receive: [["template", "flag", bool, value]], [...]]; 7: line = line.explode_quoted(); 8: out = []; 9: newlist = []; 10: [(defaults ?= [])] = defaults; 11: while (line) { 12: [x, @line] = line; 13: if (x && x[1] in ["-", "+"]) { 14: opt = 0; 15: v = ""; 16: part = x.subrange(2); 17: if ("=" in part) { 18: part = part.explode("=", 1); 19: [part, v] = part; 20: } 21: for t in (defaults) { 22: if (part.match_template(t[1])) { 23: opt = [t[1], part, x[1] == "+"]; 24: if ((| t[2] |) && !v && line) { 25: [v, @line] = line; 26: if (v == "=") 27: [(v ?= ""), @line] = line; 28: } 29: opt += [v]; 30: } 31: } 32: if (!opt) 33: opt = [0, part, x[1] == "+", ""]; 34: out += [opt]; 35: } else { 36: newlist += [x]; 37: } 38: } 39: return [newlist, out];
// Created 27-Mar-1995 as a part of ColdCore, see: @help Credit