Method code for $parse_lib.getopt()

[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

Tlon