mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-27 14:42:07 +00:00
Fixed a warning message. Changed writefile to file_write. Added file_find
which searches a directory for files matching a pattern and returns a \n- separated list.
This commit is contained in:
parent
1f67ea412d
commit
b70ffbf871
1 changed files with 68 additions and 3 deletions
|
@ -37,9 +37,22 @@ static const char rcsid[] =
|
||||||
# include <strings.h>
|
# include <strings.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_FNMATCH_H
|
||||||
|
# define model_t sunmodel_t
|
||||||
|
# include <fnmatch.h>
|
||||||
|
# undef model_t
|
||||||
|
#else
|
||||||
|
# ifdef WIN32
|
||||||
|
# include "fnmatch.h"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
#include "QF/cmd.h"
|
#include "QF/cmd.h"
|
||||||
#include "QF/cvar.h"
|
#include "QF/cvar.h"
|
||||||
#include "QF/hash.h"
|
#include "QF/hash.h"
|
||||||
|
@ -56,6 +69,10 @@ static const char rcsid[] =
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
|
|
||||||
|
#ifndef HAVE_FNMATCH_PROTO
|
||||||
|
int fnmatch (const char *__pattern, const char *__string, int __flags);
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct cmdalias_s {
|
typedef struct cmdalias_s {
|
||||||
struct cmdalias_s *next;
|
struct cmdalias_s *next;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -1928,6 +1945,8 @@ Cmd_UnAlias_f (void)
|
||||||
if (alias) {
|
if (alias) {
|
||||||
cmdalias_t **a;
|
cmdalias_t **a;
|
||||||
|
|
||||||
|
Cmd_RemoveCommand (alias->name);
|
||||||
|
|
||||||
for (a = &cmd_alias; *a != alias; a = &(*a)->next)
|
for (a = &cmd_alias; *a != alias; a = &(*a)->next)
|
||||||
;
|
;
|
||||||
*a = alias->next;
|
*a = alias->next;
|
||||||
|
@ -1935,7 +1954,6 @@ Cmd_UnAlias_f (void)
|
||||||
free ((char *) alias->name);
|
free ((char *) alias->name);
|
||||||
free ((char *) alias->value);
|
free ((char *) alias->value);
|
||||||
free (alias);
|
free (alias);
|
||||||
Cmd_RemoveCommand (Cmd_Argv(1));
|
|
||||||
} else {
|
} else {
|
||||||
Sys_Printf ("Unknown alias \"%s\"\n", s);
|
Sys_Printf ("Unknown alias \"%s\"\n", s);
|
||||||
}
|
}
|
||||||
|
@ -2321,7 +2339,7 @@ Cmd_CollapsePath (char *str)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
Cmd_Writefile_f (void)
|
Cmd_File_write_f (void)
|
||||||
{
|
{
|
||||||
VFile *file;
|
VFile *file;
|
||||||
char *path;
|
char *path;
|
||||||
|
@ -2351,6 +2369,52 @@ Cmd_Writefile_f (void)
|
||||||
Qclose (file);
|
Qclose (file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Cmd_File_find_f (void)
|
||||||
|
{
|
||||||
|
DIR *directory;
|
||||||
|
struct dirent *entry;
|
||||||
|
char *path;
|
||||||
|
dstring_t *list;
|
||||||
|
|
||||||
|
if (Cmd_Restricted ()) {
|
||||||
|
Cmd_Error ("file_find: access to restricted command denied.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Cmd_Argc() < 2 || Cmd_Argc() > 3) {
|
||||||
|
Cmd_Error ("file_find: invalid number of arguments.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Cmd_Argc() == 3) {
|
||||||
|
path = strdup (Cmd_Argv(2));
|
||||||
|
if (!Cmd_CollapsePath (path)) {
|
||||||
|
free (path);
|
||||||
|
Cmd_Error ("file_find: access to restricted directory/file denied.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
free (path);
|
||||||
|
}
|
||||||
|
directory = opendir (va ("%s/%s", com_gamedir, Cmd_Argv(2)));
|
||||||
|
if (!directory) {
|
||||||
|
Cmd_Error (va ("file_find: could not open directory: %s\n", strerror (errno)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
list = dstring_newstr ();
|
||||||
|
while ((entry = readdir (directory))) {
|
||||||
|
if (!fnmatch (Cmd_Argv(1), entry->d_name, 0)) {
|
||||||
|
dstring_appendstr (list, "\n");
|
||||||
|
dstring_appendstr (list, entry->d_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (list->str[0])
|
||||||
|
Cmd_Return (list->str+1);
|
||||||
|
else
|
||||||
|
Cmd_Return ("");
|
||||||
|
dstring_delete (list);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Cmd_Eval_f (void)
|
Cmd_Eval_f (void)
|
||||||
{
|
{
|
||||||
|
@ -2450,7 +2514,8 @@ Cmd_Init (void)
|
||||||
Cmd_AddCommand ("randint", Cmd_Randint_f, "Returns a random integer between $1 and $2");
|
Cmd_AddCommand ("randint", Cmd_Randint_f, "Returns a random integer between $1 and $2");
|
||||||
Cmd_AddCommand ("streq", Cmd_Streq_f, "Returns 1 if $1 and $2 are the same string, 0 otherwise");
|
Cmd_AddCommand ("streq", Cmd_Streq_f, "Returns 1 if $1 and $2 are the same string, 0 otherwise");
|
||||||
Cmd_AddCommand ("strlen", Cmd_Strlen_f, "Returns the length of $1");
|
Cmd_AddCommand ("strlen", Cmd_Strlen_f, "Returns the length of $1");
|
||||||
Cmd_AddCommand ("writefile", Cmd_Writefile_f, "Write $2 to the file $1 in the current gamedir");
|
Cmd_AddCommand ("file_write", Cmd_File_write_f, "Write $2 to the file $1 in the current gamedir");
|
||||||
|
Cmd_AddCommand ("file_find", Cmd_File_find_f, "Finds a file matching pattern $1 in subdirectory $2 of the gamedir.");
|
||||||
Cmd_AddCommand ("eval", Cmd_Eval_f, "Evaluates a command. Useful for callbacks or dynamically generated commands.");
|
Cmd_AddCommand ("eval", Cmd_Eval_f, "Evaluates a command. Useful for callbacks or dynamically generated commands.");
|
||||||
Cmd_AddCommand ("legacy", Cmd_Legacy_f, "Adds a command to the legacy buffer");
|
Cmd_AddCommand ("legacy", Cmd_Legacy_f, "Adds a command to the legacy buffer");
|
||||||
Cmd_SetPure ("legacy");
|
Cmd_SetPure ("legacy");
|
||||||
|
|
Loading…
Reference in a new issue