X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/59e0d9fe772464b93d835d2a2964457702469a43..3d9156a7a519a5e3aa1b92e9d9d4b991f1aed7ff:/stdio/FreeBSD/vswprintf.c.patch?ds=sidebyside diff --git a/stdio/FreeBSD/vswprintf.c.patch b/stdio/FreeBSD/vswprintf.c.patch index 159d765..4e46d74 100644 --- a/stdio/FreeBSD/vswprintf.c.patch +++ b/stdio/FreeBSD/vswprintf.c.patch @@ -1,19 +1,103 @@ ---- vswprintf.c.orig Tue May 20 15:22:44 2003 -+++ vswprintf.c Wed Nov 12 00:30:05 2003 -@@ -48,6 +48,7 @@ - mbstate_t mbs; +--- vswprintf.c.orig 2004-11-25 11:38:36.000000000 -0800 ++++ vswprintf.c 2005-02-24 15:20:20.000000000 -0800 +@@ -33,6 +33,8 @@ + #endif + __FBSDID("$FreeBSD: src/lib/libc/stdio/vswprintf.c,v 1.5 2004/04/07 09:55:05 tjr Exp $"); + ++#include "xlocale_private.h" ++ + #include + #include + #include +@@ -49,7 +51,66 @@ + struct __sFILEX ext; char *mbp; int ret, sverrno; + size_t conv; ++ locale_t loc = __current_locale(); ++ ++ if (n == 0) { ++ errno = EINVAL; ++ return (-1); ++ } ++ ++ f._file = -1; ++ f._flags = __SWR | __SSTR | __SALC; ++ f._bf._base = f._p = (unsigned char *)malloc(128); ++ if (f._bf._base == NULL) { ++ errno = ENOMEM; ++ return (-1); ++ } ++ f._bf._size = f._w = 127; /* Leave room for the NUL */ ++ f._extra = &ext; ++ INITEXTRA(&f); ++ ret = __vfwprintf(&f, loc, fmt, ap); ++ if (ret < 0) { ++ sverrno = errno; ++ free(f._bf._base); ++ errno = sverrno; ++ return (-1); ++ } ++ *f._p = '\0'; ++ mbp = (char *)f._bf._base; ++ /* ++ * XXX Undo the conversion from wide characters to multibyte that ++ * fputwc() did in __vfwprintf(). ++ */ ++ mbs = initial; ++ if ((conv = mbsrtowcs_l(s, (const char **)&mbp, n, &mbs, loc)) == (size_t)-1) { ++ free(f._bf._base); ++ errno = EILSEQ; ++ return (-1); ++ } ++ free(f._bf._base); ++ if (conv >= n) { ++ s[n - 1] = L'\0'; ++ errno = EOVERFLOW; ++ return (-1); ++ } ++ ++ return (ret); ++} ++ ++int ++vswprintf_l(wchar_t * __restrict s, size_t n, locale_t loc, ++ const wchar_t * __restrict fmt, __va_list ap) ++{ ++ static const mbstate_t initial; ++ mbstate_t mbs; ++ FILE f; ++ struct __sFILEX ext; ++ char *mbp; ++ int ret, sverrno; ++ size_t conv; ++ NORMALIZE_LOCALE(loc); if (n == 0) { errno = EINVAL; -@@ -78,13 +79,13 @@ + return (-1); +@@ -65,7 +126,7 @@ + f._bf._size = f._w = 127; /* Leave room for the NUL */ + f._extra = &ext; + INITEXTRA(&f); +- ret = __vfwprintf(&f, fmt, ap); ++ ret = __vfwprintf(&f, loc, fmt, ap); + if (ret < 0) { + sverrno = errno; + free(f._bf._base); +@@ -73,19 +134,19 @@ + return (-1); + } + *f._p = '\0'; +- mbp = f._bf._base; ++ mbp = (char *)f._bf._base; + /* * XXX Undo the conversion from wide characters to multibyte that * fputwc() did in __vfwprintf(). */ + mbs = initial; - if (mbsrtowcs(s, (const char **)&mbp, n, &mbs) == (size_t)-1) { -+ if ((conv = mbsrtowcs(s, (const char **)&mbp, n, &mbs)) == (size_t)-1) { ++ if ((conv = mbsrtowcs_l(s, (const char **)&mbp, n, &mbs, loc)) == (size_t)-1) { free(f._bf._base); errno = EILSEQ; return (-1);