#include #include #include short lgets(uchar *pt){ short r; r =pt[0]; r|=pt[1]<<8; return r; } long bgetl(uchar *pt){ long r; r =pt[0]<<24; r|=pt[1]<<16; r|=pt[2]<<8; r|=pt[3]; return r; } long lgetl(uchar *pt){ long r; r =pt[0]; r|=pt[1]<<8; r|=pt[2]<<16; r|=pt[3]<<24; return r; } vlong bgetvl(uchar *pt){ vlong r; r =pt[7]; r|=pt[6]<<8; r|=pt[5]<<16; r|=pt[4]<<24; r|=(vlong)pt[3]<<32; r|=(vlong)pt[2]<<40; r|=(vlong)pt[1]<<48; r|=(vlong)pt[0]<<56; return r; } vlong lgetvl(uchar *pt){ vlong r; r =pt[0]; r|=pt[1]<<8; r|=pt[2]<<16; r|=pt[3]<<24; r|=(vlong)pt[4]<<32; r|=(vlong)pt[5]<<40; r|=(vlong)pt[6]<<48; r|=(vlong)pt[7]<<56; return r; } #define EXP(a) ((a[7]&0x7f)<<4|(a[6]&0xf0)>>4) #define SIGN(a) (a[7]&0x80?-1:1) double lgetd(uchar *pt){ double r; if(EXP(pt)==0x7ff){ /* Inf or NaN */ if(pt[0]|pt[1]|pt[2]|pt[3]|pt[4]|pt[5]|(pt[6]&0xf)) { /* NaN */ /* how to produce a quiet NaN? */ r = NaN(); }else{ r = Inf(SIGN(pt)); } } else if(EXP(pt)==0){ /* how to produce subnormal numbers? */ r = SIGN(pt) * 0.; } else { r=(((((((pt[0]/256. + pt[1])/256. + pt[2])/256. + pt[3])/256. + pt[4])/256. + pt[5])/256.) + (pt[6]&0xf))/16. + 1.; r *= pow(2., EXP(pt)-1023.); r *= SIGN(pt); } return r; } #undef EXP #undef SIGN uvlong fsize(int fd) { uchar buf[256]; /* probably big enough */ int r; Dir d; r = fstat(fd,buf,sizeof(buf)); r = convM2D(buf, r, &d, nil); if(r