/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 1985-2011 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Glenn Fowler <[email protected]> *17* David Korn <[email protected]> *18* Phong Vo <[email protected]> *19* *20***********************************************************************/21#include "sfhdr.h"2223/* Read a portably coded double value24**25** Written by Kiem-Phong Vo26*/2728#if __STD_C29Sfdouble_t sfgetd(Sfio_t* f)30#else31Sfdouble_t sfgetd(f)32Sfio_t* f;33#endif34{35reg uchar *s, *ends, c;36reg int p, sign, exp;37Sfdouble_t v;38SFMTXDECL(f); /* declare a local stream variable for multithreading */3940SFMTXENTER(f,-1.);4142if((sign = sfgetc(f)) < 0 || (exp = (int)sfgetu(f)) < 0)43SFMTXRETURN(f, -1.);4445if(f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0)46SFMTXRETURN(f, -1.);4748SFLOCK(f,0);4950v = 0.;51for(;;)52{ /* fast read for data */53if(SFRPEEK(f,s,p) <= 0)54{ f->flags |= SF_ERROR;55v = -1.;56goto done;57}5859for(ends = s+p; s < ends; )60{ c = *s++;61v += SFUVALUE(c);62v = ldexpl(v,-SF_PRECIS);63if(!(c&SF_MORE))64{ f->next = s;65goto done;66}67}68f->next = s;69}7071done:72v = ldexpl(v,(sign&02) ? -exp : exp);73if(sign&01)74v = -v;7576SFOPEN(f,0);77SFMTXRETURN(f, v);78}798081