#include "sfhdr.h"
#if __STD_C
int _sfputd(Sfio_t* f, Sfdouble_t v)
#else
int _sfputd(f,v)
Sfio_t* f;
Sfdouble_t v;
#endif
{
#define N_ARRAY (16*sizeof(Sfdouble_t))
reg ssize_t n, w;
reg uchar *s, *ends;
int exp;
uchar c[N_ARRAY];
double x;
SFMTXSTART(f,-1);
if(f->mode != SF_WRITE && _sfmode(f,SF_WRITE,0) < 0)
SFMTXRETURN(f, -1);
SFLOCK(f,0);
if(v < 0.)
{ v = -v;
n = 1;
}
else n = 0;
#if !_ast_fltmax_double
if(v > SF_MAXDOUBLE && !_has_expfuncs)
{ SFOPEN(f,0);
SFMTXRETURN(f, -1);
}
#endif
if(v != 0.)
v = frexp(v,&exp);
else exp = 0;
if((w = exp) < 0)
{ n |= 02;
w = -w;
}
SFOPEN(f,0);
if(sfputc(f,n) < 0 || (w = sfputu(f,w)) < 0)
SFMTXRETURN(f, -1);
SFLOCK(f,0);
w += 1;
s = (ends = &c[0])+sizeof(c);
while(s > ends)
{
n = (int)(x = ldexp(v,SF_PRECIS));
*--s = n|SF_MORE;
v = x-n;
if(v <= 0.)
break;
}
ends = &c[0] + sizeof(c) -1;
*ends &= ~SF_MORE;
n = ends - s + 1;
w = SFWRITE(f,(Void_t*)s,n) == n ? w+n : -1;
SFOPEN(f,0);
SFMTXRETURN(f,w);
}