diff --git a/source/src/client.cpp b/source/src/client.cpp index 32d77496..74e790e0 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -192,8 +192,8 @@ void toserver(char *text) void echo(char *text) { conoutf("%s", text); } -COMMAND(echo, ARG_VARI); -COMMANDN(say, toserver, ARG_VARI); +COMMAND(echo, ARG_CONC); +COMMANDN(say, toserver, ARG_CONC); COMMANDN(connect, connects, ARG_3STR); COMMAND(connectadmin, ARG_3STR); COMMAND(lanconnect, ARG_NONE); diff --git a/source/src/command.cpp b/source/src/command.cpp index 0ea31792..c6bca904 100644 --- a/source/src/command.cpp +++ b/source/src/command.cpp @@ -307,10 +307,11 @@ char *executeret(const char *p) // all evaluation hap case ARG_2EST: intret(((int (__cdecl *)(char *, char *))id->fun)(w[1], w[2])); break; case ARG_IVAL: intret(((int (__cdecl *)())id->fun)()); break; case ARG_SVAL: result(((const char * (__cdecl *)())id->fun)()); break; - case ARG_VARI: - case ARG_VARIW: + case ARG_VARI: ((void (__cdecl *)(char **, int))id->fun)(&w[1], numargs-1); break; + case ARG_CONC: + case ARG_CONCW: { - char *r = conc(w+1, numargs-1, id->narg==ARG_VARI); + char *r = conc(w+1, numargs-1, id->narg==ARG_CONC); ((void (__cdecl *)(char *))id->fun)(r); delete[] r; break; @@ -456,6 +457,36 @@ void whilea(char *cond, char *body) { while(execute(cond)) execute(body); } / void concat(char *s) { result(s); } void concatword(char *s) { result(s); } +void format(char **args, int numargs) +{ + if(numargs < 1) + { + result(""); + return; + } + + vector s; + char *f = args[0]; + while(*f) + { + int c = *f++; + if(c == '%') + { + int i = *f++; + if(i >= '1' && i <= '9') + { + i -= '0'; + const char *sub = i < numargs ? args[i] : ""; + while(*sub) s.add(*sub++); + } + else s.add(i); + } + else s.add(c); + } + s.add('\0'); + result(s.getbuf()); +} + #define whitespaceskip s += strspn(s, "\n\t ") #define elementskip *s=='"' ? (++s, s += strcspn(s, "\"\n\0"), s += *s=='"') : s += strcspn(s, "\n\t \0") @@ -526,8 +557,9 @@ COMMANDN(loop, loopa, ARG_3STR); COMMANDN(while, whilea, ARG_2STR); COMMANDN(if, ifthen, ARG_3STR); COMMAND(exec, ARG_1STR); -COMMAND(concat, ARG_VARI); -COMMAND(concatword, ARG_VARIW); +COMMAND(concat, ARG_CONC); +COMMAND(concatword, ARG_CONCW); +COMMAND(format, ARG_VARI); COMMAND(result, ARG_1STR); COMMAND(at, ARG_2STR); COMMAND(listlen, ARG_1EST); diff --git a/source/src/command.h b/source/src/command.h index 18d1ac3b..3bafa176 100644 --- a/source/src/command.h +++ b/source/src/command.h @@ -72,7 +72,8 @@ enum // function signatures for script functions, see command.cpp ARG_1EXP, ARG_2EXP, ARG_1EST, ARG_2EST, ARG_IVAL, ARG_SVAL, - ARG_VARI, ARG_VARIW + ARG_CONC, ARG_CONCW, + ARG_VARI }; enum { IEXC_CORE = 0, IEXC_CFG, IEXC_PROMPT, IEXC_MAPCFG, IEXC_NUM }; // script execution context diff --git a/source/src/console.cpp b/source/src/console.cpp index 3c89b156..750aa51a 100644 --- a/source/src/console.cpp +++ b/source/src/console.cpp @@ -187,7 +187,7 @@ void inputcommand(char *init, char *action, char *prompt) void mapmsg(char *s) { s_strncpy(hdr.maptitle, s, 128); } -COMMAND(saycommand, ARG_VARI); +COMMAND(saycommand, ARG_CONC); COMMAND(inputcommand, ARG_3STR); COMMAND(mapmsg, ARG_1STR); diff --git a/source/src/docs.cpp b/source/src/docs.cpp index a9784bd3..1e4f66fe 100644 --- a/source/src/docs.cpp +++ b/source/src/docs.cpp @@ -251,7 +251,7 @@ void docwritebaseref(char *ref, char *schemalocation, char *transformation) if(id.narg != ARG_NONE && id.narg != ARG_DOWN && id.narg != ARG_IVAL && id.narg != ARG_SVAL) { fprintf(f, "\t\t\t\t\t\n"); - if(id.narg == ARG_VARI) fprintf(f, "\t\t\t\t\t\t\n"); + if(id.narg == ARG_CONC || id.narg == ARG_CONCW || id.narg == ARG_VARI) fprintf(f, "\t\t\t\t\t\t\n"); else { int base = id.narg >= ARG_1EST ? ARG_1EST : (id.narg >= ARG_1EXP ? ARG_1EXP : (id.narg >= ARG_1STR ? ARG_1STR : ARG_1INT));