Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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);
}
Example #6
0
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);
}
Example #7
0
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);
}
Example #8
0
/*
 * 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);
}
Example #9
0
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);
}
Example #10
0
/*
 * 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);
}
Example #11
0
/*
 * 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);
}