static gmx_bool do_ascread(t_fileio *fio, void *item, int nitem, int eio, const char *desc, const char *srcfile, int line) { FILE *fp = fio->fp; int i, m, res = 0, *iptr, ix; gmx_int64_t s; double d, x; char c; real *ptr; unsigned char *ucptr; char *cptr; #define NEXT_ITEM_BUF_LEN 128 char ni_buf[NEXT_ITEM_BUF_LEN]; gmx_fio_check_nitem(eio, nitem, srcfile, line); switch (eio) { case eioREAL: case eioFLOAT: case eioDOUBLE: res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%lf", &d); if (item) { *((real *) item) = d; } break; case eioINT: res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%d", &i); if (item) { *((int *) item) = i; } break; case eioINT64: res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%"GMX_SCNd64, &s); if (item) { *((gmx_int64_t *) item) = s; } break; case eioUCHAR: res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%c", &c); if (item) { *((unsigned char *) item) = (unsigned char)c; } break; case eioNUCHAR: ucptr = (unsigned char *) item; for (i = 0; (i < nitem); i++) { res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%d", &ix); if (item) { ucptr[i] = ix; } } break; case eioUSHORT: res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%d", &i); if (item) { *((unsigned short *) item) = i; } break; case eioRVEC: ptr = (real *) item; for (m = 0; (m < DIM); m++) { res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%lf\n", &x); ptr[m] = x; } break; case eioNRVEC: for (i = 0; (i < nitem); i++) { ptr = ((rvec *) item)[i]; for (m = 0; (m < DIM); m++) { res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%lf\n", &x); if (item) { ptr[m] = x; } } } break; case eioIVEC: iptr = (int *) item; for (m = 0; (m < DIM); m++) { res = sscanf(next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN), "%d\n", &ix); if (item) { iptr[m] = ix; } } break; case eioSTRING: cptr = next_item(fp, ni_buf, NEXT_ITEM_BUF_LEN); if (item) { decode_string(strlen(cptr) + 1, (char *) item, cptr); /* res = sscanf(cptr,"%s",(char *)item);*/ res = 1; } break; default: gmx_fio_fe(fio, eio, desc, srcfile, line); } if ((res <= 0) && fio->bDebug) { fprintf(stderr, "Error reading %s %s from file %s (source %s, line %d)\n", eioNames[eio], desc, fio->fn, srcfile, line); } return (res > 0); }
static gmx_bool do_ascwrite(t_fileio *fio, const void *item, int nitem, int eio, const char *desc, const char *srcfile, int line) { int i; int res = 0, *iptr; real *ptr; char strbuf[256]; char buf[GMX_FIO_BUFLEN]; unsigned char *ucptr; FILE *fp = fio->fp; gmx_fio_check_nitem(eio, nitem, srcfile, line); switch (eio) { case eioREAL: case eioFLOAT: case eioDOUBLE: res = fprintf(fp, "%18.10e%s\n", *((real *) item), gmx_fio_dbgstr(fio, desc, buf)); break; case eioINT: res = fprintf(fp, "%18d%s\n", *((int *) item), gmx_fio_dbgstr(fio, desc, buf)); break; case eioINT64: sprintf(strbuf, "%s%s%s", "%", GMX_PRId64, "\n"); res = fprintf(fp, strbuf, *((gmx_int64_t *) item), gmx_fio_dbgstr(fio, desc, buf)); break; case eioUCHAR: res = fprintf(fp, "%4d%s\n", *((unsigned char *) item), gmx_fio_dbgstr(fio, desc, buf)); break; case eioNUCHAR: ucptr = (unsigned char *) item; for (i = 0; (i < nitem); i++) { res = fprintf(fp, "%4d", (int) ucptr[i]); } fprintf(fio->fp, "%s\n", gmx_fio_dbgstr(fio, desc, buf)); break; case eioUSHORT: res = fprintf(fp, "%18d%s\n", *((unsigned short *) item), gmx_fio_dbgstr(fio, desc, buf)); break; case eioRVEC: ptr = (real *) item; res = fprintf(fp, "%18.10e%18.10e%18.10e%s\n", ptr[XX], ptr[YY], ptr[ZZ], gmx_fio_dbgstr(fio, desc, buf)); break; case eioNRVEC: for (i = 0; (i < nitem); i++) { ptr = ((rvec *) item)[i]; res = fprintf(fp, "%18.10e%18.10e%18.10e%s\n", ptr[XX], ptr[YY], ptr[ZZ], gmx_fio_dbgstr(fio, desc, buf)); } break; case eioIVEC: iptr = (int *) item; res = fprintf(fp, "%18d%18d%18d%s\n", iptr[XX], iptr[YY], iptr[ZZ], gmx_fio_dbgstr(fio, desc, buf)); break; case eioSTRING: encode_string(256, strbuf, (char *) item); res = fprintf(fp, "%-18s%s\n", strbuf, gmx_fio_dbgstr(fio, desc, buf)); break; default: gmx_fio_fe(fio, eio, desc, srcfile, line); } if ((res <= 0) && fio->bDebug) { fprintf(stderr, "Error writing %s %s to file %s (source %s, line %d)\n", eioNames[eio], desc, fio->fn, srcfile, line); } return (res > 0); }
static gmx_bool do_binwrite(t_fileio *fio, const void *item, int nitem, int eio, const char *desc, const char *srcfile, int line) { size_t size = 0, wsize; int ssize; gmx_fio_check_nitem(fio, eio, nitem, srcfile, line); switch (eio) { case eioREAL: size = sizeof(real); break; case eioFLOAT: size = sizeof(float); break; case eioDOUBLE: size = sizeof(double); break; case eioINT: size = sizeof(int); break; case eioGMX_LARGE_INT: size = sizeof(gmx_large_int_t); break; case eioUCHAR: size = sizeof(unsigned char); break; case eioNUCHAR: size = sizeof(unsigned char); break; case eioUSHORT: size = sizeof(unsigned short); break; case eioRVEC: size = sizeof(rvec); break; case eioNRVEC: size = sizeof(rvec); break; case eioIVEC: size = sizeof(ivec); break; case eioSTRING: size = ssize = strlen((char *) item) + 1; do_binwrite(fio, &ssize, 1, eioINT, desc, srcfile, line); break; default: gmx_fio_fe(fio, eio, desc, srcfile, line); } wsize = fwrite(item, size, nitem, fio->fp); if ((wsize != nitem) && fio->bDebug) { fprintf(stderr, "Error writing %s %s to file %s (source %s, line %d)\n", eioNames[eio], desc, fio->fn, srcfile, line); fprintf(stderr, "written size %u bytes, source size %u bytes\n", (unsigned int) wsize, (unsigned int) size); } return (wsize == nitem); }
static gmx_bool do_xdr(t_fileio *fio, void *item, int nitem, int eio, const char *desc, const char *srcfile, int line) { unsigned char ucdum, *ucptr; bool_t res = 0; float fvec[DIM]; double dvec[DIM]; int j, m, *iptr, idum; gmx_large_int_t sdum; real *ptr; unsigned short us; double d = 0; float f = 0; gmx_fio_check_nitem(fio, eio, nitem, srcfile, line); switch (eio) { case eioREAL: if (fio->bDouble) { if (item && !fio->bRead) d = *((real *) item); res = xdr_double(fio->xdr, &d); if (item) *((real *) item) = d; } else { if (item && !fio->bRead) f = *((real *) item); res = xdr_float(fio->xdr, &f); if (item) *((real *) item) = f; } break; case eioFLOAT: if (item && !fio->bRead) f = *((float *) item); res = xdr_float(fio->xdr, &f); if (item) *((float *) item) = f; break; case eioDOUBLE: if (item && !fio->bRead) d = *((double *) item); res = xdr_double(fio->xdr, &d); if (item) *((double *) item) = d; break; case eioINT: if (item && !fio->bRead) idum = *(int *) item; res = xdr_int(fio->xdr, &idum); if (item) *(int *) item = idum; break; case eioGMX_LARGE_INT: /* do_xdr will not generate a warning when a 64bit gmx_large_int_t * value that is out of 32bit range is read into a 32bit gmx_large_int_t. */ if (item && !fio->bRead) sdum = *(gmx_large_int_t *) item; res = xdr_gmx_large_int(fio->xdr, &sdum, NULL); if (item) *(gmx_large_int_t *) item = sdum; break; case eioUCHAR: if (item && !fio->bRead) ucdum = *(unsigned char *) item; res = xdr_u_char(fio->xdr, &ucdum); if (item) *(unsigned char *) item = ucdum; break; case eioNUCHAR: ucptr = (unsigned char *) item; res = 1; for (j = 0; (j < nitem) && res; j++) { res = xdr_u_char(fio->xdr, &(ucptr[j])); } break; case eioUSHORT: if (item && !fio->bRead) us = *(unsigned short *) item; res = xdr_u_short(fio->xdr, (unsigned short *) &us); if (item) *(unsigned short *) item = us; break; case eioRVEC: if (fio->bDouble) { if (item && !fio->bRead) for (m = 0; (m < DIM); m++) dvec[m] = ((real *) item)[m]; res = xdr_vector(fio->xdr, (char *) dvec, DIM, (unsigned int) sizeof(double), (xdrproc_t) xdr_double); if (item) for (m = 0; (m < DIM); m++) ((real *) item)[m] = dvec[m]; } else { if (item && !fio->bRead) for (m = 0; (m < DIM); m++) fvec[m] = ((real *) item)[m]; res = xdr_vector(fio->xdr, (char *) fvec, DIM, (unsigned int) sizeof(float), (xdrproc_t) xdr_float); if (item) for (m = 0; (m < DIM); m++) ((real *) item)[m] = fvec[m]; } break; case eioNRVEC: ptr = NULL; res = 1; for (j = 0; (j < nitem) && res; j++) { if (item) ptr = ((rvec *) item)[j]; res = do_xdr(fio, ptr, 1, eioRVEC, desc, srcfile, line); } break; case eioIVEC: iptr = (int *) item; res = 1; for (m = 0; (m < DIM) && res; m++) { if (item && !fio->bRead) idum = iptr[m]; res = xdr_int(fio->xdr, &idum); if (item) iptr[m] = idum; } break; case eioSTRING: { char *cptr; int slen; if (item) { if (!fio->bRead) slen = strlen((char *) item) + 1; else slen = 0; } else slen = 0; if (xdr_int(fio->xdr, &slen) <= 0) gmx_fatal(FARGS, "wrong string length %d for string %s" " (source %s, line %d)",slen,desc,srcfile,line); if (!item && fio->bRead) snew(cptr,slen); else cptr=(char *)item; if (cptr) res = xdr_string(fio->xdr,&cptr,slen); else res = 1; if (!item && fio->bRead) sfree(cptr); break; } default: gmx_fio_fe(fio, eio, desc, srcfile, line); } if ((res == 0) && (fio->bDebug)) fprintf(stderr,"Error in xdr I/O %s %s to file %s (source %s, line %d)\n", eioNames[eio],desc,fio->fn,srcfile,line); return (res != 0); }
static gmx_bool do_binread(t_fileio *fio, void *item, int nitem, int eio, const char *desc, const char *srcfile, int line) { size_t size = 0, rsize; int ssize; gmx_fio_check_nitem(fio, eio, nitem, srcfile, line); switch (eio) { case eioREAL: if (fio->bDouble) { size = sizeof(double); } else { size = sizeof(float); } break; case eioFLOAT: size = sizeof(float); break; case eioDOUBLE: size = sizeof(double); break; case eioINT: size = sizeof(int); break; case eioGMX_LARGE_INT: size = sizeof(gmx_large_int_t); break; case eioUCHAR: size = sizeof(unsigned char); break; case eioNUCHAR: size = sizeof(unsigned char); break; case eioUSHORT: size = sizeof(unsigned short); break; case eioRVEC: case eioNRVEC: if (fio->bDouble) { size = sizeof(double) * DIM; } else { size = sizeof(float) * DIM; } break; case eioIVEC: size = sizeof(ivec); break; case eioSTRING: do_binread(fio, &ssize, 1, eioINT, desc, srcfile, line); size = ssize; break; default: gmx_fio_fe(fio, eio, desc, srcfile, line); } if (item) { rsize = fread(item, size, nitem, fio->fp); } else { /* Skip over it if we have a NULL pointer here */ gmx_fseek(fio->fp, (gmx_off_t)(size*nitem), SEEK_CUR); rsize = nitem; } if ((rsize != nitem) && (fio->bDebug)) { fprintf(stderr, "Error reading %s %s from file %s (source %s, line %d)\n", eioNames[eio], desc, fio->fn, srcfile, line); } return (rsize == nitem); }