looplistconcat commands
parent
857337d815
commit
b499920eec
|
@ -565,6 +565,12 @@ float getfvarmax(const char *name)
|
||||||
_GETVAR(id, ID_FVAR, name, 0);
|
_GETVAR(id, ID_FVAR, name, 0);
|
||||||
return id->maxvalf;
|
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; }
|
bool identexists(const char *name) { return idents.access(name)!=NULL; }
|
||||||
ident *getident(const char *name) { return idents.access(name); }
|
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<<i->index)) ? i->getstr() : "";
|
return i && i->type==ID_ALIAS && (i->index >= MAXARGS || aliasstack->usedargs&(1<<i->index)) ? i->getstr() : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ICOMMAND(getalias, "s", (char *s), result(getalias(s)));
|
||||||
|
|
||||||
int clampvar(ident *id, int val, int minval, int maxval)
|
int clampvar(ident *id, int val, int minval, int maxval)
|
||||||
{
|
{
|
||||||
if(val < minval) val = minval;
|
if(val < minval) val = minval;
|
||||||
|
@ -2138,6 +2146,7 @@ bool execfile(const char *cfgfile, bool msg)
|
||||||
delete[] buf;
|
delete[] buf;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
ICOMMAND(exec, "s", (char *file), execfile(file));
|
||||||
|
|
||||||
const char *escapestring(const char *s)
|
const char *escapestring(const char *s)
|
||||||
{
|
{
|
||||||
|
@ -2160,6 +2169,15 @@ const char *escapestring(const char *s)
|
||||||
return buf.getbuf();
|
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 *escapeid(const char *s)
|
||||||
{
|
{
|
||||||
const char *end = s + strcspn(s, "\"/;()[]@ \f\t\r\n\0");
|
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));
|
commandret->setstr(conc(v, n, true));
|
||||||
}
|
}
|
||||||
|
COMMAND(concat, "V");
|
||||||
|
|
||||||
void concatword(tagval *v, int n)
|
void concatword(tagval *v, int n)
|
||||||
{
|
{
|
||||||
commandret->setstr(conc(v, n, false));
|
commandret->setstr(conc(v, n, false));
|
||||||
}
|
}
|
||||||
|
COMMAND(concatword, "V");
|
||||||
|
|
||||||
void result(tagval &v)
|
void result(tagval &v)
|
||||||
{
|
{
|
||||||
|
@ -2372,6 +2392,12 @@ void result(const char *s)
|
||||||
commandret->setstr(newstring(s));
|
commandret->setstr(newstring(s));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ICOMMAND(result, "t", (tagval *v),
|
||||||
|
{
|
||||||
|
*commandret = *v;
|
||||||
|
v->type = VAL_NULL;
|
||||||
|
});
|
||||||
|
|
||||||
void format(tagval *args, int numargs)
|
void format(tagval *args, int numargs)
|
||||||
{
|
{
|
||||||
vector<char> s;
|
vector<char> s;
|
||||||
|
@ -2395,6 +2421,7 @@ void format(tagval *args, int numargs)
|
||||||
s.add('\0');
|
s.add('\0');
|
||||||
result(s.getbuf());
|
result(s.getbuf());
|
||||||
}
|
}
|
||||||
|
COMMAND(format, "V");
|
||||||
|
|
||||||
static const char *liststart = NULL, *listend = NULL, *listquotestart = NULL, *listquoteend = NULL;
|
static const char *liststart = NULL, *listend = NULL, *listquotestart = NULL, *listquoteend = NULL;
|
||||||
|
|
||||||
|
@ -2463,6 +2490,7 @@ int listlen(const char *s)
|
||||||
while(parselist(s)) n++;
|
while(parselist(s)) n++;
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
ICOMMAND(listlen, "s", (char *s), intret(listlen(s)));
|
||||||
|
|
||||||
void at(tagval *args, int numargs)
|
void at(tagval *args, int numargs)
|
||||||
{
|
{
|
||||||
|
@ -2477,12 +2505,14 @@ void at(tagval *args, int numargs)
|
||||||
}
|
}
|
||||||
commandret->setstr(newstring(start, end-start));
|
commandret->setstr(newstring(start, end-start));
|
||||||
}
|
}
|
||||||
|
COMMAND(at, "si1V");
|
||||||
|
|
||||||
void substr(char *s, int *start, int *count, int *numargs)
|
void substr(char *s, int *start, int *count, int *numargs)
|
||||||
{
|
{
|
||||||
int len = strlen(s), offset = clamp(*start, 0, len);
|
int len = strlen(s), offset = clamp(*start, 0, len);
|
||||||
commandret->setstr(newstring(&s[offset], *numargs >= 3 ? clamp(*count, 0, len - offset) : len - offset));
|
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)
|
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));
|
if(len > 0 && parselist(s, start, end, list, qend)) while(--len > 0 && parselist(s, start, end, qstart, qend));
|
||||||
commandret->setstr(newstring(list, qend - list));
|
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),
|
ICOMMAND(stripcolors, "s", (char *s),
|
||||||
{
|
{
|
||||||
int len = strlen(s);
|
int len = strlen(s);
|
||||||
|
@ -2525,14 +2532,6 @@ ICOMMAND(stripcolors, "s", (char *s),
|
||||||
filtertext(d, s, true, len);
|
filtertext(d, s, true, len);
|
||||||
stringret(d);
|
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)
|
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(search) intret(-1);
|
||||||
if(n) poparg(*id);
|
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<char> 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)
|
void prettylist(const char *s, const char *conj)
|
||||||
{
|
{
|
||||||
|
@ -2596,6 +2637,7 @@ int listincludes(const char *list, const char *needle, int needlelen)
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
ICOMMAND(indexof, "ss", (char *list, char *elem), intret(listincludes(list, elem, strlen(elem))));
|
||||||
|
|
||||||
char *listdel(const char *s, const char *del)
|
char *listdel(const char *s, const char *del)
|
||||||
{
|
{
|
||||||
|
@ -2611,6 +2653,7 @@ char *listdel(const char *s, const char *del)
|
||||||
p.add('\0');
|
p.add('\0');
|
||||||
return newstring(p.getbuf(), p.length()-1);
|
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)
|
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");
|
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),
|
ICOMMAND(loopfiles, "rsse", (ident *id, char *dir, char *ext, uint *body),
|
||||||
{
|
{
|
||||||
if(id->type!=ID_ALIAS) return;
|
if(id->type!=ID_ALIAS) return;
|
||||||
|
|
Loading…
Reference in New Issue