20 #ifndef OMPI_FINT_2_INT_H
21 #define OMPI_FINT_2_INT_H
23 #include "ompi_config.h"
31 #if OMPI_SIZEOF_FORTRAN_INTEGER == SIZEOF_INT
32 #define OMPI_ARRAY_NAME_DECL(a)
33 #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2)
34 #define OMPI_SINGLE_NAME_DECL(a)
35 #define OMPI_ARRAY_NAME_CONVERT(a) a
36 #define OMPI_SINGLE_NAME_CONVERT(a) a
37 #define OMPI_INT_2_FINT(a) a
38 #define OMPI_FINT_2_INT(a) a
39 #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n)
40 #define OMPI_ARRAY_FINT_2_INT(in, n)
41 #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2)
42 #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in)
43 #define OMPI_SINGLE_FINT_2_INT(in)
44 #define OMPI_SINGLE_INT_2_FINT(in)
45 #define OMPI_ARRAY_INT_2_FINT(in, n)
47 #elif OMPI_SIZEOF_FORTRAN_INTEGER > SIZEOF_INT
48 #define OMPI_ARRAY_NAME_DECL(a) int *c_##a
49 #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
50 #define OMPI_SINGLE_NAME_DECL(a) int c_##a
51 #define OMPI_ARRAY_NAME_CONVERT(a) c_##a
52 #define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
53 #define OMPI_INT_2_FINT(a) a
54 #define OMPI_FINT_2_INT(a) (int) (a)
57 #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
58 OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
61 #define OMPI_ARRAY_FINT_2_INT(in, n) \
63 int converted_n = (int)(n); \
64 OMPI_ARRAY_NAME_CONVERT(in) = malloc(converted_n * sizeof(int)); \
65 while(--converted_n >= 0) { \
66 OMPI_ARRAY_NAME_CONVERT(in)[converted_n] = (int) in[converted_n]; \
71 #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
73 int converted_n = (int)(n); \
74 OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(converted_n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
75 while(--converted_n >= 0) { \
76 for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
77 OMPI_ARRAY_NAME_CONVERT(in)[converted_n][dim2_index] = (int)in[converted_n][dim2_index]; \
83 #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
84 free(OMPI_ARRAY_NAME_CONVERT(in))
87 #define OMPI_SINGLE_FINT_2_INT(in) \
88 OMPI_ARRAY_NAME_CONVERT(in) = (int) *(in)
91 #define OMPI_SINGLE_INT_2_FINT(in) \
92 *(in) = OMPI_ARRAY_NAME_CONVERT(in)
95 #define OMPI_ARRAY_INT_2_FINT(in, n) \
97 int converted_n = (int)(n); \
98 while(--converted_n >= 0) { \
99 in[converted_n] = OMPI_ARRAY_NAME_CONVERT(in)[converted_n]; \
101 free(OMPI_ARRAY_NAME_CONVERT(in)); \
104 #define OMPI_ARRAY_NAME_DECL(a) int *c_##a
105 #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
106 #define OMPI_SINGLE_NAME_DECL(a) int c_##a
107 #define OMPI_ARRAY_NAME_CONVERT(a) c_##a
108 #define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
109 #define OMPI_INT_2_FINT(a) (MPI_Fint)(a)
110 #define OMPI_FINT_2_INT(a) (a)
113 #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
114 OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
116 #define OMPI_ARRAY_FINT_2_INT(in, n) \
118 int converted_n = (int)(n); \
119 OMPI_ARRAY_NAME_CONVERT(in) = malloc(converted_n * sizeof(int)); \
120 while(--converted_n >= 0) { \
121 OMPI_ARRAY_NAME_CONVERT(in)[converted_n] = in[converted_n]; \
125 #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
127 int converted_n = (int)(n); \
128 OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(converted_n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
129 while(--converted_n >= 0) { \
130 for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
131 OMPI_ARRAY_NAME_CONVERT(in)[converted_n][dim2_index] = in[converted_n][dim2_index]; \
136 #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
137 free(OMPI_ARRAY_NAME_CONVERT(in))
139 #define OMPI_SINGLE_FINT_2_INT(in) \
140 OMPI_ARRAY_NAME_CONVERT(in) = *(in)
142 #define OMPI_SINGLE_INT_2_FINT(in) \
143 *in = (MPI_Fint) OMPI_ARRAY_NAME_CONVERT(in)
145 #define OMPI_ARRAY_INT_2_FINT(in, n) \
147 int converted_n = (int)(n); \
148 while(--converted_n >= 0) { \
149 in[converted_n] = OMPI_ARRAY_NAME_CONVERT(in)[converted_n]; \
151 free(OMPI_ARRAY_NAME_CONVERT(in)); \
160 #if OMPI_SIZEOF_FORTRAN_LOGICAL == SIZEOF_INT
161 # define OMPI_LOGICAL_NAME_DECL(in)
162 # define OMPI_LOGICAL_NAME_CONVERT(in) in
163 # define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) in
164 # define OMPI_LOGICAL_ARRAY_NAME_DECL(in)
165 # define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) in
166 # define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n)
167 # define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in)
169 # if OMPI_FORTRAN_VALUE_TRUE == 1
170 # define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 0
171 # define OMPI_LOGICAL_2_INT(a) a
172 # define OMPI_INT_2_LOGICAL(a) a
173 # define OMPI_ARRAY_LOGICAL_2_INT(in, n)
174 # define OMPI_ARRAY_INT_2_LOGICAL(in, n)
175 # define OMPI_SINGLE_INT_2_LOGICAL(a)
177 # define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 1
178 # define OMPI_LOGICAL_2_INT(a) ((a)==0? 0 : 1)
179 # define OMPI_INT_2_LOGICAL(a) ((a)==0? 0 : OMPI_FORTRAN_VALUE_TRUE)
180 # define OMPI_SINGLE_INT_2_LOGICAL(a) *a=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(*a))
181 # define OMPI_ARRAY_LOGICAL_2_INT(in, n) do { \
182 int converted_n = (int)(n); \
183 OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in, converted_n + 1); \
184 while (--converted_n >= 0) { \
185 OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[converted_n]=OMPI_LOGICAL_2_INT(in[converted_n]); \
188 # define OMPI_ARRAY_INT_2_LOGICAL(in, n) do { \
189 int converted_n = (int)(n); \
190 while (--converted_n >= 0) { \
191 in[converted_n]=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[converted_n]); \
193 free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)); \
201 # define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT 1
202 # define OMPI_LOGICAL_NAME_DECL(in) int c_##in
203 # define OMPI_LOGICAL_NAME_CONVERT(in) c_##in
204 # define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) &c_##in
205 # define OMPI_LOGICAL_ARRAY_NAME_DECL(in) int * c_##in
206 # define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) c_##in
207 # define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n) \
208 OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
209 # define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in) \
210 free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in))
212 # if OMPI_FORTRAN_VALUE_TRUE == 1
213 # define OMPI_LOGICAL_2_INT(a) (int)a
214 # define OMPI_INT_2_LOGICAL(a) (ompi_fortran_logical_t)a
215 # define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
217 # define OMPI_LOGICAL_2_INT(a) ((a)==0? 0 : 1)
218 # define OMPI_INT_2_LOGICAL(a) ((a)==0? 0 : OMPI_FORTRAN_VALUE_TRUE)
219 # define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
221 # define OMPI_ARRAY_LOGICAL_2_INT(in, n) do { \
222 int converted_n = (int)(n); \
223 OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in, converted_n + 1); \
224 while (--converted_n >= 0) { \
225 OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[converted_n]=OMPI_LOGICAL_2_INT(in[converted_n]); \
228 # define OMPI_ARRAY_INT_2_LOGICAL(in, n) do { \
229 int converted_n = (int)(n); \
230 while (--converted_n >= 0) { \
231 in[converted_n]=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[converted_n]); \
233 free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)); \