*/
void Cmd_StuffCmds_f (void)
{
- int i, j;
- int s;
- char *text, *build, c;
+ int i, j, l;
+ // this is per command, and bounds checked (no buffer overflows)
+ char build[2048];
if (Cmd_Argc () != 1)
{
return;
}
-// build the combined string to parse from
- s = 0;
- for (i=1 ; i<com_argc ; i++)
+ for (i = 0;i < com_argc;i++)
{
- if (!com_argv[i])
- continue; // NEXTSTEP nulls out -NXHost
- s += strlen (com_argv[i]) + 1;
- }
- if (!s)
- return;
-
- text = Mem_Alloc (tempmempool, s + 1);
- text[0] = 0;
- for (i=1 ; i<com_argc ; i++)
- {
- if (!com_argv[i])
- continue; // NEXTSTEP nulls out -NXHost
- strcat (text,com_argv[i]);
- if (i != com_argc-1)
- strcat (text, " ");
- }
-
- // pull out the commands
- build = Mem_Alloc (tempmempool, s + 1);
- build[0] = 0;
-
- for (i=0 ; i<s-1 ; i++)
- {
- if (text[i] == '+')
+ if (com_argv[i] && com_argv[i][0] == '+' && (com_argv[i][1] < '0' || com_argv[i][1] > '9'))
{
+ l = 0;
+ j = 1;
+ while (com_argv[i][j])
+ build[l++] = com_argv[i][j++];
i++;
-
- for (j=i ; (text[j] != '+') && (text[j] != '-') && (text[j] != 0) ; j++)
- ;
-
- c = text[j];
- text[j] = 0;
-
- strcat (build, text+i);
- strcat (build, "\n");
- text[j] = c;
- i = j-1;
+ for (;i < com_argc;i++)
+ {
+ if (!com_argv[i])
+ continue;
+ if ((com_argv[i][0] == '+' || com_argv[i][0] == '-') && (com_argv[i][1] < '0' || com_argv[i][1] > '9'))
+ break;
+ if (l + strlen(com_argv[i]) + 5 > sizeof(build))
+ break;
+ build[l++] = ' ';
+ build[l++] = '\"';
+ for (j = 0;com_argv[i][j];j++)
+ build[l++] = com_argv[i][j];
+ build[l++] = '\"';
+ }
+ build[l++] = '\n';
+ build[l++] = 0;
+ Cbuf_InsertText (build);
+ i--;
}
}
-
- if (build[0])
- Cbuf_InsertText (build);
-
- Mem_Free (text);
- Mem_Free (build);
}
Cmd_AddCommand ("cmdlist", Cmd_List_f); // Added/Modified by EvilTypeGuy eviltypeguy@qeradiant.com
Cmd_AddCommand ("cvarlist", Cvar_List_f); // 2000-01-09 CmdList, CvarList commands
// By Matthias "Maddes" Buecher
+ Cmd_AddCommand ("set", Cvar_Set_f);
+ Cmd_AddCommand ("seta", Cvar_SetA_f);
}
/*
}
// check functions (only after host_initialized)
- if (host_initialized || !strcasecmp(cmd_argv[0], "exec"))
+ if (host_initialized || !strcasecmp(cmd_argv[0], "exec") || !strcasecmp(cmd_argv[0], "set") || !strcasecmp(cmd_argv[0], "seta"))
{
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
{
/*
===================
-Cmd_ForwardToServer
+Cmd_ForwardStringToServer
-Sends the entire command line over to the server
+Sends an entire command string over to the server, unprocessed
===================
*/
-void Cmd_ForwardToServer (void)
+void Cmd_ForwardStringToServer (const char *s)
{
- const char *s;
if (cls.state != ca_connected)
{
- Con_Printf("Can't \"%s\", not connected\n", Cmd_Argv(0));
+ Con_Printf("Can't \"%s\", not connected\n", s);
return;
}
// 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
- s = Cmd_Argc() > 1 ? Cmd_Args() : "\n";
MSG_WriteByte(&cls.message, clc_stringcmd);
SZ_Write(&cls.message, s, strlen(s) + 1);
}
+/*
+===================
+Cmd_ForwardToServer
+
+Sends the entire command line over to the server
+===================
+*/
+void Cmd_ForwardToServer (void)
+{
+ const char *s;
+ if (strcasecmp(Cmd_Argv(0), "cmd"))
+ s = va("%s %s", Cmd_Argv(0), Cmd_Argc() > 1 ? Cmd_Args() : "");
+ else
+ s = Cmd_Argc() > 1 ? Cmd_Args() : "";
+ Cmd_ForwardStringToServer(s);
+}
+
/*
================