diff options
-rw-r--r-- | source/cl_locs.c | 10 | ||||
-rw-r--r-- | source/cl_parse.c | 11 | ||||
-rw-r--r-- | source/mvd_client.c | 2 | ||||
-rw-r--r-- | source/q_shared.c | 56 | ||||
-rw-r--r-- | source/q_shared.h | 14 | ||||
-rw-r--r-- | source/sv_main.c | 4 | ||||
-rw-r--r-- | source/sv_user.c | 21 | ||||
-rw-r--r-- | source/ui_demos.c | 2 |
8 files changed, 51 insertions, 69 deletions
diff --git a/source/cl_locs.c b/source/cl_locs.c index 71cef2d..8a08359 100644 --- a/source/cl_locs.c +++ b/source/cl_locs.c @@ -44,13 +44,13 @@ LOC_Alloc static location_t *LOC_Alloc( const char *name ) { location_t *loc; char buffer[MAX_QPATH]; - size_t length; + size_t len; - Q_ClearStr( buffer, name, sizeof( buffer ) ); + Q_strlcpy( buffer, name, sizeof( buffer ) ); + len = COM_strclr( buffer ); - length = strlen( buffer ); - loc = Z_Malloc( sizeof( *loc ) + length ); - memcpy( loc->name, buffer, length + 1 ); + loc = Z_Malloc( sizeof( *loc ) + len ); + memcpy( loc->name, buffer, len + 1 ); List_Append( &cl_locations, &loc->entry ); return loc; diff --git a/source/cl_parse.c b/source/cl_parse.c index 178f014..75ed182 100644 --- a/source/cl_parse.c +++ b/source/cl_parse.c @@ -1326,6 +1326,7 @@ CL_ParsePrint static void CL_ParsePrint( void ) { int level; char string[MAX_STRING_CHARS]; + const char *fmt; level = MSG_ReadByte(); MSG_ReadString( string, sizeof( string ) ); @@ -1335,6 +1336,7 @@ static void CL_ParsePrint( void ) { if( level != PRINT_CHAT ) { Com_Printf( "%s", string ); if( !cls.demo.playback ) { + COM_strclr( string ); Cmd_ExecTrigger( string ); } return; @@ -1353,11 +1355,13 @@ static void CL_ParsePrint( void ) { // filter text if( cl_chat_filter->integer ) { - int len = Q_ClearStr( string, string, MAX_STRING_CHARS - 1 ); - string[len] = '\n'; + COM_strclr( string ); + fmt = "%s\n"; + } else { + fmt = "%s"; } - Com_LPrintf( PRINT_TALK, "%s", string ); + Com_LPrintf( PRINT_TALK, fmt, string ); Con_SkipNotify( qfalse ); @@ -1385,6 +1389,7 @@ static void CL_ParseCenterPrint( void ) { SCR_CenterPrint( string ); if( !cls.demo.playback ) { + COM_strclr( string ); Cmd_ExecTrigger( string ); } } diff --git a/source/mvd_client.c b/source/mvd_client.c index 86a72c3..56c3af8 100644 --- a/source/mvd_client.c +++ b/source/mvd_client.c @@ -1506,7 +1506,7 @@ static void list_recordings( void ) { if( pos < 0 ) { strcpy( buffer, "???" ); } else { - Q_FormatFileSize( buffer, pos, sizeof( buffer ) ); + COM_FormatFileSize( buffer, pos, sizeof( buffer ) ); } } else { strcpy( buffer, "-" ); diff --git a/source/q_shared.c b/source/q_shared.c index e1112ea..a032749 100644 --- a/source/q_shared.c +++ b/source/q_shared.c @@ -381,62 +381,34 @@ int QDECL SortStricmp( const void *p1, const void *p2 ) { /* ================ -Q_ClearStr +COM_strclr -Removes high-bit and unprintable characters. -Return number of characters written, not including the NULL character. +Operates inplace, normalizing high-bit and removing unprintable characters. +Returns final number of characters, not including the NUL character. ================ */ -int Q_ClearStr( char *out, const char *in, int bufsize ) { - char *p, *m; +size_t COM_strclr( char *s ) { + char *p; int c; + size_t len; - if( bufsize < 1 ) { - Com_Error( ERR_FATAL, "%s: bad bufsize: %d", __func__, bufsize ); - } - - p = out; - m = out + bufsize - 1; - while( *in && p < m ) { - c = *in++; + p = s; + len = 0; + while( *s ) { + c = *s++; c &= 127; if( Q_isprint( c ) ) { *p++ = c; + len++; } } *p = 0; - return p - out; -} - -int Q_HighlightStr( char *out, const char *in, int bufsize ) { - char *p, *m; - int c; - - if( bufsize < 1 ) { - Com_Error( ERR_FATAL, "%s: bad bufsize: %d", __func__, bufsize ); - } - - p = out; - m = out + bufsize - 1; - while( *in && p < m ) { - c = *in++; - c |= 128; - *p++ = c; - } - - *p = 0; - - return p - out; + return len; } -/* -================ -Q_IsWhiteSpace -================ -*/ -qboolean Q_IsWhiteSpace( const char *s ) { +qboolean COM_iswhite( const char *s ) { int c; while( *s ) { @@ -450,7 +422,7 @@ qboolean Q_IsWhiteSpace( const char *s ) { return qtrue; } -size_t Q_FormatFileSize( char *dest, size_t bytes, size_t size ) { +size_t COM_FormatFileSize( char *dest, size_t bytes, size_t size ) { if( bytes >= 1000000 ) { return Q_snprintf( dest, size, "%2.1fM", ( float )bytes / 1000000 ); } diff --git a/source/q_shared.h b/source/q_shared.h index 400f9e2..3f2b463 100644 --- a/source/q_shared.h +++ b/source/q_shared.h @@ -331,11 +331,6 @@ static inline int rand_byte( void ) { #define Q_SetBit( data, bit ) ( (data)[(bit) >> 3] |= ( 1 << ( (bit) & 7 ) ) ) #define Q_ClearBit( data, bit ) ( (data)[(bit) >> 3] &= ~( 1 << ( (bit) & 7 ) ) ) -qboolean Q_IsWhiteSpace( const char *string ); -size_t Q_FormatFileSize( char *dest, size_t bytes, size_t size ); -int Q_ClearStr( char *out, const char *in, int bufsize ); -int Q_HighlightStr( char *out, const char *in, int bufsize ); - //============================================= // fast "C" macros @@ -449,6 +444,8 @@ qboolean COM_IsFloat( const char *s ); qboolean COM_IsUint( const char *s ); qboolean COM_HasSpaces( const char *s ); +unsigned COM_ParseHex( const char *s ); + char *COM_Parse( const char **data_p ); // data is an in/out parm, returns a parsed out token int COM_Compress( char *data ); @@ -456,6 +453,11 @@ int COM_Compress( char *data ); int QDECL SortStrcmp( const void *p1, const void *p2 ); int QDECL SortStricmp( const void *p1, const void *p2 ); +size_t COM_strclr( char *s ); +qboolean COM_iswhite( const char *s ); + +size_t COM_FormatFileSize( char *dest, size_t bytes, size_t size ); + // buffer safe operations size_t Q_strlcpy( char *dst, const char *src, size_t size ); size_t Q_strlcat( char *dst, const char *src, size_t size ); @@ -467,8 +469,6 @@ size_t Q_vscnprintf( char *dest, size_t size, const char *fmt, va_list argptr ); size_t Q_snprintf( char *dest, size_t size, const char *fmt, ... ) q_printf( 3, 4 ); size_t Q_scnprintf( char *dest, size_t size, const char *fmt, ... ) q_printf( 3, 4 ); -unsigned COM_ParseHex( const char *string ); - char *va( const char *format, ... ) q_printf( 1, 2 ); //============================================= diff --git a/source/sv_main.c b/source/sv_main.c index c7e3a40..9c8d2a0 100644 --- a/source/sv_main.c +++ b/source/sv_main.c @@ -705,7 +705,7 @@ static void SVC_DirectConnect( void ) { } s = Info_ValueForKey( info, "name" ); - if( Q_IsWhiteSpace( s ) ) { + if( COM_iswhite( s ) ) { SV_OobPrintf( "Please set your name before connecting.\n" ); Com_DPrintf( " rejected - empty name.\n" ); return; @@ -1665,7 +1665,7 @@ void SV_UpdateUserinfo( char *userinfo ) { } s = Info_ValueForKey( userinfo, "name" ); - if( Q_IsWhiteSpace( s ) ) { + if( COM_iswhite( s ) ) { if( sv_client->name[0] ) { SV_ClientCommand( sv_client, "set name \"%s\"\n", sv_client->name ); } else { diff --git a/source/sv_user.c b/source/sv_user.c index a8cfc67..7f7c299 100644 --- a/source/sv_user.c +++ b/source/sv_user.c @@ -572,15 +572,14 @@ static void SV_BeginDownload_f( void ) { ssize_t downloadsize, maxdownloadsize, result; int offset = 0; cvar_t *allow; - int length; + size_t len; unsigned flags; qhandle_t f; - length = Q_ClearStr( name, Cmd_Argv( 1 ), sizeof( name ) ); - Q_strlwr( name ); - - if( Cmd_Argc() > 2 ) - offset = atoi( Cmd_Argv( 2 ) ); // downloaded offset + len = Cmd_ArgvBuffer( 1, name, sizeof( name ) ); + if( len >= MAX_QPATH ) { + goto fail1; + } // hack for 'status' command if( !strcmp( name, "http" ) ) { @@ -588,11 +587,17 @@ static void SV_BeginDownload_f( void ) { return; } + len = COM_strclr( name ); + Q_strlwr( name ); + + if( Cmd_Argc() > 2 ) + offset = atoi( Cmd_Argv( 2 ) ); // downloaded offset + // hacked by zoid to allow more conrol over download // first off, no .. or global allow check if( !allow_download->integer // check for empty paths - || !length + || !len // check for illegal negative offsets || offset < 0 // don't allow anything with .. path @@ -600,7 +605,7 @@ static void SV_BeginDownload_f( void ) { // leading dots, slashes, etc are no good || !Q_ispath( name[0] ) // trailing dots, slashes, etc are no good - || !Q_ispath( name[ length - 1 ] ) + || !Q_ispath( name[ len - 1 ] ) // back slashes should be never sent || strchr( name, '\\' ) // colons are bad also diff --git a/source/ui_demos.c b/source/ui_demos.c index ce2e8d7..9e15a01 100644 --- a/source/ui_demos.c +++ b/source/ui_demos.c @@ -85,7 +85,7 @@ static void BuildName( file_info_t *info, char **cache ) { CL_GetDemoInfo( buffer, &demo ); } - Q_FormatFileSize( buffer, info->size, sizeof( buffer ) ); + COM_FormatFileSize( buffer, info->size, sizeof( buffer ) ); e = UI_FormatColumns( DEMO_EXTRASIZE, info->name, buffer, demo.map, demo.pov, NULL ); |