separate path manipulating functions
unlimit VFS_MAXDIRS
This commit is contained in:
parent
e1186dd734
commit
97ad9bf5c5
|
|
@ -272,8 +272,7 @@ TextOutputStreamType& ostream_write( TextOutputStreamType& ostream, const Direct
|
||||||
ostream << *i;
|
ostream << *i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--i;
|
if ( !path_separator( *--i ) ) {
|
||||||
if ( *i != '/' && *i != '\\' ) {
|
|
||||||
ostream << '/';
|
ostream << '/';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "inout.h"
|
#include "inout.h"
|
||||||
#include "qstringops.h"
|
#include "qstringops.h"
|
||||||
|
#include "qpathops.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,10 @@
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "inout.h"
|
#include "inout.h"
|
||||||
#include "qstringops.h"
|
#include "qstringops.h"
|
||||||
|
#include "qpathops.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
|
|
@ -424,35 +426,6 @@ int LoadFile( const char *filename, void **bufferptr ){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
==============
|
|
||||||
LoadFileBlock
|
|
||||||
-
|
|
||||||
rounds up memory allocation to 4K boundary
|
|
||||||
-
|
|
||||||
==============
|
|
||||||
*/
|
|
||||||
int LoadFileBlock( const char *filename, void **bufferptr ){
|
|
||||||
FILE *f;
|
|
||||||
int length, nBlock, nAllocSize;
|
|
||||||
void *buffer;
|
|
||||||
|
|
||||||
f = SafeOpenRead( filename );
|
|
||||||
length = Q_filelength( f );
|
|
||||||
nAllocSize = length;
|
|
||||||
nBlock = nAllocSize % MEM_BLOCKSIZE;
|
|
||||||
if ( nBlock > 0 ) {
|
|
||||||
nAllocSize += MEM_BLOCKSIZE - nBlock;
|
|
||||||
}
|
|
||||||
buffer = safe_calloc( nAllocSize + 1 );
|
|
||||||
SafeRead( f, buffer, length );
|
|
||||||
fclose( f );
|
|
||||||
|
|
||||||
*bufferptr = buffer;
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============
|
==============
|
||||||
TryLoadFile
|
TryLoadFile
|
||||||
|
|
@ -496,86 +469,6 @@ void SaveFile( const char *filename, const void *buffer, int count ){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
====================
|
|
||||||
Extract file parts
|
|
||||||
====================
|
|
||||||
*/
|
|
||||||
|
|
||||||
/// \brief Returns a pointer to the last slash or to terminating null character if not found.
|
|
||||||
const char* path_get_last_separator( const char* path ){
|
|
||||||
const char *end = path + strlen( path );
|
|
||||||
const char *src = end;
|
|
||||||
|
|
||||||
while ( src != path ){
|
|
||||||
if( path_separator( *--src ) )
|
|
||||||
return src;
|
|
||||||
}
|
|
||||||
return end;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* path_get_last_separator( char* path ){
|
|
||||||
return const_cast<char*>( path_get_last_separator( const_cast<const char*>( path ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Appends trailing slash, unless \p path is empty or already has slash.
|
|
||||||
void path_add_slash( char *path ){
|
|
||||||
char* end = path + strlen( path );
|
|
||||||
if ( end != path && !path_separator( end[-1] ) )
|
|
||||||
strcat( end, "/" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \brief Appends or replaces .EXT part of \p path with \p extension.
|
|
||||||
void path_set_extension( char *path, const char *extension ){
|
|
||||||
strcpy( path_get_filename_base_end( path ), extension );
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// if path doesnt have a .EXT, append extension
|
|
||||||
// (extension should include the .)
|
|
||||||
//
|
|
||||||
void DefaultExtension( char *path, const char *extension ){
|
|
||||||
char* ext = path_get_filename_base_end( path );
|
|
||||||
if( strEmpty( ext ) )
|
|
||||||
strcpy( ext, extension );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DefaultPath( char *path, const char *basepath ){
|
|
||||||
if( !path_is_absolute( path ) ){
|
|
||||||
char* temp = strdup( path );
|
|
||||||
sprintf( path, "%s%s", basepath, temp );
|
|
||||||
free( temp );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void StripFilename( char *path ){
|
|
||||||
strClear( path_get_filename_start( path ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void StripExtension( char *path ){
|
|
||||||
strClear( path_get_filename_base_end( path ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// NOTE: includes the slash, otherwise
|
|
||||||
// backing to an empty path will be wrong when appending a slash
|
|
||||||
void ExtractFilePath( const char *path, char *dest ){
|
|
||||||
strcpyQ( dest, path, path_get_filename_start( path ) - path + 1 ); // +1 for '\0'
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExtractFileBase( const char *path, char *dest ){
|
|
||||||
const char* start = path_get_filename_start( path );
|
|
||||||
const char* end = path_get_filename_base_end( start );
|
|
||||||
strcpyQ( dest, start, end - start + 1 ); // +1 for '\0'
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExtractFileExtension( const char *path, char *dest ){
|
|
||||||
strcpy( dest, path_get_extension( path ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============
|
==============
|
||||||
ParseNum / ParseHex
|
ParseNum / ParseHex
|
||||||
|
|
|
||||||
|
|
@ -21,38 +21,12 @@
|
||||||
|
|
||||||
// cmdlib.h
|
// cmdlib.h
|
||||||
|
|
||||||
#ifndef __CMDLIB__
|
#pragma once
|
||||||
#define __CMDLIB__
|
|
||||||
|
|
||||||
#include "bytebool.h"
|
#include "bytebool.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable : 4244) // MIPS
|
|
||||||
#pragma warning(disable : 4136) // X86
|
|
||||||
#pragma warning(disable : 4051) // ALPHA
|
|
||||||
|
|
||||||
#pragma warning(disable : 4018) // signed/unsigned mismatch
|
|
||||||
#pragma warning(disable : 4305) // truncate from double to float
|
|
||||||
|
|
||||||
#pragma check_stack(off)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
|
|
||||||
#include "os/path.h"
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
|
|
||||||
#pragma intrinsic( memset, memcpy )
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef PATH_MAX
|
#ifdef PATH_MAX
|
||||||
|
|
@ -60,7 +34,6 @@
|
||||||
#else
|
#else
|
||||||
#define MAX_OS_PATH 4096
|
#define MAX_OS_PATH 4096
|
||||||
#endif
|
#endif
|
||||||
#define MEM_BLOCKSIZE 4096
|
|
||||||
|
|
||||||
#define SAFE_MALLOC
|
#define SAFE_MALLOC
|
||||||
#ifdef SAFE_MALLOC
|
#ifdef SAFE_MALLOC
|
||||||
|
|
@ -115,31 +88,11 @@ void SafeRead( FILE *f, void *buffer, int count );
|
||||||
void SafeWrite( FILE *f, const void *buffer, int count );
|
void SafeWrite( FILE *f, const void *buffer, int count );
|
||||||
|
|
||||||
int LoadFile( const char *filename, void **bufferptr );
|
int LoadFile( const char *filename, void **bufferptr );
|
||||||
int LoadFileBlock( const char *filename, void **bufferptr );
|
|
||||||
int TryLoadFile( const char *filename, void **bufferptr );
|
int TryLoadFile( const char *filename, void **bufferptr );
|
||||||
void SaveFile( const char *filename, const void *buffer, int count );
|
void SaveFile( const char *filename, const void *buffer, int count );
|
||||||
bool FileExists( const char *filename );
|
bool FileExists( const char *filename );
|
||||||
|
|
||||||
|
|
||||||
const char* path_get_last_separator( const char* path );
|
|
||||||
char* path_get_last_separator( char* path );
|
|
||||||
void path_add_slash( char *path );
|
|
||||||
void path_set_extension( char *path, const char *extension );
|
|
||||||
void DefaultExtension( char *path, const char *extension );
|
|
||||||
void DefaultPath( char *path, const char *basepath );
|
|
||||||
void StripFilename( char *path );
|
|
||||||
void StripExtension( char *path );
|
|
||||||
|
|
||||||
static inline void FixDOSName( char *src ){
|
|
||||||
for ( ; *src; ++src )
|
|
||||||
if ( *src == '\\' )
|
|
||||||
*src = '/';
|
|
||||||
}
|
|
||||||
|
|
||||||
void ExtractFilePath( const char *path, char *dest ); // file directory with trailing slash
|
|
||||||
void ExtractFileBase( const char *path, char *dest ); // file name w/o extension
|
|
||||||
void ExtractFileExtension( const char *path, char *dest );
|
|
||||||
|
|
||||||
int ParseNum( const char *str );
|
int ParseNum( const char *str );
|
||||||
|
|
||||||
short BigShort( short l );
|
short BigShort( short l );
|
||||||
|
|
@ -159,13 +112,3 @@ void QCopyFile( const char *from, const char *to );
|
||||||
|
|
||||||
// sleep for the given amount of milliseconds
|
// sleep for the given amount of milliseconds
|
||||||
void Sys_Sleep( int n );
|
void Sys_Sleep( int n );
|
||||||
|
|
||||||
// for compression routines
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
void *data;
|
|
||||||
int count, width, height;
|
|
||||||
} cblock_t;
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include "inout.h"
|
#include "inout.h"
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "qstringops.h"
|
#include "qstringops.h"
|
||||||
|
#include "qpathops.h"
|
||||||
#include "etclib.h"
|
#include "etclib.h"
|
||||||
#include "imagelib.h"
|
#include "imagelib.h"
|
||||||
#include "vfs.h"
|
#include "vfs.h"
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
#include "inout.h"
|
#include "inout.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <algorithm>
|
||||||
#include "generic/vector.h"
|
#include "generic/vector.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "inout.h"
|
#include "inout.h"
|
||||||
|
|
|
||||||
105
tools/quake3/common/qpathops.h
Normal file
105
tools/quake3/common/qpathops.h
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1999-2006 Id Software, Inc. and contributors.
|
||||||
|
For a list of contributors, see the accompanying CONTRIBUTORS file.
|
||||||
|
|
||||||
|
This file is part of GtkRadiant.
|
||||||
|
|
||||||
|
GtkRadiant 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.
|
||||||
|
|
||||||
|
GtkRadiant 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 GtkRadiant; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
// cmdlib.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "os/path.h"
|
||||||
|
#include "qstringops.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
====================
|
||||||
|
Extract file parts
|
||||||
|
====================
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// \brief Returns a pointer to the last slash or to terminating null character if not found.
|
||||||
|
inline const char* path_get_last_separator( const char* path ){
|
||||||
|
const char *end = path + strlen( path );
|
||||||
|
const char *src = end;
|
||||||
|
|
||||||
|
while ( src != path ){
|
||||||
|
if( path_separator( *--src ) )
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline char* path_get_last_separator( char* path ){
|
||||||
|
return const_cast<char*>( path_get_last_separator( const_cast<const char*>( path ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \brief Appends trailing slash, unless \p path is empty or already has slash.
|
||||||
|
inline void path_add_slash( char *path ){
|
||||||
|
char* end = path + strlen( path );
|
||||||
|
if ( end != path && !path_separator( end[-1] ) )
|
||||||
|
strcat( end, "/" );
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \brief Appends or replaces .EXT part of \p path with \p extension.
|
||||||
|
inline void path_set_extension( char *path, const char *extension ){
|
||||||
|
strcpy( path_get_filename_base_end( path ), extension );
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// if path doesnt have a .EXT, append extension
|
||||||
|
// (extension should include the .)
|
||||||
|
//
|
||||||
|
inline void DefaultExtension( char *path, const char *extension ){
|
||||||
|
char* ext = path_get_filename_base_end( path );
|
||||||
|
if( strEmpty( ext ) )
|
||||||
|
strcpy( ext, extension );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void StripFilename( char *path ){
|
||||||
|
strClear( path_get_filename_start( path ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void StripExtension( char *path ){
|
||||||
|
strClear( path_get_filename_base_end( path ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void FixDOSName( char *src ){
|
||||||
|
for ( ; *src; ++src )
|
||||||
|
if ( *src == '\\' )
|
||||||
|
*src = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
// file directory with trailing slash
|
||||||
|
// NOTE: includes the slash, otherwise
|
||||||
|
// backing to an empty path will be wrong when appending a slash
|
||||||
|
inline void ExtractFilePath( const char *path, char *dest ){
|
||||||
|
strcpyQ( dest, path, path_get_filename_start( path ) - path + 1 ); // +1 for '\0'
|
||||||
|
}
|
||||||
|
|
||||||
|
// file name w/o extension
|
||||||
|
inline void ExtractFileBase( const char *path, char *dest ){
|
||||||
|
const char* start = path_get_filename_start( path );
|
||||||
|
const char* end = path_get_filename_base_end( start );
|
||||||
|
strcpyQ( dest, start, end - start + 1 ); // +1 for '\0'
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void ExtractFileExtension( const char *path, char *dest ){
|
||||||
|
strcpy( dest, path_get_extension( path ) );
|
||||||
|
}
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "inout.h"
|
#include "inout.h"
|
||||||
#include "qstringops.h"
|
#include "qstringops.h"
|
||||||
|
#include "qpathops.h"
|
||||||
#include "scriplib.h"
|
#include "scriplib.h"
|
||||||
#include "vfs.h"
|
#include "vfs.h"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,12 +41,27 @@
|
||||||
// Leonardo Zide (leo@lokigames.com)
|
// Leonardo Zide (leo@lokigames.com)
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#if defined ( __linux__ ) || defined ( __APPLE__ )
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#else
|
||||||
|
#include <io.h>
|
||||||
|
|
||||||
|
#ifndef R_OK
|
||||||
|
#define R_OK 04
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "qstringops.h"
|
#include "qstringops.h"
|
||||||
|
#include "qpathops.h"
|
||||||
#include "filematch.h"
|
#include "filematch.h"
|
||||||
#include "inout.h"
|
#include "inout.h"
|
||||||
#include "vfs.h"
|
#include "vfs.h"
|
||||||
|
|
@ -80,10 +95,8 @@ struct VFS_PAKFILE
|
||||||
|
|
||||||
static std::forward_list<VFS_PAK> g_paks;
|
static std::forward_list<VFS_PAK> g_paks;
|
||||||
static std::forward_list<VFS_PAKFILE> g_pakFiles;
|
static std::forward_list<VFS_PAKFILE> g_pakFiles;
|
||||||
static char g_strDirs[VFS_MAXDIRS][PATH_MAX + 1];
|
static std::vector<CopiedString> g_strDirs;
|
||||||
static int g_numDirs;
|
std::vector<CopiedString> g_strForbiddenDirs;
|
||||||
char g_strForbiddenDirs[VFS_MAXDIRS][PATH_MAX + 1];
|
|
||||||
int g_numForbiddenDirs = 0;
|
|
||||||
static constexpr bool g_bUsePak = true;
|
static constexpr bool g_bUsePak = true;
|
||||||
char g_strLoadedFileLocation[1024];
|
char g_strLoadedFileLocation[1024];
|
||||||
|
|
||||||
|
|
@ -147,31 +160,26 @@ static void vfsInitPakFile( const char *filename ){
|
||||||
// reads all pak files from a dir
|
// reads all pak files from a dir
|
||||||
void vfsInitDirectory( const char *path ){
|
void vfsInitDirectory( const char *path ){
|
||||||
GDir *dir;
|
GDir *dir;
|
||||||
int j;
|
|
||||||
|
|
||||||
for ( j = 0; j < g_numForbiddenDirs; ++j )
|
const auto path_is_forbidden = []( const char *path ){
|
||||||
|
for ( const auto& forbidden : g_strForbiddenDirs )
|
||||||
|
if ( matchpattern( path_get_filename_start( path ), forbidden.c_str(), TRUE ) )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
char* dbuf = strdup( path );
|
StringBuffer buf( path );
|
||||||
if ( !strEmpty( dbuf ) && path_separator( dbuf[strlen( dbuf ) - 1] ) ) // del trailing slash
|
if ( !buf.empty() && path_separator( buf.back() ) ) // del trailing slash
|
||||||
strClear( &dbuf[strlen( dbuf ) - 1] );
|
buf.pop_back();
|
||||||
if ( matchpattern( path_get_filename_start( dbuf ), g_strForbiddenDirs[j], TRUE ) ) {
|
if ( path_is_forbidden( buf.c_str() ) )
|
||||||
free( dbuf );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
free( dbuf );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( g_numDirs == VFS_MAXDIRS ) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sys_Printf( "VFS Init: %s\n", path );
|
Sys_Printf( "VFS Init: %s\n", path );
|
||||||
|
|
||||||
strncpy( g_strDirs[g_numDirs], path, PATH_MAX );
|
// clean and store copy to be safe of original's reallocation
|
||||||
g_strDirs[g_numDirs][PATH_MAX] = 0;
|
const CopiedString pathCleaned = g_strDirs.emplace_back( StringOutputStream( 256 )( DirectoryCleaned( path ) ) );
|
||||||
FixDOSName( g_strDirs[g_numDirs] );
|
|
||||||
path_add_slash( g_strDirs[g_numDirs] );
|
|
||||||
g_numDirs++;
|
|
||||||
|
|
||||||
if ( g_bUsePak ) {
|
if ( g_bUsePak ) {
|
||||||
dir = g_dir_open( path, 0, NULL );
|
dir = g_dir_open( path, 0, NULL );
|
||||||
|
|
@ -181,29 +189,16 @@ void vfsInitDirectory( const char *path ){
|
||||||
const char* name;
|
const char* name;
|
||||||
while ( ( name = g_dir_read_name( dir ) ) )
|
while ( ( name = g_dir_read_name( dir ) ) )
|
||||||
{
|
{
|
||||||
for ( j = 0; j < g_numForbiddenDirs; ++j )
|
if ( path_is_forbidden( name ) )
|
||||||
{
|
|
||||||
if ( matchpattern( path_get_filename_start( name ), g_strForbiddenDirs[j], TRUE ) ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( j < g_numForbiddenDirs ) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
const char *ext = path_get_filename_base_end( name );
|
const char *ext = path_get_filename_base_end( name );
|
||||||
|
|
||||||
if ( striEqual( ext, ".pk3" ) ) {
|
if ( striEqual( ext, ".pk3" ) ) {
|
||||||
paks.push_back( StringOutputStream( 256 )( path, '/', name ) );
|
paks.push_back( StringOutputStream( 256 )( pathCleaned.c_str(), name ) );
|
||||||
}
|
}
|
||||||
else if ( striEqual( ext, ".pk3dir" ) ) {
|
else if ( striEqual( ext, ".pk3dir" ) ) {
|
||||||
if ( g_numDirs == VFS_MAXDIRS ) {
|
g_strDirs.emplace_back( StringOutputStream( 256 )( pathCleaned.c_str(), name, '/' ) );
|
||||||
continue;
|
|
||||||
}
|
|
||||||
snprintf( g_strDirs[g_numDirs], PATH_MAX, "%s/%s", path, name );
|
|
||||||
FixDOSName( g_strDirs[g_numDirs] );
|
|
||||||
path_add_slash( g_strDirs[g_numDirs] );
|
|
||||||
++g_numDirs;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_dir_close( dir );
|
g_dir_close( dir );
|
||||||
|
|
@ -233,8 +228,8 @@ std::vector<CopiedString> vfsListShaderFiles( const char *shaderPath ){
|
||||||
list.emplace_back( name );
|
list.emplace_back( name );
|
||||||
};
|
};
|
||||||
/* search in dirs */
|
/* search in dirs */
|
||||||
for ( int i = 0; i < g_numDirs; i++ ){
|
for ( const auto& strdir : g_strDirs ){
|
||||||
GDir *dir = g_dir_open( StringOutputStream( 256 )( g_strDirs[ i ], shaderPath, "/" ), 0, NULL );
|
GDir *dir = g_dir_open( StringOutputStream( 256 )( strdir.c_str(), shaderPath, "/" ), 0, NULL );
|
||||||
|
|
||||||
if ( dir != NULL ) {
|
if ( dir != NULL ) {
|
||||||
const char* name;
|
const char* name;
|
||||||
|
|
@ -268,7 +263,7 @@ void vfsShutdown(){
|
||||||
|
|
||||||
// return the number of files that match
|
// return the number of files that match
|
||||||
int vfsGetFileCount( const char *filename ){
|
int vfsGetFileCount( const char *filename ){
|
||||||
int i, count = 0;
|
int count = 0;
|
||||||
char fixed[NAME_MAX], tmp[NAME_MAX];
|
char fixed[NAME_MAX], tmp[NAME_MAX];
|
||||||
|
|
||||||
strcpy( fixed, filename );
|
strcpy( fixed, filename );
|
||||||
|
|
@ -282,9 +277,9 @@ int vfsGetFileCount( const char *filename ){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( i = 0; i < g_numDirs; i++ )
|
for ( const auto& dir : g_strDirs )
|
||||||
{
|
{
|
||||||
strcpy( tmp, g_strDirs[i] );
|
strcpy( tmp, dir.c_str() );
|
||||||
strcat( tmp, fixed );
|
strcat( tmp, fixed );
|
||||||
if ( access( tmp, R_OK ) == 0 ) {
|
if ( access( tmp, R_OK ) == 0 ) {
|
||||||
count++;
|
count++;
|
||||||
|
|
@ -296,7 +291,7 @@ int vfsGetFileCount( const char *filename ){
|
||||||
|
|
||||||
// NOTE: when loading a file, you have to allocate one extra byte and set it to \0
|
// NOTE: when loading a file, you have to allocate one extra byte and set it to \0
|
||||||
int vfsLoadFile( const char *filename, void **bufferptr, int index ){
|
int vfsLoadFile( const char *filename, void **bufferptr, int index ){
|
||||||
int i, count = 0;
|
int count = 0;
|
||||||
char tmp[NAME_MAX], fixed[NAME_MAX];
|
char tmp[NAME_MAX], fixed[NAME_MAX];
|
||||||
|
|
||||||
// filename is a full path
|
// filename is a full path
|
||||||
|
|
@ -331,9 +326,9 @@ int vfsLoadFile( const char *filename, void **bufferptr, int index ){
|
||||||
FixDOSName( fixed );
|
FixDOSName( fixed );
|
||||||
strLower( fixed );
|
strLower( fixed );
|
||||||
|
|
||||||
for ( i = 0; i < g_numDirs; i++ )
|
for ( const auto& dir : g_strDirs )
|
||||||
{
|
{
|
||||||
strcpy( tmp, g_strDirs[i] );
|
strcpy( tmp, dir.c_str() );
|
||||||
strcat( tmp, filename );
|
strcat( tmp, filename );
|
||||||
if ( access( tmp, R_OK ) == 0 ) {
|
if ( access( tmp, R_OK ) == 0 ) {
|
||||||
if ( count == index ) {
|
if ( count == index ) {
|
||||||
|
|
@ -386,9 +381,9 @@ int vfsLoadFile( const char *filename, void **bufferptr, int index ){
|
||||||
// we need to end the buffer with a 0
|
// we need to end the buffer with a 0
|
||||||
( (char*) ( *bufferptr ) )[file.size] = 0;
|
( (char*) ( *bufferptr ) )[file.size] = 0;
|
||||||
|
|
||||||
i = unzReadCurrentFile( zipfile, *bufferptr, file.size );
|
const int size = unzReadCurrentFile( zipfile, *bufferptr, file.size );
|
||||||
unzCloseCurrentFile( zipfile );
|
unzCloseCurrentFile( zipfile );
|
||||||
if ( i < 0 ) {
|
if ( size < 0 ) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|
@ -406,7 +401,6 @@ int vfsLoadFile( const char *filename, void **bufferptr, int index ){
|
||||||
|
|
||||||
|
|
||||||
bool vfsPackFile( const char *filename, const char *packname, const int compLevel ){
|
bool vfsPackFile( const char *filename, const char *packname, const int compLevel ){
|
||||||
int i;
|
|
||||||
char tmp[NAME_MAX], fixed[NAME_MAX];
|
char tmp[NAME_MAX], fixed[NAME_MAX];
|
||||||
|
|
||||||
byte *bufferptr = NULL;
|
byte *bufferptr = NULL;
|
||||||
|
|
@ -414,9 +408,9 @@ bool vfsPackFile( const char *filename, const char *packname, const int compLeve
|
||||||
FixDOSName( fixed );
|
FixDOSName( fixed );
|
||||||
strLower( fixed );
|
strLower( fixed );
|
||||||
|
|
||||||
for ( i = 0; i < g_numDirs; i++ )
|
for ( const auto& dir : g_strDirs )
|
||||||
{
|
{
|
||||||
strcpy( tmp, g_strDirs[i] );
|
strcpy( tmp, dir.c_str() );
|
||||||
strcat( tmp, filename );
|
strcat( tmp, filename );
|
||||||
if ( access( tmp, R_OK ) == 0 ) {
|
if ( access( tmp, R_OK ) == 0 ) {
|
||||||
if ( access( packname, R_OK ) == 0 ) {
|
if ( access( packname, R_OK ) == 0 ) {
|
||||||
|
|
@ -468,14 +462,14 @@ bool vfsPackFile( const char *filename, const char *packname, const int compLeve
|
||||||
// we need to end the buffer with a 0
|
// we need to end the buffer with a 0
|
||||||
bufferptr[file.size] = 0;
|
bufferptr[file.size] = 0;
|
||||||
|
|
||||||
i = unzReadCurrentFile( zipfile, bufferptr, file.size );
|
const int size = unzReadCurrentFile( zipfile, bufferptr, file.size );
|
||||||
unzCloseCurrentFile( zipfile );
|
unzCloseCurrentFile( zipfile );
|
||||||
if ( i < 0 ) {
|
if ( size < 0 ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
mz_bool success = MZ_TRUE;
|
mz_bool success = MZ_TRUE;
|
||||||
success &= mz_zip_add_mem_to_archive_file_in_place_with_time( packname, filename, bufferptr, i, 0, 0, compLevel, file.zipinfo.cur_file_info.dosDate );
|
success &= mz_zip_add_mem_to_archive_file_in_place_with_time( packname, filename, bufferptr, size, 0, 0, compLevel, file.zipinfo.cur_file_info.dosDate );
|
||||||
if ( !success ){
|
if ( !success ){
|
||||||
Error( "Failed creating zip archive \"%s\"!\n", packname );
|
Error( "Failed creating zip archive \"%s\"!\n", packname );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,29 +28,7 @@
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _VFS_H_
|
#pragma once
|
||||||
#define _VFS_H_
|
|
||||||
|
|
||||||
// to get PATH_MAX
|
|
||||||
#include <stdio.h>
|
|
||||||
#if defined ( __linux__ ) || defined ( __APPLE__ )
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#else
|
|
||||||
#include <wtypes.h>
|
|
||||||
#include <io.h>
|
|
||||||
|
|
||||||
#ifndef R_OK
|
|
||||||
#define R_OK 04
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//#define S_ISDIR( mode ) ( mode & _S_IFDIR )
|
|
||||||
#define PATH_MAX 260
|
|
||||||
#endif
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
#define VFS_MAXDIRS 64
|
|
||||||
|
|
||||||
void vfsInitDirectory( const char *path );
|
void vfsInitDirectory( const char *path );
|
||||||
void vfsShutdown();
|
void vfsShutdown();
|
||||||
|
|
@ -60,8 +38,5 @@ std::vector<CopiedString> vfsListShaderFiles( const char *shaderPath );
|
||||||
bool vfsPackFile( const char *filename, const char *packname, const int compLevel );
|
bool vfsPackFile( const char *filename, const char *packname, const int compLevel );
|
||||||
bool vfsPackFile_Absolute_Path( const char *filepath, const char *filename, const char *packname, const int compLevel );
|
bool vfsPackFile_Absolute_Path( const char *filepath, const char *filename, const char *packname, const int compLevel );
|
||||||
|
|
||||||
extern char g_strForbiddenDirs[VFS_MAXDIRS][PATH_MAX + 1];
|
extern std::vector<CopiedString> g_strForbiddenDirs;
|
||||||
extern int g_numForbiddenDirs;
|
|
||||||
extern char g_strLoadedFileLocation[1024];
|
extern char g_strLoadedFileLocation[1024];
|
||||||
|
|
||||||
#endif // _VFS_H_
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
#include "md3lib.h"
|
#include "md3lib.h"
|
||||||
#include "inout.h"
|
#include "inout.h"
|
||||||
#include "../common/cmdlib.h"
|
#include "../common/cmdlib.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** MD3_ComputeTagFromTri
|
** MD3_ComputeTagFromTri
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include "../common/cmdlib.h"
|
#include "../common/cmdlib.h"
|
||||||
#include "../common/qstringops.h"
|
#include "../common/qstringops.h"
|
||||||
|
#include "../common/qpathops.h"
|
||||||
|
|
||||||
#define MAX_POLYSETS 64
|
#define MAX_POLYSETS 64
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
#include "../common/cmdlib.h"
|
#include "../common/cmdlib.h"
|
||||||
#include "../common/inout.h"
|
#include "../common/inout.h"
|
||||||
#include "../common/qstringops.h"
|
#include "../common/qstringops.h"
|
||||||
|
#include "../common/qpathops.h"
|
||||||
#include "scriplib.h"
|
#include "scriplib.h"
|
||||||
#include "mathlib.h"
|
#include "mathlib.h"
|
||||||
#include "polyset.h"
|
#include "polyset.h"
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <time.h>
|
||||||
#include "q3data.h"
|
#include "q3data.h"
|
||||||
|
|
||||||
static int s_resample_width = 256;
|
static int s_resample_width = 256;
|
||||||
|
|
@ -39,6 +40,13 @@ static byte *s_soundtrack;
|
||||||
static char s_base[32];
|
static char s_base[32];
|
||||||
static char s_output_base[32];
|
static char s_output_base[32];
|
||||||
|
|
||||||
|
// for compression routines
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
void *data;
|
||||||
|
int count, width, height;
|
||||||
|
} cblock_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
===============================================================================
|
===============================================================================
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -401,11 +401,7 @@ void InitPaths( int *argc, char **argv ){
|
||||||
Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
|
Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
|
||||||
}
|
}
|
||||||
argv[ i - 1 ] = NULL;
|
argv[ i - 1 ] = NULL;
|
||||||
if ( g_numForbiddenDirs < VFS_MAXDIRS ) {
|
g_strForbiddenDirs.emplace_back( argv[i] );
|
||||||
strncpy( g_strForbiddenDirs[g_numForbiddenDirs], argv[i], PATH_MAX );
|
|
||||||
g_strForbiddenDirs[g_numForbiddenDirs][PATH_MAX] = 0;
|
|
||||||
++g_numForbiddenDirs;
|
|
||||||
}
|
|
||||||
argv[ i ] = NULL;
|
argv[ i ] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@
|
||||||
|
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "qstringops.h"
|
#include "qstringops.h"
|
||||||
|
#include "qpathops.h"
|
||||||
#include "md5lib.h"
|
#include "md5lib.h"
|
||||||
#include "ddslib.h"
|
#include "ddslib.h"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user