format command

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@2198 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
Lee Salzman
2008-07-23 18:42:32 +00:00
parent e388c5fef7
commit 116dda1414
5 changed files with 43 additions and 10 deletions
+2 -2
View File
@@ -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);
+37 -5
View File
@@ -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<char> 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);
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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<arguments>\n");
if(id.narg == ARG_VARI) fprintf(f, "\t\t\t\t\t\t<variableArgument token=\"...\" description=\"TODO\"/>\n");
if(id.narg == ARG_CONC || id.narg == ARG_CONCW || id.narg == ARG_VARI) fprintf(f, "\t\t\t\t\t\t<variableArgument token=\"...\" description=\"TODO\"/>\n");
else
{
int base = id.narg >= ARG_1EST ? ARG_1EST : (id.narg >= ARG_1EXP ? ARG_1EXP : (id.narg >= ARG_1STR ? ARG_1STR : ARG_1INT));