@@ -43,6 +43,7 @@ If you have questions concerning this license or the applicable additional terms
4343#include <math.h>
4444#include <stddef.h>
4545#include <stdio.h>
46+ #include <stdarg.h>
4647#include <stdlib.h>
4748#include <string.h>
4849
@@ -207,19 +208,51 @@ qboolean Q_isintegral( float f )
207208 return (qboolean )( (int )f == f );
208209}
209210
211+ #ifdef _WIN32
212+ #define QDECL __cdecl
213+ #define NORETURN __declspec(noreturn)
214+ #define FORMAT_PRINTF (x , y ) /* nothing */
215+ #elif defined(__GNUC__ ) || defined(__clang__ )
216+ #define QDECL
217+ #define NORETURN __attribute__((noreturn))
218+ #define FORMAT_PRINTF (x , y ) __attribute__((format (printf, x, y)))
219+ #else
220+ #define QDECL
221+ #define NORETURN /* nothing */
222+ #endif
223+
224+ void NORETURN trap_Error (const char * fmt );
225+
226+ static void FORMAT_PRINTF (1 ,2 ) NORETURN QDECL Lib_Error ( const char * error , ... ) {
227+ va_list argptr ;
228+ char text [8192 ];
229+
230+ va_start (argptr , error );
231+ Q_vsnprintf (text , sizeof (text ), error , argptr );
232+ va_end (argptr );
233+
234+ trap_Error ( text );
235+ }
236+
210237/*
211238=============
212239Q_strncpyz
213240
214241Safe strncpy that ensures a trailing zero
215242=============
216243*/
217- void Q_strncpyz ( char * dest , const char * src , int destsize ) {
218- assert (src );
219- assert (dest );
220- assert (destsize );
244+ void Q_strncpyz_fn ( char * dest , const char * src , const int destsize , const char * func , const char * file , const int line ) {
245+ if (!dest ) {
246+ Lib_Error ("Q_strncpyz: NULL dest (%s, %s:%i)" , func , file , line );
247+ }
248+ if (!src ) {
249+ Lib_Error ("Q_strncpyz: NULL src (%s, %s:%i)" , func , file , line );
250+ }
251+ if (destsize < 1 ) {
252+ Lib_Error ("Q_strncpyz: destsize < 1 (%s, %s:%i)" , func , file , line );
253+ }
221254
222- strncpy ( dest , src , destsize - 1 );
255+ strncpy ( dest , src , ( size_t ) destsize - 1 );
223256 dest [destsize - 1 ] = '\0' ;
224257}
225258
@@ -386,20 +419,30 @@ char *Q_strupr( char *s1 ) {
386419}
387420
388421// never goes past bounds or leaves without a terminating 0
389- void Q_strcat ( char * dest , int size , const char * src ) {
390- int l1 ;
422+ void Q_strcat_fn ( char * dest , const int size , const char * src , const char * func , const char * file , const int line ) {
423+ const int l1 = ( int ) strlen ( dest ) ;
391424
392- l1 = strlen ( dest );
393425 if ( l1 >= size ) {
394- //Com_Error( ERR_FATAL, "Q_strcat: already overflowed" );
395- return ;
426+ Lib_Error ( "Q_strcat: already overflowed" );
427+ // return;
396428 }
397429 if ( strlen (src )+ 1 > (size_t )(size - l1 ))
398430 { //do the error here instead of in Q_strncpyz to get a meaningful msg
399- //Com_Error(ERR_FATAL,"Q_strcat: cannot append \"%s\" to \"%s\"", src, dest);
400- return ;
431+ Lib_Error ("Q_strcat: cannot append \"%s\" to \"%s\"" , src , dest );
432+ //return;
433+ }
434+ Q_strncpyz_fn ( dest + l1 , src , size - l1 , func , file , line );
435+ }
436+
437+ size_t Q_strnlen_fn (const char * str , size_t strsz , const char * func , const char * file , const int line ) {
438+ const char * p ;
439+ if (!str ) {
440+ Lib_Error ("Q_strnlen: NULL str (%s, %s:%i)" , func , file , line );
441+ //return 0;
401442 }
402- Q_strncpyz ( dest + l1 , src , size - l1 );
443+
444+ p = memchr (str , 0 , strsz );
445+ return p ? p - str : strsz ;
403446}
404447
405448char * Q_stradd ( char * dst , const char * src )
@@ -687,3 +730,11 @@ int Q_vsnprintf(char *str, size_t size, const char *format, va_list ap)
687730}
688731#endif
689732
733+ float Q_atof (const char * str ) {
734+ const float f = strtof (str , NULL );
735+ return (isfinite (f ) ? f : 0 );
736+ }
737+
738+ int Q_atoi (const char * str ) {
739+ return (int )strtol (str , NULL , 10 );
740+ }
0 commit comments