summaryrefslogblamecommitdiffstats
path: root/private/fp32/conv/fltinf.c
blob: 90736fad5c094be345b8a22e76426155f14d7790 (plain) (tree)





























































                                                                                
/***
*fltinf.c - Encode interface for FORTRAN
*
*	Copyright (c) 19xx-1992, Microsoft Corporation.	All rights reserved.
*
*Purpose:
*   FORTRAN interface for decimal to binary (input) conversion
*
*Revision History:
*   06-22-92	GDP	Modified version of cfin.c for FORTRAN support
*
*******************************************************************************/

#include <string.h>
#include <cv.h>

static struct _flt ret;
static FLT flt = &ret;

/* Error codes set by this routine */
#define CFIN_NODIGITS 512
#define CFIN_OVERFLOW 128
#define CFIN_UNDERFLOW 256
#define CFIN_INVALID  64

FLT _CALLTYPE2 _fltinf(const char *str, int len, int scale, int decpt)
{
    _LDBL12 ld12;
    DOUBLE x;
    const char *EndPtr;
    unsigned flags;
    int retflags = 0;

    flags = __strgtold12(&ld12, &EndPtr, str, 0, scale, decpt, 1);
    if (flags & SLD_NODIGITS) {
	retflags |= CFIN_NODIGITS;
	*(u_long *)&x = 0;
	*((u_long *)&x+1) = 0;
    }
    else {
	INTRNCVT_STATUS intrncvt;

	intrncvt = _ld12tod(&ld12, &x);

	if (flags & SLD_OVERFLOW  ||
	    intrncvt == INTRNCVT_OVERFLOW) {
	    retflags |= CFIN_OVERFLOW;
	}
	if (flags & SLD_UNDERFLOW ||
	    intrncvt == INTRNCVT_UNDERFLOW) {
	    retflags |= CFIN_UNDERFLOW;
	}
    }

    flt->nbytes = EndPtr - str;
    if (len != flt->nbytes)
	retflags |= CFIN_INVALID;
    flt->dval = *(double *)&x;
    flt->flags = retflags;

    return flt;
}