static __inline int convert_wstring(FILE *fp, wchar_t *wcp, int width, locale_t locale) { wchar_t *wcp0; wint_t wi; int nread; nread = 0; if (wcp == SUPPRESS_PTR) { while ((wi = __fgetwc(fp, locale)) != WEOF && width-- != 0 && !iswspace(wi)) nread++; if (wi != WEOF) __ungetwc(wi, fp, locale); } else { wcp0 = wcp; while ((wi = __fgetwc(fp, locale)) != WEOF && width-- != 0 && !iswspace(wi)) { *wcp++ = (wchar_t)wi; nread++; } if (wi != WEOF) __ungetwc(wi, fp, locale); *wcp = '\0'; } return (nread); }
static __inline int convert_wccl(FILE *fp, wchar_t *wcp, int width, const struct ccl *ccl, locale_t locale) { wchar_t *wcp0; wint_t wi; int n; if (wcp == SUPPRESS_PTR) { n = 0; while ((wi = __fgetwc(fp, locale)) != WEOF && width-- != 0 && inccl(ccl, wi)) n++; if (wi != WEOF) __ungetwc(wi, fp, locale); } else { wcp0 = wcp; while ((wi = __fgetwc(fp, locale)) != WEOF && width-- != 0 && inccl(ccl, wi)) *wcp++ = (wchar_t)wi; if (wi != WEOF) __ungetwc(wi, fp, locale); n = wcp - wcp0; if (n == 0) return (0); *wcp = 0; } return (n); }
static __inline int convert_wstring(FILE *fp, wchar_t *wcp, int width, locale_t locale) { mbstate_t mbs; wint_t wi; int n, nread; mbs = initial_mbs; n = 0; if (wcp == SUPPRESS_PTR) { while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && width-- != 0 && !iswspace(wi)) n += nread; if (wi != WEOF) __ungetwc(wi, fp, __get_locale()); } else { while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && width-- != 0 && !iswspace(wi)) { *wcp++ = (wchar_t)wi; n += nread; } if (wi != WEOF) __ungetwc(wi, fp, __get_locale()); *wcp = '\0'; } return (n); }
static __inline int convert_wccl(FILE *fp, wchar_t *wcp, int width, const char *ccltab, locale_t locale) { mbstate_t mbs; wint_t wi; int n, nread; mbs = initial_mbs; n = 0; if (wcp == SUPPRESS_PTR) { while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && width-- != 0 && ccltab[wctob(wi)]) n += nread; if (wi != WEOF) __ungetwc(wi, fp, __get_locale()); } else { while ((wi = __fgetwc_mbs(fp, &mbs, &nread, locale)) != WEOF && width-- != 0 && ccltab[wctob(wi)]) { *wcp++ = (wchar_t)wi; n += nread; } if (wi != WEOF) __ungetwc(wi, fp, __get_locale()); if (n == 0) return (0); *wcp = 0; } return (n); }
static __inline int convert_string(FILE *fp, char * mbp, int width, locale_t locale) { mbstate_t mbs; size_t nconv; wint_t wi; int nread; mbs = initial_mbs; nread = 0; while ((wi = __fgetwc(fp, locale)) != WEOF && width-- != 0 && !iswspace(wi)) { if (mbp != SUPPRESS_PTR) { nconv = wcrtomb(mbp, wi, &mbs); if (nconv == (size_t)-1) return (-1); mbp += nconv; } nread++; } if (wi != WEOF) __ungetwc(wi, fp, locale); if (mbp != SUPPRESS_PTR) *mbp = 0; return (nread); }
static __inline int 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; n = 0; mbs = initial_mbs; while ((wi = __fgetwc(fp, locale)) != WEOF && width-- != 0 && inccl(ccl, wi)) { if (mbp != SUPPRESS_PTR) { nconv = wcrtomb(mbp, wi, &mbs); if (nconv == (size_t)-1) return (-1); mbp += nconv; } n++; } if (wi != WEOF) __ungetwc(wi, fp, locale); if (mbp != SUPPRESS_PTR) *mbp = 0; return (n); }
wint_t ungetwc_l(wint_t wc, FILE *fp, locale_t locale) { wint_t r; FIX_LOCALE(locale); FLOCKFILE(fp); r = __ungetwc(wc, fp, locale); FUNLOCKFILE(fp); return (r); }
/* * MT-safe version. */ wint_t ungetwc(wint_t wc, FILE *fp) { wint_t r; FLOCKFILE(fp); ORIENT(fp, 1); r = __ungetwc(wc, fp); FUNLOCKFILE(fp); return (r); }
wint_t ungetwc_l(wint_t wc, FILE *fp, locale_t loc) { wint_t r; NORMALIZE_LOCALE(loc); FLOCKFILE(fp); ORIENT(fp, 1); r = __ungetwc(wc, fp, loc); FUNLOCKFILE(fp); return (r); }
/* * Non-MT-safe version. */ wint_t __ungetwc(wint_t wc, FILE *fp) { char buf[MB_LEN_MAX]; size_t len; if (wc == WEOF) return (WEOF); #ifndef __SYMBIAN32__ if ((len = __wcrtomb(buf, wc, &fp->_extra->mbstate)) == (size_t)-1) { #else //__SYMBIAN32__ if ((len = wcrtomb(buf, wc, &fp->_extra->mbstate)) == (size_t)-1) { #endif //__SYMBIAN32__ fp->_flags |= __SERR; return (WEOF); } while (len-- != 0) if (__ungetc((unsigned char)buf[len], fp) == EOF) return (WEOF); return (wc); } /* * MT-safe version. */ EXPORT_C wint_t ungetwc(wint_t wc, FILE *fp) { wint_t r; FLOCKFILE(fp); ORIENT(fp, 1); r = __ungetwc(wc, fp); FUNLOCKFILE(fp); return (r); }
/* * Read an integer, storing it in buf. The only relevant bit in the * flags argument is PFXOK. * * Return 0 on a match failure, and the number of characters read * otherwise. */ static __inline int parseint(FILE *fp, wchar_t *buf, int width, int base, int flags, locale_t locale) { /* `basefix' is used to avoid `if' tests */ static const short basefix[17] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; wchar_t *wcp; int c; flags |= SIGNOK | NDIGITS | NZDIGITS; for (wcp = buf; width; width--) { c = __fgetwc(fp, locale); /* * Switch on the character; `goto ok' if we accept it * as a part of number. */ switch (c) { /* * The digit 0 is always legal, but is special. For * %i conversions, if no digits (zero or nonzero) have * been scanned (only signs), we will have base==0. * In that case, we should set it to 8 and enable 0x * prefixing. Also, if we have not scanned zero * digits before this, do not turn off prefixing * (someone else will turn it off if we have scanned * any nonzero digits). */ case '0': if (base == 0) { base = 8; flags |= PFXOK; } if (flags & NZDIGITS) flags &= ~(SIGNOK|NZDIGITS|NDIGITS); else flags &= ~(SIGNOK|PFXOK|NDIGITS); goto ok; /* 1 through 7 always legal */ case '1': case '2': case '3': case '4': case '5': case '6': case '7': base = basefix[base]; flags &= ~(SIGNOK | PFXOK | NDIGITS); goto ok; /* digits 8 and 9 ok iff decimal or hex */ case '8': case '9': base = basefix[base]; if (base <= 8) break; /* not legal here */ flags &= ~(SIGNOK | PFXOK | NDIGITS); goto ok; /* letters ok iff hex */ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': /* no need to fix base here */ if (base <= 10) break; /* not legal here */ flags &= ~(SIGNOK | PFXOK | NDIGITS); goto ok; /* sign ok only as first character */ case '+': case '-': if (flags & SIGNOK) { flags &= ~SIGNOK; flags |= HAVESIGN; goto ok; } break; /* * x ok iff flag still set & 2nd char (or 3rd char if * we have a sign). */ case 'x': case 'X': if (flags & PFXOK && wcp == buf + 1 + !!(flags & HAVESIGN)) { base = 16; /* if %i */ flags &= ~PFXOK; goto ok; } break; } /* * If we got here, c is not a legal character for a * number. Stop accumulating digits. */ if (c != WEOF) __ungetwc(c, fp, locale); break; ok: /* * c is legal: store it and look at the next. */ *wcp++ = (wchar_t)c; } /* * If we had only a sign, it is no good; push back the sign. * If the number ends in `x', it was [sign] '0' 'x', so push * back the x and treat it as [sign] '0'. */ if (flags & NDIGITS) { if (wcp > buf) __ungetwc(*--wcp, fp, locale); return (0); } c = wcp[-1]; if (c == 'x' || c == 'X') { --wcp; __ungetwc(c, fp, locale); } return (wcp - buf); }