add common functions:

strempty
	strclear
	path_is_absolute
	path_get_filename_start
	path_get_filename_base_end
	path_get_extension
simplify functions:
	DefaultExtension
	StripFilename
	StripExtension
	ExtractFilePath
	ExtractFileBase
	ExtractFileExtension
This commit is contained in:
Garux 2020-01-23 21:55:43 +03:00
parent 0bc1a2a280
commit ba26c2d02b
2 changed files with 78 additions and 73 deletions

View File

@ -682,24 +682,71 @@ void SaveFile( const char *filename, const void *buffer, int count ){
}
/*
====================
Extract file parts
====================
*/
/// \brief Returns true if \p path is a fully qualified file-system path.
qboolean path_is_absolute( const char* path ){
#if defined( WIN32 )
return path[0] == '/'
|| ( path[0] != '\0' && path[1] == ':' ); // local drive
#elif defined( POSIX )
return path[0] == '/';
#endif
}
static inline qboolean path_separator( const char c ){
return c == '/' || c == '\\';
}
/// \brief Returns a pointer to the first character of the filename component of \p path.
char* path_get_filename_start( const char* path ){
const char *src = path + strlen( path );
while ( src != path && !path_separator( *( src - 1 ) ) ){
--src;
}
return src;
}
/// \brief Returns a pointer to the character after the end of the filename component of \p path - either the extension separator or the terminating null character.
char* path_get_filename_base_end( const char* path ){
const char *end = path + strlen( path );
const char *src = end;
while ( src != path && !path_separator( *src ) ){
if( *src == '.' )
return src;
--src;
}
return end;
}
/// \brief Returns a pointer to the first character of the file extension of \p path, or to terminating null character if not found.
char* path_get_extension( const char* path ){
const char *end = path + strlen( path );
const char *src = end;
while ( src != path && !path_separator( *src ) ){
if( *src == '.' )
return src + 1;
--src;
}
return end;
}
void DefaultExtension( char *path, const char *extension ){
char *src;
//
// if path doesnt have a .EXT, append extension
// (extension should include the .)
//
src = path + strlen( path ) - 1;
while ( *src != '/' && *src != '\\' && src != path )
{
if ( *src == '.' ) {
return; // it has an extension
}
src--;
}
strcat( path, extension );
void DefaultExtension( char *path, const char *extension ){
char* ext = path_get_filename_base_end( path );
if( strempty( ext ) )
strcpy( ext, extension );
}
@ -716,80 +763,28 @@ void DefaultPath( char *path, const char *basepath ){
void StripFilename( char *path ){
int length;
length = strlen( path ) - 1;
while ( length > 0 && path[length] != '/' && path[ length ] != '\\' )
length--;
path[length] = 0;
strclear( path_get_filename_start( path ) );
}
void StripExtension( char *path ){
int length;
length = strlen( path ) - 1;
while ( length > 0 && path[length] != '.' )
{
length--;
if ( path[length] == '/' || path[ length ] == '\\' ) {
return; // no extension
}
}
if ( length ) {
path[length] = 0;
}
strclear( path_get_filename_base_end( path ) );
}
/*
====================
Extract file parts
====================
*/
// FIXME: should include the slash, otherwise
// NOTE: includes the slash, otherwise
// backing to an empty path will be wrong when appending a slash
// hm: includes the slash rn
void ExtractFilePath( const char *path, char *dest ){
const char *src = path + strlen( path );
//
// back up until a \ or the start
//
while ( src != path && *( src - 1 ) != '\\' && *( src - 1 ) != '/' )
src--;
memcpy( dest, path, src - path );
dest[src - path] = 0;
strcpyQ( dest, path, path_get_filename_start( path ) - path + 1 ); // +1 for '\0'
}
void ExtractFileBase( const char *path, char *dest ){
const char *src = path + strlen( path );
const char *end = src;
//
// back up until a \ or the start
//
while ( src != path && *( src - 1 ) != '/' && *( src - 1 ) != '\\' ){
src--;
if( *end != '.' && *src == '.' )
end = src;
}
memcpy( dest, src, end - src );
dest[end - src] = 0;
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 ){
const char *src = path + strlen( path );
//
// back up until a . or the start
//
while ( src != path && *( src - 1 ) != '.' )
src--;
if ( src == path ) {
*dest = 0; // no extension
return;
}
strcpy( dest, src );
strcpy( dest, path_get_extension( path ) );
}

View File

@ -80,6 +80,12 @@ void *safe_calloc_info( size_t size, const char* info );
extern int myargc;
extern char **myargv;
static inline qboolean strempty( const char* string ){
return *string == '\0';
}
static inline void strclear( char* string ){
*string = '\0';
}
char *strlower( char *in );
#ifdef WIN32
#define Q_stricmp stricmp
@ -130,6 +136,10 @@ int TryLoadFile( const char *filename, void **bufferptr );
void SaveFile( const char *filename, const void *buffer, int count );
qboolean FileExists( const char *filename );
qboolean path_is_absolute( const char* path );
char* path_get_filename_start( const char* path );
char* path_get_filename_base_end( const char* path );
char* path_get_extension( const char* path );
void DefaultExtension( char *path, const char *extension );
void DefaultPath( char *path, const char *basepath );
void StripFilename( char *path );