From 628e7725b72931b714cb145260e269a538fd536f Mon Sep 17 00:00:00 2001 From: divverent Date: Wed, 22 Aug 2007 15:40:45 +0000 Subject: [PATCH] add to cvar expansion: new variant $3- for all arguments starting from the 3rd; note: $1- is equivalent to $*. Fix bug in cvar value quoting that didn't quote $ (typo). git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7530 d7cf8633-e32d-0410-b094-e92efae38249 --- cmd.c | 53 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/cmd.c b/cmd.c index aa697001..e9e3a971 100644 --- a/cmd.c +++ b/cmd.c @@ -518,19 +518,49 @@ cmd_source_t cmd_source; static cmd_function_t *cmd_functions; // possible commands to execute -static const char *Cmd_GetDirectCvarValue(const char *varname, cmdalias_t *alias) +static const char *Cmd_GetDirectCvarValue(const char *varname, cmdalias_t *alias, qboolean *is_multiple) { cvar_t *cvar; long argno; char *endptr; + if(is_multiple) + *is_multiple = false; + if(!varname || !*varname) return NULL; if(alias) { if(!strcmp(varname, "*")) + { + if(is_multiple) + *is_multiple = true; return Cmd_Args(); + } + else if(varname[strlen(varname) - 1] == '-') + { + argno = strtol(varname, &endptr, 10); + if(endptr == varname + strlen(varname) - 1) + { + // whole string is a number, apart from the - + const char *p = Cmd_Args(); + for(; argno > 1; --argno) + if(!COM_ParseToken_Console(&p)) + break; + if(p) + { + if(is_multiple) + *is_multiple = true; + + // kill pre-argument whitespace + for (;*p && *p <= ' ';p++) + ; + + return p; + } + } + } else { argno = strtol(varname, &endptr, 10); @@ -578,7 +608,7 @@ qboolean Cmd_QuoteString(char *out, size_t outlen, const char *in, const char *q *out++ = '\\'; --outlen; *out++ = '\\'; --outlen; } - else if(*in == '\\' && quote_dollar) + else if(*in == '$' && quote_dollar) { if(outlen <= 2) { @@ -630,14 +660,16 @@ static const char *Cmd_GetCvarValue(const char *var, size_t varlen, cmdalias_t * varstr = NULL; - // Exception: $* doesn't use the quoted form by default - if(!strcmp(varname, "*")) - varfunc = "asis"; - if(varname[0] == '$') - varstr = Cmd_GetDirectCvarValue(Cmd_GetDirectCvarValue(varname + 1, alias), alias); + varstr = Cmd_GetDirectCvarValue(Cmd_GetDirectCvarValue(varname + 1, alias, NULL), alias, NULL); else - varstr = Cmd_GetDirectCvarValue(varname, alias); + { + qboolean is_multiple = false; + // Exception: $* and $n- don't use the quoted form by default + varstr = Cmd_GetDirectCvarValue(varname, alias, &is_multiple); + if(is_multiple) + varfunc = "asis"; + } if(!varstr) { @@ -707,7 +739,8 @@ static void Cmd_PreprocessString( const char *intext, char *outtext, unsigned ma // alias parameter, where the name of the alias is $0, the first // parameter is $1 and so on; as a special case, $* inserts all // parameters, without extra quoting, so one can use $* to just - // pass all parameters around + // pass all parameters around. All parameters starting from $n + // can be referred to as $n- (so $* is equivalent to $1-). // // Note: when expanding an alias, cvar expansion is done in the SAME step // as alias expansion so that alias parameters or cvar values containing @@ -753,7 +786,7 @@ static void Cmd_PreprocessString( const char *intext, char *outtext, unsigned ma eat = varlen + 1; } } else { - varlen = strspn(in, "*0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"); + varlen = strspn(in, "*0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-"); val = Cmd_GetCvarValue(in, varlen, alias); eat = varlen; } -- 2.39.2