]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
... forgot to add the files, I'm too used to git now :P
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index 366b33b8c4eb25977219f03a5484f0dd68b9e592..db6acdb99072cd68c78ed7bbc4db2e98bed61583 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -21,16 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 
-#define        MAX_ALIAS_NAME  32
-// this is the largest script file that can be executed in one step
-// LordHavoc: inreased this from 8192 to 32768
-// div0: increased this from 32k to 128k
-#define CMDBUFSIZE 131072
-// maximum number of parameters to a command
-#define        MAX_ARGS 80
-// maximum tokenizable commandline length (counting NUL terminations)
-#define CMD_TOKENIZELENGTH (MAX_INPUTLINE + MAX_ARGS)
-
 typedef struct cmdalias_s
 {
        struct cmdalias_s *next;
@@ -320,7 +310,7 @@ void Cbuf_Execute (void)
                                }
                                else
                                {
-                                       if(text[i] == '/' && text[i + 1] == '/')
+                                       if(text[i] == '/' && text[i + 1] == '/' && (i == 0 || ISWHITESPACE(text[i-1])))
                                                comment = true;
                                        if(text[i] == ';')
                                                break;  // don't break if inside a quoted string or comment
@@ -608,7 +598,7 @@ static void Cmd_Alias_f (void)
        {
                Con_Print("Current alias commands:\n");
                for (a = cmd_alias ; a ; a=a->next)
-                       Con_Printf("%s : %s\n", a->name, a->value);
+                       Con_Printf("%s : %s", a->name, a->value);
                return;
        }
 
@@ -659,10 +649,53 @@ static void Cmd_Alias_f (void)
        strlcat (cmd, "\n", sizeof (cmd));
 
        alloclen = strlen (cmd) + 1;
+       if(alloclen >= 2)
+               cmd[alloclen - 2] = '\n'; // to make sure a newline is appended even if too long
        a->value = (char *)Z_Malloc (alloclen);
        memcpy (a->value, cmd, alloclen);
 }
 
+/*
+===============
+Cmd_UnAlias_f
+
+Remove existing aliases.
+===============
+*/
+static void Cmd_UnAlias_f (void)
+{
+       cmdalias_t      *a, *p;
+       int i;
+       const char *s;
+
+       if(Cmd_Argc() == 1)
+       {
+               Con_Print("unalias: Usage: unalias alias1 [alias2 ...]\n");
+               return;
+       }
+
+       for(i = 1; i < Cmd_Argc(); ++i)
+       {
+               s = Cmd_Argv(i);
+               p = NULL;
+               for(a = cmd_alias; a; p = a, a = a->next)
+               {
+                       if(!strcmp(s, a->name))
+                       {
+                               if(a == cmd_alias)
+                                       cmd_alias = a->next;
+                               if(p)
+                                       p->next = a->next;
+                               Z_Free(a->value);
+                               Z_Free(a);
+                               break;
+                       }
+               }
+               if(!a)
+                       Con_Printf("unalias: %s alias not found\n", s);
+       }
+}
+
 /*
 =============================================================================
 
@@ -873,7 +906,7 @@ static const char *Cmd_GetCvarValue(const char *var, size_t varlen, cmdalias_t *
 /*
 Cmd_PreprocessString
 
-Preprocesses strings and replaces $*, $param#, $cvar accordingly
+Preprocesses strings and replaces $*, $param#, $cvar accordingly. Also strips comments.
 */
 static void Cmd_PreprocessString( const char *intext, char *outtext, unsigned maxoutlen, cmdalias_t *alias ) {
        const char *in;
@@ -980,9 +1013,9 @@ static void Cmd_PreprocessString( const char *intext, char *outtext, unsigned ma
                                        --eat;
                                }
                        }
-               } else {
-                       outtext[outlen++] = *in++;
                }
+               else 
+                       outtext[outlen++] = *in++;
        }
        outtext[outlen] = 0;
 }
@@ -1022,12 +1055,14 @@ static void Cmd_List_f (void)
 {
        cmd_function_t *cmd;
        const char *partial;
-       int len, count;
+       size_t len;
+       int count;
+       qboolean ispattern;
 
        if (Cmd_Argc() > 1)
        {
                partial = Cmd_Argv (1);
-               len = (int)strlen(partial);
+               len = strlen(partial);
        }
        else
        {
@@ -1035,21 +1070,84 @@ static void Cmd_List_f (void)
                len = 0;
        }
 
+       ispattern = partial && (strchr(partial, '*') || strchr(partial, '?'));
+
        count = 0;
        for (cmd = cmd_functions; cmd; cmd = cmd->next)
        {
-               if (partial && strncmp(partial, cmd->name, len))
+               if (partial && (ispattern ? !matchpattern_with_separator(cmd->name, partial, false, "", false) : strncmp(partial, cmd->name, len)))
                        continue;
                Con_Printf("%s : %s\n", cmd->name, cmd->description);
                count++;
        }
 
-       if (partial)
-               Con_Printf("%i Command%s beginning with \"%s\"\n\n", count, (count > 1) ? "s" : "", partial);
+       if (len)
+       {
+               if(ispattern)
+                       Con_Printf("%i Command%s matching \"%s\"\n\n", count, (count > 1) ? "s" : "", partial);
+               else
+                       Con_Printf("%i Command%s beginning with \"%s\"\n\n", count, (count > 1) ? "s" : "", partial);
+       }
        else
                Con_Printf("%i Command%s\n\n", count, (count > 1) ? "s" : "");
 }
 
