vsnprintf (and snprintf)


[Home] Home > Programming > Portability >
vsnprintf
#include <stdarg.h>

#include <sys/types.h>

#include <objc/objc.h>
#include <streams/streams.h>

int
vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
{
  NXStream *stream = NULL;
  int       length = 0;

  stream = NXOpenMemory(NULL, 0, NX_READWRITE);
  NXVPrintf(stream, fmt, args);
  NXFlush(stream);

  NXSeek(stream, 0, NX_FROMEND);
  length = NXTell(stream);
	
  if (length == 0) {
    return 0;
  }

  if (length > size) {
    length = size;
  }

  NXSeek(stream, 0, NX_FROMSTART);
  NXRead(stream, buf, length);
  NXCloseMemory(stream, NX_FREEBUFFER);

  buf[length] = '\0';

  return length;
}

Which of course allows a trivial snprintf:

int
snprintf(char *buf, size_t size, const char *fmt, ...)
{
  va_list ap;
  size_t  res = 0;

  va_start(ap, fmt);
  res = vsnprintf(buf, size, fmt, ap);
  va_end(ap);

  return res;
}

Copyright © 2010-2024 Paul Ward.
License Information