first commit
This commit is contained in:
57
tools/vispatch-1.4.6/source/djlib/vsnprntf.c
Normal file
57
tools/vispatch-1.4.6/source/djlib/vsnprntf.c
Normal file
@@ -0,0 +1,57 @@
|
||||
/* 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;
|
||||
}
|
||||
Reference in New Issue
Block a user