/
ColdCore-3.0a9.02/
ColdCore-3.0a9.02/src/
new object $bs_eval: $evaluator;

var $root created_on = 837583704;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$bs_eval];
var $root manager = $bs_eval;

public method ._separate_list() {
    arg sep, l;
    
    if (sep == "none")
        return l;
    if (sep == "english")
        return [l.to_english()];
    return [l.join(sep)];
};

public method .eval_formatter() {
    arg form, vars;
    var text;
    
    if ((vars['time]) == 'post) {
        [text, vars] = (vars['formatter]).eval_formatter(form, vars);
        return [[text], vars];
    }
    return pass(form, vars);
};

public method .gen_data() {
    arg vars, flags, args;
    var method, data;
    
    [args, vars] = ._eval_ctext(args, vars);
    method = (| flags.getkey("source") |);
    catch ~methodnf
        data = (vars['this]).(tosym("gen_" + method))();
    with
        return [[">>>invalid data source<<<"], vars];
    return [[data], vars];
};

public method .gen_def() {
    arg vars, flags, args;
    var name, val;
    
    name = flags.getkey("var");
    val = args[1];
    return [[""], vars.add(name, val)];
};

public method .gen_english() {
    arg vars, flags, args;
    var sep, empty, and, text, item;
    
    sep = (| flags.getkey("separator") |) || ", ";
    empty = (| flags.getkey("empty") |) || "nothing";
    and = (| flags.getkey("and") |) || " and ";
    [text, vars] = ._eval_ctext(args, vars);
    if (((vars['time]) == 'pre) || find item in (text) where (type(item) == 'frob)) {
        return [[(<$generator, ["english", flags, text, 'gen_english]>)], vars];
    } else {
        if (type(sep) == 'list)
            sep = sep[1];
        if (type(and) == 'list)
            and = and[1];
        return [[text.to_english(empty, and, sep)], vars];
    }
};

public method .gen_foreach() {
    arg vars, flags, args;
    var v, list, body, out, item, sep, text;
    
    v = (| flags.getkey("var") |) || "iterator";
    list = flags.getkey("list");
    sep = (| flags.getkey("separator") |) || " ";
    out = [];
    for item in (list) {
        vars = vars.add(v, item);
        [text, vars] = ._eval_ctext(args, vars);
        if ((vars['time]) == 'post)
            out = out.affix(text);
        else
            out += [text];
    }
    if ((vars['time]) == 'pre)
        out = ._separate_list(sep, out);
    return [out, vars];
};

public method .gen_join() {
    arg vars, flags, args;
    var v, sep, item;
    
    sep = (| flags.getkey("separator") |) || " ";
    [args, vars] = ._eval_ctext(args, vars);
    if (((vars['time]) == 'pre) || find item in (args) where (type(item) == 'frob)) {
        return [[(<$generator, ["join", flags, args, 'gen_join]>)], vars];
    } else {
        if (type(sep) == 'list)
            sep = sep[1];
        return [._separate_list(sep, args), vars];
    }
};

public method .gen_name() {
    arg vars, flags, args;
    var out, name, sep, type;
    
    [args, vars] = ._eval_ctext(args, vars);
    out = [];
    type = (| tosym(flags.getkey("type")) |) || 'name;
    if (!args)
        return [[(vars['this]).namef(type)], vars];
    sep = (| flags.getkey("separator") |) || " ";
    for name in (args) {
        switch (type(name)) {
            case 'objnum:
                name = name.namef(type);
            case 'string:
                catch ~objnf
                    name = ((vars['this]).match_environment(name)).namef(type);
                with
                    name = name;
        }
        out += [name];
    }
    return [._separate_list(sep, out), vars];
};

public method .gen_pro() {
    arg vars, flags, args;
    var out, type, obj, key, objstr;
    
    if ((| (objstr = flags.getkey("obj")) |)) {
        while (type(objstr) == 'list)
            objstr = objstr[1];
        if (type(objstr) == 'string) {
            catch ~objnf, ~namenf
                obj = (vars['this]).match_environment(objstr);
            with
                return [[(">>ERROR: Invalid object '" + objstr) + "'.<<"], vars];
        } else {
            obj = objstr;
        }
    } else {
        obj = vars['this];
    }
    out = [];
    if ((args.length()) == 0)
        return [[">>ERROR: Must specify pronoun type.<<"], vars];
    type = (args[1]).to_symbol();
    catch ~keynf
        out = (> [(obj.gender()).pronoun(type)] <);
    with
        return [[(">>ERROR: Invalid pronoun type '" + (args[1])) + "'.<<"], vars];
    return [out, vars];
};

public method .gen_servername() {
    arg vars, flags, args;
    
    return [[$motd.server_name()], vars];
};

public method .gen_servname() {
    arg vars, flags, args;
    
    return [[$motd.server_name()], vars];
};

public method .gen_set() {
    arg vars, flags, args;
    var text, name;
    
    name = flags.getkey("var");
    [text, vars] = ._eval_ctext(args[1], vars);
    return [[""], vars.add(name, text[1])];
};

public method .gen_switch() {
    arg vars, flags, args;
    var v, i, num, n, done;
    
    v = flags.getkey("value");
    if (type(v) == 'list)
        v = v.join("");
    if (args.contains(v))
        return ._eval_ctext(args[v], vars);
    if (args.contains('ranges)) {
        if ((num = v.is_numeric()))
            n = toint(v);
        done = 0;
        for i in (args['ranges]) {
            if ((| num && (((i[1]).is_numeric()) && ((i[2]).is_numeric())) |)) {
                if ((n >= toint(i[1])) && (n <= toint(i[2])))
                    done = 1;
            } else if ((| (v >= (i[1])) && (v <= (i[2])) |)) {
                done = 1;
            }
            if (done)
                return ._eval_ctext(i[3], vars);
        }
    }
    if (args.contains('default))
        return ._eval_ctext(args['default], vars);
    return [((vars['time]) == 'pre) ? [""] : "", vars];
};

public method .gen_time() {
    arg vars, flags, args;
    var a, word;
    
    [args, vars] = ._eval_ctext(args, vars);
    if (!args)
        return [[tostr(time())], vars];
    return [[$time.format(args[1])], vars];
};

public method .gen_vars() {
    arg vars, flags, args;
    var out, v, sep;
    
    out = [];
    sep = (| flags.getkey("separator") |) || " ";
    for v in (vars.keys()) {
        if (type(v) == 'string)
            out += [v];
    }
    return [._separate_list(sep, out), vars];
};