public: crtlib: add safe COM_FileBase implementation
This commit is contained in:
parent
8f207362a5
commit
ac39090f6e
2 changed files with 24 additions and 26 deletions
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
crtlib.c - internal stdlib
|
crtlib.c - internal stdlib
|
||||||
Copyright (C) 2011 Uncle Mike
|
Copyright (C) 2011 Uncle Mike
|
||||||
|
Copyright (c) QuakeSpasm contributors
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -578,40 +579,37 @@ char *Q_pretifymem( float value, int digitsafterdecimal )
|
||||||
COM_FileBase
|
COM_FileBase
|
||||||
|
|
||||||
Extracts the base name of a file (no path, no extension, assumes '/' as path separator)
|
Extracts the base name of a file (no path, no extension, assumes '/' as path separator)
|
||||||
|
a1ba: adapted and simplified version from QuakeSpasm
|
||||||
============
|
============
|
||||||
*/
|
*/
|
||||||
void COM_FileBase( const char *in, char *out )
|
void COM_FileBase( const char *in, char *out, size_t size )
|
||||||
{
|
{
|
||||||
int len, start, end;
|
const char *dot, *slash, *s;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
len = Q_strlen( in );
|
if( unlikely( !COM_CheckString( in ) || size <= 1 ))
|
||||||
if( !len ) return;
|
{
|
||||||
|
out[0] = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// scan backward for '.'
|
slash = in;
|
||||||
end = len - 1;
|
dot = NULL;
|
||||||
|
for( s = in; *s; s++ )
|
||||||
|
{
|
||||||
|
if( *s == '/' || *s == '\\' )
|
||||||
|
slash = s + 1;
|
||||||
|
|
||||||
while( end && in[end] != '.' && in[end] != '/' && in[end] != '\\' )
|
if( *s == '.' )
|
||||||
end--;
|
dot = s;
|
||||||
|
}
|
||||||
|
|
||||||
if( in[end] != '.' )
|
if( dot == NULL || dot < slash )
|
||||||
end = len-1; // no '.', copy to end
|
dot = s;
|
||||||
else end--; // found ',', copy to left of '.'
|
|
||||||
|
|
||||||
// scan backward for '/'
|
len = Q_min( size - 1, dot - slash );
|
||||||
start = len - 1;
|
|
||||||
|
|
||||||
while( start >= 0 && in[start] != '/' && in[start] != '\\' )
|
memcpy( out, slash, len );
|
||||||
start--;
|
|
||||||
|
|
||||||
if( start < 0 || ( in[start] != '/' && in[start] != '\\' ))
|
|
||||||
start = 0;
|
|
||||||
else start++;
|
|
||||||
|
|
||||||
// length of new sting
|
|
||||||
len = end - start + 1;
|
|
||||||
|
|
||||||
// Copy partial string
|
|
||||||
Q_strncpy( out, &in[start], len + 1 );
|
|
||||||
out[len] = 0;
|
out[len] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ int Q_sprintf( char *buffer, const char *format, ... ) _format( 2 );
|
||||||
void COM_StripColors( const char *in, char *out );
|
void COM_StripColors( const char *in, char *out );
|
||||||
#define Q_memprint( val ) Q_pretifymem( val, 2 )
|
#define Q_memprint( val ) Q_pretifymem( val, 2 )
|
||||||
char *Q_pretifymem( float value, int digitsafterdecimal );
|
char *Q_pretifymem( float value, int digitsafterdecimal );
|
||||||
void COM_FileBase( const char *in, char *out );
|
void COM_FileBase( const char *in, char *out, size_t size );
|
||||||
const char *COM_FileExtension( const char *in );
|
const char *COM_FileExtension( const char *in );
|
||||||
void COM_DefaultExtension( char *path, const char *extension );
|
void COM_DefaultExtension( char *path, const char *extension );
|
||||||
void COM_ReplaceExtension( char *path, const char *extension );
|
void COM_ReplaceExtension( char *path, const char *extension );
|
||||||
|
|
Loading…
Add table
Reference in a new issue