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 // if path doesnt have a .EXT, append extension
// (extension should include the .) // (extension should include the .)
// //
src = path + strlen( path ) - 1; void DefaultExtension( char *path, const char *extension ){
char* ext = path_get_filename_base_end( path );
while ( *src != '/' && *src != '\\' && src != path ) if( strempty( ext ) )
{ strcpy( ext, extension );
if ( *src == '.' ) {
return; // it has an extension
}
src--;
}
strcat( path, extension );
} }
@ -716,80 +763,28 @@ void DefaultPath( char *path, const char *basepath ){
void StripFilename( char *path ){ void StripFilename( char *path ){
int length; strclear( path_get_filename_start( path ) );
length = strlen( path ) - 1;
while ( length > 0 && path[length] != '/' && path[ length ] != '\\' )
length--;
path[length] = 0;
} }
void StripExtension( char *path ){ void StripExtension( char *path ){
int length; strclear( path_get_filename_base_end( path ) );
length = strlen( path ) - 1;
while ( length > 0 && path[length] != '.' )
{
length--;
if ( path[length] == '/' || path[ length ] == '\\' ) {
return; // no extension
}
}
if ( length ) {
path[length] = 0;
}
} }
/* // NOTE: includes the slash, otherwise
====================
Extract file parts
====================
*/
// FIXME: should include the slash, otherwise
// backing to an empty path will be wrong when appending a slash // backing to an empty path will be wrong when appending a slash
// hm: includes the slash rn
void ExtractFilePath( const char *path, char *dest ){ void ExtractFilePath( const char *path, char *dest ){
const char *src = path + strlen( path ); strcpyQ( dest, path, path_get_filename_start( path ) - path + 1 ); // +1 for '\0'
//
// back up until a \ or the start
//
while ( src != path && *( src - 1 ) != '\\' && *( src - 1 ) != '/' )
src--;
memcpy( dest, path, src - path );
dest[src - path] = 0;
} }
void ExtractFileBase( const char *path, char *dest ){ void ExtractFileBase( const char *path, char *dest ){
const char *src = path + strlen( path ); const char* start = path_get_filename_start( path );
const char *end = src; const char* end = path_get_filename_base_end( start );
// strcpyQ( dest, start, end - start + 1 ); // +1 for '\0'
// 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;
} }
void ExtractFileExtension( const char *path, char *dest ){ void ExtractFileExtension( const char *path, char *dest ){
const char *src = path + strlen( path ); strcpy( dest, path_get_extension( 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 );
} }

View File

@ -80,6 +80,12 @@ void *safe_calloc_info( size_t size, const char* info );
extern int myargc; extern int myargc;
extern char **myargv; 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 ); char *strlower( char *in );
#ifdef WIN32 #ifdef WIN32
#define Q_stricmp stricmp #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 ); void SaveFile( const char *filename, const void *buffer, int count );
qboolean FileExists( const char *filename ); 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 DefaultExtension( char *path, const char *extension );
void DefaultPath( char *path, const char *basepath ); void DefaultPath( char *path, const char *basepath );
void StripFilename( char *path ); void StripFilename( char *path );