4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $NetBSD: gethex.c,v 1.3.14.1 2008/04/08 21:10:55 jdc Exp $ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/****************************************************************
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe author of this software is David M. Gay.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (C) 1998 by Lucent Technologies
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAll Rights Reserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPermission to use, copy, modify, and distribute this software and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncits documentation for any purpose and without fee is hereby
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncgranted, provided that the above copyright notice appear in all
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccopies and that both that the copyright notice and this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncpermission notice and warranty disclaimer appear in supporting
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdocumentation, and that the name of Lucent or any of its entities
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncnot be used in advertising or publicity pertaining to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdistribution of the software without specific, written prior
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncpermission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHIS SOFTWARE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync****************************************************************/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Please send bug reports to David M. Gay (dmg at acm dot org,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * with " at " changed at "@" and " dot " changed to "."). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <LibConfig.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "gdtoaimp.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef USE_LOCALE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "locale.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncgethex( CONST char **sp, CONST FPI *fpi, Long *expt, Bigint **bp, int sign)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bigint *b;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST unsigned char *decpt, *s0, *s, *s1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int esign, havedig, irv, k, n, nbits, up, zret;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULong L, lostbits, *x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Long e, e1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef USE_LOCALE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned char decimalpoint = *localeconv()->decimal_point;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define decimalpoint '.'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!hexdig['0'])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hexdig_init_D2A();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync havedig = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s0 = *(CONST unsigned char **)sp + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(s0[havedig] == '0')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync havedig++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s0 += havedig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s = s0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync decpt = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync zret = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!hexdig[*s]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync zret = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*s != decimalpoint)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto pcheck;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync decpt = ++s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!hexdig[*s])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto pcheck;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(*s == '0')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (hexdig[*s])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync zret = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync havedig = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s0 = s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(hexdig[*s])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*s == decimalpoint && !decpt) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync decpt = ++s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(hexdig[*s])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (decpt)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e = -(((Long)(s-decpt)) << 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pcheck:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s1 = s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch(*s) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'p':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 'P':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync esign = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch(*++s) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '-':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync esign = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* FALLTHROUGH */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case '+':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((n = hexdig[*s]) == 0 || n > 0x19) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s = s1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e1 = n - 0x10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while((n = hexdig[*++s]) !=0 && n <= 0x19)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e1 = 10*e1 + n - 0x10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (esign)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e1 = -e1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e += e1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *sp = __UNCONST(s);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (zret)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return havedig ? STRTOG_Zero : STRTOG_NoNumber;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n = (int)(s1 - s0 - 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for(k = 0; n > 7; n = (unsigned int)n >> 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync k++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync b = Balloc(k);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (b == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return STRTOG_NoMemory;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x = b->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(s1 > s0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*--s1 == decimalpoint)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (n == 32) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *x++ = L;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L |= (hexdig[*s1] & 0x0f) << n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n += 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *x++ = L;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync b->wds = n = (int)(x - b->x);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n = 32*n - hi0bits(L);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nbits = fpi->nbits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lostbits = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x = b->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (n > nbits) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n -= nbits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (any_on(b,n)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lostbits = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync k = n - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (x[(unsigned int)k>>kshift] & 1 << (k & kmask)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lostbits = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (k > 1 && any_on(b,k-1))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lostbits = 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rshift(b, n);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e += n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (n < nbits) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n = nbits - n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync b = lshift(b, n);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (b == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return STRTOG_NoMemory;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e -= n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x = b->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (e > fpi->emax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ovfl:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bfree(b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *bp = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync irv = STRTOG_Normal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (e < fpi->emin) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync irv = STRTOG_Denormal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n = fpi->emin - e;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (n >= nbits) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (fpi->rounding) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FPI_Round_near:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (n == nbits && (n < 2 || any_on(b,n-1)))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto one_bit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FPI_Round_up:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!sign)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto one_bit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FPI_Round_down:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (sign) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync one_bit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *expt = fpi->emin;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x[0] = b->wds = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *bp = b;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return STRTOG_Denormal | STRTOG_Inexhi
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync | STRTOG_Underflow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bfree(b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *bp = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return STRTOG_Zero | STRTOG_Inexlo | STRTOG_Underflow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync k = n - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (lostbits)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lostbits = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (k > 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lostbits = any_on(b,k);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (x[(unsigned int)k>>kshift] & 1 << (k & kmask))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lostbits |= 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nbits -= n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rshift(b,n);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e = fpi->emin;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (lostbits) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync up = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch(fpi->rounding) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FPI_Round_zero:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FPI_Round_near:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (lostbits & 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && (lostbits & 1) | (x[0] & 1))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync up = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FPI_Round_up:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync up = 1 - sign;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case FPI_Round_down:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync up = sign;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (up) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync k = b->wds;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync b = increment(b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x = b->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (irv == STRTOG_Denormal) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (nbits == fpi->nbits - 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && x[(unsigned int)nbits >> kshift] & 1 << (nbits & kmask))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync irv = STRTOG_Normal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else if (b->wds > k
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ((n = nbits & kmask) !=0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && hi0bits(x[k-1]) < 32-n)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync rshift(b,1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (++e > fpi->emax)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ovfl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync irv |= STRTOG_Inexhi;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync irv |= STRTOG_Inexlo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *bp = b;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *expt = e;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return irv;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }