view Python/mysnprintf.c @ 19051:f20727cc3d0f legacy-trunk

Implement PEP 238 in its (almost) full glory. This introduces: - A new operator // that means floor division (the kind of division where 1/2 is 0). - The "future division" statement ("from __future__ import division) which changes the meaning of the / operator to implement "true division" (where 1/2 is 0.5). - New overloadable operators __truediv__ and __floordiv__. - New slots in the PyNumberMethods struct for true and floor division, new abstract APIs for them, new opcodes, and so on. I emphasize that without the future division statement, the semantics of / will remain unchanged until Python 3.0. Not yet implemented are warnings (default off) when / is used with int or long arguments. This has been on display since 7/31 as SF patch #443474. Flames to /dev/null.
author Guido van Rossum <guido@python.org>
date Wed, 08 Aug 2001 05:00:18 +0000
parents 2bc648932d44
children 6b6a9cae256e
line wrap: on
line source


#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