user/lib/libc/src/locale/_wcstol.h
/*
 * function template for wcstol, wcstoll and wcstoimax.
 *
 * parameters:
 *	FUNCNAME : function name
 *      int_type : return type
 *      MIN_VALUE : lower limit of the return type
 *      MAX_VALUE : upper limit of the return type
 */
function template for wcstol, wcstoll and wcstoimax.
function template for wcstol wcstoll and wcstoimax .
int_type
FUNCNAME(const wchar_t *nptr, wchar_t **endptr, int base)
{
	const wchar_t *s;
	int_type acc, cutoff;
	wint_t wc;
	int i;
	int neg, any, cutlim;
	if (base && (base < 2 || base > 36)) {
		errno = EINVAL;
		return 0;
	}
	s = nptr;
	do {
		wc = (wchar_t) *s++;
	} while (iswspace(wc));
	if (wc == L'-') {
		neg = 1;
		wc = *s++;
	} else {
		neg = 0;
		if (wc == L'+')
			wc = *s++;
	}
	if ((base == 0 || base == 16) &&
	    wc == L'0' && (*s == L'x' || *s == L'X')) {
		wc = s[1];
		s += 2;
		base = 16;
	}
	if (base == 0)
		base = wc == L'0' ? 8 : 10;
	cutoff = neg ? MIN_VALUE : MAX_VALUE;
	cutlim = (int)(cutoff % base);
	cutoff /= base;
	if (neg) {
		if (cutlim > 0) {
			cutlim -= base;
			cutoff += 1;
		}
		cutlim = -cutlim;
	}
	for (acc = 0, any = 0;; wc = (wchar_t) *s++) {
		i = wctoint(wc);
		if (i == -1)
			break;
		if (i >= base)
			break;
		if (any < 0)
			continue;
		if (neg) {
			if (acc < cutoff || (acc == cutoff && i > cutlim)) {
				any = -1;
				acc = MIN_VALUE;
				errno = ERANGE;
			} else {
				any = 1;
				acc *= base;
				acc -= i;
			}
		} else {
			if (acc > cutoff || (acc == cutoff && i > cutlim)) {
				any = -1;
				acc = MAX_VALUE;
				errno = ERANGE;
			} else {
				any = 1;
				acc *= base;
				acc += i;
			}
		}
	}
	if (endptr != 0)
		*endptr = (wchar_t *)(any ? s - 1 : nptr);
	return (acc);
}
int_type FUNCNAME ( const wchar_t * nptr , wchar_t * * endptr , int base ) { const wchar_t * s ; int_type acc , cutoff ; wint_t wc ; int i ; int neg , any , cutlim ; if ( base && ( base < 2 || base > 36 ) ) { errno = EINVAL ; return 0 ; } s = nptr ; do { wc = ( wchar_t ) * s ++ ; } while ( iswspace ( wc ) ) ; if ( wc == L' ' ) { neg = 1 ; wc = * s ++ ; } else { neg = 0 ; if ( wc == L' ' ) wc = * s ++ ; } if ( ( base == 0 || base == 16 ) && wc == L' ' && ( * s == L' ' || * s == L' ' ) ) { wc = s [ 1 ] ; s += 2 ; base = 16 ; } if ( base == 0 ) base = wc == L' ' ? 8 : 10 ; cutoff = neg ? MIN_VALUE : MAX_VALUE ; cutlim = ( int ) ( cutoff % base ) ; cutoff /= base ; if ( neg ) { if ( cutlim > 0 ) { cutlim -= base ; cutoff += 1 ; } cutlim = - cutlim ; } for ( acc = 0 , any = 0 ; ; wc = ( wchar_t ) * s ++ ) { i = wctoint ( wc ) ; if ( i == -1 ) break ; if ( i >= base ) break ; if ( any < 0 ) continue ; if ( neg ) { if ( acc < cutoff || ( acc == cutoff && i > cutlim ) ) { any = -1 ; acc = MIN_VALUE ; errno = ERANGE ; } else { any = 1 ; acc *= base ; acc -= i ; } } else { if ( acc > cutoff || ( acc == cutoff && i > cutlim ) ) { any = -1 ; acc = MAX_VALUE ; errno = ERANGE ; } else { any = 1 ; acc *= base ; acc += i ; } } } if ( endptr != 0 ) * endptr = ( wchar_t * ) ( any ? s - 1 : nptr ) ; return ( acc ) ; }
function template for wcstol, wcstoll and wcstoimax.
function template for wcstol wcstoll and wcstoimax .
/* check base value */ /*
	 * Skip white space and pick up leading +/- sign if any.
	 * If base is 0, allow 0x for hex and 0 for octal, else
	 * assume decimal; if base is already 16, allow 0x.
	 */ /*
	 * See strtol for comments as to the logic used.
	 */