Method code for $parse_lib.getopt()

[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"]

the Cold Dark