};
-#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