Forked from
Mark Wheelhouse / pintos-skeleton
This fork has diverged from the upstream repository.
-
Liam Gallagher authoredLiam Gallagher authored
stdio.c 17.72 KiB
#include <stdio.h>
#include <ctype.h>
#include <inttypes.h>
#include <round.h>
#include <stdint.h>
#include <string.h>
/* Auxiliary data for vsnprintf_helper(). */
struct vsnprintf_aux
{
char *p; /* Current output position. */
int length; /* Length of output string. */
int max_length; /* Max length of output string. */
};
static void vsnprintf_helper (char, void *);
/* Like vprintf(), except that output is stored into BUFFER,
which must have space for BUF_SIZE characters. Writes at most
BUF_SIZE - 1 characters to BUFFER, followed by a null
terminator. BUFFER will always be null-terminated unless
BUF_SIZE is zero. Returns the number of characters that would
have been written to BUFFER, not including a null terminator,
had there been enough room. */
int
vsnprintf (char *buffer, size_t buf_size, const char *format, va_list args)
{
/* Set up aux data for vsnprintf_helper(). */
struct vsnprintf_aux aux;
aux.p = buffer;
aux.length = 0;
aux.max_length = buf_size > 0 ? buf_size - 1 : 0;
/* Do most of the work. */
__vprintf (format, args, vsnprintf_helper, &aux);
/* Add null terminator. */
if (buf_size > 0)
*aux.p = '\0';
return aux.length;
}
/* Helper function for vsnprintf(). */
static void
vsnprintf_helper (char ch, void *aux_)
{
struct vsnprintf_aux *aux = aux_;
if (aux->length++ < aux->max_length)
*aux->p++ = ch;
}
/* Like printf(), except that output is stored into BUFFER,
which must have space for BUF_SIZE characters. Writes at most
BUF_SIZE - 1 characters to BUFFER, followed by a null
terminator. BUFFER will always be null-terminated unless
BUF_SIZE is zero. Returns the number of characters that would
have been written to BUFFER, not including a null terminator,
had there been enough room. */
int
snprintf (char *buffer, size_t buf_size, const char *format, ...)
{
va_list args;
int retval;
va_start (args, format);
retval = vsnprintf (buffer, buf_size, format, args);
va_end (args);