From: black Date: Wed, 10 Aug 2005 10:03:38 +0000 (+0000) Subject: Fixed alias parsing and added support for $* which pastes all formal parameters. X-Git-Tag: xonotic-v0.1.0preview~4656 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=2b7759404ad6679d201d96c7a67ea48294e3c0b0;p=xonotic%2Fdarkplaces.git Fixed alias parsing and added support for $* which pastes all formal parameters. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@5566 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/cmd.c b/cmd.c index 729469fc..7f83d6dc 100644 --- a/cmd.c +++ b/cmd.c @@ -151,8 +151,8 @@ void Cbuf_Execute (void) for (i=0 ; i< cmd_text.cursize ; i++) { if (text[i] == '"') - quotes++; - if ( !(quotes&1) && text[i] == ';') + quotes ^= 1; + if ( !quotes && text[i] == ';') break; // don't break if inside a quoted string if (text[i] == '\r' || text[i] == '\n') break; @@ -403,40 +403,75 @@ Called for aliases and fills in the alias into the cbuffer */ static void Cmd_ExecuteAlias (cmdalias_t *alias) { - const char *text = alias->value; - - while( COM_ParseTokenConsole( &text ) ) +#define ALIAS_BUFFER 1024 + static char buffer[ ALIAS_BUFFER + 2 ]; + const char *in; + char *out; + unsigned outlen; + int inquote; + + in = alias->value; + out = buffer; + outlen = 0; + inquote = 0; + + while( *in && outlen < ALIAS_BUFFER ) { - Cbuf_AddText( "\"" ); - - if( com_token[0] == '$' ) + if( *in == '"' ) { - int argNum; - argNum = atoi( &com_token[1] ); - - // no number at all? - if( argNum == 0 ) - { - Cbuf_AddText( com_token ); - } - else if( argNum >= Cmd_Argc() ) - { - Con_Printf( "Warning: Not enough parameters passed to alias '%s', at least %i expected:\n %s\n", alias->name, argNum, alias->value ); - Cbuf_AddText( com_token ); - } - else + inquote ^= 1; + } + else if( *in == '$' && !inquote ) + { + // $* is replaced with all formal parameters, $num is parsed as an argument (or as $num if there arent enough parameters), $bla becomes $bla and $$bla becomes $$bla + // read over the $ + in++; + if( *in == '*' ) { - Cbuf_AddText( Cmd_Argv( argNum ) ); + const char *linein = Cmd_Args(); + // include all params + while( *linein && outlen < ALIAS_BUFFER ) { + *out++ = *linein++; + outlen++; + } + + in++; + } else { + char *nexttoken; + int argnum; + + argnum = strtol( in, &nexttoken, 10 ); + + if( 0 < argnum && argnum < Cmd_Argc() ) + { + const char *param = Cmd_Argv( argnum ); + while( *param && outlen < ALIAS_BUFFER ) { + *out++ = *param++; + outlen++; + } + in = nexttoken; + } + else if( argnum >= Cmd_Argc() ) + { + Con_Printf( "Warning: Not enough parameters passed to alias '%s', at least %i expected:\n %s\n", alias->name, argnum, alias->value ); + *out++ = '$'; + outlen++; + } + // not a number + else if( argnum == 0 ) + { + *out++ = '$'; + outlen++; + } } + } else { + *out++ = *in++; + outlen++; } - else - { - Cbuf_AddText( com_token ); - } - - Cbuf_AddText( "\"" ); } - Cbuf_AddText( "\n" ); + *out++ = '\n'; + *out++ = 0; + Cbuf_AddText( buffer ); } /*