From 7d584bbfb15adddc9d7d6d317ede79b5c374645b Mon Sep 17 00:00:00 2001 From: q66 Date: Sat, 8 Aug 2015 02:03:05 +0100 Subject: [PATCH] more progress, remove cstate global state (but some funcs are disabled for now) --- command.cc | 96 ++++++++++++++++++++++++++++++------------------------ command.hh | 12 ------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/command.cc b/command.cc index acf83b16..9d7e34cf 100644 --- a/command.cc +++ b/command.cc @@ -14,8 +14,6 @@ static inline bool check_num(const char *s) { } } -CsState cstate; - const struct NullValue: TaggedValue { NullValue() { set_null(); } } null_value; @@ -3693,49 +3691,66 @@ int listlen(CsState &, const char *s) { while (parselist(s)) n++; return n; } -ICOMMAND(listlen, "s", (CsState &cs, char *s), cs.result->set_int(listlen(cs, s))); -void at(CsState &cs, TaggedValue *args, int numargs) { - if (!numargs) return; - const char *start = args[0].get_str(), *end = start + strlen(start), *qstart = ""; - for (int i = 1; i < numargs; i++) { - const char *list = start; - int pos = args[i].get_int(); - for (; pos > 0; pos--) if (!parselist(list)) break; - if (pos > 0 || !parselist(list, start, end, qstart)) start = end = qstart = ""; - } - cs.result->set_str(listelem(start, end, qstart).disown()); -} -COMMAND(at, "si1V"); - -void sublist(CsState &cs, const char *s, int *skip, int *count, int *numargs) { - int offset = ostd::max(*skip, 0), len = *numargs >= 3 ? ostd::max(*count, 0) : -1; - for (int i = 0; i < offset; ++i) if (!parselist(s)) break; - if (len < 0) { - if (offset > 0) skiplist(s); - cs.result->set_str(dup_ostr(s)); - return; - } - const char *list = s, *start, *end, *qstart, *qend = s; - if (len > 0 && parselist(s, start, end, list, qend)) while (--len > 0 && parselist(s, start, end, qstart, qend)); - cs.result->set_str(dup_ostr(ostd::ConstCharRange(list, qend - list))); -} -COMMAND(sublist, "siiN"); - -static inline void setiter(Ident &id, char *val, IdentStack &stack) { +static inline void cs_set_iter(Ident &id, char *val, IdentStack &stack) { if (id.stack == &stack) { - if (id.valtype == VAL_STR) delete[] id.val.s; - else id.valtype = VAL_STR; + if (id.valtype == VAL_STR) + delete[] id.val.s; + else + id.valtype = VAL_STR; id.clean_code(); id.val.s = val; - } else { - TaggedValue t; - t.set_str(val); - id.push_arg(t, stack); - id.flags &= ~IDF_UNKNOWN; + return; } + TaggedValue v; + v.set_str(val); + id.push_arg(v, stack); + id.flags &= ~IDF_UNKNOWN; } +void init_lib_list(CsState &cs) { + cs.add_command("listlen", "s", [](CsState &cs, char *s) { + cs.result->set_int(listlen(cs, s)); + }); + + cs.add_command("at", "si1V", [](CsState &cs, TaggedValue *args, + int numargs) { + if (!numargs) + return; + const char *start = args[0].get_str(), + *end = start + strlen(start), + *qstart = ""; + for (int i = 1; i < numargs; ++i) { + const char *list = start; + int pos = args[i].get_int(); + for (; pos > 0; --pos) + if (!parselist(list)) break; + if (pos > 0 || !parselist(list, start, end, qstart)) + start = end = qstart = ""; + } + cs.result->set_str(listelem(start, end, qstart).disown()); + }); + + cs.add_command("sublist", "siiN", [](CsState &cs, const char *s, + int *skip, int *count, int *numargs) { + int offset = ostd::max(*skip, 0), + len = (*numargs >= 3) ? ostd::max(*count, 0) : -1; + for (int i = 0; i < offset; ++i) + if (!parselist(s)) break; + if (len < 0) { + if (offset > 0) + skiplist(s); + cs.result->set_str(dup_ostr(s)); + return; + } + const char *list = s, *start, *end, *qstart, *qend = s; + if (len > 0 && parselist(s, start, end, list, qend)) + while (--len > 0 && parselist(s, start, end, qstart, qend)); + cs.result->set_str(dup_ostr(ostd::ConstCharRange(list, qend - list))); + }); +} + +/* void listfind(CsState &cs, Ident *id, const char *list, const ostd::Uint32 *body) { if (id->type != ID_ALIAS) { cs.result->set_int(-1); @@ -4103,7 +4118,7 @@ void sortlist(CsState &cs, char *list, Ident *x, Ident *y, ostd::Uint32 *body, o } COMMAND(sortlist, "srree"); ICOMMAND(uniquelist, "srre", (CsState &cs, char *list, Ident *x, Ident *y, ostd::Uint32 *body), sortlist(cs, list, x, y, nullptr, body)); - +*/ static constexpr float PI = 3.14159265358979f; static constexpr float RAD = PI / 180.0f; @@ -4297,9 +4312,6 @@ void init_lib_math(CsState &cs) { #undef CS_CMD_CMP } -void init_lib_list(CsState &) { -} - void init_lib_string(CsState &cs) { cs.add_command("strstr", "ss", [](CsState &cs, char *a, char *b) { char *s = strstr(a, b); diff --git a/command.hh b/command.hh index 32d60ec4..5c7dcfc0 100644 --- a/command.hh +++ b/command.hh @@ -451,8 +451,6 @@ struct CsState { void print_var_str(Ident *id, ostd::ConstCharRange s); }; -extern CsState cstate; - extern const char *intstr(int v); extern const char *floatstr(float v); @@ -597,16 +595,6 @@ void explodelist(const char *s, ostd::Vector &elems, int limit = - extern char *indexlist(const char *s, int pos); extern int listlen(CsState &cs, const char *s); -#define COMMAND(name, nargs) static bool __dummy_##name = cstate.add_command(#name, nargs, (IdentFunc)name, ID_COMMAND) - -#define ICOMMANDNAME(name) _icmd_##name -#define ICOMMANDSNAME _icmds_ -#define ICOMMANDNS(name, cmdname, nargs, proto, b) template struct cmdname; template<> struct cmdname<__LINE__> { static bool init; static void run proto; }; bool cmdname<__LINE__>::init = cstate.add_command(name, nargs, (IdentFunc)cmdname<__LINE__>::run, ID_COMMAND); void cmdname<__LINE__>::run proto \ - { b; } -#define ICOMMANDN(name, cmdname, nargs, proto, b) ICOMMANDNS(#name, cmdname, nargs, proto, b) -#define ICOMMAND(name, nargs, proto, b) ICOMMANDN(name, ICOMMANDNAME(name), nargs, proto, b) -#define ICOMMANDS(name, nargs, proto, b) ICOMMANDNS(name, ICOMMANDSNAME, nargs, proto, b) - void init_lib_base(CsState &cs); void init_lib_io(CsState &cs); void init_lib_math(CsState &cs);