#include #include #include "binread.h" /* in-place byte swapping */ #define SWAP(a,b) (b)^=(a); (a)^=(b); (b)^=(a) #define FLIP4(b) SWAP((b)[0],(b)[3]); SWAP((b)[1],(b)[2]) #define FLIP8(b) SWAP((b)[0],(b)[7]); SWAP((b)[1],(b)[6]); \ SWAP((b)[2],(b)[5]); SWAP((b)[3],(b)[4]) Vec *binread(const char *bfname, int *n) { FILE *f; Vec *v = NULL; long startvec, endvec; int isflipped = 0; if (sizeof(int) != 4) { fprintf(stderr, "type 'int' has unexpected size %d\n", (int) sizeof(int)); return NULL; } if (bfname == NULL) return NULL; if ((f = fopen(bfname,"r")) == NULL) return NULL; if (fread(n, sizeof(int), 1, f) != 1) return NULL; if ((startvec = ftell(f)) == -1L) return NULL; if (fseek(f, 0L, SEEK_END) != 0) return NULL; if ((endvec = ftell(f)) == -1L) return NULL; if (*n * sizeof(Vec) != endvec - startvec) { isflipped = 1; FLIP4((unsigned char *)n); if (*n * sizeof(Vec) != endvec - startvec) { fprintf(stderr, "length of file does not match number of atoms\n"); return NULL; } } if (fseek(f, 4L, SEEK_SET) != 0) return NULL; if ((v = (Vec *) malloc(*n * sizeof(Vec))) == NULL) return NULL; if (fread(v, sizeof(Vec), *n, f) != *n) { free(v); return NULL; } if (fclose(f) != 0) return v; if (isflipped) { Vec *p; int i; for (p = v, i = 0; i < *n; i++, p++) { FLIP8((unsigned char *)&(p->x)); FLIP8((unsigned char *)&(p->y)); FLIP8((unsigned char *)&(p->z)); } } return v; }