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;
text = (char *)cmd_text.data;
quotes = false;
- comment = false;
+ comment = NULL;
for (i=0 ; i < cmd_text.cursize ; i++)
{
if(!comment)
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
}
}
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
}
// 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 );
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)
// 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));
return NULL;
}
-qboolean Cmd_QuoteString(char *out, size_t outlen, const char *in, const char *quoteset)
+qboolean Cmd_QuoteString(char *out, size_t outlen, const char *in, const char *quoteset, qboolean putquotes)
{
qboolean quote_quot = !!strchr(quoteset, '"');
qboolean quote_backslash = !!strchr(quoteset, '\\');
qboolean quote_dollar = !!strchr(quoteset, '$');
+ if(putquotes)
+ {
+ if(outlen <= 2)
+ {
+ *out++ = 0;
+ return false;
+ }
+ *out++ = '"'; --outlen;
+ --outlen;
+ }
+
while(*in)
{
if(*in == '"' && quote_quot)
{
if(outlen <= 2)
- {
- *out++ = 0;
- return false;
- }
+ goto fail;
*out++ = '\\'; --outlen;
*out++ = '"'; --outlen;
}
else if(*in == '\\' && quote_backslash)
{
if(outlen <= 2)
- {
- *out++ = 0;
- return false;
- }
+ goto fail;
*out++ = '\\'; --outlen;
*out++ = '\\'; --outlen;
}
else if(*in == '$' && quote_dollar)
{
if(outlen <= 2)
- {
- *out++ = 0;
- return false;
- }
+ goto fail;
*out++ = '$'; --outlen;
*out++ = '$'; --outlen;
}
else
{
if(outlen <= 1)
- {
- *out++ = 0;
- return false;
- }
+ goto fail;
*out++ = *in; --outlen;
}
++in;
}
+ if(putquotes)
+ *out++ = '"';
*out++ = 0;
return true;
+fail:
+ if(putquotes)
+ *out++ = '"';
+ *out++ = 0;
+ return false;
}
static const char *Cmd_GetCvarValue(const char *var, size_t varlen, cmdalias_t *alias)
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;
varstr = Cmd_GetDirectCvarValue(varname, alias, &is_multiple);
if(is_multiple)
if(!varfunc)
- varfunc = "asis";
+ varfunc = asis;
}
if(!varstr)
{
// quote it so it can be used inside double quotes
// we just need to replace " by \", and of course, double backslashes
- Cmd_QuoteString(varval, sizeof(varval), varstr, "\"\\");
+ Cmd_QuoteString(varval, sizeof(varval), varstr, "\"\\", false);
return varval;
}
else if(!strcmp(varfunc, "asis"))
// Note: Cbuf_PreprocessString will be called on this string AGAIN! So we
// have to make sure that no second variable expansion takes place, otherwise
// alias parameters containing dollar signs can have bad effects.
- Cmd_QuoteString(buffer2, sizeof(buffer2), buffer, "$");
+ Cmd_QuoteString(buffer2, sizeof(buffer2), buffer, "$", false);
Cbuf_InsertText( buffer2 );
}
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");
ispattern = partial && (strchr(partial, '*') || strchr(partial, '?'));
if(!ispattern)
- {
partial = va("*%s*", partial);
- len += 2;
- }
count = 0;
for (cvar = cvar_vars; cvar; cvar = cvar->next)
}
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" : "");