parent $libraries
object $arg_opts
var $root child_index 0
var $root owners [$arg_opts]
var $root fertile 1
var $root inited 1
var $root owned [$arg_opts]
var $arg_opts opt_rec []
var $root manager $arg_opts
var $root writable [$arg_opts]
var $root readable ['parameters, 'methods, 'code]
var $root dbref 'arg_opts
method from_str
arg opt_str, [subs];
var opts_given, opt_ret, opt, prefix, colon_pos, opt_val, match_opt, opt_type, opt_default, opt_trans_dict, opt_id;
opts_given = explode(opt_str);
opt_ret = #[];
for opt in (opts_given) {
switch (opt[1]) {
case "!", "-":
prefix = 'minus;
case "+":
prefix = 'plus;
default:
prefix = 'none;
}
if (prefix != 'none)
opt = substr(opt, 2);
colon_pos = ":" in opt;
opt_val = prefix;
if (colon_pos) {
opt_val = substr(opt, colon_pos + 1);
opt = substr(opt, 1, colon_pos - 1);
}
opt_id = 0;
for match_opt in (opt_rec) {
if (match_template(match_opt[2], opt)) {
opt_type = match_opt[3];
opt_default = match_opt[4];
opt_trans_dict = match_opt[5];
opt_id = match_opt[1];
break;
// out of for loop
}
}
if (!opt_id)
break;
opt_val = ._get_opt_val(opt_val, opt_type, opt_default, opt_trans_dict, prefix);
opt_val = ._val_subs(opt_val, opt_default, subs);
// may throw duplicate key (which is ok)
catch any {
opt_ret = dict_add(opt_ret, opt_id, opt_val);
}
}
// account for missing options:
for match_opt in (opt_rec) {
opt_id = match_opt[1];
if (!(opt_id in dict_keys(opt_ret))) {
opt_type = match_opt[3];
opt_default = match_opt[4];
if (opt_type == 'check_presence)
opt_val = ['val, 0];
else
opt_val = opt_default;
opt_val = ._val_subs(opt_val, opt_default, subs);
opt_ret = dict_add(opt_ret, opt_id, opt_val);
}
}
return opt_ret;
.
method _get_opt_val
arg opt_val, opt_type, opt_default, opt_trans_dict, prefix;
switch (opt_type) {
case 'check_presence:
opt_val = ['val, 1];
case 'on_off_dict:
opt_val = opt_trans_dict[prefix];
case 'obj:
if (opt_val)
opt_val = ['val, (| get_objnum(tosym(substr(opt_val, 2))) |)];
else
opt_val = opt_default;
case 'num:
if (opt_val)
opt_val = ['val, toint(opt_val)];
else
opt_val = opt_default;
case 'obj_or_dict:
if ((opt_val[1]) == "$") {
// may throw namenf
opt_val = (| get_objnum(tosym(substr(opt_val, 2))) |);
opt_val = opt_val ? ['val, opt_val] | opt_default;
} else {
// may throw keynf
opt_val = (| opt_trans_dict[opt_val] |) || opt_default;
}
default:
opt_val = opt_default;
}
return opt_val;
.
method _val_subs
arg opt_val, opt_default, subs;
switch (opt_val[1]) {
case 'sub:
if (type(opt_val[2]) == 'integer) {
if (((opt_val[2]) <= listlen(subs)) && ((opt_val[2]) > 0))
opt_val = subs[opt_val[2]];
else
throw(~range, "Sub index out of range.");
} else if (((opt_default[1]) != 'sub) || (type(opt_default[2]) == 'integer)) {
opt_val = ((opt_default[1]) in ['sub, 'val]) ? ._val_subs(opt_default, opt_default, subs) | (opt_default[2]);
}
case 'val:
opt_val = opt_val[2];
default:
opt_val = ((opt_default[1]) in ['sub, 'val]) ? ._val_subs(opt_default, opt_default, subs) | (opt_default[2]);
}
return opt_val;
.