/* GetVal: get a short from given source and check range */ static short GetVal(Source *src, short lo, short hi, char *item) { short x; char buf[MAXSTRLEN]; if (!ReadShort(src,&x,1,FALSE)) HError(6150,"GetVal: cant read %s at %s",item, SrcPosition(*src, buf)); if (lo==0 && hi==0) return x; if (x<lo || x>hi) HError(6151,"GetVal: %s out of range at %s",item, SrcPosition(*src, buf)); return x; }
/* GetFLoat: read float from input stream */ static float GetFloat(Boolean bin) { float x; char buf[100]; if (!ReadFloat(&source,&x,1,bin)) HError(8150,"GetFloat: Float Expected at %s",SrcPosition(source,buf)); return x; }
/* GetInt: read int from input stream */ static int GetInt(void) { int x; char buf[100]; if (!ReadInt(&source,&x,1,FALSE)) HError(8150,"GetInt: Int Expected at %s",SrcPosition(source,buf)); return x; }
/* GetNode: read a node definition and create node */ static VQNode GetNode(Source *src, CovKind ck, short width) { char buf[MAXSTRLEN]; VQNode n; short vqidx,nid,lid,rid; Vector mean; Covariance cov; vqidx = GetVal(src,0,0,"VQ Index"); nid = GetVal(src,0,0,"Node Id"); lid = GetVal(src,0,0,"Left Id"); rid = GetVal(src,0,0,"Right Id"); mean = CreateVector(&vqHeap,width); if (!ReadVector(src, mean, FALSE)) HError(6150,"GetNode: cannot read mean vector at %s", SrcPosition(*src, buf)); switch(ck){ case NULLC: cov.var = NULL; n = CreateVQNode(vqidx,nid,lid,rid,mean,ck,cov); break; case INVDIAGC: cov.var = CreateVector(&vqHeap,width); if (!ReadVector(src, cov.var, FALSE)) HError(6150,"GetNode: cannot read variance vector at %s", SrcPosition(*src, buf)); n = CreateVQNode(vqidx,nid,lid,rid,mean,ck,cov); break; case FULLC: cov.inv = CreateTriMat(&vqHeap,width); if (!ReadTriMat(src, cov.inv, FALSE)) HError(6150,"GetNode: cannot read covariance matrix at %s", SrcPosition(*src, buf)); n = CreateVQNode(vqidx,nid,lid,rid,mean,ck,cov); break; default: n = CreateVQNode(vqidx,nid,lid,rid,mean,ck,cov); break; } return n; }