X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=cmd.c;h=0a6459743b36b8ad65f5d08ed62c749d29ddf5f0;hb=c32e446060df3ccfcbec6fa49ab1146ae2ba7076;hp=2e1323a41f9ed62c741931ad0ca5ceb5ca8f6813;hpb=71e075efa49758f4fd21831973fb0d8e4d6938c8;p=xonotic%2Fdarkplaces.git diff --git a/cmd.c b/cmd.c index 2e1323a4..0a645974 100644 --- a/cmd.c +++ b/cmd.c @@ -64,19 +64,9 @@ static void Cmd_Wait_f (void) ============================================================================= */ -static sizebuf_t cmd_text; - -/* -============ -Cbuf_Init -============ -*/ -void Cbuf_Init (void) -{ // LordHavoc: inreased this from 8192 to 32768 - SZ_Alloc (&cmd_text, 32768, "command buffer"); // space for commands and script files -} - +static sizebuf_t cmd_text; +static qbyte cmd_text_buf[32768]; /* ============ @@ -214,6 +204,7 @@ quake +prog jctest.qp +cmd amlev1 quake -nosound +cmd amlev1 =============== */ +qboolean host_stuffcmdsrun = false; void Cmd_StuffCmds_f (void) { int i, j, l; @@ -226,6 +217,7 @@ void Cmd_StuffCmds_f (void) return; } + host_stuffcmdsrun = true; for (i = 0;i < com_argc;i++) { if (com_argv[i] && com_argv[i][0] == '+' && (com_argv[i][1] < '0' || com_argv[i][1] > '9')) @@ -343,11 +335,21 @@ static void Cmd_Alias_f (void) if (!a) { + cmdalias_t *prev, *current; + a = Z_Malloc (sizeof(cmdalias_t)); - a->next = cmd_alias; - cmd_alias = a; + strlcpy (a->name, s, sizeof (a->name)); + // insert it at the right alphanumeric position + for( prev = NULL, current = cmd_alias ; current && strcmp( current->name, a->name ) < 0 ; prev = current, current = current->next ) + ; + if( prev ) { + prev->next = a; + } else { + cmd_alias = a; + } + a->next = current; } - strlcpy (a->name, s, sizeof (a->name)); + // copy the rest of the command line cmd[0] = 0; // start out with a null string @@ -442,7 +444,14 @@ Cmd_Init void Cmd_Init (void) { cmd_mempool = Mem_AllocPool("commands", 0, NULL); + // space for commands and script files + cmd_text.data = cmd_text_buf; + cmd_text.maxsize = sizeof(cmd_text_buf); + cmd_text.cursize = 0; +} +void Cmd_Init_Commands (void) +{ // // register our commands // @@ -459,6 +468,16 @@ void Cmd_Init (void) Cmd_AddCommand ("seta", Cvar_SetA_f); } +/* +============ +Cmd_Shutdown +============ +*/ +void Cmd_Shutdown(void) +{ + Mem_FreePool(&cmd_mempool); +} + /* ============ Cmd_Argc @@ -509,12 +528,18 @@ static void Cmd_TokenizeString (const char *text) while (1) { // skip whitespace up to a /n - while (*text && *text <= ' ' && *text != '\n') + while (*text && *text <= ' ' && *text != '\r' && *text != '\n') text++; - if (*text == '\n') + // line endings: + // UNIX: \n + // Mac: \r + // Windows: \r\n + if (*text == '\n' || *text == '\r') { // a newline seperates commands in the buffer + if (*text == '\r' && text[1] == '\n') + text++; text++; break; } @@ -532,14 +557,16 @@ static void Cmd_TokenizeString (const char *text) { l = strlen(com_token) + 1; if (cmd_tokenizebufferpos + l > CMD_TOKENIZELENGTH) - Sys_Error("Cmd_TokenizeString: ran out of %i character buffer space for command arguements\n", CMD_TOKENIZELENGTH); + { + Con_Printf("Cmd_TokenizeString: ran out of %i character buffer space for command arguements\n", CMD_TOKENIZELENGTH); + break; + } strcpy (cmd_tokenizebuffer + cmd_tokenizebufferpos, com_token); cmd_argv[cmd_argc] = cmd_tokenizebuffer + cmd_tokenizebufferpos; cmd_tokenizebufferpos += l; cmd_argc++; } } - } @@ -551,6 +578,7 @@ Cmd_AddCommand void Cmd_AddCommand (const char *cmd_name, xcommand_t function) { cmd_function_t *cmd; + cmd_function_t *prev, *current; // fail if the command is a variable name if (Cvar_VariableString(cmd_name)[0]) @@ -573,7 +601,16 @@ void Cmd_AddCommand (const char *cmd_name, xcommand_t function) cmd->name = cmd_name; cmd->function = function; cmd->next = cmd_functions; - cmd_functions = cmd; + +// insert it at the right alphanumeric position + for( prev = NULL, current = cmd_functions ; current && strcmp( current->name, cmd->name ) < 0 ; prev = current, current = current->next ) + ; + if( prev ) { + prev->next = cmd; + } else { + cmd_functions = cmd; + } + cmd->next = current; } /* @@ -782,36 +819,30 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src) return; // no tokens } -// check functions (only after host_initialized) - if (host_initialized || !strcasecmp(cmd_argv[0], "exec") || !strcasecmp(cmd_argv[0], "set") || !strcasecmp(cmd_argv[0], "seta")) +// check functions + for (cmd=cmd_functions ; cmd ; cmd=cmd->next) { - for (cmd=cmd_functions ; cmd ; cmd=cmd->next) + if (!strcasecmp (cmd_argv[0],cmd->name)) { - if (!strcasecmp (cmd_argv[0],cmd->name)) - { - cmd->function (); - cmd_tokenizebufferpos = oldpos; - return; - } + cmd->function (); + cmd_tokenizebufferpos = oldpos; + return; } } -// check alias (only after host_initialized) - if (host_initialized) +// check alias + for (a=cmd_alias ; a ; a=a->next) { - for (a=cmd_alias ; a ; a=a->next) + if (!strcasecmp (cmd_argv[0], a->name)) { - if (!strcasecmp (cmd_argv[0], a->name)) - { - Cbuf_InsertText (a->value); - cmd_tokenizebufferpos = oldpos; - return; - } + Cbuf_InsertText (a->value); + cmd_tokenizebufferpos = oldpos; + return; } } -// check cvars (always) - if (!Cvar_Command () && host_initialized) +// check cvars + if (!Cvar_Command () && host_framecount > 0) Con_Printf("Unknown command \"%s\"\n", Cmd_Argv(0)); cmd_tokenizebufferpos = oldpos; @@ -820,17 +851,16 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src) /* =================== -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; } @@ -840,14 +870,27 @@ void Cmd_ForwardToServer (void) // 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); +} + /* ================ @@ -863,7 +906,10 @@ int Cmd_CheckParm (const char *parm) int i; if (!parm) - Sys_Error ("Cmd_CheckParm: NULL"); + { + Con_Printf ("Cmd_CheckParm: NULL"); + return 0; + } for (i = 1; i < Cmd_Argc (); i++) if (!strcasecmp (parm, Cmd_Argv (i)))