diff --git a/src/engine/command.cpp b/src/engine/command.cpp index ba82c42..6aa8699 100644 --- a/src/engine/command.cpp +++ b/src/engine/command.cpp @@ -565,6 +565,12 @@ float getfvarmax(const char *name) _GETVAR(id, ID_FVAR, name, 0); return id->maxvalf; } + +ICOMMAND(getvarmin, "s", (char *s), intret(getvarmin(s))); +ICOMMAND(getvarmax, "s", (char *s), intret(getvarmax(s))); +ICOMMAND(getfvarmin, "s", (char *s), floatret(getfvarmin(s))); +ICOMMAND(getfvarmax, "s", (char *s), floatret(getfvarmax(s))); + bool identexists(const char *name) { return idents.access(name)!=NULL; } ident *getident(const char *name) { return idents.access(name); } @@ -587,6 +593,8 @@ const char *getalias(const char *name) return i && i->type==ID_ALIAS && (i->index >= MAXARGS || aliasstack->usedargs&(1<index)) ? i->getstr() : ""; } +ICOMMAND(getalias, "s", (char *s), result(getalias(s))); + int clampvar(ident *id, int val, int minval, int maxval) { if(val < minval) val = minval; @@ -2138,6 +2146,7 @@ bool execfile(const char *cfgfile, bool msg) delete[] buf; return true; } +ICOMMAND(exec, "s", (char *file), execfile(file)); const char *escapestring(const char *s) { @@ -2160,6 +2169,15 @@ const char *escapestring(const char *s) return buf.getbuf(); } +ICOMMAND(escape, "s", (char *s), result(escapestring(s))); +ICOMMAND(unescape, "s", (char *s), +{ + int len = strlen(s); + char *d = newstring(len); + d[unescapestring(d, s, &s[len])] = '\0'; + stringret(d); +}); + const char *escapeid(const char *s) { const char *end = s + strcspn(s, "\"/;()[]@ \f\t\r\n\0"); @@ -2350,11 +2368,13 @@ void concat(tagval *v, int n) { commandret->setstr(conc(v, n, true)); } +COMMAND(concat, "V"); void concatword(tagval *v, int n) { commandret->setstr(conc(v, n, false)); } +COMMAND(concatword, "V"); void result(tagval &v) { @@ -2372,6 +2392,12 @@ void result(const char *s) commandret->setstr(newstring(s)); } +ICOMMAND(result, "t", (tagval *v), +{ + *commandret = *v; + v->type = VAL_NULL; +}); + void format(tagval *args, int numargs) { vector s; @@ -2395,6 +2421,7 @@ void format(tagval *args, int numargs) s.add('\0'); result(s.getbuf()); } +COMMAND(format, "V"); static const char *liststart = NULL, *listend = NULL, *listquotestart = NULL, *listquoteend = NULL; @@ -2463,6 +2490,7 @@ int listlen(const char *s) while(parselist(s)) n++; return n; } +ICOMMAND(listlen, "s", (char *s), intret(listlen(s))); void at(tagval *args, int numargs) { @@ -2477,12 +2505,14 @@ void at(tagval *args, int numargs) } commandret->setstr(newstring(start, end-start)); } +COMMAND(at, "si1V"); void substr(char *s, int *start, int *count, int *numargs) { int len = strlen(s), offset = clamp(*start, 0, len); commandret->setstr(newstring(&s[offset], *numargs >= 3 ? clamp(*count, 0, len - offset) : len - offset)); } +COMMAND(substr, "siiN"); void sublist(const char *s, int *skip, int *count, int *numargs) { @@ -2493,31 +2523,8 @@ void sublist(const char *s, int *skip, int *count, int *numargs) if(len > 0 && parselist(s, start, end, list, qend)) while(--len > 0 && parselist(s, start, end, qstart, qend)); commandret->setstr(newstring(list, qend - list)); } +COMMAND(sublist, "siiN"); -void getalias_(char *s) -{ - result(getalias(s)); -} - -ICOMMAND(exec, "s", (char *file), execfile(file)); -ICOMMAND(result, "t", (tagval *v), -{ - *commandret = *v; - v->type = VAL_NULL; -}); - -COMMAND(concat, "V"); -COMMAND(concatword, "V"); -COMMAND(format, "V"); -COMMAND(at, "si1V"); -ICOMMAND(escape, "s", (char *s), result(escapestring(s))); -ICOMMAND(unescape, "s", (char *s), -{ - int len = strlen(s); - char *d = newstring(len); - d[unescapestring(d, s, &s[len])] = '\0'; - stringret(d); -}); ICOMMAND(stripcolors, "s", (char *s), { int len = strlen(s); @@ -2525,14 +2532,6 @@ ICOMMAND(stripcolors, "s", (char *s), filtertext(d, s, true, len); stringret(d); }); -COMMAND(substr, "siiN"); -COMMAND(sublist, "siiN"); -ICOMMAND(listlen, "s", (char *s), intret(listlen(s))); -COMMANDN(getalias, getalias_, "s"); -ICOMMAND(getvarmin, "s", (char *s), intret(getvarmin(s))); -ICOMMAND(getvarmax, "s", (char *s), intret(getvarmax(s))); -ICOMMAND(getfvarmin, "s", (char *s), floatret(getfvarmin(s))); -ICOMMAND(getfvarmax, "s", (char *s), floatret(getfvarmax(s))); void looplist(ident *id, const char *list, const uint *body, bool search) { @@ -2561,6 +2560,48 @@ void looplist(ident *id, const char *list, const uint *body, bool search) if(search) intret(-1); if(n) poparg(*id); } +ICOMMAND(listfind, "rse", (ident *id, char *list, uint *body), looplist(id, list, body, true)); +ICOMMAND(looplist, "rse", (ident *id, char *list, uint *body), looplist(id, list, body, false)); + +void looplistconc(ident *id, const char *list, const uint *body, bool space) +{ + if(id->type!=ID_ALIAS) return; + identstack stack; + vector r; + int n = 0; + for(const char *s = list, *start, *end; parselist(s, start, end);) + { + char *val = newstring(start, end-start); + if(n++) + { + if(id->valtype == VAL_STR) delete[] id->val.s; + else id->valtype = VAL_STR; + cleancode(*id); + id->val.s = val; + + if(space) r.add(' '); + } + else + { + tagval t; + t.setstr(val); + pusharg(*id, t, stack); + id->flags &= ~IDF_UNKNOWN; + } + + tagval v; + executeret(body, v); + const char *vstr = v.getstr(); + int len = strlen(vstr); + r.put(vstr, len); + freearg(v); + } + if(n) poparg(*id); + r.add('\0'); + commandret->setstr(newstring(r.getbuf(), r.length()-1)); +} +ICOMMAND(looplistconcat, "rse", (ident *id, char *list, uint *body), looplistconc(id, list, body, true)); +ICOMMAND(looplistconcatword, "rse", (ident *id, char *list, uint *body), looplistconc(id, list, body, false)); void prettylist(const char *s, const char *conj) { @@ -2596,6 +2637,7 @@ int listincludes(const char *list, const char *needle, int needlelen) } return -1; } +ICOMMAND(indexof, "ss", (char *list, char *elem), intret(listincludes(list, elem, strlen(elem)))); char *listdel(const char *s, const char *del) { @@ -2611,6 +2653,7 @@ char *listdel(const char *s, const char *del) p.add('\0'); return newstring(p.getbuf(), p.length()-1); } +ICOMMAND(listdel, "ss", (char *list, char *del), commandret->setstr(listdel(list, del))); void listsplice(const char *s, const char *vals, int *skip, int *count, int *numargs) { @@ -2639,10 +2682,6 @@ void listsplice(const char *s, const char *vals, int *skip, int *count, int *num } COMMAND(listsplice, "ssiiN"); -ICOMMAND(listdel, "ss", (char *list, char *del), commandret->setstr(listdel(list, del))); -ICOMMAND(indexof, "ss", (char *list, char *elem), intret(listincludes(list, elem, strlen(elem)))); -ICOMMAND(listfind, "rse", (ident *id, char *list, uint *body), looplist(id, list, body, true)); -ICOMMAND(looplist, "rse", (ident *id, char *list, uint *body), looplist(id, list, body, false)); ICOMMAND(loopfiles, "rsse", (ident *id, char *dir, char *ext, uint *body), { if(id->type!=ID_ALIAS) return;