*** empty log message ***
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user