X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=cmd.c;h=3fb741e0a3d6ba10380caade324fa99df721fe3e;hb=2dbe17fce49258350f4a501edc8923470f224cb5;hp=d68a289a90822fad3396b7c471fa483ee89a30f2;hpb=04ebd98618c773b10ada031f18b99f11020b559f;p=xonotic%2Fdarkplaces.git diff --git a/cmd.c b/cmd.c index d68a289a..3fb741e0 100644 --- a/cmd.c +++ b/cmd.c @@ -281,7 +281,8 @@ void Cbuf_Execute (void) char line[MAX_INPUTLINE]; char preprocessed[MAX_INPUTLINE]; char *firstchar; - qboolean quotes, comment; + qboolean quotes; + char *comment; // LordHavoc: making sure the tokenizebuffer doesn't get filled up by repeated crashes cmd_tokenizebufferpos = 0; @@ -293,7 +294,7 @@ void Cbuf_Execute (void) text = (char *)cmd_text.data; quotes = false; - comment = false; + comment = NULL; for (i=0 ; i < cmd_text.cursize ; i++) { if(!comment) @@ -311,7 +312,7 @@ void Cbuf_Execute (void) else { if(text[i] == '/' && text[i + 1] == '/' && (i == 0 || ISWHITESPACE(text[i-1]))) - comment = true; + comment = &text[i]; if(text[i] == ';') break; // don't break if inside a quoted string or comment } @@ -329,8 +330,8 @@ void Cbuf_Execute (void) } else { - memcpy (line, text, i); - line[i] = 0; + memcpy (line, text, comment ? (comment - text) : i); + line[comment ? (comment - text) : i] = 0; } // delete the text from the command buffer and move remaining commands down @@ -347,13 +348,15 @@ void Cbuf_Execute (void) } // execute the command line - firstchar = line + strspn(line, " \t"); + firstchar = line; + while(*firstchar && ISWHITESPACE(*firstchar)) + ++firstchar; if( - (strncmp(firstchar, "alias", 5) || (firstchar[5] != ' ' && firstchar[5] != '\t')) + (strncmp(firstchar, "alias", 5) || !ISWHITESPACE(firstchar[5])) && - (strncmp(firstchar, "bind", 4) || (firstchar[4] != ' ' && firstchar[4] != '\t')) + (strncmp(firstchar, "bind", 4) || !ISWHITESPACE(firstchar[4])) && - (strncmp(firstchar, "in_bind", 7) || (firstchar[7] != ' ' && firstchar[7] != '\t')) + (strncmp(firstchar, "in_bind", 7) || !ISWHITESPACE(firstchar[7])) ) { Cmd_PreprocessString( line, preprocessed, sizeof(preprocessed), NULL ); @@ -454,6 +457,7 @@ Cmd_Exec_f static void Cmd_Exec_f (void) { char *f; + const char *filename; if (Cmd_Argc () != 2) { @@ -461,18 +465,26 @@ static void Cmd_Exec_f (void) return; } - f = (char *)FS_LoadFile (Cmd_Argv(1), tempmempool, false, NULL); + filename = Cmd_Argv(1); + if (!strcmp(filename, "config.cfg")) + { + filename = CONFIGFILENAME; + if (COM_CheckParm("-noconfig")) + return; // don't execute config.cfg + } + + f = (char *)FS_LoadFile (filename, tempmempool, false, NULL); if (!f) { - Con_Printf("couldn't exec %s\n",Cmd_Argv(1)); + Con_Printf("couldn't exec %s\n",filename); return; } - Con_Printf("execing %s\n",Cmd_Argv(1)); + Con_Printf("execing %s\n",filename); // if executing default.cfg for the first time, lock the cvar defaults // it may seem backwards to insert this text BEFORE the default.cfg // but Cbuf_InsertText inserts before, so this actually ends up after it. - if (!strcmp(Cmd_Argv(1), "default.cfg")) + if (strlen(filename) >= 11 && !strcmp(filename + strlen(filename) - 11, "default.cfg")) Cbuf_InsertText("\ncvar_lockdefaults\n"); // insert newline after the text to make sure the last line is terminated (some text editors omit the trailing newline) @@ -640,11 +652,11 @@ static void Cmd_Alias_f (void) // copy the rest of the command line cmd[0] = 0; // start out with a null string c = Cmd_Argc(); - for (i=2 ; i< c ; i++) + for (i=2 ; i < c ; i++) { - strlcat (cmd, Cmd_Argv(i), sizeof (cmd)); - if (i != c) + if (i != 2) strlcat (cmd, " ", sizeof (cmd)); + strlcat (cmd, Cmd_Argv(i), sizeof (cmd)); } strlcat (cmd, "\n", sizeof (cmd)); @@ -848,6 +860,7 @@ static const char *Cmd_GetCvarValue(const char *var, size_t varlen, cmdalias_t * static char varval[MAX_INPUTLINE]; const char *varstr; char *varfunc; +static char asis[] = "asis"; // just to suppress const char warnings if(varlen >= MAX_INPUTLINE) varlen = MAX_INPUTLINE - 1; @@ -878,7 +891,7 @@ static const char *Cmd_GetCvarValue(const char *var, size_t varlen, cmdalias_t * varstr = Cmd_GetDirectCvarValue(varname, alias, &is_multiple); if(is_multiple) if(!varfunc) - varfunc = "asis"; + varfunc = asis; } if(!varstr) @@ -1102,15 +1115,11 @@ static void Cmd_Apropos_f(void) 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 \n"); @@ -1119,10 +1128,7 @@ static void Cmd_Apropos_f(void) ispattern = partial && (strchr(partial, '*') || strchr(partial, '?')); if(!ispattern) - { partial = va("*%s*", partial); - len += 2; - } count = 0; for (cvar = cvar_vars; cvar; cvar = cvar->next) @@ -1143,10 +1149,11 @@ static void Cmd_Apropos_f(void) } for (alias = cmd_alias; alias; alias = alias->next) { + // procede here a bit differently as an alias value always got a final \n if (!matchpattern_with_separator(alias->name, partial, true, "", false)) - if (!matchpattern_with_separator(alias->value, partial, true, "", false)) + if (!matchpattern_with_separator(alias->value, partial, true, "\n", false)) // when \n is as separator wildcards don't match it continue; - Con_Printf("alias ^5%s^7: %s", alias->name, alias->value); + Con_Printf("alias ^5%s^7: %s", alias->name, alias->value); // do not print an extra \n count++; } Con_Printf("%i result%s\n\n", count, (count > 1) ? "s" : ""); @@ -1180,6 +1187,7 @@ void Cmd_Init_Commands (void) 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"); + Cmd_AddCommand ("unset", Cvar_Del_f, "delete a cvar (does not work for static ones like _cl_name, or read-only ones)"); #ifdef FILLALLCVARSWITHRUBBISH Cmd_AddCommand ("fillallcvarswithrubbish", Cvar_FillAll_f, "fill all cvars with a specified number of characters to provoke buffer overruns"); #endif /* FILLALLCVARSWITHRUBBISH */