From c068f22329d5cc722622a2183bbb22eef2093df7 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 24 Aug 2026 11:16:07 +0200 Subject: initial import --- src/libparsec/sw_path.cpp | 346 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 src/libparsec/sw_path.cpp (limited to 'src/libparsec/sw_path.cpp') diff --git a/src/libparsec/sw_path.cpp b/src/libparsec/sw_path.cpp new file mode 100644 index 0000000..9369d6b --- /dev/null +++ b/src/libparsec/sw_path.cpp @@ -0,0 +1,346 @@ +/* + * PARSEC - Path Processing + * + * $Author: uberlinuxguy $ - $Date: 2004/09/15 12:25:43 $ + * + * Orginally written by: + * Copyright (c) Markus Hadwiger 1997-1999 + * Copyright (c) Clemens Beer 1998 + * + * 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 "config.h" + +#ifdef SYSTEM_TARGET_WINDOWS + +// C library +#include +#include +#include +#include +#include + +#ifdef SYSTEM_COMPILER_GCC +// POSIX headers +#include +#endif + +// compilation flags/debug support +#include "debug.h" + +// general definitions +#include "general.h" +#include "objstruc.h" + +// global externals +#include "globals.h" + +// i/o system calls +#include "sys_io.h" + +// local module header +#include "sw_path.h" + +// proprietary module headers +#ifdef PARSEC_SERVER + #include "con_ext_sv.h" +#else // !PARSEC_SERVER + #include "con_ext.h" + #include "e_demo.h" +#endif // !PARSEC_SERVER + + + + +// temporary path string ------------------------------------------------------ +// +static char path_string[ PATH_MAX + 1 ]; + + +// process path read from console/script and create valid system path --------- +// +char *SYSs_ProcessPathString( char *path ) +{ + ASSERT( path != NULL ); + + for ( char *scan = path; *scan != 0; scan++ ) { + + // substitute backslashes for slashes + if ( *scan == '/' ) { + *scan = '\\'; + } + } + + return path; +} + + +// scan to file name extension in supplied string ----------------------------- +// +char *SYSs_ScanToExtension( char *fname ) +{ + ASSERT( fname != NULL ); + + char *scan = fname + strlen( fname ); + while ( ( scan != fname ) && ( *scan != '.' ) ) + scan--; + + return scan; +} + + +// strip path (directory names) from file name -------------------------------- +// +char *SYSs_StripPath( char *fname ) +{ + ASSERT( fname != NULL ); + + char *scan = fname + strlen( fname ); + while ( ( scan != fname ) && ( *scan != '\\' ) ) + scan--; + + if ( *scan == '\\' ) + scan++; + + return scan; +} + + +// acquire scripts located at specified path ---------------------------------- +// +int SYSs_AcquireScriptPath( char *path, int comtype, char *prefix ) +{ + ASSERT( path != NULL ); + ASSERT( comtype >= 0 ); +// ASSERT( prefix != NULL ); + + // wildcard extension must be supplied + ASSERT( strlen( path ) > 4 ); + +#ifdef SYSTEM_COMPILER_MSVC + + // open script directory + struct _finddata_t c_file; + long hFile = _findfirst( path, &c_file ); + + if ( hFile != -1L ) { + + int countbase = num_external_commands; + + while ( num_external_commands < MAX_EXTERNAL_COMMANDS ) { + + char *prefixed = c_file.name; + + if ( prefix != NULL ) { + strcpy( path_string, prefix ); + strcat( path_string, "/" ); + strcat( path_string, c_file.name ); + prefixed = SYSs_ProcessPathString( path_string ); + } + + // skip extension + int len = strlen( prefixed ) - 4; + ASSERT( len >= 0 ); + + // release-safe; simply skip file names that are too long + if ( ( len >= 0 ) && ( len <= COMMAND_NAME_ALLOC_LEN ) ) { + + // store base name + strncpy( external_commands[ num_external_commands ], prefixed, len ); + external_commands[ num_external_commands ][ len ] = 0; + + // set type and convert to lower-case + external_command_types[ num_external_commands ] = comtype; + strlwr( external_commands[ num_external_commands ] ); + + num_external_commands++; + } + + if ( _findnext( hFile, &c_file ) != 0 ) { + break; + } + } + + _findclose( hFile ); + return ( num_external_commands - countbase ); + } + +#else // SYSTEM_COMPILER_MSVC + + // open script directory + DIR *dirp = opendir( path ); + + if ( dirp != NULL ) { + + int countbase = num_external_commands; + dirent *direntp; + + // read script names up to maximum number + while ( ( direntp = readdir( dirp ) ) && + ( num_external_commands < MAX_EXTERNAL_COMMANDS ) ) { + + char *prefixed = direntp->d_name; + + if ( prefix != NULL ) { + strcpy( path_string, prefix ); + strcat( path_string, "/" ); + strcat( path_string, direntp->d_name ); + prefixed = SYSs_ProcessPathString( path_string ); + } + + // skip extension + int len = strlen( prefixed ) - 4; + ASSERT( len >= 0 ); + + // release-safe + if ( len < 0 ) + continue; + + // simply skip file names that are too long + if ( len > COMMAND_NAME_ALLOC_LEN ) + continue; + + // store base name + strncpy( external_commands[ num_external_commands ], prefixed, len ); + external_commands[ num_external_commands ][ len ] = 0; + + // set type and convert to lower-case + external_command_types[ num_external_commands ] = comtype; + strlwr( external_commands[ num_external_commands ] ); + + num_external_commands++; + } + + closedir( dirp ); + return ( num_external_commands - countbase ); + } + +#endif // SYSTEM_COMPILER_MSVC + + return 0; +} + + +// acquire demos located at specified path ------------------------------------ +// +int SYSs_AcquireDemoPath( char *path, char *prefix ) +{ + ASSERT( path != NULL ); +// ASSERT( prefix != NULL ); + + // wildcard extension must be supplied + ASSERT( strlen( path ) > 4 ); + +#ifdef PARSEC_CLIENT + +#ifdef SYSTEM_COMPILER_MSVC + + // open demo directory + struct _finddata_t c_file; + long hFile = _findfirst( path, &c_file ); + + if ( hFile != -1L ) { + + int countbase = num_registered_demos; + + while ( num_registered_demos < max_registered_demos ) { + + // skip extension + int len = strlen( c_file.name ) - 4; + ASSERT( len >= 0 ); + + // release-safe + if ( len >= 0 ) { + + // store demo name + int demoid = num_registered_demos; + if ( registered_demo_names[ demoid ] != NULL ) { + FREEMEM( registered_demo_names[ demoid ] ); + registered_demo_names[ demoid ] = NULL; + } + registered_demo_names[ demoid ] = (char *) ALLOCMEM( len + 1 ); + if ( registered_demo_names[ demoid ] == NULL ) + OUTOFMEM( 0 ); + strncpy( registered_demo_names[ demoid ], c_file.name, len ); + registered_demo_names[ demoid ][ len ] = 0; + + // convert to lower-case + strlwr( registered_demo_names[ demoid ] ); + + num_registered_demos++; + } + + if ( _findnext( hFile, &c_file ) != 0 ) { + break; + } + } + + _findclose( hFile ); + return ( num_registered_demos - countbase ); + } + +#else // !SYSTEM_COMPILER_MSVC + + // open demo directory + DIR *dirp = opendir( path ); + + if ( dirp != NULL ) { + + int countbase = num_registered_demos; + dirent *direntp; + + // read demo names up to maximum number + while ( ( direntp = readdir( dirp ) ) && + ( num_registered_demos < max_registered_demos ) ) { + + // skip extension + int len = strlen( direntp->d_name ) - 4; + ASSERT( len >= 0 ); + + // release-safe + if ( len < 0 ) + continue; + + // store demo name + int demoid = num_registered_demos; + if ( registered_demo_names[ demoid ] != NULL ) { + FREEMEM( registered_demo_names[ demoid ] ); + registered_demo_names[ demoid ] = NULL; + } + registered_demo_names[ demoid ] = (char *) ALLOCMEM( len + 1 ); + if ( registered_demo_names[ demoid ] == NULL ) + OUTOFMEM( 0 ); + strncpy( registered_demo_names[ demoid ], direntp->d_name, len ); + registered_demo_names[ demoid ][ len ] = 0; + + // convert to lower-case + strlwr( registered_demo_names[ demoid ] ); + + num_registered_demos++; + } + + closedir( dirp ); + return ( num_registered_demos - countbase ); + } + +#endif // !SYSTEM_COMPILER_MSVC + +#endif // PARSEC_CLIENT + + return 0; +} + + +#endif // SYSTEM_TARGET_WINDOWS -- cgit v1.2.3