summaryrefslogtreecommitdiffstats
path: root/lib/libc/stdio/vfwscanf.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/stdio/vfwscanf.c')
-rw-r--r--lib/libc/stdio/vfwscanf.c61
1 files changed, 13 insertions, 48 deletions
diff --git a/lib/libc/stdio/vfwscanf.c b/lib/libc/stdio/vfwscanf.c
index 6b4d8c5..28e2c03 100644
--- a/lib/libc/stdio/vfwscanf.c
+++ b/lib/libc/stdio/vfwscanf.c
@@ -138,35 +138,22 @@ static const mbstate_t initial_mbs;
*/
static __inline int
-convert_char(FILE *fp, char * __restrict mbp, int width, locale_t locale)
+convert_char(FILE *fp, char * mbp, int width, locale_t locale)
{
mbstate_t mbs;
size_t nconv;
wint_t wi;
int n;
- char mbbuf[MB_LEN_MAX];
n = 0;
mbs = initial_mbs;
- while (width != 0 && (wi = __fgetwc(fp, locale)) != WEOF) {
- if (width >= MB_CUR_MAX && mbp != SUPPRESS_PTR) {
+ while (width-- != 0 && (wi = __fgetwc(fp, locale)) != WEOF) {
+ if (mbp != SUPPRESS_PTR) {
nconv = wcrtomb(mbp, wi, &mbs);
if (nconv == (size_t)-1)
return (-1);
- } else {
- nconv = wcrtomb(mbbuf, wi, &mbs);
- if (nconv == (size_t)-1)
- return (-1);
- if (nconv > width) {
- __ungetwc(wi, fp, locale);
- break;
- }
- if (mbp != SUPPRESS_PTR)
- memcpy(mbp, mbbuf, nconv);
- }
- if (mbp != SUPPRESS_PTR)
mbp += nconv;
- width -= nconv;
+ }
n++;
}
if (n == 0)
@@ -192,35 +179,24 @@ convert_wchar(FILE *fp, wchar_t *wcp, int width, locale_t locale)
}
static __inline int
-convert_ccl(FILE *fp, char * __restrict mbp, int width, const struct ccl *ccl,
+convert_ccl(FILE *fp, char * mbp, int width, const struct ccl *ccl,
locale_t locale)
{
mbstate_t mbs;
size_t nconv;
wint_t wi;
int n;
- char mbbuf[MB_LEN_MAX];
n = 0;
mbs = initial_mbs;
while ((wi = __fgetwc(fp, locale)) != WEOF &&
- width != 0 && inccl(ccl, wi)) {
- if (width >= MB_CUR_MAX && mbp != SUPPRESS_PTR) {
+ width-- != 0 && inccl(ccl, wi)) {
+ if (mbp != SUPPRESS_PTR) {
nconv = wcrtomb(mbp, wi, &mbs);
if (nconv == (size_t)-1)
return (-1);
- } else {
- nconv = wcrtomb(mbbuf, wi, &mbs);
- if (nconv == (size_t)-1)
- return (-1);
- if (nconv > width)
- break;
- if (mbp != SUPPRESS_PTR)
- memcpy(mbp, mbbuf, nconv);
- }
- if (mbp != SUPPRESS_PTR)
mbp += nconv;
- width -= nconv;
+ }
n++;
}
if (wi != WEOF)
@@ -261,34 +237,23 @@ convert_wccl(FILE *fp, wchar_t *wcp, int width, const struct ccl *ccl,
}
static __inline int
-convert_string(FILE *fp, char * __restrict mbp, int width, locale_t locale)
+convert_string(FILE *fp, char * mbp, int width, locale_t locale)
{
mbstate_t mbs;
size_t nconv;
wint_t wi;
int nread;
- char mbbuf[MB_LEN_MAX];
mbs = initial_mbs;
nread = 0;
- while ((wi = __fgetwc(fp, locale)) != WEOF && width != 0 &&
+ while ((wi = __fgetwc(fp, locale)) != WEOF && width-- != 0 &&
!iswspace(wi)) {
- if (width >= MB_CUR_MAX && mbp != SUPPRESS_PTR) {
+ if (mbp != SUPPRESS_PTR) {
nconv = wcrtomb(mbp, wi, &mbs);
if (nconv == (size_t)-1)
return (-1);
- } else {
- nconv = wcrtomb(mbbuf, wi, &mbs);
- if (nconv == (size_t)-1)
- return (-1);
- if (nconv > width)
- break;
- if (mbp != SUPPRESS_PTR)
- memcpy(mbp, mbbuf, nconv);
- }
- if (mbp != SUPPRESS_PTR)
mbp += nconv;
- width -= nconv;
+ }
nread++;
}
if (wi != WEOF)
@@ -407,7 +372,7 @@ parseint(FILE *fp, wchar_t *buf, int width, int base, int flags,
goto ok;
}
break;
-
+
/*
* x ok iff flag still set & 2nd char (or 3rd char if
* we have a sign).
OpenPOWER on IntegriCloud