public: improve Q_strncat fallback implementation

This commit is contained in:
Alibek Omarov 2024-12-17 20:12:58 +03:00
parent 339aebb08c
commit 90a3497afe

View file

@ -187,12 +187,11 @@ static inline size_t Q_strncpy( char *dst, const char *src, size_t size )
return strlcpy( dst, src, size ); return strlcpy( dst, src, size );
#else #else
{ {
size_t len; size_t len = strlen( src );
len = strlen( src ); if( len >= size ) // check if truncate
if( len + 1 > size ) // check if truncate
{ {
memcpy( dst, src, size - 1 ); memcpy( dst, src, size );
dst[size - 1] = 0; dst[size - 1] = 0;
} }
else memcpy( dst, src, len + 1 ); else memcpy( dst, src, len + 1 );
@ -210,30 +209,21 @@ static inline size_t Q_strncat( char *dst, const char *src, size_t size )
return strlcat( dst, src, size ); return strlcat( dst, src, size );
#else #else
{ {
char *d = dst; size_t slen = strlen( src );
const char *s = src; size_t dlen = Q_strnlen( dst, size );
size_t n = size;
size_t dlen;
// find the end of dst and adjust bytes left but don't go past end if( dlen != size )
while( n-- != 0 && *d != '\0' ) d++;
dlen = d - dst;
n = size - dlen;
if( n == 0 ) return( dlen + Q_strlen( s ));
while( *s != '\0' )
{ {
if( n != 1 ) size_t copy = size - dlen - 1;
{
*d++ = *s; if( copy > slen )
n--; copy = slen;
}
s++; memcpy( &dst[dlen], src, copy );
dst[dlen + copy] = 0;
} }
*d = '\0'; return dlen + slen;
return( dlen + ( s - src )); // count does not include NULL
} }
#endif #endif
} }