str cleanups

master
Daniel Kolesa 2015-08-07 03:12:20 +01:00
parent c3aa112e21
commit 934e35f56b
2 changed files with 25 additions and 62 deletions

View File

@ -671,11 +671,7 @@ bool CsState::add_command(ostd::ConstCharRange name, ostd::ConstCharRange args,
return true; return true;
} }
bool addcommand(const char *name, IdentFunc fun, const char *args, int type) { static void cs_init_lib_base_var(CsState &cs) {
return cstate.add_command(name, args, fun, type);
}
void init_lib_base(CsState &cs) {
cs.add_command("nodebug", "e", [](CsState &cs, ostd::uint *body) { cs.add_command("nodebug", "e", [](CsState &cs, ostd::uint *body) {
++cs.nodebug; ++cs.nodebug;
executeret(body, *cs.result); executeret(body, *cs.result);
@ -3278,6 +3274,10 @@ bool validateblock(const char *s) {
/* standard lib */ /* standard lib */
void init_lib_base(CsState &cs) {
cs_init_lib_base_var(cs);
}
static char retbuf[4][256]; static char retbuf[4][256];
static int retidx = 0; 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) { static inline void setiter(Ident &id, int i, IdentStack &stack) {
if (id.stack == &stack) { if (id.stack == &stack) {
if (id.valtype != VAL_INT) { if (id.valtype != VAL_INT) {
@ -3529,30 +3514,30 @@ endblock:
return true; 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; ostd::Size len = end - start;
char *s = new char[len + 1]; ostd::String s;
if (*quotestart == '"') unescapestring(s, start, end); s.reserve(len);
if (*quotestart == '"') unescapestring(s.data(), start, end);
else { else {
memcpy(s, start, len); memcpy(s.data(), start, len);
s[len] = '\0'; s[len] = '\0';
} }
s.advance(len);
return s; return s;
} }
void explodelist(const char *s, ostd::Vector<ostd::String> &elems, int limit) { void explodelist(const char *s, ostd::Vector<ostd::String> &elems, int limit) {
const char *start, *end, *qstart; const char *start, *end, *qstart;
while ((limit < 0 || int(elems.size()) < limit) && parselist(s, start, end, qstart)) { while ((limit < 0 || int(elems.size()) < limit) && parselist(s, start, end, qstart)) {
char *s = listelem(start, end, qstart); elems.push(ostd::move(listelem(start, end, qstart)));
elems.push(s);
delete[] s;
} }
} }
char *indexlist(const char *s, int pos) { char *indexlist(const char *s, int pos) {
for (int i = 0; i < pos; ++i) if (!parselist(s)) return dup_ostr(""); for (int i = 0; i < pos; ++i) if (!parselist(s)) return dup_ostr("");
const char *start, *end, *qstart; 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) { 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; for (; pos > 0; pos--) if (!parselist(list)) break;
if (pos > 0 || !parselist(list, start, end, qstart)) start = end = qstart = ""; 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"); COMMAND(at, "si1V");
@ -3638,7 +3623,7 @@ void listassoc(CsState &cs, Ident *id, const char *list, const ostd::uint *body)
++n; ++n;
setiter(*id, dup_ostr(ostd::ConstCharRange(start, end - start)), stack); setiter(*id, dup_ostr(ostd::ConstCharRange(start, end - start)), stack);
if (cs.run_bool(body)) { 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; break;
} }
if (!parselist(s)) break; if (!parselist(s)) break;
@ -3670,7 +3655,7 @@ LISTFIND(listfind=s, "s", char, int len = (int)strlen(val), int(end - start) ==
init; \ init; \
for(const char *s = list, *start, *end, *qstart; parselist(s, start, end);) \ 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; \ if(!parselist(s)) break; \
} \ } \
}); });
@ -3683,7 +3668,7 @@ void looplist(CsState &cs, Ident *id, const char *list, const ostd::uint *body)
IdentStack stack; IdentStack stack;
int n = 0; int n = 0;
for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n++) { 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); cs.run_int(body);
} }
if (n) id->pop_arg(); 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; IdentStack stack, stack2;
int n = 0; int n = 0;
for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n += 2) { for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n += 2) {
setiter(*id, listelem(start, end, qstart), stack); setiter(*id, listelem(start, end, qstart).disown(), stack);
setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack2); setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart).disown() : dup_ostr(""), stack2);
cs.run_int(body); cs.run_int(body);
} }
if (n) { if (n) {
@ -3711,9 +3696,9 @@ void looplist3(CsState &cs, Ident *id, Ident *id2, Ident *id3, const char *list,
IdentStack stack, stack2, stack3; IdentStack stack, stack2, stack3;
int n = 0; int n = 0;
for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n += 3) { for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n += 3) {
setiter(*id, listelem(start, end, qstart), stack); setiter(*id, listelem(start, end, qstart).disown(), stack);
setiter(*id2, parselist(s, start, end, qstart) ? listelem(start, end, qstart) : dup_ostr(""), stack2); 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) : dup_ostr(""), stack3); setiter(*id3, parselist(s, start, end, qstart) ? listelem(start, end, qstart).disown() : dup_ostr(""), stack3);
cs.run_int(body); cs.run_int(body);
} }
if (n) { if (n) {
@ -3730,7 +3715,7 @@ void looplistconc(CsState &cs, Ident *id, const char *list, const ostd::uint *bo
ostd::Vector<char> r; ostd::Vector<char> r;
int n = 0; int n = 0;
for (const char *s = list, *start, *end, *qstart; parselist(s, start, end, qstart); n++) { 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); setiter(*id, val, stack);
if (n && space) r.push(' '); if (n && space) r.push(' ');

View File

@ -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 ostd::uint *compilecode(const char *p);
extern void keepcode(ostd::uint *p); extern void keepcode(ostd::uint *p);
extern void freecode(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 printvar(Ident *id, int i);
extern void printfvar(Ident *id, float f); extern void printfvar(Ident *id, float f);
extern void printsvar(Ident *id, const char *s); 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; #define COMMANDKN(name, type, fun, nargs) static bool __dummy_##fun = cstate.add_command(#name, nargs, (IdentFunc)fun, type)
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 COMMANDK(name, type, nargs) COMMANDKN(name, type, name, nargs) #define COMMANDK(name, type, nargs) COMMANDKN(name, type, name, nargs)
#define COMMANDN(name, fun, nargs) COMMANDKN(name, ID_COMMAND, fun, nargs) #define COMMANDN(name, fun, nargs) COMMANDKN(name, ID_COMMAND, fun, nargs)
#define COMMAND(name, nargs) COMMANDN(name, name, nargs) #define COMMAND(name, nargs) COMMANDN(name, name, nargs)
#define ICOMMANDNAME(name) _icmd_##name #define ICOMMANDNAME(name) _icmd_##name
#define ICOMMANDSNAME _icmds_ #define ICOMMANDSNAME _icmds_
#define ICOMMANDKNS(name, type, cmdname, nargs, proto, b) template<int N> 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<int N> 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; } { b; }
#define ICOMMANDKN(name, type, cmdname, nargs, proto, b) ICOMMANDKNS(#name, type, cmdname, nargs, 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) #define ICOMMANDK(name, type, nargs, proto, b) ICOMMANDKN(name, type, ICOMMANDNAME(name), nargs, proto, b)