[Turn on line numbering]
arg line, @defaults;
var out, newlist, part, v, opt, t, keys, key, x;
// submit: [["template", value], [...]];
// => if value is 1, it will take the next part of the string
// receive: [["template", "flag", bool, value]], [...]];
line = line.explode_quoted();
out = [];
newlist = [];
[(defaults ?= [])] = defaults;
while (line) {
[x, @line] = line;
if (x && x[1] in ["-", "+"]) {
opt = 0;
v = "";
part = x.subrange(2);
if ("=" in part) {
part = part.explode("=", 1);
[part, v] = part;
}
for t in (defaults) {
if (part.match_template(t[1])) {
opt = [t[1], part, x[1] == "+"];
if ((| t[2] |) && !v && line) {
[v, @line] = line;
if (v == "=")
[(v ?= ""), @line] = line;
}
opt += [v];
}
}
if (!opt)
opt = [0, part, x[1] == "+", ""];
out += [opt];
} else {
newlist += [x];
}
}
return [newlist, out];
["// Created 26-Mar-1995 as a part of ColdCore, see: @help Credit"]