static cmd_function_t *cmd_functions; // possible commands to execute
+/*
+============
+Cmd_ExecuteAlias
+
+Called for aliases and fills in the alias into the cbuffer
+============
+*/
+static void Cmd_ExecuteAlias (cmdalias_t *alias)
+{
+#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 )
+ {
+ if( *in == '"' )
+ {
+ 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 == '*' )
+ {
+ 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 );