Code beautification with uncrustify
[alexxy/gromacs.git] / src / gromacs / gmxlib / xdrd.c
1 /*
2  *
3  *                This source code is part of
4  *
5  *                 G   R   O   M   A   C   S
6  *
7  *          GROningen MAchine for Chemical Simulations
8  *
9  *                        VERSION 3.2.0
10  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12  * Copyright (c) 2001-2004, The GROMACS development team,
13  * check out http://www.gromacs.org for more information.
14
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version 2
18  * of the License, or (at your option) any later version.
19  *
20  * If you want to redistribute modifications, please consider that
21  * scientific software is very special. Version control is crucial -
22  * bugs must be traceable. We will be happy to consider code for
23  * inclusion in the official distribution, but derived work must not
24  * be called official GROMACS. Details are found in the README & COPYING
25  * files - if they are missing, get the official version at www.gromacs.org.
26  *
27  * To help us fund GROMACS development, we humbly ask that you cite
28  * the papers on the package - you can find them in the top README file.
29  *
30  * For more info, check our website at http://www.gromacs.org
31  *
32  * And Hey:
33  * GROningen Mixture of Alchemy and Childrens' Stories
34  */
35 #ifdef HAVE_CONFIG_H
36 #include <config.h>
37 #endif
38
39 #include "typedefs.h"
40 #include "xdrf.h"
41 #include "gmx_fatal.h"
42 #include "smalloc.h"
43
44 int xdr_real(XDR *xdrs, real *r)
45 {
46 #ifdef GMX_DOUBLE
47     float f;
48     int   ret;
49
50     f   = *r;
51     ret = xdr_float(xdrs, &f);
52     *r  = f;
53
54     return ret;
55 #else
56     return xdr_float(xdrs, (float *)r);
57 #endif
58 }
59
60 int xdr3drcoord(XDR *xdrs, real *fp, int *size, real *precision)
61 {
62 #ifdef GMX_DOUBLE
63     float *ffp;
64     float  fprec;
65     int    i, ret, isize;
66
67     isize = *size*DIM;
68     if (isize <= 0)
69     {
70         gmx_fatal(FARGS, "Don't know what to malloc for ffp, isize = %d", isize);
71     }
72
73     snew(ffp, isize);
74
75     for (i = 0; (i < isize); i++)
76     {
77         ffp[i] = fp[i];
78     }
79     fprec = *precision;
80     ret   = xdr3dfcoord(xdrs, ffp, size, &fprec);
81
82     *precision = fprec;
83     for (i = 0; (i < isize); i++)
84     {
85         fp[i] = ffp[i];
86     }
87
88     sfree(ffp);
89     return ret;
90 #else
91     return xdr3dfcoord(xdrs, (float *)fp, size, (float *)precision);
92 #endif
93 }
94
95 int xdr_gmx_large_int(XDR *xdrs, gmx_large_int_t *i, const char *warn)
96 {
97     /* This routine stores values compatible with xdr_int64_t */
98
99     int imaj, imin;
100     int ret;
101
102 #if ((defined SIZEOF_GMX_LARGE_INT) && SIZEOF_GMX_LARGE_INT == 8)
103     static const gmx_large_int_t two_p32_m1 = 0xFFFFFFFF;
104     gmx_large_int_t              imaj64, imin64;
105
106     imaj64 = ((*i)>>32) & two_p32_m1;
107     imin64 = (*i) & two_p32_m1;
108     imaj   = (int)imaj64;
109     imin   = (int)imin64;
110 #else
111     /* Our code has 4 bytes, but we should make sure that this value
112      * will be correctly read by 8 byte code.
113      */
114     if (*i >= 0)
115     {
116         imaj = 0;
117     }
118     else
119     {
120         imaj = -1;
121     }
122     imin = *i;
123 #endif
124     ret = xdr_int(xdrs, &imaj);
125     ret = xdr_int(xdrs, &imin);
126
127 #if ((defined SIZEOF_GMX_LARGE_INT) && SIZEOF_GMX_LARGE_INT == 8)
128     *i = (((gmx_large_int_t)imaj << 32) | ((gmx_large_int_t)imin & two_p32_m1));
129 #else
130     *i = imin;
131
132     if (warn != NULL && (imaj < -1 || imaj > 0))
133     {
134         fprintf(stderr, "\nWARNING during %s:\n", warn);
135         fprintf(stderr, "a step value written by code supporting 64bit integers is read by code that only supports 32bit integers, out of range step value has been converted to %d\n\n", *i);
136     }
137 #endif
138
139     return ret;
140 }