4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $NetBSD: hexnan.c,v 1.3 2006/03/11 18:38:14 kleink Exp $ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/****************************************************************
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe author of this software is David M. Gay.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (C) 2000 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 static void
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef KR_headers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncL_shift(x, x1, i) ULong *x; ULong *x1; int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncL_shift(ULong *x, ULong *x1, int i)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int j;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync i = 8 - i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync i <<= 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync j = ULbits - i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *x |= x[1] << j;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x[1] >>= i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while(++x < x1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef KR_headers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchexnan(sp, fpi, x0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST char **sp; CONST FPI *fpi; ULong *x0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchexnan( CONST char **sp, CONST FPI *fpi, ULong *x0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULong c, h, *x, *x1, *xe;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST char *s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int havedig, hd0, i, nbits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!hexdig['0'])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hexdig_init_D2A();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nbits = fpi->nbits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x = x0 + ((unsigned int)nbits >> kshift);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (nbits & kmask)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *--x = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x1 = xe = x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync havedig = hd0 = i = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync s = *sp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while((c = *(CONST unsigned char*)++s) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((h = hexdig[c]) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (c <= ' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (hd0 < havedig) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (x < x1 && i < 8)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L_shift(x, x1, i);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (x <= x0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync i = 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hd0 = havedig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *--x = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x1 = x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync i = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (/*(*/ c == ')' && havedig) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *sp = s + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return STRTOG_NaN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync havedig++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (++i > 8) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (x <= x0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync i = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *--x = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *x = (*x << 4) | (h & 0xf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!havedig)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return STRTOG_NaN;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (x < x1 && i < 8)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L_shift(x, x1, i);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (x > x0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync x1 = x0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do *x1++ = *x++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(x <= xe);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do *x1++ = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(x1 <= xe);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* truncate high-order word if necessary */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( (i = nbits & (ULbits-1)) !=0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *xe &= ((ULong)0xffffffff) >> (ULbits - i);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for(x1 = xe;; --x1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*x1 != 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (x1 == x0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *x1 = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return STRTOG_NaNbits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }