mirror of
https://github.com/Shpoike/Quakespasm.git
synced 2024-11-10 07:21:58 +00:00
Add "apropos" command from QS-Spike
git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1393 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
parent
1c83b69cb6
commit
43b509ba4f
3 changed files with 101 additions and 0 deletions
58
Quake/cmd.c
58
Quake/cmd.c
|
@ -499,6 +499,62 @@ void Cmd_List_f (void)
|
|||
Con_SafePrintf ("\n");
|
||||
}
|
||||
|
||||
static char *Cmd_TintSubstring(const char *in, const char *substr, char *out, size_t outsize)
|
||||
{
|
||||
int l;
|
||||
char *m;
|
||||
q_strlcpy(out, in, outsize);
|
||||
while ((m = q_strcasestr(out, substr)))
|
||||
{
|
||||
l = strlen(substr);
|
||||
while (l-->0)
|
||||
if (*m >= ' ' && *m < 127)
|
||||
*m++ |= 0x80;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Apropos_f
|
||||
|
||||
scans through each command and cvar names+descriptions for the given substring
|
||||
we don't support descriptions, so this isn't really all that useful, but even without the sake of consistency it still combines cvars+commands under a single command.
|
||||
============
|
||||
*/
|
||||
void Cmd_Apropos_f(void)
|
||||
{
|
||||
char tmpbuf[256];
|
||||
int hits = 0;
|
||||
cmd_function_t *cmd;
|
||||
cvar_t *var;
|
||||
const char *substr = Cmd_Argv (1);
|
||||
if (!*substr)
|
||||
{
|
||||
Con_SafePrintf ("%s <substring> : search through commands and cvars for the given substring\n", Cmd_Argv(0));
|
||||
return;
|
||||
}
|
||||
for (cmd=cmd_functions ; cmd ; cmd=cmd->next)
|
||||
{
|
||||
if (q_strcasestr(cmd->name, substr))
|
||||
{
|
||||
hits++;
|
||||
Con_SafePrintf ("%s\n", Cmd_TintSubstring(cmd->name, substr, tmpbuf, sizeof(tmpbuf)));
|
||||
}
|
||||
}
|
||||
|
||||
for (var=Cvar_FindVarAfter("", 0) ; var ; var=var->next)
|
||||
{
|
||||
if (q_strcasestr(var->name, substr))
|
||||
{
|
||||
hits++;
|
||||
Con_SafePrintf ("%s (current value: \"%s\")\n", Cmd_TintSubstring(var->name, substr, tmpbuf, sizeof(tmpbuf)), var->string);
|
||||
}
|
||||
}
|
||||
if (!hits)
|
||||
Con_SafePrintf ("no cvars nor commands contain that substring\n");
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_Init
|
||||
|
@ -516,6 +572,8 @@ void Cmd_Init (void)
|
|||
Cmd_AddCommand ("alias",Cmd_Alias_f);
|
||||
Cmd_AddCommand ("cmd", Cmd_ForwardToServer);
|
||||
Cmd_AddCommand ("wait", Cmd_Wait_f);
|
||||
|
||||
Cmd_AddCommand ("apropos", Cmd_Apropos_f);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -190,6 +190,46 @@ int q_strncasecmp(const char *s1, const char *s2, size_t n)
|
|||
return (int)(c1 - c2);
|
||||
}
|
||||
|
||||
//spike -- grabbed this from fte, because its useful to me
|
||||
char *q_strcasestr(const char *haystack, const char *needle)
|
||||
{
|
||||
int c1, c2, c2f;
|
||||
int i;
|
||||
c2f = *needle;
|
||||
if (c2f >= 'a' && c2f <= 'z')
|
||||
c2f -= ('a' - 'A');
|
||||
if (!c2f)
|
||||
return (char*)haystack;
|
||||
while (1)
|
||||
{
|
||||
c1 = *haystack;
|
||||
if (!c1)
|
||||
return NULL;
|
||||
if (c1 >= 'a' && c1 <= 'z')
|
||||
c1 -= ('a' - 'A');
|
||||
if (c1 == c2f)
|
||||
{
|
||||
for (i = 1; ; i++)
|
||||
{
|
||||
c1 = haystack[i];
|
||||
c2 = needle[i];
|
||||
if (c1 >= 'a' && c1 <= 'z')
|
||||
c1 -= ('a' - 'A');
|
||||
if (c2 >= 'a' && c2 <= 'z')
|
||||
c2 -= ('a' - 'A');
|
||||
if (!c2)
|
||||
return (char*)haystack; //end of needle means we found a complete match
|
||||
if (!c1) //end of haystack means we can't possibly find needle in it any more
|
||||
return NULL;
|
||||
if (c1 != c2) //mismatch means no match starting at haystack[0]
|
||||
break;
|
||||
}
|
||||
}
|
||||
haystack++;
|
||||
}
|
||||
return NULL; //didn't find it
|
||||
}
|
||||
|
||||
char *q_strlwr (char *str)
|
||||
{
|
||||
char *c;
|
||||
|
|
|
@ -141,6 +141,9 @@ float Q_atof (const char *str);
|
|||
extern int q_strcasecmp (const char * s1, const char * s2);
|
||||
extern int q_strncasecmp (const char *s1, const char *s2, size_t n);
|
||||
|
||||
/* locale-insensitive case-insensitive alternative to strstr */
|
||||
extern char *q_strcasestr(const char *haystack, const char *needle);
|
||||
|
||||
/* locale-insensitive strlwr/upr replacement functions: */
|
||||
extern char *q_strlwr (char *str);
|
||||
extern char *q_strupr (char *str);
|
||||
|
|
Loading…
Reference in a new issue