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