Пример #1
0
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);
}
Пример #2
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);
}
Пример #3
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);
}
Пример #4
0
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);
}
Пример #5
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);
}