+static void Cmd_Apropos_f(void)
+{
+       cmd_function_t *cmd;
+       cvar_t *cvar;
+       cmdalias_t *alias;
+       const char *partial;
+       size_t len;
+       int count;
+       qboolean ispattern;
+
+       if (Cmd_Argc() > 1)
+       {
+               partial = Cmd_Args();
+               len = strlen(partial);
+       }
+       else
+       {
+               Con_Printf("usage: apropos <string>\n");
+               return;
+       }
+
+       ispattern = partial && (strchr(partial, '*') || strchr(partial, '?'));
+       if(!ispattern)
+       {
+               partial = va("*%s*", partial);
+               len += 2;
+       }
+
+       count = 0;
+       for (cvar = cvar_vars; cvar; cvar = cvar->next)
+       {
+               if (!matchpattern_with_separator(cvar->name, partial, true, "", false))
+               if (!matchpattern_with_separator(cvar->description, partial, true, "", false))
+                       continue;
+               Con_Printf ("cvar ^3%s^7 is \"%s\" [\"%s\"] %s\n", cvar->name, cvar->string, cvar->defstring, cvar->description);
+               count++;
+       }
+       for (cmd = cmd_functions; cmd; cmd = cmd->next)
+       {
+               if (!matchpattern_with_separator(cmd->name, partial, true, "", false))
+               if (!matchpattern_with_separator(cmd->description, partial, true, "", false))
+                       continue;
+               Con_Printf("command ^2%s^7: %s\n", cmd->name, cmd->description);
+               count++;
+       }
+       for (alias = cmd_alias; alias; alias = alias->next)
+       {
+               if (!matchpattern_with_separator(alias->name, partial, true, "", false))
+               if (!matchpattern_with_separator(alias->value, partial, true, "", false))
+                       continue;
+               Con_Printf("alias ^5%s^7: %s", alias->name, alias->value);
+               count++;
+       }
+       Con_Printf("%i result%s\n\n", count, (count > 1) ? "s" : "");
+}
+
 /*
 ============
 Cmd_Init
@@ -1072,16 +1170,21 @@ void Cmd_Init_Commands (void)
        Cmd_AddCommand ("stuffcmds",Cmd_StuffCmds_f, "execute commandline parameters (must be present in quake.rc script)");
        Cmd_AddCommand ("exec",Cmd_Exec_f, "execute a script file");
        Cmd_AddCommand ("echo",Cmd_Echo_f, "print a message to the console (useful in scripts)");
-       Cmd_AddCommand ("alias",Cmd_Alias_f, "create a script function (parameters are passed in as $1 through $9, and $* for all parameters)");
+       Cmd_AddCommand ("alias",Cmd_Alias_f, "create a script function (parameters are passed in as $X (being X a number), $* for all parameters, $X- for all parameters starting from $X). Without arguments show the list of all alias");
+       Cmd_AddCommand ("unalias",Cmd_UnAlias_f, "remove an alias");
        Cmd_AddCommand ("cmd", Cmd_ForwardToServer, "send a console commandline to the server (used by some mods)");
        Cmd_AddCommand ("wait", Cmd_Wait_f, "make script execution wait for next rendered frame");
        Cmd_AddCommand ("set", Cvar_Set_f, "create or change the value of a console variable");
        Cmd_AddCommand ("seta", Cvar_SetA_f, "create or change the value of a console variable that will be saved to config.cfg");
+#ifdef FILLALLCVARSWITHRUBBISH
+       Cmd_AddCommand ("fillallcvarswithrubbish", Cvar_FillAll_f, "fill all cvars with a specified number of characters to provoke buffer overruns");
+#endif /* FILLALLCVARSWITHRUBBISH */
 
        // 2000-01-09 CmdList, CvarList commands By Matthias "Maddes" Buecher
        // Added/Modified by EvilTypeGuy eviltypeguy@qeradiant.com
-       Cmd_AddCommand ("cmdlist", Cmd_List_f, "lists all console commands beginning with the specified prefix");
-       Cmd_AddCommand ("cvarlist", Cvar_List_f, "lists all console variables beginning with the specified prefix");
+       Cmd_AddCommand ("cmdlist", Cmd_List_f, "lists all console commands beginning with the specified prefix or matching the specified wildcard pattern");
+       Cmd_AddCommand ("cvarlist", Cvar_List_f, "lists all console variables beginning with the specified prefix or matching the specified wildcard pattern");
+       Cmd_AddCommand ("apropos", Cmd_Apropos_f, "lists all console variables/commands/aliases containing the specified string in the name or description");
 
        Cmd_AddCommand ("cvar_lockdefaults", Cvar_LockDefaults_f, "stores the current values of all cvars into their default values, only used once during startup after parsing default.cfg");
        Cmd_AddCommand ("cvar_resettodefaults_all", Cvar_ResetToDefaults_All_f, "sets all cvars to their locked default values");
@@ -1364,7 +1467,7 @@ void Cmd_CompleteCommandPrint (const char *partial)
        // Loop through the command list and print all matches
        for (cmd = cmd_functions; cmd; cmd = cmd->next)
                if (!strncasecmp(partial, cmd->name, len))
-                       Con_Printf("%s : %s\n", cmd->name, cmd->description);
+                       Con_Printf("^2%s^7: %s\n", cmd->name, cmd->description);
 }
 
 /*
@@ -1402,7 +1505,7 @@ void Cmd_CompleteAliasPrint (const char *partial)
        // Loop through the alias list and print all matches
        for (alias = cmd_alias; alias; alias = alias->next)
                if (!strncasecmp(partial, alias->name, len))
-                       Con_Printf("%s : %s\n", alias->name, alias->value);
+                       Con_Printf("^5%s^7: %s", alias->name, alias->value);
 }