static mempool_t *cmd_mempool;
+#define CMD_TOKENIZELENGTH 4096
+static char cmd_tokenizebuffer[CMD_TOKENIZELENGTH];
+static int cmd_tokenizebufferpos = 0;
+
//=============================================================================
/*
char line[1024];
int quotes;
+ // LordHavoc: making sure the tokenizebuffer doesn't get filled up by repeated crashes
+ cmd_tokenizebufferpos = 0;
+
while (cmd_text.cursize)
{
// find a \n or ; line break
return;
}
- f = (char *)COM_LoadFile (Cmd_Argv(1), false);
+ f = (char *)FS_LoadFile (Cmd_Argv(1), false);
if (!f)
{
Con_Printf ("couldn't exec %s\n",Cmd_Argv(1));
return;
}
- Con_Printf ("execing %s\n",Cmd_Argv(1));
+ Con_DPrintf ("execing %s\n",Cmd_Argv(1));
Cbuf_InsertText (f);
Mem_Free(f);
a->next = cmd_alias;
cmd_alias = a;
}
- strcpy (a->name, s);
+ strlcpy (a->name, s, sizeof (a->name));
// copy the rest of the command line
cmd[0] = 0; // start out with a null string
c = Cmd_Argc();
for (i=2 ; i< c ; i++)
{
- strcat (cmd, Cmd_Argv(i));
+ strlcat (cmd, Cmd_Argv(i), sizeof (cmd));
if (i != c)
- strcat (cmd, " ");
+ strlcat (cmd, " ", sizeof (cmd));
}
- strcat (cmd, "\n");
+ strlcat (cmd, "\n", sizeof (cmd));
a->value = CopyString (cmd);
}
}
-#define CMD_TOKENIZELENGTH 4096
-char cmd_tokenizebuffer[CMD_TOKENIZELENGTH];
-
/*
============
Cmd_TokenizeString
static void Cmd_TokenizeString (const char *text)
{
int l;
- int pos;
- pos = 0;
cmd_argc = 0;
cmd_args = NULL;
while (1)
{
-// skip whitespace up to a /n
+ // skip whitespace up to a /n
while (*text && *text <= ' ' && *text != '\n')
- {
text++;
- }
if (*text == '\n')
- { // a newline seperates commands in the buffer
+ {
+ // a newline seperates commands in the buffer
text++;
break;
}
if (cmd_argc == 1)
cmd_args = text;
- if (!COM_ParseToken (&text))
+ if (!COM_ParseTokenConsole(&text))
return;
if (cmd_argc < MAX_ARGS)
{
l = strlen(com_token) + 1;
- if (pos + l > CMD_TOKENIZELENGTH)
+ if (cmd_tokenizebufferpos + l > CMD_TOKENIZELENGTH)
Sys_Error("Cmd_TokenizeString: ran out of %i character buffer space for command arguements\n", CMD_TOKENIZELENGTH);
- strcpy (cmd_tokenizebuffer + pos, com_token);
- cmd_argv[cmd_argc] = cmd_tokenizebuffer + pos;
- pos += l;
+ strcpy (cmd_tokenizebuffer + cmd_tokenizebufferpos, com_token);
+ cmd_argv[cmd_argc] = cmd_tokenizebuffer + cmd_tokenizebufferpos;
+ cmd_tokenizebufferpos += l;
cmd_argc++;
}
}
*/
void Cmd_ExecuteString (const char *text, cmd_source_t src)
{
+ int oldpos;
cmd_function_t *cmd;
cmdalias_t *a;
+ oldpos = cmd_tokenizebufferpos;
cmd_source = src;
Cmd_TokenizeString (text);
// execute the command line
if (!Cmd_Argc())
+ {
+ cmd_tokenizebufferpos = oldpos;
return; // no tokens
+ }
-// check functions
- for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
+// check functions (only after host_initialized)
+ if (host_initialized || !strcasecmp(cmd_argv[0], "exec"))
{
- if (!Q_strcasecmp (cmd_argv[0],cmd->name))
+ for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
{
- cmd->function ();
- return;
+ if (!strcasecmp (cmd_argv[0],cmd->name))
+ {
+ cmd->function ();
+ cmd_tokenizebufferpos = oldpos;
+ return;
+ }
}
}
-// check alias
- for (a=cmd_alias ; a ; a=a->next)
+// check alias (only after host_initialized)
+ if (host_initialized)
{
- if (!Q_strcasecmp (cmd_argv[0], a->name))
+ for (a=cmd_alias ; a ; a=a->next)
{
- Cbuf_InsertText (a->value);
- return;
+ if (!strcasecmp (cmd_argv[0], a->name))
+ {
+ Cbuf_InsertText (a->value);
+ cmd_tokenizebufferpos = oldpos;
+ return;
+ }
}
}
-// check cvars
- if (!Cvar_Command ())
+// check cvars (always)
+ if (!Cvar_Command () && host_initialized)
Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0));
+
+ cmd_tokenizebufferpos = oldpos;
}
*/
void Cmd_ForwardToServer (void)
{
+ char *s;
if (cls.state != ca_connected)
{
Con_Printf ("Can't \"%s\", not connected\n", Cmd_Argv(0));
if (cls.demoplayback)
return; // not really connected
- MSG_WriteByte (&cls.message, clc_stringcmd);
- if (Q_strcasecmp(Cmd_Argv(0), "cmd") != 0)
- {
- SZ_Print (&cls.message, Cmd_Argv(0));
- SZ_Print (&cls.message, " ");
- }
- if (Cmd_Argc() > 1)
- SZ_Print (&cls.message, Cmd_Args());
+ // LordHavoc: thanks to Fuh for bringing the pure evil of SZ_Print to my
+ // attention, it has been eradicated from here, its only (former) use in
+ // all of darkplaces.
+ if (strcasecmp(Cmd_Argv(0), "cmd") != 0)
+ s = va("%s %s", Cmd_Argv(0), Cmd_Argc() > 1 ? Cmd_Args() : "\n");
else
- SZ_Print (&cls.message, "\n");
+ s = va("%s", Cmd_Argc() > 1 ? Cmd_Args() : "\n");
+ MSG_WriteByte(&cls.message, clc_stringcmd);
+ SZ_Write(&cls.message, s, strlen(s) + 1);
}
Sys_Error ("Cmd_CheckParm: NULL");
for (i = 1; i < Cmd_Argc (); i++)
- if (!Q_strcasecmp (parm, Cmd_Argv (i)))
+ if (!strcasecmp (parm, Cmd_Argv (i)))
return i;
return 0;