--- ray/src/common/readmesh.c 2003/06/08 12:03:09 2.5 +++ ray/src/common/readmesh.c 2023/02/07 20:28:16 2.19 @@ -1,12 +1,14 @@ #ifndef lint -static const char RCSid[] = "$Id: readmesh.c,v 2.5 2003/06/08 12:03:09 schorsch Exp $"; +static const char RCSid[] = "$Id: readmesh.c,v 2.19 2023/02/07 20:28:16 greg Exp $"; #endif /* * Routines for reading a compiled mesh from a file */ -#include "standard.h" +#include + #include "platform.h" +#include "standard.h" #include "octree.h" #include "object.h" #include "mesh.h" @@ -33,11 +35,11 @@ static long mgetint(siz) /* get a siz-byte integer */ int siz; { - register long r; + long r = getint(siz, meshfp); - r = getint(siz, meshfp); - if (feof(meshfp)) + if (r == EOF && feof(meshfp)) mesherror(USER, "truncated mesh file"); + return(r); } @@ -45,11 +47,11 @@ int siz; static double mgetflt() /* get a floating point number */ { - double r; + double r = getflt(meshfp); - r = getflt(meshfp); - if (feof(meshfp)) + if (r == (double)EOF && feof(meshfp)) mesherror(USER, "truncated mesh file"); + return(r); } @@ -58,7 +60,7 @@ static OCTREE getfullnode() /* get a set, return fullnode */ { OBJECT set[MAXSET+1]; - register int i; + int i; if ((set[0] = mgetint(objsize)) > MAXSET) mesherror(USER, "bad set in getfullnode"); @@ -71,8 +73,8 @@ getfullnode() /* get a set, return fullnode */ static OCTREE gettree() /* get a pre-ordered octree */ { - register OCTREE ot; - register int i; + OCTREE ot; + int i; switch (getc(meshfp)) { case OT_EMPTY: @@ -90,14 +92,14 @@ gettree() /* get a pre-ordered octree */ default: mesherror(USER, "damaged mesh octree"); } - return NULL; /* pro forma return */ + return (OCTREE)0; /* pro forma return */ } static void skiptree() /* skip octree on input */ { - register int i; + int i; switch (getc(meshfp)) { case OT_EMPTY: @@ -121,7 +123,7 @@ skiptree() /* skip octree on input */ static void getpatch(pp) /* load a mesh patch */ -register MESHPATCH *pp; +MESHPATCH *pp; { int flags; int i, j; @@ -131,19 +133,19 @@ register MESHPATCH *pp; mesherror(USER, "bad patch flags"); /* allocate vertices */ pp->nverts = mgetint(2); - if (pp->nverts <= 0 || pp->nverts > 256) + if ((pp->nverts <= 0) | (pp->nverts > 256)) mesherror(USER, "bad number of patch vertices"); - pp->xyz = (uint4 (*)[3])malloc(pp->nverts*3*sizeof(uint4)); + pp->xyz = (uint32 (*)[3])malloc(pp->nverts*3*sizeof(uint32)); if (pp->xyz == NULL) goto nomem; if (flags & MT_N) { - pp->norm = (int4 *)calloc(pp->nverts, sizeof(int4)); + pp->norm = (int32 *)calloc(pp->nverts, sizeof(int32)); if (pp->norm == NULL) goto nomem; } else pp->norm = NULL; if (flags & MT_UV) { - pp->uv = (uint4 (*)[2])calloc(pp->nverts, 2*sizeof(uint4)); + pp->uv = (uint32 (*)[2])calloc(pp->nverts, 2*sizeof(uint32)); if (pp->uv == NULL) goto nomem; } else @@ -163,7 +165,7 @@ register MESHPATCH *pp; pp->uv[i][j] = mgetint(4); /* local triangles */ pp->ntris = mgetint(2); - if (pp->ntris < 0 || pp->ntris > 512) + if ((pp->ntris < 0) | (pp->ntris > 512)) mesherror(USER, "bad number of local triangles"); if (pp->ntris) { pp->tri = (struct PTri *)malloc(pp->ntris * @@ -179,7 +181,7 @@ register MESHPATCH *pp; pp->tri = NULL; /* local triangle material(s) */ if (mgetint(2) > 1) { - pp->trimat = (int2 *)malloc(pp->ntris*sizeof(int2)); + pp->trimat = (int16 *)malloc(pp->ntris*sizeof(int16)); if (pp->trimat == NULL) goto nomem; for (i = 0; i < pp->ntris; i++) @@ -190,7 +192,7 @@ register MESHPATCH *pp; } /* joiner triangles */ pp->nj1tris = mgetint(2); - if (pp->nj1tris < 0 || pp->nj1tris > 512) + if ((pp->nj1tris < 0) | (pp->nj1tris > 256)) mesherror(USER, "bad number of joiner triangles"); if (pp->nj1tris) { pp->j1tri = (struct PJoin1 *)malloc(pp->nj1tris * @@ -207,7 +209,7 @@ register MESHPATCH *pp; pp->j1tri = NULL; /* double joiner triangles */ pp->nj2tris = mgetint(2); - if (pp->nj2tris < 0 || pp->nj2tris > 256) + if ((pp->nj2tris < 0) | (pp->nj2tris > 256)) mesherror(USER, "bad number of double joiner triangles"); if (pp->nj2tris) { pp->j2tri = (struct PJoin2 *)malloc(pp->nj2tris * @@ -248,11 +250,14 @@ int flags; error(SYSTEM, errmsg); } SET_FILE_BINARY(meshfp); +#ifdef getc_unlocked /* avoid stupid semaphores */ + flockfile(meshfp); +#endif /* read header */ checkheader(meshfp, MESHFMT, flags&IO_INFO ? stdout : (FILE *)NULL); /* read format number */ objsize = getint(2, meshfp) - MESHMAGIC; - if (objsize <= 0 || objsize > MAXOBJSIZ || objsize > sizeof(long)) + if ((objsize <= 0) | (objsize > MAXOBJSIZ) | (objsize > sizeof(long))) mesherror(USER, "incompatible mesh format"); /* read boundaries */ if (flags & IO_BOUNDS) { @@ -288,7 +293,12 @@ int flags; getpatch(&mp->patch[i]); } /* clean up */ - fclose(meshfp); + if (meshfp != stdin) + fclose(meshfp); +#ifdef getc_unlocked + else + funlockfile(meshfp); +#endif mp->ldflags |= flags; /* verify data */ if ((err = checkmesh(mp)) != NULL)