mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-26 14:30:48 +00:00
Bennene posix.c zu hunk.c um
This commit is contained in:
parent
1ad221b667
commit
9a750b4e4e
4 changed files with 345 additions and 341 deletions
12
Makefile
12
Makefile
|
@ -254,7 +254,7 @@ SERVER_OBJS = \
|
|||
# POSIX platform objects
|
||||
POSIX_OBJS = \
|
||||
build/posix/network.o \
|
||||
build/posix/posix.o \
|
||||
build/posix/hunk.o \
|
||||
build/posix/system.o \
|
||||
build/posix/glob/glob.o \
|
||||
build/posix/vid/menu.o \
|
||||
|
@ -314,7 +314,7 @@ DEDICATED_SERVER_COMMON_OBJS = \
|
|||
DEDICATED_SERVER_POSIX_OBJS = \
|
||||
build/dedicated_server_posix/glob/glob.o \
|
||||
build/dedicated_server_posix/network.o \
|
||||
build/dedicated_server_posix/posix.o \
|
||||
build/dedicated_server_posix/hunk.o \
|
||||
build/dedicated_server_posix/system.o
|
||||
|
||||
# ----------
|
||||
|
@ -343,7 +343,7 @@ OPENGL_GAME_OBJS = \
|
|||
OPENGL_POSIX_OBJS = \
|
||||
build/ref_gl_posix/abi.o \
|
||||
build/ref_gl_posix/glob.o \
|
||||
build/ref_gl_posix/posix.o \
|
||||
build/ref_gl_posix/hunk.o \
|
||||
build/ref_gl_posix/qgl.o \
|
||||
build/ref_gl_posix/refresh.o
|
||||
|
||||
|
@ -620,7 +620,7 @@ build/server/sv_world.o : src/server/sv_world.c
|
|||
build/posix/network.o : src/posix/network.c
|
||||
$(CC) $(CFLAGS_CLIENT) -o $@ -c $<
|
||||
|
||||
build/posix/posix.o : src/posix/posix.c
|
||||
build/posix/hunk.o : src/posix/hunk.c
|
||||
$(CC) $(CFLAGS_CLIENT) -o $@ -c $<
|
||||
|
||||
build/posix/system.o : src/posix/system.c
|
||||
|
@ -750,7 +750,7 @@ build/dedicated_server_posix/glob/glob.o : src/posix/glob/glob.c
|
|||
build/dedicated_server_posix/network.o : src/posix/network.c
|
||||
$(CC) $(CFLAGS_DEDICATED_SERVER) -o $@ -c $<
|
||||
|
||||
build/dedicated_server_posix/posix.o : src/posix/posix.c
|
||||
build/dedicated_server_posix/hunk.o : src/posix/hunk.c
|
||||
$(CC) $(CFLAGS_DEDICATED_SERVER) -o $@ -c $<
|
||||
|
||||
build/dedicated_server_posix/system.o : src/posix/system.c
|
||||
|
@ -800,7 +800,7 @@ build/ref_gl_posix/abi.o: src/posix/refresh/abi.c
|
|||
build/ref_gl_posix/glob.o: src/posix/glob/glob.c
|
||||
$(CC) $(CFLAGS_OPENGL) -o $@ -c $<
|
||||
|
||||
build/ref_gl_posix/posix.o: src/posix/posix.c
|
||||
build/ref_gl_posix/hunk.o: src/posix/hunk.c
|
||||
$(CC) $(CFLAGS_OPENGL) -o $@ -c $<
|
||||
|
||||
build/ref_gl_posix/qgl.o: src/posix/refresh/qgl.c
|
||||
|
|
142
src/posix/hunk.c
Normal file
142
src/posix/hunk.c
Normal file
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
* Copyright (C) 1997-2001 Id Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* =======================================================================
|
||||
*
|
||||
* This file implements the low level part of the Hunk_* memory system
|
||||
*
|
||||
* =======================================================================
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "../common/header/common.h"
|
||||
|
||||
#if defined( __FreeBSD__ )
|
||||
#include <machine/param.h>
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif
|
||||
|
||||
|
||||
/* For mremap() */
|
||||
#if defined( __linux__ )
|
||||
#define __USE_GNU
|
||||
#endif
|
||||
|
||||
byte *membase;
|
||||
int maxhunksize;
|
||||
int curhunksize;
|
||||
|
||||
void *
|
||||
Hunk_Begin ( int maxsize )
|
||||
{
|
||||
/* reserve a huge chunk of memory, but don't commit any yet */
|
||||
maxhunksize = maxsize + sizeof ( int );
|
||||
curhunksize = 0;
|
||||
|
||||
membase = mmap( 0, maxhunksize, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 );
|
||||
|
||||
if ( ( membase == NULL ) || ( membase == (byte *) -1 ) )
|
||||
{
|
||||
Sys_Error( "unable to virtual allocate %d bytes", maxsize );
|
||||
}
|
||||
|
||||
*( (int *) membase ) = curhunksize;
|
||||
|
||||
return ( membase + sizeof ( int ) );
|
||||
}
|
||||
|
||||
void *
|
||||
Hunk_Alloc ( int size )
|
||||
{
|
||||
byte *buf;
|
||||
|
||||
/* round to cacheline */
|
||||
size = ( size + 31 ) & ~31;
|
||||
|
||||
if ( curhunksize + size > maxhunksize )
|
||||
{
|
||||
Sys_Error( "Hunk_Alloc overflow" );
|
||||
}
|
||||
|
||||
buf = membase + sizeof ( int ) + curhunksize;
|
||||
curhunksize += size;
|
||||
return ( buf );
|
||||
}
|
||||
|
||||
int
|
||||
Hunk_End ( void )
|
||||
{
|
||||
byte *n = NULL;
|
||||
|
||||
#if defined( __FreeBSD__ )
|
||||
size_t old_size = maxhunksize;
|
||||
size_t new_size = curhunksize + sizeof ( int );
|
||||
void *unmap_base;
|
||||
size_t unmap_len;
|
||||
|
||||
new_size = round_page( new_size );
|
||||
old_size = round_page( old_size );
|
||||
|
||||
if ( new_size > old_size )
|
||||
{
|
||||
n = 0; /* error */
|
||||
}
|
||||
else if ( new_size < old_size )
|
||||
{
|
||||
unmap_base = (caddr_t) ( membase + new_size );
|
||||
unmap_len = old_size - new_size;
|
||||
n = munmap( unmap_base, unmap_len ) + membase;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined( __linux__ )
|
||||
n = mremap( membase, maxhunksize, curhunksize + sizeof ( int ), 0 );
|
||||
#endif
|
||||
|
||||
if ( n != membase )
|
||||
{
|
||||
Sys_Error( "Hunk_End: Could not remap virtual block (%d)", errno );
|
||||
}
|
||||
|
||||
*( (int *) membase ) = curhunksize + sizeof ( int );
|
||||
|
||||
return ( curhunksize );
|
||||
}
|
||||
|
||||
void
|
||||
Hunk_Free ( void *base )
|
||||
{
|
||||
byte *m;
|
||||
|
||||
if ( base )
|
||||
{
|
||||
m = ( (byte *) base ) - sizeof ( int );
|
||||
|
||||
if ( munmap( m, *( (int *) m ) ) )
|
||||
{
|
||||
Sys_Error( "Hunk_Free: munmap failed (%d)", errno );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,325 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 1997-2001 Id Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <dirent.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/time.h>
|
||||
#include "glob/glob.h"
|
||||
#include "../common/header/common.h"
|
||||
|
||||
#if defined( __FreeBSD__ )
|
||||
#include <machine/param.h>
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif
|
||||
|
||||
|
||||
/* For mremap() */
|
||||
#if defined( __linux__ )
|
||||
#define __USE_GNU
|
||||
#endif
|
||||
|
||||
byte *membase;
|
||||
int maxhunksize;
|
||||
int curhunksize;
|
||||
|
||||
void *
|
||||
Hunk_Begin ( int maxsize )
|
||||
{
|
||||
/* reserve a huge chunk of memory, but don't commit any yet */
|
||||
maxhunksize = maxsize + sizeof ( int );
|
||||
curhunksize = 0;
|
||||
|
||||
membase = mmap( 0, maxhunksize, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0 );
|
||||
|
||||
if ( ( membase == NULL ) || ( membase == (byte *) -1 ) )
|
||||
{
|
||||
Sys_Error( "unable to virtual allocate %d bytes", maxsize );
|
||||
}
|
||||
|
||||
*( (int *) membase ) = curhunksize;
|
||||
|
||||
return ( membase + sizeof ( int ) );
|
||||
}
|
||||
|
||||
void *
|
||||
Hunk_Alloc ( int size )
|
||||
{
|
||||
byte *buf;
|
||||
|
||||
/* round to cacheline */
|
||||
size = ( size + 31 ) & ~31;
|
||||
|
||||
if ( curhunksize + size > maxhunksize )
|
||||
{
|
||||
Sys_Error( "Hunk_Alloc overflow" );
|
||||
}
|
||||
|
||||
buf = membase + sizeof ( int ) + curhunksize;
|
||||
curhunksize += size;
|
||||
return ( buf );
|
||||
}
|
||||
|
||||
int
|
||||
Hunk_End ( void )
|
||||
{
|
||||
byte *n = NULL;
|
||||
|
||||
#if defined( __FreeBSD__ )
|
||||
size_t old_size = maxhunksize;
|
||||
size_t new_size = curhunksize + sizeof ( int );
|
||||
void *unmap_base;
|
||||
size_t unmap_len;
|
||||
|
||||
new_size = round_page( new_size );
|
||||
old_size = round_page( old_size );
|
||||
|
||||
if ( new_size > old_size )
|
||||
{
|
||||
n = 0; /* error */
|
||||
}
|
||||
else if ( new_size < old_size )
|
||||
{
|
||||
unmap_base = (caddr_t) ( membase + new_size );
|
||||
unmap_len = old_size - new_size;
|
||||
n = munmap( unmap_base, unmap_len ) + membase;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined( __linux__ )
|
||||
n = mremap( membase, maxhunksize, curhunksize + sizeof ( int ), 0 );
|
||||
#endif
|
||||
|
||||
if ( n != membase )
|
||||
{
|
||||
Sys_Error( "Hunk_End: Could not remap virtual block (%d)", errno );
|
||||
}
|
||||
|
||||
*( (int *) membase ) = curhunksize + sizeof ( int );
|
||||
|
||||
return ( curhunksize );
|
||||
}
|
||||
|
||||
void
|
||||
Hunk_Free ( void *base )
|
||||
{
|
||||
byte *m;
|
||||
|
||||
if ( base )
|
||||
{
|
||||
m = ( (byte *) base ) - sizeof ( int );
|
||||
|
||||
if ( munmap( m, *( (int *) m ) ) )
|
||||
{
|
||||
Sys_Error( "Hunk_Free: munmap failed (%d)", errno );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int curtime;
|
||||
|
||||
int
|
||||
Sys_Milliseconds ( void )
|
||||
{
|
||||
struct timeval tp;
|
||||
struct timezone tzp;
|
||||
static int secbase;
|
||||
|
||||
gettimeofday( &tp, &tzp );
|
||||
|
||||
if ( !secbase )
|
||||
{
|
||||
secbase = tp.tv_sec;
|
||||
return ( tp.tv_usec / 1000 );
|
||||
}
|
||||
|
||||
curtime = ( tp.tv_sec - secbase ) * 1000 + tp.tv_usec / 1000;
|
||||
|
||||
return ( curtime );
|
||||
}
|
||||
|
||||
void
|
||||
Sys_Mkdir ( char *path )
|
||||
{
|
||||
mkdir( path, 0755 );
|
||||
}
|
||||
|
||||
void
|
||||
Sys_Rmdir ( char *path )
|
||||
{
|
||||
rmdir( path );
|
||||
}
|
||||
|
||||
char *
|
||||
Sys_GetCurrentDirectory ( void )
|
||||
{
|
||||
static char dir [ MAX_OSPATH ];
|
||||
|
||||
if ( !getcwd( dir, sizeof ( dir ) ) )
|
||||
{
|
||||
Sys_Error( "Couldn't get current working directory" );
|
||||
}
|
||||
|
||||
return ( dir );
|
||||
}
|
||||
|
||||
char *
|
||||
strlwr ( char *s )
|
||||
{
|
||||
char *p = s;
|
||||
|
||||
while ( *s )
|
||||
{
|
||||
*s = tolower( *s );
|
||||
s++;
|
||||
}
|
||||
|
||||
return ( p );
|
||||
}
|
||||
|
||||
|
||||
static char findbase [ MAX_OSPATH ];
|
||||
static char findpath [ MAX_OSPATH ];
|
||||
static char findpattern [ MAX_OSPATH ];
|
||||
static DIR *fdir;
|
||||
|
||||
static qboolean
|
||||
CompareAttributes ( char *path, char *name, unsigned musthave, unsigned canthave )
|
||||
{
|
||||
struct stat st;
|
||||
char fn [ MAX_OSPATH ];
|
||||
|
||||
/* . and .. never match */
|
||||
if ( ( strcmp( name, "." ) == 0 ) || ( strcmp( name, ".." ) == 0 ) )
|
||||
{
|
||||
return ( false );
|
||||
}
|
||||
|
||||
return ( true );
|
||||
|
||||
if ( stat( fn, &st ) == -1 )
|
||||
{
|
||||
return ( false ); /* shouldn't happen */
|
||||
}
|
||||
|
||||
if ( ( st.st_mode & S_IFDIR ) && ( canthave & SFF_SUBDIR ) )
|
||||
{
|
||||
return ( false );
|
||||
}
|
||||
|
||||
if ( ( musthave & SFF_SUBDIR ) && !( st.st_mode & S_IFDIR ) )
|
||||
{
|
||||
return ( false );
|
||||
}
|
||||
|
||||
return ( true );
|
||||
}
|
||||
|
||||
char *
|
||||
Sys_FindFirst ( char *path, unsigned musthave, unsigned canhave )
|
||||
{
|
||||
struct dirent *d;
|
||||
char *p;
|
||||
|
||||
if ( fdir )
|
||||
{
|
||||
Sys_Error( "Sys_BeginFind without close" );
|
||||
}
|
||||
|
||||
strcpy( findbase, path );
|
||||
|
||||
if ( ( p = strrchr( findbase, '/' ) ) != NULL )
|
||||
{
|
||||
*p = 0;
|
||||
strcpy( findpattern, p + 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy( findpattern, "*" );
|
||||
}
|
||||
|
||||
if ( strcmp( findpattern, "*.*" ) == 0 )
|
||||
{
|
||||
strcpy( findpattern, "*" );
|
||||
}
|
||||
|
||||
if ( ( fdir = opendir( findbase ) ) == NULL )
|
||||
{
|
||||
return ( NULL );
|
||||
}
|
||||
|
||||
while ( ( d = readdir( fdir ) ) != NULL )
|
||||
{
|
||||
if ( !*findpattern || glob_match( findpattern, d->d_name ) )
|
||||
{
|
||||
if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) )
|
||||
{
|
||||
sprintf( findpath, "%s/%s", findbase, d->d_name );
|
||||
return ( findpath );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ( NULL );
|
||||
}
|
||||
|
||||
char *
|
||||
Sys_FindNext ( unsigned musthave, unsigned canhave )
|
||||
{
|
||||
struct dirent *d;
|
||||
|
||||
if ( fdir == NULL )
|
||||
{
|
||||
return ( NULL );
|
||||
}
|
||||
|
||||
while ( ( d = readdir( fdir ) ) != NULL )
|
||||
{
|
||||
if ( !*findpattern || glob_match( findpattern, d->d_name ) )
|
||||
{
|
||||
if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) )
|
||||
{
|
||||
sprintf( findpath, "%s/%s", findbase, d->d_name );
|
||||
return ( findpath );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ( NULL );
|
||||
}
|
||||
|
||||
void
|
||||
Sys_FindClose ( void )
|
||||
{
|
||||
if ( fdir != NULL )
|
||||
{
|
||||
closedir( fdir );
|
||||
}
|
||||
|
||||
fdir = NULL;
|
||||
}
|
||||
|
|
@ -1,22 +1,29 @@
|
|||
/*
|
||||
* Copyright (C) 1997-2001 Id Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or (at
|
||||
* your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*
|
||||
* =======================================================================
|
||||
*
|
||||
* This file implements all system dependend generic funktions
|
||||
*
|
||||
* =======================================================================
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -36,18 +43,201 @@
|
|||
#include <sys/mman.h>
|
||||
#include <errno.h>
|
||||
#include <dlfcn.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#include "glob/glob.h"
|
||||
#include "../common/header/common.h"
|
||||
|
||||
#include "posix.h"
|
||||
|
||||
unsigned sys_frame_time;
|
||||
int curtime;
|
||||
static void *game_library;
|
||||
|
||||
static char findbase [ MAX_OSPATH ];
|
||||
static char findpath [ MAX_OSPATH ];
|
||||
static char findpattern [ MAX_OSPATH ];
|
||||
static DIR *fdir;
|
||||
|
||||
cvar_t *nostdout;
|
||||
uid_t saved_euid;
|
||||
qboolean stdin_active = true;
|
||||
|
||||
int
|
||||
Sys_Milliseconds ( void )
|
||||
{
|
||||
struct timeval tp;
|
||||
struct timezone tzp;
|
||||
static int secbase;
|
||||
|
||||
gettimeofday( &tp, &tzp );
|
||||
|
||||
if ( !secbase )
|
||||
{
|
||||
secbase = tp.tv_sec;
|
||||
return ( tp.tv_usec / 1000 );
|
||||
}
|
||||
|
||||
curtime = ( tp.tv_sec - secbase ) * 1000 + tp.tv_usec / 1000;
|
||||
|
||||
return ( curtime );
|
||||
}
|
||||
|
||||
void
|
||||
Sys_Mkdir ( char *path )
|
||||
{
|
||||
mkdir( path, 0755 );
|
||||
}
|
||||
|
||||
void
|
||||
Sys_Rmdir ( char *path )
|
||||
{
|
||||
rmdir( path );
|
||||
}
|
||||
|
||||
char *
|
||||
Sys_GetCurrentDirectory ( void )
|
||||
{
|
||||
static char dir [ MAX_OSPATH ];
|
||||
|
||||
if ( !getcwd( dir, sizeof ( dir ) ) )
|
||||
{
|
||||
Sys_Error( "Couldn't get current working directory" );
|
||||
}
|
||||
|
||||
return ( dir );
|
||||
}
|
||||
|
||||
char *
|
||||
strlwr ( char *s )
|
||||
{
|
||||
char *p = s;
|
||||
|
||||
while ( *s )
|
||||
{
|
||||
*s = tolower( *s );
|
||||
s++;
|
||||
}
|
||||
|
||||
return ( p );
|
||||
}
|
||||
|
||||
static qboolean
|
||||
CompareAttributes ( char *path, char *name, unsigned musthave, unsigned canthave )
|
||||
{
|
||||
struct stat st;
|
||||
char fn [ MAX_OSPATH ];
|
||||
|
||||
/* . and .. never match */
|
||||
if ( ( strcmp( name, "." ) == 0 ) || ( strcmp( name, ".." ) == 0 ) )
|
||||
{
|
||||
return ( false );
|
||||
}
|
||||
|
||||
return ( true );
|
||||
|
||||
if ( stat( fn, &st ) == -1 )
|
||||
{
|
||||
return ( false ); /* shouldn't happen */
|
||||
}
|
||||
|
||||
if ( ( st.st_mode & S_IFDIR ) && ( canthave & SFF_SUBDIR ) )
|
||||
{
|
||||
return ( false );
|
||||
}
|
||||
|
||||
if ( ( musthave & SFF_SUBDIR ) && !( st.st_mode & S_IFDIR ) )
|
||||
{
|
||||
return ( false );
|
||||
}
|
||||
|
||||
return ( true );
|
||||
}
|
||||
|
||||
char *
|
||||
Sys_FindFirst ( char *path, unsigned musthave, unsigned canhave )
|
||||
{
|
||||
struct dirent *d;
|
||||
char *p;
|
||||
|
||||
if ( fdir )
|
||||
{
|
||||
Sys_Error( "Sys_BeginFind without close" );
|
||||
}
|
||||
|
||||
strcpy( findbase, path );
|
||||
|
||||
if ( ( p = strrchr( findbase, '/' ) ) != NULL )
|
||||
{
|
||||
*p = 0;
|
||||
strcpy( findpattern, p + 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy( findpattern, "*" );
|
||||
}
|
||||
|
||||
if ( strcmp( findpattern, "*.*" ) == 0 )
|
||||
{
|
||||
strcpy( findpattern, "*" );
|
||||
}
|
||||
|
||||
if ( ( fdir = opendir( findbase ) ) == NULL )
|
||||
{
|
||||
return ( NULL );
|
||||
}
|
||||
|
||||
while ( ( d = readdir( fdir ) ) != NULL )
|
||||
{
|
||||
if ( !*findpattern || glob_match( findpattern, d->d_name ) )
|
||||
{
|
||||
if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) )
|
||||
{
|
||||
sprintf( findpath, "%s/%s", findbase, d->d_name );
|
||||
return ( findpath );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ( NULL );
|
||||
}
|
||||
|
||||
char *
|
||||
Sys_FindNext ( unsigned musthave, unsigned canhave )
|
||||
{
|
||||
struct dirent *d;
|
||||
|
||||
if ( fdir == NULL )
|
||||
{
|
||||
return ( NULL );
|
||||
}
|
||||
|
||||
while ( ( d = readdir( fdir ) ) != NULL )
|
||||
{
|
||||
if ( !*findpattern || glob_match( findpattern, d->d_name ) )
|
||||
{
|
||||
if ( CompareAttributes( findbase, d->d_name, musthave, canhave ) )
|
||||
{
|
||||
sprintf( findpath, "%s/%s", findbase, d->d_name );
|
||||
return ( findpath );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ( NULL );
|
||||
}
|
||||
|
||||
void
|
||||
Sys_FindClose ( void )
|
||||
{
|
||||
if ( fdir != NULL )
|
||||
{
|
||||
closedir( fdir );
|
||||
}
|
||||
|
||||
fdir = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
Sys_ConsoleOutput ( char *string )
|
||||
{
|
||||
|
@ -203,7 +393,6 @@ Sys_ConsoleInput ( void )
|
|||
return ( text );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Sys_UnloadGame ( void )
|
||||
{
|
||||
|
@ -319,8 +508,6 @@ Sys_SendKeyEvents ( void )
|
|||
sys_frame_time = Sys_Milliseconds();
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
int
|
||||
main ( int argc, char **argv )
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue