mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
 | 
						|
#include "Python.h"
 | 
						|
 | 
						|
/* snprintf() emulation for platforms which don't have it (yet). 
 | 
						|
   
 | 
						|
   Return value
 | 
						|
 | 
						|
       The number of characters printed (not including the trailing
 | 
						|
       `\0' used to end output to strings) or a negative number in
 | 
						|
       case of an error.
 | 
						|
 | 
						|
       PyOS_snprintf and PyOS_vsnprintf do not write more than size
 | 
						|
       bytes (including the trailing '\0').
 | 
						|
 | 
						|
       If the output would have been truncated, they return the number
 | 
						|
       of characters (excluding the trailing '\0') which would have
 | 
						|
       been written to the final string if enough space had been
 | 
						|
       available. This is inline with the C99 standard.
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
#include <ctype.h>
 | 
						|
 | 
						|
#ifndef HAVE_SNPRINTF
 | 
						|
 | 
						|
static
 | 
						|
int myvsnprintf(char *str, size_t size, const char  *format, va_list va)
 | 
						|
{
 | 
						|
    char *buffer = PyMem_Malloc(size + 512);
 | 
						|
    int len;
 | 
						|
    
 | 
						|
    if (buffer == NULL)
 | 
						|
	return -1;
 | 
						|
    len = vsprintf(buffer, format, va);
 | 
						|
    if (len < 0) {
 | 
						|
	PyMem_Free(buffer);
 | 
						|
	return len;
 | 
						|
    }
 | 
						|
    len++;
 | 
						|
    assert(len >= 0);
 | 
						|
    if ((size_t)len > size + 512)
 | 
						|
	Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf");
 | 
						|
    if ((size_t)len > size) {
 | 
						|
	PyMem_Free(buffer);
 | 
						|
	return len - 1;
 | 
						|
    }
 | 
						|
    memcpy(str, buffer, len);
 | 
						|
    PyMem_Free(buffer);
 | 
						|
    return len - 1;
 | 
						|
}
 | 
						|
 | 
						|
int PyOS_snprintf(char *str, size_t size, const  char  *format, ...)
 | 
						|
{
 | 
						|
    int rc;
 | 
						|
    va_list va;
 | 
						|
 | 
						|
    va_start(va, format);
 | 
						|
    rc = myvsnprintf(str, size, format, va);
 | 
						|
    va_end(va);
 | 
						|
    return rc;
 | 
						|
}
 | 
						|
 | 
						|
int PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
 | 
						|
{
 | 
						|
    return myvsnprintf(str, size, format, va);
 | 
						|
}
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
/* Make sure that a C API is included in the lib */
 | 
						|
 | 
						|
#ifdef PyOS_snprintf
 | 
						|
# undef PyOS_snprintf
 | 
						|
#endif
 | 
						|
 | 
						|
int PyOS_snprintf(char *str, size_t size, const  char  *format, ...)
 | 
						|
{
 | 
						|
    int rc;
 | 
						|
    va_list va;
 | 
						|
 | 
						|
    va_start(va, format);
 | 
						|
    rc = vsnprintf(str, size, format, va);
 | 
						|
    va_end(va);
 | 
						|
    return rc;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef PyOS_vsnprintf
 | 
						|
# undef PyOS_vsnprintf
 | 
						|
#endif
 | 
						|
 | 
						|
int PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
 | 
						|
{
 | 
						|
    return vsnprintf(str, size, format, va);
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 |