forked from OctaForge/libcubescript
remove ID_STUFF from public header
parent
607e4ae1b9
commit
133857205d
154
cubescript.cc
154
cubescript.cc
|
@ -14,6 +14,11 @@ namespace cscript {
|
|||
static constexpr int MaxArguments = 25;
|
||||
static constexpr int MaxResults = 7;
|
||||
|
||||
enum {
|
||||
ID_UNKNOWN = -1, ID_VAR, ID_FVAR, ID_SVAR, ID_COMMAND, ID_ALIAS,
|
||||
ID_LOCAL, ID_DO, ID_DOARGS, ID_IF, ID_RESULT, ID_NOT, ID_AND, ID_OR
|
||||
};
|
||||
|
||||
enum {
|
||||
CODE_START = 0,
|
||||
CODE_OFFSET,
|
||||
|
@ -110,59 +115,61 @@ static inline bool cs_check_num(ostd::ConstCharRange s) {
|
|||
}
|
||||
}
|
||||
|
||||
Ident::Ident(): type(ID_UNKNOWN) {}
|
||||
|
||||
/* ID_VAR */
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, int m, int x, int *s,
|
||||
Ident::Ident(ostd::ConstCharRange n, int m, int x, int *s,
|
||||
VarCb f, int flagsv)
|
||||
: type(t), flags(flagsv | (m > x ? IDF_READONLY : 0)), name(n),
|
||||
: type(ID_VAR), flags(flagsv | (m > x ? IDF_READONLY : 0)), name(n),
|
||||
minval(m), maxval(x), cb_var(ostd::move(f)) {
|
||||
storage.ip = s;
|
||||
}
|
||||
|
||||
/* ID_FVAR */
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, float m, float x, float *s,
|
||||
Ident::Ident(ostd::ConstCharRange n, float m, float x, float *s,
|
||||
VarCb f, int flagsv)
|
||||
: type(t), flags(flagsv | (m > x ? IDF_READONLY : 0)), name(n),
|
||||
: type(ID_FVAR), flags(flagsv | (m > x ? IDF_READONLY : 0)), name(n),
|
||||
minvalf(m), maxvalf(x), cb_var(ostd::move(f)) {
|
||||
storage.fp = s;
|
||||
}
|
||||
|
||||
/* ID_SVAR */
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, char **s, VarCb f, int flagsv)
|
||||
: type(t), flags(flagsv), name(n), cb_var(ostd::move(f)) {
|
||||
Ident::Ident(ostd::ConstCharRange n, char **s, VarCb f, int flagsv)
|
||||
: type(ID_SVAR), flags(flagsv), name(n), cb_var(ostd::move(f)) {
|
||||
storage.sp = s;
|
||||
}
|
||||
|
||||
/* ID_ALIAS */
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, char *a, int flagsv)
|
||||
: type(t), valtype(VAL_STR), flags(flagsv), name(n), code(nullptr),
|
||||
Ident::Ident(ostd::ConstCharRange n, char *a, int flagsv)
|
||||
: type(ID_ALIAS), valtype(VAL_STR), flags(flagsv), name(n), code(nullptr),
|
||||
stack(nullptr) {
|
||||
val.s = a;
|
||||
val.len = strlen(a);
|
||||
}
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, int a, int flagsv)
|
||||
: type(t), valtype(VAL_INT), flags(flagsv), name(n), code(nullptr),
|
||||
Ident::Ident(ostd::ConstCharRange n, int a, int flagsv)
|
||||
: type(ID_ALIAS), valtype(VAL_INT), flags(flagsv), name(n), code(nullptr),
|
||||
stack(nullptr) {
|
||||
val.i = a;
|
||||
}
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, float a, int flagsv)
|
||||
: type(t), valtype(VAL_FLOAT), flags(flagsv), name(n), code(nullptr),
|
||||
Ident::Ident(ostd::ConstCharRange n, float a, int flagsv)
|
||||
: type(ID_ALIAS), valtype(VAL_FLOAT), flags(flagsv), name(n), code(nullptr),
|
||||
stack(nullptr) {
|
||||
val.f = a;
|
||||
}
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, int flagsv)
|
||||
: type(t), valtype(VAL_NULL), flags(flagsv), name(n), code(nullptr),
|
||||
Ident::Ident(ostd::ConstCharRange n, int flagsv)
|
||||
: type(ID_ALIAS), valtype(VAL_NULL), flags(flagsv), name(n), code(nullptr),
|
||||
stack(nullptr) {
|
||||
}
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, TaggedValue const &v, int flagsv)
|
||||
: type(t), valtype(v.p_type), flags(flagsv), name(n), code(nullptr),
|
||||
Ident::Ident(ostd::ConstCharRange n, TaggedValue const &v, int flagsv)
|
||||
: type(ID_ALIAS), valtype(v.p_type), flags(flagsv), name(n), code(nullptr),
|
||||
stack(nullptr) {
|
||||
val = v;
|
||||
}
|
||||
|
||||
/* ID_COMMAND */
|
||||
Ident::Ident(int t, ostd::ConstCharRange n, ostd::ConstCharRange args,
|
||||
ostd::Uint32 argmask, int numargs, CmdFunc f, int flagsv)
|
||||
: type(t), numargs(numargs), flags(flagsv), name(n),
|
||||
ostd::Uint32 argmask, int numargs, CmdFunc f)
|
||||
: type(t), numargs(numargs), flags(0), name(n),
|
||||
cargs(!args.empty() ? cs_dup_ostr(args) : nullptr),
|
||||
argmask(argmask), cb_cftv(ostd::move(f)) {
|
||||
}
|
||||
|
@ -186,8 +193,8 @@ CsState::CsState(): result(&no_ret) {
|
|||
new_ident(static_cast<char const *>(buf), IDF_ARG);
|
||||
}
|
||||
dummy = new_ident("//dummy");
|
||||
add_ident(ID_VAR, "numargs", MaxArguments, 0, &numargs);
|
||||
add_ident(ID_VAR, "dbgalias", 0, 1000, &dbgalias);
|
||||
add_ident("numargs", MaxArguments, 0, &numargs);
|
||||
add_ident("dbgalias", 0, 1000, &dbgalias);
|
||||
cs_init_lib_base(*this);
|
||||
}
|
||||
|
||||
|
@ -308,7 +315,7 @@ Ident *CsState::new_ident(ostd::ConstCharRange name, int flags) {
|
|||
name);
|
||||
return dummy;
|
||||
}
|
||||
id = add_ident(ID_ALIAS, name, flags);
|
||||
id = add_ident(name, flags);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
@ -386,7 +393,7 @@ void CsState::set_alias(ostd::ConstCharRange name, TaggedValue &v) {
|
|||
cs_debug_code(*this, "cannot alias number %s", name);
|
||||
v.cleanup();
|
||||
} else {
|
||||
add_ident(ID_ALIAS, name, v, identflags);
|
||||
add_ident(name, v, identflags);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -818,6 +825,13 @@ void Ident::set_alias(CsState &cs, TaggedValue &v) {
|
|||
flags = (flags & cs.identflags) | cs.identflags;
|
||||
}
|
||||
|
||||
IdentType Ident::get_type() const {
|
||||
if (type > ID_ALIAS) {
|
||||
return IdentType::unknown;
|
||||
}
|
||||
return IdentType(type);
|
||||
}
|
||||
|
||||
template<typename F>
|
||||
static void cs_do_args(CsState &cs, F body) {
|
||||
IdentStack argstack[MaxArguments];
|
||||
|
@ -1054,8 +1068,10 @@ void CsState::set_var_str_checked(Ident *id, ostd::ConstCharRange v) {
|
|||
id->changed();
|
||||
}
|
||||
|
||||
bool CsState::add_command(ostd::ConstCharRange name, ostd::ConstCharRange args,
|
||||
CmdFunc func, int type, int flags) {
|
||||
static bool cs_add_command(
|
||||
CsState &cs, ostd::ConstCharRange name, ostd::ConstCharRange args,
|
||||
CmdFunc func, int type = ID_COMMAND
|
||||
) {
|
||||
ostd::Uint32 argmask = 0;
|
||||
int nargs = 0;
|
||||
ostd::ConstCharRange fmt(args);
|
||||
|
@ -1098,10 +1114,16 @@ bool CsState::add_command(ostd::ConstCharRange name, ostd::ConstCharRange args,
|
|||
return false;
|
||||
}
|
||||
}
|
||||
add_ident(type, name, args, argmask, nargs, ostd::move(func), flags);
|
||||
cs.add_ident(type, name, args, argmask, nargs, ostd::move(func));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CsState::add_command(
|
||||
ostd::ConstCharRange name, ostd::ConstCharRange args, CmdFunc func
|
||||
) {
|
||||
return cs_add_command(*this, name, args, ostd::move(func));
|
||||
}
|
||||
|
||||
char const *parsestring(char const *p) {
|
||||
for (; *p; p++) switch (*p) {
|
||||
case '\r':
|
||||
|
@ -3538,7 +3560,7 @@ namespace util {
|
|||
}
|
||||
|
||||
void cs_init_lib_io(CsState &cs) {
|
||||
cs.add_command("exec", "sb", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "exec", "sb", [&cs](TvalRange args) {
|
||||
auto file = args[0].get_strr();
|
||||
bool ret = cs.run_file(file);
|
||||
if (!ret) {
|
||||
|
@ -3549,7 +3571,7 @@ void cs_init_lib_io(CsState &cs) {
|
|||
cs.result->set_int(1);
|
||||
});
|
||||
|
||||
cs.add_command("echo", "C", [](TvalRange args) {
|
||||
cs_add_command(cs, "echo", "C", [](TvalRange args) {
|
||||
ostd::writeln(args[0].get_strr());
|
||||
});
|
||||
}
|
||||
|
@ -3608,32 +3630,32 @@ static inline void cs_loop_conc(CsState &cs, Ident &id, int offset, int n,
|
|||
}
|
||||
|
||||
void cs_init_lib_base(CsState &cs) {
|
||||
cs.add_command("do", "e", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "do", "e", [&cs](TvalRange args) {
|
||||
cs.run_ret(args[0].get_code());
|
||||
}, ID_DO);
|
||||
|
||||
cs.add_command("doargs", "e", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "doargs", "e", [&cs](TvalRange args) {
|
||||
if (cs.stack != &cs.noalias)
|
||||
cs_do_args(cs, [&]() { cs.run_ret(args[0].get_code()); });
|
||||
else
|
||||
cs.run_ret(args[0].get_code());
|
||||
}, ID_DOARGS);
|
||||
|
||||
cs.add_command("if", "tee", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "if", "tee", [&cs](TvalRange args) {
|
||||
cs.run_ret((args[0].get_bool() ? args[1] : args[2]).get_code());
|
||||
}, ID_IF);
|
||||
|
||||
cs.add_command("result", "T", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "result", "T", [&cs](TvalRange args) {
|
||||
TaggedValue &v = args[0];
|
||||
*cs.result = v;
|
||||
v.set_null();
|
||||
}, ID_RESULT);
|
||||
|
||||
cs.add_command("!", "t", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "!", "t", [&cs](TvalRange args) {
|
||||
cs.result->set_int(!args[0].get_bool());
|
||||
}, ID_NOT);
|
||||
|
||||
cs.add_command("&&", "E1V", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "&&", "E1V", [&cs](TvalRange args) {
|
||||
if (args.empty())
|
||||
cs.result->set_int(1);
|
||||
else for (ostd::Size i = 0; i < args.size(); ++i) {
|
||||
|
@ -3646,7 +3668,7 @@ void cs_init_lib_base(CsState &cs) {
|
|||
}
|
||||
}, ID_AND);
|
||||
|
||||
cs.add_command("||", "E1V", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "||", "E1V", [&cs](TvalRange args) {
|
||||
if (args.empty())
|
||||
cs.result->set_int(0);
|
||||
else for (ostd::Size i = 0; i < args.size(); ++i) {
|
||||
|
@ -3659,11 +3681,11 @@ void cs_init_lib_base(CsState &cs) {
|
|||
}
|
||||
}, ID_OR);
|
||||
|
||||
cs.add_command("?", "tTT", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "?", "tTT", [&cs](TvalRange args) {
|
||||
cs.result->set(args[0].get_bool() ? args[1] : args[2]);
|
||||
});
|
||||
|
||||
cs.add_command("cond", "ee2V", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "cond", "ee2V", [&cs](TvalRange args) {
|
||||
for (ostd::Size i = 0; i < args.size(); i += 2) {
|
||||
if ((i + 1) < args.size()) {
|
||||
if (cs.run_bool(args[i].code)) {
|
||||
|
@ -3678,7 +3700,7 @@ void cs_init_lib_base(CsState &cs) {
|
|||
});
|
||||
|
||||
#define CS_CMD_CASE(name, fmt, type, acc, compare) \
|
||||
cs.add_command(name, fmt "te2V", [&cs](TvalRange args) { \
|
||||
cs_add_command(cs, name, fmt "te2V", [&cs](TvalRange args) { \
|
||||
type val = ostd::move(acc); \
|
||||
ostd::Size i; \
|
||||
for (i = 1; (i + 1) < args.size(); i += 2) { \
|
||||
|
@ -3703,7 +3725,7 @@ void cs_init_lib_base(CsState &cs) {
|
|||
|
||||
#undef CS_CMD_CASE
|
||||
|
||||
cs.add_command("pushif", "rTe", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "pushif", "rTe", [&cs](TvalRange args) {
|
||||
Ident *id = args[0].get_ident();
|
||||
TaggedValue &v = args[1];
|
||||
Bytecode *code = args[2].get_code();
|
||||
|
@ -3718,132 +3740,132 @@ void cs_init_lib_base(CsState &cs) {
|
|||
}
|
||||
});
|
||||
|
||||
cs.add_command("loop", "rie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loop", "rie", [&cs](TvalRange args) {
|
||||
cs_do_loop(
|
||||
cs, *args[0].get_ident(), 0, args[1].get_int(), 1, nullptr,
|
||||
args[2].get_code()
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loop+", "riie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loop+", "riie", [&cs](TvalRange args) {
|
||||
cs_do_loop(
|
||||
cs, *args[0].get_ident(), args[1].get_int(), args[2].get_int(), 1,
|
||||
nullptr, args[3].get_code()
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loop*", "riie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loop*", "riie", [&cs](TvalRange args) {
|
||||
cs_do_loop(
|
||||
cs, *args[0].get_ident(), 0, args[1].get_int(), args[2].get_int(),
|
||||
nullptr, args[3].get_code()
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loop+*", "riiie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loop+*", "riiie", [&cs](TvalRange args) {
|
||||
cs_do_loop(
|
||||
cs, *args[0].get_ident(), args[1].get_int(), args[3].get_int(),
|
||||
args[2].get_int(), nullptr, args[4].get_code()
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopwhile", "riee", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopwhile", "riee", [&cs](TvalRange args) {
|
||||
cs_do_loop(
|
||||
cs, *args[0].get_ident(), 0, args[1].get_int(), 1,
|
||||
args[2].get_code(), args[3].get_code()
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopwhile+", "riiee", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopwhile+", "riiee", [&cs](TvalRange args) {
|
||||
cs_do_loop(
|
||||
cs, *args[0].get_ident(), args[1].get_int(), args[2].get_int(), 1,
|
||||
args[3].get_code(), args[4].get_code()
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopwhile*", "riiee", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopwhile*", "riiee", [&cs](TvalRange args) {
|
||||
cs_do_loop(
|
||||
cs, *args[0].get_ident(), 0, args[2].get_int(), args[1].get_int(),
|
||||
args[3].get_code(), args[4].get_code()
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopwhile+*", "riiiee", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopwhile+*", "riiiee", [&cs](TvalRange args) {
|
||||
cs_do_loop(
|
||||
cs, *args[0].get_ident(), args[1].get_int(), args[3].get_int(),
|
||||
args[2].get_int(), args[4].get_code(), args[5].get_code()
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("while", "ee", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "while", "ee", [&cs](TvalRange args) {
|
||||
Bytecode *cond = args[0].get_code(), *body = args[1].get_code();
|
||||
while (cs.run_bool(cond)) {
|
||||
cs.run_int(body);
|
||||
}
|
||||
});
|
||||
|
||||
cs.add_command("loopconcat", "rie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopconcat", "rie", [&cs](TvalRange args) {
|
||||
cs_loop_conc(
|
||||
cs, *args[0].get_ident(), 0, args[1].get_int(), 1,
|
||||
args[2].get_code(), true
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopconcat+", "riie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopconcat+", "riie", [&cs](TvalRange args) {
|
||||
cs_loop_conc(
|
||||
cs, *args[0].get_ident(), args[1].get_int(), args[2].get_int(), 1,
|
||||
args[3].get_code(), true
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopconcat*", "riie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopconcat*", "riie", [&cs](TvalRange args) {
|
||||
cs_loop_conc(
|
||||
cs, *args[0].get_ident(), 0, args[2].get_int(), args[1].get_int(),
|
||||
args[3].get_code(), true
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopconcat+*", "riiie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopconcat+*", "riiie", [&cs](TvalRange args) {
|
||||
cs_loop_conc(
|
||||
cs, *args[0].get_ident(), args[1].get_int(), args[3].get_int(),
|
||||
args[2].get_int(), args[4].get_code(), true
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopconcatword", "rie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopconcatword", "rie", [&cs](TvalRange args) {
|
||||
cs_loop_conc(
|
||||
cs, *args[0].get_ident(), 0, args[1].get_int(), 1,
|
||||
args[2].get_code(), false
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopconcatword+", "riie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopconcatword+", "riie", [&cs](TvalRange args) {
|
||||
cs_loop_conc(
|
||||
cs, *args[0].get_ident(), args[1].get_int(), args[2].get_int(), 1,
|
||||
args[3].get_code(), false
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopconcatword*", "riie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopconcatword*", "riie", [&cs](TvalRange args) {
|
||||
cs_loop_conc(
|
||||
cs, *args[0].get_ident(), 0, args[2].get_int(), args[1].get_int(),
|
||||
args[3].get_code(), false
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("loopconcatword+*", "riiie", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "loopconcatword+*", "riiie", [&cs](TvalRange args) {
|
||||
cs_loop_conc(
|
||||
cs, *args[0].get_ident(), args[1].get_int(), args[3].get_int(),
|
||||
args[2].get_int(), args[4].get_code(), false
|
||||
);
|
||||
});
|
||||
|
||||
cs.add_command("nodebug", "e", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "nodebug", "e", [&cs](TvalRange args) {
|
||||
++cs.nodebug;
|
||||
cs.run_ret(args[0].get_code());
|
||||
--cs.nodebug;
|
||||
});
|
||||
|
||||
cs.add_command("push", "rTe", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "push", "rTe", [&cs](TvalRange args) {
|
||||
Ident *id = args[0].get_ident();
|
||||
if (id->type != ID_ALIAS || id->index < MaxArguments) return;
|
||||
IdentStack stack;
|
||||
|
@ -3854,36 +3876,36 @@ void cs_init_lib_base(CsState &cs) {
|
|||
id->pop_arg();
|
||||
});
|
||||
|
||||
cs.add_command("local", nullptr, nullptr, ID_LOCAL);
|
||||
cs_add_command(cs, "local", nullptr, nullptr, ID_LOCAL);
|
||||
|
||||
cs.add_command("resetvar", "s", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "resetvar", "s", [&cs](TvalRange args) {
|
||||
cs.result->set_int(cs.reset_var(args[0].get_strr()));
|
||||
});
|
||||
|
||||
cs.add_command("alias", "sT", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "alias", "sT", [&cs](TvalRange args) {
|
||||
TaggedValue &v = args[1];
|
||||
cs.set_alias(args[0].get_strr(), v);
|
||||
v.set_null();
|
||||
});
|
||||
|
||||
cs.add_command("getvarmin", "s", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "getvarmin", "s", [&cs](TvalRange args) {
|
||||
cs.result->set_int(cs.get_var_min_int(args[0].get_strr()).value_or(0));
|
||||
});
|
||||
cs.add_command("getvarmax", "s", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "getvarmax", "s", [&cs](TvalRange args) {
|
||||
cs.result->set_int(cs.get_var_max_int(args[0].get_strr()).value_or(0));
|
||||
});
|
||||
cs.add_command("getfvarmin", "s", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "getfvarmin", "s", [&cs](TvalRange args) {
|
||||
cs.result->set_float(cs.get_var_min_float(args[0].get_strr()).value_or(0.0f));
|
||||
});
|
||||
cs.add_command("getfvarmax", "s", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "getfvarmax", "s", [&cs](TvalRange args) {
|
||||
cs.result->set_float(cs.get_var_max_float(args[0].get_strr()).value_or(0.0f));
|
||||
});
|
||||
|
||||
cs.add_command("identexists", "s", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "identexists", "s", [&cs](TvalRange args) {
|
||||
cs.result->set_int(cs.have_ident(args[0].get_strr()));
|
||||
});
|
||||
|
||||
cs.add_command("getalias", "s", [&cs](TvalRange args) {
|
||||
cs_add_command(cs, "getalias", "s", [&cs](TvalRange args) {
|
||||
cs.result->set_str(ostd::move(cs.get_alias(args[0].get_strr()).value_or("")));
|
||||
});
|
||||
}
|
||||
|
|
|
@ -23,11 +23,6 @@ enum {
|
|||
VAL_CANY, VAL_WORD, VAL_POP, VAL_COND
|
||||
};
|
||||
|
||||
enum {
|
||||
ID_UNKNOWN = -1, ID_VAR, ID_FVAR, ID_SVAR, ID_COMMAND, ID_ALIAS,
|
||||
ID_LOCAL, ID_DO, ID_DOARGS, ID_IF, ID_RESULT, ID_NOT, ID_AND, ID_OR
|
||||
};
|
||||
|
||||
enum {
|
||||
IDF_PERSIST = 1 << 0,
|
||||
IDF_OVERRIDE = 1 << 1,
|
||||
|
@ -171,6 +166,11 @@ struct CsState;
|
|||
using VarCb = ostd::Function<void(Ident &)>;
|
||||
using CmdFunc = ostd::Function<void(TvalRange)>;
|
||||
|
||||
enum class IdentType {
|
||||
unknown = -1,
|
||||
ivar, fvar, svar, command, alias
|
||||
};
|
||||
|
||||
struct OSTD_EXPORT Ident {
|
||||
ostd::byte type; /* ID_something */
|
||||
union {
|
||||
|
@ -206,38 +206,37 @@ struct OSTD_EXPORT Ident {
|
|||
VarCb cb_var;
|
||||
CmdFunc cb_cftv;
|
||||
|
||||
Ident(): type(ID_UNKNOWN) {}
|
||||
Ident();
|
||||
|
||||
/* ID_VAR */
|
||||
Ident(
|
||||
int t, ostd::ConstCharRange n, int m, int x, int *s,
|
||||
ostd::ConstCharRange n, int m, int x, int *s,
|
||||
VarCb f = VarCb(), int flags = 0
|
||||
);
|
||||
|
||||
/* ID_FVAR */
|
||||
Ident(
|
||||
int t, ostd::ConstCharRange n, float m, float x, float *s,
|
||||
ostd::ConstCharRange n, float m, float x, float *s,
|
||||
VarCb f = VarCb(), int flags = 0
|
||||
);
|
||||
|
||||
/* ID_SVAR */
|
||||
Ident(
|
||||
int t, ostd::ConstCharRange n, char **s, VarCb f = VarCb(),
|
||||
ostd::ConstCharRange n, char **s, VarCb f = VarCb(),
|
||||
int flags = 0
|
||||
);
|
||||
|
||||
/* ID_ALIAS */
|
||||
Ident(int t, ostd::ConstCharRange n, char *a, int flags);
|
||||
Ident(int t, ostd::ConstCharRange n, int a, int flags);
|
||||
Ident(int t, ostd::ConstCharRange n, float a, int flags);
|
||||
Ident(int t, ostd::ConstCharRange n, int flags);
|
||||
Ident(int t, ostd::ConstCharRange n, TaggedValue const &v, int flags);
|
||||
Ident(ostd::ConstCharRange n, char *a, int flags);
|
||||
Ident(ostd::ConstCharRange n, int a, int flags);
|
||||
Ident(ostd::ConstCharRange n, float a, int flags);
|
||||
Ident(ostd::ConstCharRange n, int flags);
|
||||
Ident(ostd::ConstCharRange n, TaggedValue const &v, int flags);
|
||||
|
||||
/* ID_COMMAND */
|
||||
Ident(
|
||||
int t, ostd::ConstCharRange n, ostd::ConstCharRange args,
|
||||
ostd::Uint32 argmask, int numargs, CmdFunc f = CmdFunc(),
|
||||
int flags = 0
|
||||
ostd::Uint32 argmask, int numargs, CmdFunc f = CmdFunc()
|
||||
);
|
||||
|
||||
void changed() {
|
||||
|
@ -293,6 +292,33 @@ struct OSTD_EXPORT Ident {
|
|||
int get_valtype() const {
|
||||
return valtype;
|
||||
}
|
||||
|
||||
IdentType get_type() const;
|
||||
|
||||
bool is_alias() const {
|
||||
return get_type() == IdentType::alias;
|
||||
}
|
||||
|
||||
bool is_command() const {
|
||||
return get_type() == IdentType::command;
|
||||
}
|
||||
|
||||
bool is_var() const {
|
||||
IdentType tp = get_type();
|
||||
return (tp >= IdentType::ivar) && (tp <= IdentType::svar);
|
||||
}
|
||||
|
||||
bool is_ivar() const {
|
||||
return get_type() == IdentType::ivar;
|
||||
}
|
||||
|
||||
bool is_fvar() const {
|
||||
return get_type() == IdentType::fvar;
|
||||
}
|
||||
|
||||
bool is_svar() const {
|
||||
return get_type() == IdentType::svar;
|
||||
}
|
||||
};
|
||||
|
||||
struct IdentLink {
|
||||
|
@ -348,8 +374,7 @@ struct OSTD_EXPORT CsState {
|
|||
void touch_var(ostd::ConstCharRange name);
|
||||
|
||||
bool add_command(
|
||||
ostd::ConstCharRange name, ostd::ConstCharRange args,
|
||||
CmdFunc func, int type = ID_COMMAND, int flags = 0
|
||||
ostd::ConstCharRange name, ostd::ConstCharRange args, CmdFunc func
|
||||
);
|
||||
|
||||
ostd::String run_str(Bytecode const *code);
|
||||
|
@ -433,10 +458,6 @@ enum {
|
|||
|
||||
OSTD_EXPORT void init_libs(CsState &cs, int libs = CS_LIB_ALL);
|
||||
|
||||
inline bool check_alias(Ident *id) {
|
||||
return id && (id->type == ID_ALIAS);
|
||||
}
|
||||
|
||||
struct OSTD_EXPORT StackedValue: TaggedValue {
|
||||
Ident *id;
|
||||
|
||||
|
@ -450,7 +471,7 @@ struct OSTD_EXPORT StackedValue: TaggedValue {
|
|||
|
||||
bool alias(CsState &cs, ostd::ConstCharRange name) {
|
||||
id = cs.new_ident(name);
|
||||
return check_alias(id);
|
||||
return id && id->is_alias();
|
||||
}
|
||||
|
||||
bool push() {
|
||||
|
|
20
lib_list.cc
20
lib_list.cc
|
@ -30,7 +30,7 @@ static inline void cs_set_iter(Ident &id, char *val, IdentStack &stack) {
|
|||
|
||||
static void cs_loop_list_conc(CsState &cs, Ident *id, ostd::ConstCharRange list,
|
||||
Bytecode const *body, bool space) {
|
||||
if (id->type != ID_ALIAS)
|
||||
if (!id->is_alias())
|
||||
return;
|
||||
IdentStack stack;
|
||||
ostd::Vector<char> r;
|
||||
|
@ -119,7 +119,7 @@ void cs_init_lib_list(CsState &cs) {
|
|||
cs.add_command("listfind", "rse", [&cs](TvalRange args) {
|
||||
Ident *id = args[0].get_ident();
|
||||
auto body = args[2].get_code();
|
||||
if (id->type != ID_ALIAS) {
|
||||
if (!id->is_alias()) {
|
||||
cs.result->set_int(-1);
|
||||
return;
|
||||
}
|
||||
|
@ -142,7 +142,7 @@ found:
|
|||
cs.add_command("listassoc", "rse", [&cs](TvalRange args) {
|
||||
Ident *id = args[0].get_ident();
|
||||
auto body = args[2].get_code();
|
||||
if (id->type != ID_ALIAS)
|
||||
if (!id->is_alias())
|
||||
return;
|
||||
IdentStack stack;
|
||||
int n = -1;
|
||||
|
@ -217,7 +217,7 @@ found:
|
|||
cs.add_command("looplist", "rse", [&cs](TvalRange args) {
|
||||
Ident *id = args[0].get_ident();
|
||||
auto body = args[2].get_code();
|
||||
if (id->type != ID_ALIAS)
|
||||
if (!id->is_alias())
|
||||
return;
|
||||
IdentStack stack;
|
||||
int n = 0;
|
||||
|
@ -232,7 +232,7 @@ found:
|
|||
cs.add_command("looplist2", "rrse", [&cs](TvalRange args) {
|
||||
Ident *id = args[0].get_ident(), *id2 = args[1].get_ident();
|
||||
auto body = args[3].get_code();
|
||||
if (id->type != ID_ALIAS || id2->type != ID_ALIAS)
|
||||
if (!id->is_alias() || !id2->is_alias())
|
||||
return;
|
||||
IdentStack stack, stack2;
|
||||
int n = 0;
|
||||
|
@ -253,9 +253,7 @@ found:
|
|||
Ident *id2 = args[1].get_ident();
|
||||
Ident *id3 = args[2].get_ident();
|
||||
auto body = args[4].get_code();
|
||||
if (id->type != ID_ALIAS)
|
||||
return;
|
||||
if (id2->type != ID_ALIAS || id3->type != ID_ALIAS)
|
||||
if (!id->is_alias() || !id2->is_alias() || !id3->is_alias())
|
||||
return;
|
||||
IdentStack stack, stack2, stack3;
|
||||
int n = 0;
|
||||
|
@ -291,7 +289,7 @@ found:
|
|||
cs.add_command("listfilter", "rse", [&cs](TvalRange args) {
|
||||
Ident *id = args[0].get_ident();
|
||||
auto body = args[2].get_code();
|
||||
if (id->type != ID_ALIAS)
|
||||
if (!id->is_alias())
|
||||
return;
|
||||
IdentStack stack;
|
||||
ostd::Vector<char> r;
|
||||
|
@ -314,7 +312,7 @@ found:
|
|||
cs.add_command("listcount", "rse", [&cs](TvalRange args) {
|
||||
Ident *id = args[0].get_ident();
|
||||
auto body = args[2].get_code();
|
||||
if (id->type != ID_ALIAS)
|
||||
if (!id->is_alias())
|
||||
return;
|
||||
IdentStack stack;
|
||||
int n = 0, r = 0;
|
||||
|
@ -464,7 +462,7 @@ static void cs_list_sort(
|
|||
CsState &cs, ostd::ConstCharRange list, Ident *x, Ident *y,
|
||||
Bytecode *body, Bytecode *unique
|
||||
) {
|
||||
if (x == y || x->type != ID_ALIAS || y->type != ID_ALIAS)
|
||||
if (x == y || !x->is_alias() || !y->is_alias())
|
||||
return;
|
||||
|
||||
ostd::Vector<ListSortItem> items;
|
||||
|
|
Loading…
Reference in New Issue