|  |  |  | @ -18,7 +18,7 @@ | 
			
		
	
		
			
				
					|  |  |  |  | //    Leonard Ritter
 | 
			
		
	
		
			
				
					|  |  |  |  | //    Stefano Zanotti
 | 
			
		
	
		
			
				
					|  |  |  |  | //    Adam Allison
 | 
			
		
	
		
			
				
					|  |  |  |  | //    Kevin Schmidt
 | 
			
		
	
		
			
				
					|  |  |  |  | //    Arvid Gerstmann
 | 
			
		
	
		
			
				
					|  |  |  |  | //
 | 
			
		
	
		
			
				
					|  |  |  |  | // LICENSE:
 | 
			
		
	
		
			
				
					|  |  |  |  | //
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -140,37 +140,25 @@ PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC): | 
			
		
	
		
			
				
					|  |  |  |  | "...512 char string..." ( 35.0x/32.5x faster!) | 
			
		
	
		
			
				
					|  |  |  |  | */ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if defined(__clang__) | 
			
		
	
		
			
				
					|  |  |  |  |  #if defined(__has_feature) && defined(__has_attribute) | 
			
		
	
		
			
				
					|  |  |  |  | #if defined(__has_feature) | 
			
		
	
		
			
				
					|  |  |  |  |    #if __has_feature(address_sanitizer) | 
			
		
	
		
			
				
					|  |  |  |  |    #if __has_attribute(__no_sanitize__) | 
			
		
	
		
			
				
					|  |  |  |  |     #define STBSP__ASAN __attribute__((__no_sanitize__("address"))) | 
			
		
	
		
			
				
					|  |  |  |  |    #elif __has_attribute(__no_sanitize_address__) | 
			
		
	
		
			
				
					|  |  |  |  |     #define STBSP__ASAN __attribute__((__no_sanitize_address__)) | 
			
		
	
		
			
				
					|  |  |  |  |    #elif __has_attribute(__no_address_safety_analysis__) | 
			
		
	
		
			
				
					|  |  |  |  |     #define STBSP__ASAN __attribute__((__no_address_safety_analysis__)) | 
			
		
	
		
			
				
					|  |  |  |  |    #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |  #endif | 
			
		
	
		
			
				
					|  |  |  |  | #elif __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) | 
			
		
	
		
			
				
					|  |  |  |  |  #if __SANITIZE_ADDRESS__ | 
			
		
	
		
			
				
					|  |  |  |  |   #define STBSP__ASAN __attribute__((__no_sanitize_address__)) | 
			
		
	
		
			
				
					|  |  |  |  |       #define STBI__ASAN __attribute__((no_sanitize("address"))) | 
			
		
	
		
			
				
					|  |  |  |  |    #endif | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #ifndef STBSP__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #ifndef STBI__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #define STBI__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef STB_SPRINTF_STATIC | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEC static | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEF static STBSP__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEF static STBI__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #else | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef __cplusplus | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEC extern "C" | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEF extern "C" STBSP__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEF extern "C" STBI__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #else | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEC extern | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEF STBSP__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #define STBSP__PUBLICDEF STBI__ASAN | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -1355,12 +1343,14 @@ STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, . | 
			
		
	
		
			
				
					|  |  |  |  | typedef struct stbsp__context { | 
			
		
	
		
			
				
					|  |  |  |  |    char *buf; | 
			
		
	
		
			
				
					|  |  |  |  |    int count; | 
			
		
	
		
			
				
					|  |  |  |  |    int length; | 
			
		
	
		
			
				
					|  |  |  |  |    char tmp[STB_SPRINTF_MIN]; | 
			
		
	
		
			
				
					|  |  |  |  | } stbsp__context; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static char *stbsp__clamp_callback(char *buf, void *user, int len) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |    stbsp__context *c = (stbsp__context *)user; | 
			
		
	
		
			
				
					|  |  |  |  |    c->length += len; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |    if (len > c->count) | 
			
		
	
		
			
				
					|  |  |  |  |       len = c->count; | 
			
		
	
	
		
			
				
					|  |  |  | @ -1380,7 +1370,7 @@ static char *stbsp__clamp_callback(char *buf, void *user, int len) | 
			
		
	
		
			
				
					|  |  |  |  |    } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |    if (c->count <= 0) | 
			
		
	
		
			
				
					|  |  |  |  |       return 0; | 
			
		
	
		
			
				
					|  |  |  |  |       return c->tmp; | 
			
		
	
		
			
				
					|  |  |  |  |    return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -1388,29 +1378,27 @@ static char * stbsp__count_clamp_callback( char * buf, void * user, int len ) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |    stbsp__context * c = (stbsp__context*)user; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |    c->count += len; | 
			
		
	
		
			
				
					|  |  |  |  |    c->length += len; | 
			
		
	
		
			
				
					|  |  |  |  |    return c->tmp; // go direct into buffer if you can
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va ) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |    stbsp__context c; | 
			
		
	
		
			
				
					|  |  |  |  |    int l; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |    if ( (count == 0) && !buf ) | 
			
		
	
		
			
				
					|  |  |  |  |    { | 
			
		
	
		
			
				
					|  |  |  |  |       c.count = 0; | 
			
		
	
		
			
				
					|  |  |  |  |       c.length = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va ); | 
			
		
	
		
			
				
					|  |  |  |  |       l = c.count; | 
			
		
	
		
			
				
					|  |  |  |  |    } | 
			
		
	
		
			
				
					|  |  |  |  |    else | 
			
		
	
		
			
				
					|  |  |  |  |    { | 
			
		
	
		
			
				
					|  |  |  |  |       if ( count == 0 ) | 
			
		
	
		
			
				
					|  |  |  |  |          return 0; | 
			
		
	
		
			
				
					|  |  |  |  |       int l; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       c.buf = buf; | 
			
		
	
		
			
				
					|  |  |  |  |       c.count = count; | 
			
		
	
		
			
				
					|  |  |  |  |       c.length = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -1421,7 +1409,7 @@ STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, c | 
			
		
	
		
			
				
					|  |  |  |  |       buf[l] = 0; | 
			
		
	
		
			
				
					|  |  |  |  |    } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |    return l; | 
			
		
	
		
			
				
					|  |  |  |  |    return c.length; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) | 
			
		
	
	
		
			
				
					|  |  |  | 
 |