Merge release-4-6 into master
[alexxy/gromacs.git] / src / gromacs / gmxlib / libxdrf.c
index 9a2be229fe2fb115feb62764182520abad476773..b76cac81fea6813e6369144d9135afff72424ca3 100644 (file)
@@ -76,422 +76,6 @@ const char *xdr_datatype_names[] =
 };
 
 
-#ifdef GMX_FORTRAN
-
-/* NOTE: DO NOT USE THESE ANYWHERE IN GROMACS ITSELF. 
-   These are necessary for the backward-compatile io routines for 3d party
-   tools */
-#define MAXID 256
-static FILE *xdrfiles[MAXID];
-static XDR *xdridptr[MAXID];
-static char xdrmodes[MAXID];
-static unsigned int cnt;
-#ifdef GMX_THREAD_MPI
-/* we need this because of the global variables above for FORTRAN binding. 
-   The I/O operations are going to be slow. */
-static tMPI_Thread_mutex_t xdr_fortran_mutex=TMPI_THREAD_MUTEX_INITIALIZER;
-#endif
-
-static void xdr_fortran_lock(void)
-{
-#ifdef GMX_THREAD_MPI
-    tMPI_Thread_mutex_lock(&xdr_fortran_mutex);
-#endif
-}
-static void xdr_fortran_unlock(void)
-{
-#ifdef GMX_THREAD_MPI
-    tMPI_Thread_mutex_unlock(&xdr_fortran_mutex);
-#endif
-}
-
-
-
-/* the open&close prototypes */
-static int xdropen(XDR *xdrs, const char *filename, const char *type);
-static int xdrclose(XDR *xdrs);
-
-typedef void (* F77_FUNC(xdrfproc,XDRFPROC))(int *, void *, int *);
-
-int ftocstr(char *ds, int dl, char *ss, int sl)
-    /* dst, src ptrs */
-    /* dst max len */
-    /* src len */
-{
-    char *p;
-
-    p = ss + sl;
-    while ( --p >= ss && *p == ' ' );
-    sl = p - ss + 1;
-    dl--;
-    ds[0] = 0;
-    if (sl > dl)
-      return 1;
-    while (sl--)
-      (*ds++ = *ss++);
-    *ds = '\0';
-    return 0;
-}
-
-
-int ctofstr(char *ds, int dl, char *ss)
-     /* dest space */
-     /* max dest length */
-     /* src string (0-term) */
-{
-    while (dl && *ss) {
-       *ds++ = *ss++;
-       dl--;
-    }
-    while (dl--)
-       *ds++ = ' ';
-    return 0;
-}
-
-void
-F77_FUNC(xdrfbool,XDRFBOOL)(int *xdrid, int *pb, int *ret) 
-{
-        xdr_fortran_lock();
-       *ret = xdr_bool(xdridptr[*xdrid], pb);
-       cnt += XDR_INT_SIZE;
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfchar,XDRFCHAR)(int *xdrid, char *cp, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_char(xdridptr[*xdrid], cp);
-       cnt += sizeof(char);
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfdouble,XDRFDOUBLE)(int *xdrid, double *dp, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_double(xdridptr[*xdrid], dp);
-       cnt += sizeof(double);
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrffloat,XDRFFLOAT)(int *xdrid, float *fp, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_float(xdridptr[*xdrid], fp);
-       cnt += sizeof(float);
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfint,XDRFINT)(int *xdrid, int *ip, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_int(xdridptr[*xdrid], ip);
-       cnt += XDR_INT_SIZE;
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfshort,XDRFSHORT)(int *xdrid, short *sp, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_short(xdridptr[*xdrid], sp);
-       cnt += sizeof(sp);
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfuchar,XDRFUCHAR)(int *xdrid, unsigned char *ucp, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_u_char(xdridptr[*xdrid], (u_char *)ucp);
-       cnt += sizeof(char);
-        xdr_fortran_unlock();
-}
-
-
-void
-F77_FUNC(xdrfushort,XDRFUSHORT)(int *xdrid, unsigned short *usp, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_u_short(xdridptr[*xdrid], (unsigned short *)usp);
-       cnt += sizeof(unsigned short);
-        xdr_fortran_unlock();
-}
-
-void 
-F77_FUNC(xdrf3dfcoord,XDRF3DFCOORD)(int *xdrid, float *fp, int *size, float *precision, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr3dfcoord(xdridptr[*xdrid], fp, size, precision);
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfstring,XDRFSTRING)(int *xdrid, char * sp_ptr,
-                               int *maxsize, int *ret, int sp_len)
-{
-       char *tsp;
-
-        xdr_fortran_lock();
-       tsp = (char*) malloc((size_t)(((sp_len) + 1) * sizeof(char)));
-       if (tsp == NULL) {
-           *ret = -1;
-           return;
-       }
-       if (ftocstr(tsp, *maxsize+1, sp_ptr, sp_len)) {
-           *ret = -1;
-           free(tsp);
-            xdr_fortran_unlock();
-           return;
-       }
-        *ret = xdr_string(xdridptr[*xdrid], (char **) &tsp, (unsigned int) *maxsize);
-       ctofstr( sp_ptr, sp_len , tsp);
-       cnt += *maxsize;
-       free(tsp);
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfwrapstring,XDRFWRAPSTRING)(int *xdrid, char *sp_ptr,
-                                       int *ret, int sp_len)
-{
-       char *tsp;
-       int maxsize;
-
-        xdr_fortran_lock();
-       maxsize = (sp_len) + 1;
-       tsp = (char*) malloc((size_t)(maxsize * sizeof(char)));
-       if (tsp == NULL) {
-           *ret = -1;
-           return;
-            xdr_fortran_unlock();
-       }
-       if (ftocstr(tsp, maxsize, sp_ptr, sp_len)) {
-           *ret = -1;
-           free(tsp);
-           return;
-            xdr_fortran_unlock();
-       }
-       *ret = xdr_string(xdridptr[*xdrid], (char **) &tsp, (u_int)maxsize);
-       ctofstr( sp_ptr, sp_len, tsp);
-       cnt += maxsize;
-       free(tsp);
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfopaque,XDRFOPAQUE)(int *xdrid, caddr_t *cp, int *ccnt, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_opaque(xdridptr[*xdrid], (caddr_t)*cp, (u_int)*ccnt);
-       cnt += *ccnt;
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfsetpos,XDRFSETPOS)(int *xdrid, int *pos, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdr_setpos(xdridptr[*xdrid], (u_int) *pos);
-        xdr_fortran_unlock();
-}
-
-
-void
-F77_FUNC(xdrf,XDRF)(int *xdrid, int *pos)
-{
-        xdr_fortran_lock();
-       *pos = xdr_getpos(xdridptr[*xdrid]);
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfvector,XDRFVECTOR)(int *xdrid, char *cp, int *size, F77_FUNC(xdrfproc,XDRFPROC) elproc, int *ret) 
-{
-       int lcnt;
-       cnt = 0;
-        xdr_fortran_lock();
-       for (lcnt = 0; lcnt < *size; lcnt++) {
-               elproc(xdrid, (cp+cnt) , ret);
-       }
-        xdr_fortran_unlock();
-}
-
-
-void
-F77_FUNC(xdrfclose,XDRFCLOSE)(int *xdrid, int *ret)
-{
-        xdr_fortran_lock();
-       *ret = xdrclose(xdridptr[*xdrid]);
-       cnt = 0;
-        xdr_fortran_unlock();
-}
-
-void
-F77_FUNC(xdrfopen,XDRFOPEN)(int *xdrid, char *fp_ptr, char *mode_ptr,
-                           int *ret, int fp_len, int mode_len)
-{
-       char fname[512];
-       char fmode[3];
-
-        xdr_fortran_lock();
-       if (ftocstr(fname, sizeof(fname), fp_ptr, fp_len)) {
-               *ret = 0;
-       }
-       if (ftocstr(fmode, sizeof(fmode), mode_ptr,
-                       mode_len)) {
-               *ret = 0;
-       }
-
-       *xdrid = xdropen(NULL, fname, fmode);
-       if (*xdrid == 0)
-               *ret = 0;
-       else 
-               *ret = 1;       
-        xdr_fortran_unlock();
-}
-
-/*__________________________________________________________________________
- |
- | xdropen - open xdr file
- |
- | This versions differs from xdrstdio_create, because I need to know
- | the state of the file (read or write)  and the file descriptor
- | so I can close the file (something xdr_destroy doesn't do).
- |
- | It assumes xdr_fortran_mutex is locked.
- |
- | NOTE: THIS FUNCTION IS NOW OBSOLETE AND ONLY PROVIDED FOR BACKWARD
- |       COMPATIBILITY OF 3D PARTY TOOLS. IT SHOULD NOT BE USED ANYWHERE 
- |       IN GROMACS ITSELF. 
-*/
-
-int xdropen(XDR *xdrs, const char *filename, const char *type) {
-    static int init_done = 0;
-    enum xdr_op lmode;
-    int xdrid;
-    char newtype[5];
-
-
-#ifdef GMX_THREAD_MPI
-    if (!tMPI_Thread_mutex_trylock( &xdr_fortran_mutex ))  
-    {
-        tMPI_Thread_mutex_unlock( &xdr_fortran_mutex );
-        gmx_incons("xdropen called without locked mutex. NEVER call this function.");
-    }
-#endif 
-
-    if (init_done == 0) {
-       for (xdrid = 1; xdrid < MAXID; xdrid++) {
-           xdridptr[xdrid] = NULL;
-       }
-       init_done = 1;
-    }
-    xdrid = 1;
-    while (xdrid < MAXID && xdridptr[xdrid] != NULL) {
-       xdrid++;
-    }
-    if (xdrid == MAXID) {
-       return 0;
-    }
-    if (*type == 'w' || *type == 'W')
-    {
-        xdrmodes[xdrid] = 'w';
-        strcpy(newtype, "wb+");
-        lmode = XDR_ENCODE;
-    }
-    else if (*type == 'a' || *type == 'A')
-    {
-        xdrmodes[xdrid] = 'a';
-        strcpy(newtype, "ab+");
-        lmode = XDR_ENCODE;
-    }
-    else if (gmx_strncasecmp(type, "r+", 2) == 0)
-    {
-        xdrmodes[xdrid] = 'a';
-        strcpy(newtype, "rb+");
-        lmode = XDR_ENCODE;
-    }
-    else
-    {
-        xdrmodes[xdrid] = 'r';
-        strcpy(newtype, "rb");
-        lmode = XDR_DECODE;
-    }
-    xdrfiles[xdrid] = fopen(filename, newtype);
-       
-    if (xdrfiles[xdrid] == NULL) {
-       xdrs = NULL;
-       return 0;
-    }
-    
-    /* next test isn't useful in the case of C language
-     * but is used for the Fortran interface
-     * (C users are expected to pass the address of an already allocated
-     * XDR staructure)
-     */
-    if (xdrs == NULL) {
-       xdridptr[xdrid] = (XDR *) malloc((size_t)sizeof(XDR));
-       xdrstdio_create(xdridptr[xdrid], xdrfiles[xdrid], lmode);
-    } else {
-       xdridptr[xdrid] = xdrs;
-       xdrstdio_create(xdrs, xdrfiles[xdrid], lmode);
-    }
-    return xdrid;
-}
-/*_________________________________________________________________________
- |
- | xdrclose - close a xdr file
- |
- | This will flush the xdr buffers, and destroy the xdr stream.
- | It also closes the associated file descriptor (this is *not*
- | done by xdr_destroy).
- |
- | It assumes xdr_fortran_mutex is locked.
- |
- | NOTE: THIS FUNCTION IS NOW OBSOLETE AND ONLY PROVIDED FOR BACKWARD
- |       COMPATIBILITY OF 3D PARTY TOOLS. IT SHOULD NOT BE USED ANYWHERE 
- |       IN GROMACS ITSELF. 
-*/
-int xdrclose(XDR *xdrs) {
-    int xdrid;
-    int rc = 0;
-
-#ifdef GMX_THREAD_MPI
-    if (!tMPI_Thread_mutex_trylock( &xdr_fortran_mutex ))  
-    {
-        tMPI_Thread_mutex_unlock( &xdr_fortran_mutex );
-        gmx_incons("xdropen called without locked mutex. NEVER call this function");
-    }
-#endif
-
-    if (xdrs == NULL) {
-       fprintf(stderr, "xdrclose: passed a NULL pointer\n");
-       exit(1);
-    }
-    for (xdrid = 1; xdrid < MAXID && rc==0; xdrid++) {
-       if (xdridptr[xdrid] == xdrs) {
-           
-           xdr_destroy(xdrs);
-           rc = fclose(xdrfiles[xdrid]);
-           xdridptr[xdrid] = NULL;
-           return !rc; /* xdr routines return 0 when ok */
-       }
-    } 
-    fprintf(stderr, "xdrclose: no such open xdr file\n");
-    exit(1);
-    
-    /* to make some compilers happy: */
-    return 0;    
-}
-
-#endif /* GMX_FORTRAN */
-
-
 /*___________________________________________________________________________
  |
  | what follows are the C routine to read/write compressed coordinates together