1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc. 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version. 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful, 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of 117fab267913a64aad55cedfcf1fca21cc09516a43Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details. 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// cmd.c -- Quake script command processing module 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich#include "quakedef.h" 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_ForwardToServer (void); 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 267fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich#define MAX_ALIAS_NAME 32 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct cmdalias_s 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 307fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich struct cmdalias_s *next; 317fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char name[MAX_ALIAS_NAME]; 327fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char *value; 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} cmdalias_t; 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 357fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichcmdalias_t *cmd_alias; 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint trashtest; 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint *trashspot; 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 407fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichqboolean cmd_wait; 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich//============================================================================= 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Wait_f 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCauses execution of the remainder of the command buffer to be delayed until 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichnext frame. This allows commands like: 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbind g "impulse 5 ; +attack ; wait ; -attack ; impulse 2" 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_Wait_f (void) 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 557fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_wait = true; 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============================================================================= 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 617fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich COMMAND BUFFER 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============================================================================= 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 667fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichsizebuf_t cmd_text; 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCbuf_Init 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cbuf_Init (void) 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 757fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SZ_Alloc (&cmd_text, 8192); // space for commands and script files 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCbuf_AddText 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichAdds command text at the end of the buffer 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cbuf_AddText (const char *text) 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 887fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int l; 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 907fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich l = Q_strlen (text); 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 927fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (cmd_text.cursize + l >= cmd_text.maxsize) 937fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 947fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("Cbuf_AddText: overflow\n"); 957fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 967fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 977fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 987fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SZ_Write (&cmd_text, text, Q_strlen (text)); 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCbuf_InsertText 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichAdds command text immediately after the current command 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichAdds a \n to the text 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFIXME: actually change the command buffer to do less copying 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cbuf_InsertText (const char *text) 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1137fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char *temp; 1147fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int templen; 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// copy off any commands still remaining in the exec buffer 1177fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich templen = cmd_text.cursize; 1187fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (templen) 1197fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 1207fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich temp = (char*) Z_Malloc (templen); 1217fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Q_memcpy (temp, cmd_text.data, templen); 1227fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SZ_Clear (&cmd_text); 1237fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 1247fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich else 1257fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich temp = NULL; // shut up compiler 1267fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// add the entire text of the file 1287fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cbuf_AddText (text); 1297fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// add the copied off data 1317fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (templen) 1327fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 1337fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SZ_Write (&cmd_text, temp, templen); 1347fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Z_Free (temp); 1357fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 139cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCbuf_Execute 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cbuf_Execute (void) 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 1457fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int i; 1467fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char *text; 1477fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char line[1024]; 1487fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int quotes; 1497fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 1507fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich while (cmd_text.cursize) 1517fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// find a \n or ; line break 1537fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich text = (char *)cmd_text.data; 1547fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 1557fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich quotes = 0; 1567fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (i=0 ; i< cmd_text.cursize ; i++) 1577fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 1587fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (text[i] == '"') 1597fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich quotes++; 1607fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if ( !(quotes&1) && text[i] == ';') 1617fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich break; // don't break if inside a quoted string 1627fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (text[i] == '\n' || text[i] == '\r') 1637fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich break; 1647fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 1657fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 1667fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 1677fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich memcpy (line, text, i); 1687fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich line[i] = 0; 1697fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// delete the text from the command buffer and move remaining commands down 171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// this is necessary because commands (exec, alias) can insert data at the 172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// beginning of the text buffer 173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1747fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (i == cmd_text.cursize) 1757fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_text.cursize = 0; 1767fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich else 1777fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 1787fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich i++; 1797fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_text.cursize -= i; 1807fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Q_memcpy (text, text+i, cmd_text.cursize); 1817fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// execute the command line 1847fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cmd_ExecuteString (line, src_command); 1857fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 1867fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (cmd_wait) 1877fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { // skip out while text still remains in buffer, leaving it 1887fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich // for next frame 1897fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_wait = false; 1907fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich break; 1917fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 1927fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============================================================================== 197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 1987fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SCRIPT COMMANDS 199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============================================================================== 201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_StuffCmds_f 206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichAdds command line parameters as script statements 208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCommands lead with a +, and continue until a - or another + 209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichquake +prog jctest.qp +cmd amlev1 210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichquake -nosound +cmd amlev1 211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 212cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 213cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_StuffCmds_f (void) 214cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 2157fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int i, j; 2167fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int s; 2177fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char *text, *build, c; 2187fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2197fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (Cmd_Argc () != 1) 2207fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 2217fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("stuffcmds : execute command line parameters\n"); 2227fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 2237fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// build the combined string to parse from 2267fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich s = 0; 2277fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (i=1 ; i<com_argc ; i++) 2287fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 2297fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!com_argv[i]) 2307fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich continue; // NEXTSTEP nulls out -NXHost 2317fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich s += Q_strlen (com_argv[i]) + 1; 2327fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 2337fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!s) 2347fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 2357fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2367fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich text = (char*) Z_Malloc (s+1); 2377fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich text[0] = 0; 2387fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (i=1 ; i<com_argc ; i++) 2397fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 2407fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!com_argv[i]) 2417fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich continue; // NEXTSTEP nulls out -NXHost 2427fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Q_strcat (text,com_argv[i]); 2437fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (i != com_argc-1) 2447fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Q_strcat (text, " "); 2457fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 2467fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 247cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// pull out the commands 2487fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich build = (char*) Z_Malloc (s+1); 2497fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich build[0] = 0; 2507fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2517fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (i=0 ; i<s-1 ; i++) 2527fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 2537fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (text[i] == '+') 2547fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 2557fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich i++; 2567fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2577fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (j=i ; (text[j] != '+') && (text[j] != '-') && (text[j] != 0) ; j++) 2587fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich ; 2597fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2607fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich c = text[j]; 2617fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich text[j] = 0; 2627fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2637fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Q_strcat (build, text+i); 2647fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Q_strcat (build, "\n"); 2657fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich text[j] = c; 2667fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich i = j-1; 2677fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 2687fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 2697fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2707fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (build[0]) 2717fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cbuf_InsertText (build); 2727fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2737fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Z_Free (text); 2747fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Z_Free (build); 275cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 277cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Exec_f 281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_Exec_f (void) 284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 2857fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char *f; 2867fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int mark; 2877fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2887fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (Cmd_Argc () != 2) 2897fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 2907fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("exec <filename> : execute a script file\n"); 2917fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 2927fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 2937fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 2947fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich mark = Hunk_LowMark (); 2957fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich f = (char *)COM_LoadHunkFile (Cmd_Argv(1)); 2967fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!f) 2977fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 2987fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("couldn't exec %s\n",Cmd_Argv(1)); 2997fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 3007fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 3017fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("execing %s\n",Cmd_Argv(1)); 3027fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 3037fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cbuf_InsertText (f); 3047fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Hunk_FreeToLowMark (mark); 305cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 306cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 307cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 308cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 309cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 310cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Echo_f 311cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 312cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichJust prints the rest of the line to the console 313cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 314cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 315cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_Echo_f (void) 316cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 3177fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int i; 3187fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 3197fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (i=1 ; i<Cmd_Argc() ; i++) 3207fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("%s ",Cmd_Argv(i)); 3217fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("\n"); 322cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 323cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 324cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 325cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 326cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Alias_f 327cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 328cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCreates a new command that executes a command string (possibly ; seperated) 329cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=============== 330cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 331cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 332cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichchar *CopyString (const char *in) 333cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 3347fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char *out; 3357fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 3367fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich out = (char*) Z_Malloc (strlen(in)+1); 3377fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich strcpy (out, in); 3387fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return out; 339cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 340cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 341cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_Alias_f (void) 342cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 3437fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmdalias_t *a; 3447fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char cmd[1024]; 3457fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int i, c; 3467fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich const char *s; 3477fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 3487fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (Cmd_Argc() == 1) 3497fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 3507fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("Current alias commands:\n"); 3517fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (a = cmd_alias ; a ; a=a->next) 3527fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("%s : %s\n", a->name, a->value); 3537fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 3547fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 3557fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 3567fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich s = Cmd_Argv(1); 3577fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (strlen(s) >= MAX_ALIAS_NAME) 3587fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 3597fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("Alias name is too long\n"); 3607fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 3617fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 3627fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 3637fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich // if the alias allready exists, reuse it 3647fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (a = cmd_alias ; a ; a=a->next) 3657fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 3667fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!strcmp(s, a->name)) 3677fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 3687fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Z_Free (a->value); 3697fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich break; 3707fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 3717fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 3727fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 3737fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!a) 3747fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 3757fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich a = (cmdalias_t*) Z_Malloc (sizeof(cmdalias_t)); 3767fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich a->next = cmd_alias; 3777fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_alias = a; 3787fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 3797fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich strcpy (a->name, s); 380cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 381cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// copy the rest of the command line 3827fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd[0] = 0; // start out with a null string 3837fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich c = Cmd_Argc(); 3847fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (i=2 ; i< c ; i++) 3857fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 3867fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich strcat (cmd, Cmd_Argv(i)); 3877fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (i != c) 3887fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich strcat (cmd, " "); 3897fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 3907fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich strcat (cmd, "\n"); 3917fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 3927fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich a->value = CopyString (cmd); 393cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 394cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 395cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 396cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============================================================================= 397cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 3987fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich COMMAND EXECUTION 399cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 400cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============================================================================= 401cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 402cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 403cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichtypedef struct cmd_function_s 404cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 4057fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich struct cmd_function_s *next; 4067fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich char *name; 4077fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich xcommand_t function; 408cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} cmd_function_t; 409cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 410cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4117fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich#define MAX_ARGS 80 412cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4137fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichstatic int cmd_argc; 4147fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichstatic char *cmd_argv[MAX_ARGS]; 4157fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichstatic char *cmd_null_string = (char*) ""; 4167fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichstatic char *cmd_args = NULL; 417cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4187fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichcmd_source_t cmd_source; 419cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 420cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 4217fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichstatic cmd_function_t *cmd_functions; // possible commands to execute 422cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 423cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 424cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 425cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Init 426cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 427cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 428cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_Init (void) 429cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 430cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 431cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// register our commands 432cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// 4337fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cmd_AddCommand ("stuffcmds",Cmd_StuffCmds_f); 4347fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cmd_AddCommand ("exec",Cmd_Exec_f); 4357fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cmd_AddCommand ("echo",Cmd_Echo_f); 4367fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cmd_AddCommand ("alias",Cmd_Alias_f); 4377fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cmd_AddCommand ("cmd", Cmd_ForwardToServer); 4387fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cmd_AddCommand ("wait", Cmd_Wait_f); 439cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 440cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 441cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 442cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 443cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Argc 444cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 445cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 4467fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichint Cmd_Argc (void) 447cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 4487fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return cmd_argc; 449cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 450cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 451cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 452cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 453cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Argv 454cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 455cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 4567fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichchar *Cmd_Argv (int arg) 457cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 4587fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if ( arg >= cmd_argc ) 4597fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return cmd_null_string; 4607fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return cmd_argv[arg]; 461cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 462cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 463cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 464cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 465cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Args 466cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 467cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 4687fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichchar *Cmd_Args (void) 469cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 4707fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return cmd_args; 471cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 472cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 473cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 474cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 475cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 476cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_TokenizeString 477cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 478cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichParses the given string into command line tokens. 479cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 480cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 481cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_TokenizeString (char *text) 482cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 4837fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int i; 4847fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 485cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// clear the args from the last string 4867fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (i=0 ; i<cmd_argc ; i++) 4877fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Z_Free (cmd_argv[i]); 4887fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 4897fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_argc = 0; 4907fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_args = NULL; 4917fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 4927fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich while (1) 4937fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 494cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// skip whitespace up to a /n 4957fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich while (*text && *text <= ' ' && *text != '\n') 4967fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 4977fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich text++; 4987fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 4997fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5007fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (*text == '\n') 5017fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { // a newline seperates commands in the buffer 5027fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich text++; 5037fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich break; 5047fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 5057fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5067fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!*text) 5077fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 5087fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5097fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (cmd_argc == 1) 5107fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_args = text; 5117fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5127fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich text = COM_Parse (text); 5137fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!text) 5147fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 5157fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5167fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (cmd_argc < MAX_ARGS) 5177fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 5187fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_argv[cmd_argc] = (char*) Z_Malloc (Q_strlen(com_token)+1); 5197fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Q_strcpy (cmd_argv[cmd_argc], com_token); 5207fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_argc++; 5217fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 5227fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 5237fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 524cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 525cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 526cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 527cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 528cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 529cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_AddCommand 530cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 531cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 5327fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichvoid Cmd_AddCommand (const char *cmd_name, xcommand_t function) 533cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 5347fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_function_t *cmd; 5357fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5367fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (host_initialized) // because hunk allocation would get stomped 5377fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Sys_Error ("Cmd_AddCommand after host_initialized"); 5387fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 539cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// fail if the command is a variable name 5407fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (Cvar_VariableString(cmd_name)[0]) 5417fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 5427fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("Cmd_AddCommand: %s already defined as a var\n", cmd_name); 5437fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 5447fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 5457fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 546cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// fail if the command already exists 5477fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (cmd=cmd_functions ; cmd ; cmd=cmd->next) 5487fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 5497fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!Q_strcmp (cmd_name, cmd->name)) 5507fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 5517fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name); 5527fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 5537fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 5547fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 5557fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5567fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd = (cmd_function_t*) Hunk_Alloc (sizeof(cmd_function_t)); 5577fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd->name = (char*) cmd_name; 5587fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd->function = function; 5597fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd->next = cmd_functions; 5607fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_functions = cmd; 561cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 562cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 563cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 564cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 565cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_Exists 566cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 567cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 5687fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichqboolean Cmd_Exists (const char *cmd_name) 569cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 5707fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_function_t *cmd; 571cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 5727fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (cmd=cmd_functions ; cmd ; cmd=cmd->next) 5737fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 5747fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!Q_strcmp (cmd_name,cmd->name)) 5757fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return true; 5767fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 577cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 5787fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return false; 579cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 580cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 581cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 582cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 583cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 584cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 585cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_CompleteCommand 586cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 587cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 588cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichconst char *Cmd_CompleteCommand (const char *partial) 589cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 5907fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_function_t *cmd; 5917fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int len; 5927fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5937fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich len = Q_strlen(partial); 5947fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 5957fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!len) 5967fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return NULL; 5977fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 598cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// check functions 5997fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (cmd=cmd_functions ; cmd ; cmd=cmd->next) 6007fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!Q_strncmp (partial,cmd->name, len)) 6017fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return cmd->name; 602cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 6037fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return NULL; 604cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 605cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 606cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 607cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 608cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_ExecuteString 609cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 610cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichA complete command line has been parsed, so try to execute it 611cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFIXME: lookupnoadd the token to speed search? 612cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich============ 613cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 6147fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevichvoid Cmd_ExecuteString (char *text, cmd_source_t src) 6157fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich{ 6167fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_function_t *cmd; 6177fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmdalias_t *a; 6187fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 6197fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd_source = src; 6207fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cmd_TokenizeString (text); 6217fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 622cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// execute the command line 6237fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!Cmd_Argc()) 6247fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; // no tokens 625cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 626cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// check functions 6277fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (cmd=cmd_functions ; cmd ; cmd=cmd->next) 6287fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 6297fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!Q_strcasecmp (cmd_argv[0],cmd->name)) 6307fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 6317fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich cmd->function (); 6327fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 6337fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 6347fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 635cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 636cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// check alias 6377fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (a=cmd_alias ; a ; a=a->next) 6387fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 6397fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!Q_strcasecmp (cmd_argv[0], a->name)) 6407fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 6417fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Cbuf_InsertText (a->value); 6427fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 6437fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 6447fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 6457fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 646cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich// check cvars 6477fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!Cvar_Command ()) 6487fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0)); 6497fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 650cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 651cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 652cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_ExecuteString2 (const char *text, cmd_source_t src) 653cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 654cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich char buf[100]; 655cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Q_strncpy(buf, text, sizeof(buf)); 656cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich buf[sizeof(buf)-1] = 0; 657cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich Cmd_ExecuteString(buf, src); 658cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 659cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 660cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 661cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 662cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_ForwardToServer 663cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 664cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSends the entire command line over to the server 665cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich=================== 666cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 667cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichvoid Cmd_ForwardToServer (void) 668cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 6697fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (cls.state != ca_connected) 6707fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 6717fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Con_Printf ("Can't \"%s\", not connected\n", Cmd_Argv(0)); 6727fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; 6737fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 6747fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 6757fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (cls.demoplayback) 6767fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return; // not really connected 6777fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 6787fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich MSG_WriteByte (&cls.message, clc_stringcmd); 6797fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (Q_strcasecmp(Cmd_Argv(0), "cmd") != 0) 6807fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich { 6817fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SZ_Print (&cls.message, Cmd_Argv(0)); 6827fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SZ_Print (&cls.message, " "); 6837fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich } 6847fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (Cmd_Argc() > 1) 6857fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SZ_Print (&cls.message, Cmd_Args()); 6867fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich else 6877fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich SZ_Print (&cls.message, "\n"); 688cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 689cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 690cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 691cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 692cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================ 693cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCmd_CheckParm 694cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 695cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichReturns the position (1 to argc-1) in the command's argument list 696cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichwhere the given parameter apears, or 0 if not present 697cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich================ 698cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/ 699cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 700cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichint Cmd_CheckParm (const char *parm) 701cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich{ 7027fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich int i; 7037fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 7047fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (!parm) 7057fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich Sys_Error ("Cmd_CheckParm: NULL"); 7067fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 7077fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich for (i = 1; i < Cmd_Argc (); i++) 7087fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich if (! Q_strcasecmp (parm, Cmd_Argv (i))) 7097fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return i; 7107fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich 7117fab267913a64aad55cedfcf1fca21cc09516a43Jack Palevich return 0; 712cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 713