*** empty log message ***

This commit is contained in:
cvs
2002-06-10 12:45:24 +00:00
parent 0daef05b2e
commit 267d16908a
20 changed files with 863 additions and 538 deletions

View File

@@ -216,3 +216,93 @@ void StrNLink(StrBuf *buf, char *str, int length) {
buf->wrpos=l;
buf->dsize=buf->wrpos;
}
#define TWO_23 8388608
#define EXP_OFFS 128
void flt_to_char4(double f, char buf[4]) {
double m;
int e, res, ir;
m=frexp(f, &e);
e=e+EXP_OFFS;
if (e<0 || m==0) {
res=0; m=0;
} else {
if (e>255) {
res=255*TWO_23+(TWO_23-1); /* max. representable number */
} else {
res=e*TWO_23+(int)(0.5+(fabs(m*2)-1.0)*TWO_23);
}
}
buf[0]=res % 256; res=res/256;
buf[1]=res % 256; res=res/256;
buf[2]=res % 256; res=res/256;
if (m<0) {
buf[3]=res-128;
} else {
buf[3]=res;
}
}
double flt_from_char4(char buf[4]) {
int s, i, b0, b1, b2, b3;
b0=buf[0]; if (b0<0) b0+=256;
b1=buf[1]; if (b1<0) b1+=256;
b2=buf[2]; if (b2<0) b2+=256;
b3=buf[3]; if (b3<0) b3+=256;
if (b3>=128) {
i=(b3-128)*(256*65536)+b2*65536+b1*256+b0;
if (i==0) return 0.0;
return -ldexp((i % TWO_23)*1.0/(TWO_23)*0.5+0.5, i/TWO_23-EXP_OFFS);
} else {
i=b3*(256*65536)+b2*65536+b1*256+b0;
if (i==0) return 0.0;
return ldexp((i % TWO_23)*1.0/(TWO_23)*0.5+0.5, i/TWO_23-EXP_OFFS);
}
}
int StrPutArray(StrBuf *buf, float val[], int size) {
int i, pos;
char *b;
pos=buf->wrpos;
if (pos < 0 || pos >= buf->dsize || buf->buf==NULL)
ERR_MSG("buffer corrupt");
if (pos+4*size >= buf->dsize)
ERR_MSG("buffer too short");
b=buf->buf+pos;
flt_to_char4((float)size, b);
b+=4;
for (i=0; i<size; i++) {
flt_to_char4(val[i], b);
b+=4;
}
buf->wrpos=b - buf->buf;
return(0);
OnError:
buf->wrpos=-1;
return(-1);
}
int StrGetArray(StrBuf *buf, float val[], int maxsize) {
int size, i;
char *b;
double gg;
if (buf->rdpos < 0 || buf->rdpos >= buf->dsize || buf->buf==NULL)
ERR_MSG("buffer corrupt");
b=buf->buf + buf->rdpos;
size=flt_from_char4(b); b+=4;
buf->rdpos+=4*(size+1);
if (maxsize<size) size=maxsize;
for (i=0; i<size; i++) {
gg=flt_from_char4(b); b+=4;
val[i]=gg;
}
return size;
OnError:
buf->rdpos=buf->dsize; /* illegal value */
return(-1);
}