Files
quakemapping/tools/vispatch-1.4.6/source/djlib/vsnprntf.c
2019-12-30 17:23:05 +01:00

58 lines
1.2 KiB
C

/* DJGPP < v2.04 doesn't have vsnprintf(). The following are
* copied over from DJGPP 2.04. */
/* Copyright (C) 2001 DJ Delorie, see COPYING.DJ for details */
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <limits.h>
#include <errno.h>
#include <libc/file.h>
#if !defined(_IONTERM)
#define _IONTERM 0 /* dummy value */
#endif /* _IONTERM */
static __inline__ void __stropenw(FILE *p, char *str, int len)
{
p->_flag = _IOWRT | _IOSTRG | _IONTERM;
p->_ptr = str;
p->_cnt = len;
}
static __inline__ void __strclosew(FILE *p)
{
*p->_ptr = '\0';
}
int
vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
{
FILE _strbuf;
int len;
/* _cnt is an int in the FILE structure. To prevent wrap-around, we limit
* n to between 0 and INT_MAX inclusively. */
if (n > INT_MAX)
{
errno = EFBIG;
return -1;
}
memset(&_strbuf, 0, sizeof(_strbuf));
/* If n == 0, just querying how much space is needed. */
if (n > 0)
__stropenw(&_strbuf, str, n - 1);
else
__stropenw(&_strbuf, NULL, 0);
len = _doprnt(fmt, ap, &_strbuf);
/* Ensure nul termination */
if (n > 0)
__strclosew(&_strbuf);
return len;
}