/* Copyright (C) 2018 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2017 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2015 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2004 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2001 DJ Delorie, see COPYING.DJ for details */ #include #include #include #include #include #include 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; }