From 934e35f56b3c292b94a71e156ffe5f7cdaf6647f Mon Sep 17 00:00:00 2001 From: q66 Date: Fri, 7 Aug 2015 03:12:20 +0100 Subject: [PATCH] str cleanups --- command.cc | 61 ++++++++++++++++++++---------------------------------- command.hh | 26 ++--------------------- 2 files changed, 25 insertions(+), 62 deletions(-) diff --git a/command.cc b/command.cc index 4e2086c2..fe556aea 100644 --- a/command.cc +++ b/command.cc @@ -671,11 +671,7 @@ bool CsState::add_command(ostd::ConstCharRange name, ostd::ConstCharRange args, return true; } -bool addcommand(const char *name, IdentFunc fun, const char *args, int type) { - return cstate.add_command(name, args, fun, type); -} - -void init_lib_base(CsState &cs) { +static void cs_init_lib_base_var(CsState &cs) { cs.add_command("nodebug", "e", [](CsState &cs, ostd::uint *body) { ++cs.nodebug; executeret(body, *cs.result); @@ -3278,6 +3274,10 @@ bool validateblock(const char *s) { /* standard lib */ +void init_lib_base(CsState &cs) { + cs_init_lib_base_var(cs); +} + static char retbuf[4][256]; static int retidx = 0; @@ -3322,21 +3322,6 @@ ICOMMAND(pushif, "rTe", (CsState &cs, Ident *id, TaggedValue *v, ostd::uint *cod } }); -void loopiter(Ident *id, IdentStack &stack, const TaggedValue &v) { - if (id->stack != &stack) { - id->push_arg(v, stack); - id->flags &= ~IDF_UNKNOWN; - } else { - if (id->valtype == VAL_STR) delete[] id->val.s; - id->clean_code(); - id->setval(v); - } -} - -void loopend(Ident *id, IdentStack &stack) { - if (id->stack == &stack) id->pop_arg(); -} - static inline void setiter(Ident &id, int i, IdentStack &stack) { if (id.stack == &stack) { if (id.valtype != VAL_INT) { @@ -3529,30 +3514,30 @@ endblock: return true; } -static inline char *listelem(const char *start = liststart, const char *end = listend, const char *quotestart = listquotestart) { +static inline ostd::String listelem(const char *start = liststart, const char *end = listend, const char *quotestart = listquotestart) { ostd::Size len = end - start; - char *s = new char[len + 1]; - if (*quotestart == '"') unescapestring(s, start, end); + ostd::String s; + s.reserve(len); + if (*quotestart == '"') unescapestring(s.data(), start, end); else { - memcpy(s, start, len); + memcpy(s.data(), start, len); s[len] = '\0'; } + s.advance(len); return s; } void explodelist(const char *s, ostd::Vector &elems, int limit) { const char *start, *end, *qstart; while ((limit < 0 || int(elems.size()) < limit) && parselist(s, start, end, qstart)) { - char *s = listelem(start, end, qstart); - elems.push(s); - delete[] s; + elems.push(ostd::move(listelem(start, end, qstart))); } } char *indexlist(const char *s, int pos) { for (int i = 0; i < pos; ++i) if (!parselist(s)) return dup_ostr(""); const char *start, *end, *qstart; - return parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""); + return parselist(s, start, end, qstart) ? listelem(start, end, qstart).disown() : dup_ostr(""); } int listlen(CsState &, const char *s) { @@ -3571,7 +3556,7 @@ void at(CsState &cs, TaggedValue *args, int numargs) { 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)); + cs.result->set_str(listelem(start, end, qstart).disown()); } COMMAND(at, "si1V"); @@ -3638,7 +3623,7 @@ void listassoc(CsState &cs, Ident *id, const char *list, const ostd::uint *body) ++n; setiter(*id, dup_ostr(ostd::ConstCharRange(start, end - start)), stack); if (cs.run_bool(body)) { - if (parselist(s, start, end, qstart)) stringret(listelem(start, end, qstart)); + if (parselist(s, start, end, qstart)) stringret(listelem(start, end, qstart).disown()); break; } if (!parselist(s)) break; @@ -3670,7 +3655,7 @@ LISTFIND(listfind=s, "s", char, int len = (int)strlen(val), int(end - start) == init; \ for(const char *s = list, *start, *end, *qstart; parselist(s, start, end);) \ { \ - if(cmp) { if(parselist(s, start, end, qstart)) stringret(listelem(start, end, qstart)); return; } \ + if(cmp) { if(parselist(s, start, end, qstart)) stringret(listelem(start, end, qstart).disown()); return; } \ if(!parselist(s)) break; \ } \ }); @@ -3683,7 +3668,7 @@ void looplist(CsState &cs, Ident *id, const char *list, const ostd::uint *body) IdentStack stack; int n = 0; for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n++) { - setiter(*id, listelem(start, end, qstart), stack); + setiter(*id, listelem(start, end, qstart).disown(), stack); cs.run_int(body); } if (n) id->pop_arg(); @@ -3695,8 +3680,8 @@ void looplist2(CsState &cs, Ident *id, Ident *id2, const char *list, const ostd: IdentStack stack, stack2; int n = 0; for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n += 2) { - setiter(*id, listelem(start, end, qstart), stack); - setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack2); + setiter(*id, listelem(start, end, qstart).disown(), stack); + setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart).disown() : dup_ostr(""), stack2); cs.run_int(body); } if (n) { @@ -3711,9 +3696,9 @@ void looplist3(CsState &cs, Ident *id, Ident *id2, Ident *id3, const char *list, IdentStack stack, stack2, stack3; int n = 0; for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n += 3) { - setiter(*id, listelem(start, end, qstart), stack); - setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack2); - setiter(*id3, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack3); + setiter(*id, listelem(start, end, qstart).disown(), stack); + setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart).disown() : dup_ostr(""), stack2); + setiter(*id3, parselist(s, start, end, qstart) ? listelem(start, end, qstart).disown() : dup_ostr(""), stack3); cs.run_int(body); } if (n) { @@ -3730,7 +3715,7 @@ void looplistconc(CsState &cs, Ident *id, const char *list, const ostd::uint *bo ostd::Vector r; int n = 0; for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n++) { - char *val = listelem(start, end, qstart); + char *val = listelem(start, end, qstart).disown(); setiter(*id, val, stack); if (n && space) r.push(' '); diff --git a/command.hh b/command.hh index 0c963dbc..ee98f672 100644 --- a/command.hh +++ b/command.hh @@ -559,7 +559,6 @@ inline void Ident::getcval(TaggedValue &v) const { } } -extern bool addcommand(const char *name, IdentFunc fun, const char *narg, int type = ID_COMMAND); extern ostd::uint *compilecode(const char *p); extern void keepcode(ostd::uint *p); extern void freecode(ostd::uint *p); @@ -580,36 +579,15 @@ extern void printvar(Ident *id); extern void printvar(Ident *id, int i); extern void printfvar(Ident *id, float f); extern void printsvar(Ident *id, const char *s); -extern int clampvar(Ident *id, int i, int minval, int maxval); -extern float clampfvar(Ident *id, float f, float minval, float maxval); -extern void loopiter(Ident *id, IdentStack &stack, const TaggedValue &v); -extern void loopend(Ident *id, IdentStack &stack); -#define loopstart(id, stack) if((id)->type != ID_ALIAS) return; IdentStack stack; -static inline void loopiter(Ident *id, IdentStack &stack, int i) { - TaggedValue v; - v.set_int(i); - loopiter(id, stack, v); -} -static inline void loopiter(Ident *id, IdentStack &stack, float f) { - TaggedValue v; - v.set_float(f); - loopiter(id, stack, v); -} -static inline void loopiter(Ident *id, IdentStack &stack, const char *s) { - TaggedValue v; - v.set_str(dup_ostr(s)); - loopiter(id, stack, v); -} - -#define COMMANDKN(name, type, fun, nargs) static bool __dummy_##fun = addcommand(#name, (IdentFunc)fun, nargs, type) +#define COMMANDKN(name, type, fun, nargs) static bool __dummy_##fun = cstate.add_command(#name, nargs, (IdentFunc)fun, type) #define COMMANDK(name, type, nargs) COMMANDKN(name, type, name, nargs) #define COMMANDN(name, fun, nargs) COMMANDKN(name, ID_COMMAND, fun, nargs) #define COMMAND(name, nargs) COMMANDN(name, name, nargs) #define ICOMMANDNAME(name) _icmd_##name #define ICOMMANDSNAME _icmds_ -#define ICOMMANDKNS(name, type, cmdname, nargs, proto, b) template struct cmdname; template<> struct cmdname<__LINE__> { static bool init; static void run proto; }; bool cmdname<__LINE__>::init = addcommand(name, (IdentFunc)cmdname<__LINE__>::run, nargs, type); void cmdname<__LINE__>::run proto \ +#define ICOMMANDKNS(name, type, 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, type); void cmdname<__LINE__>::run proto \ { b; } #define ICOMMANDKN(name, type, cmdname, nargs, proto, b) ICOMMANDKNS(#name, type, cmdname, nargs, proto, b) #define ICOMMANDK(name, type, nargs, proto, b) ICOMMANDKN(name, type, ICOMMANDNAME(name), nargs, proto, b)