1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 #ifndef OMPI_FORTRAN_BASE_FINT_2_INT_H
  24 #define OMPI_FORTRAN_BASE_FINT_2_INT_H
  25 
  26 #include "ompi_config.h"
  27 
  28 #include <stdlib.h>
  29 
  30 
  31 
  32 
  33 
  34 #if OMPI_SIZEOF_FORTRAN_INTEGER == SIZEOF_INT
  35   #define OMPI_ARRAY_NAME_DECL(a)
  36   #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2)
  37   #define OMPI_SINGLE_NAME_DECL(a)
  38   #define OMPI_ARRAY_NAME_CONVERT(a) a
  39   #define OMPI_SINGLE_NAME_CONVERT(a) a
  40   #define OMPI_INT_2_FINT(a) a
  41   #define OMPI_FINT_2_INT(a) a
  42   #define OMPI_PFINT_2_PINT(a) a
  43   #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n)
  44   #define OMPI_ARRAY_FINT_2_INT(in, n)
  45   #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2)
  46   #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in)
  47   #define OMPI_SINGLE_FINT_2_INT(in)
  48   #define OMPI_SINGLE_INT_2_FINT(in)
  49   #define OMPI_ARRAY_INT_2_FINT(in, n)
  50 
  51 #elif OMPI_SIZEOF_FORTRAN_INTEGER > SIZEOF_INT
  52   #define OMPI_ARRAY_NAME_DECL(a) int *c_##a
  53   #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
  54   #define OMPI_SINGLE_NAME_DECL(a) int c_##a
  55   #define OMPI_ARRAY_NAME_CONVERT(a) c_##a
  56   #define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
  57   #define OMPI_INT_2_FINT(a) a
  58   #define OMPI_FINT_2_INT(a) (int) (a)
  59   #define OMPI_PFINT_2_PINT(a) (int *) (a)
  60 
  61   
  62   #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
  63     OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
  64 
  65   
  66   #define OMPI_ARRAY_FINT_2_INT(in, n) \
  67     do { \
  68       int converted_n = (int)(n); \
  69       OMPI_ARRAY_NAME_CONVERT(in) = malloc(converted_n * sizeof(int)); \
  70       while(--converted_n >= 0) { \
  71         OMPI_ARRAY_NAME_CONVERT(in)[converted_n] = (int) in[converted_n]; \
  72       } \
  73     } while (0)
  74 
  75   
  76   #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
  77     do { \
  78       int converted_n = (int)(n); \
  79       OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(converted_n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
  80       while(--converted_n >= 0) { \
  81         for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
  82           OMPI_ARRAY_NAME_CONVERT(in)[converted_n][dim2_index] = (int)in[converted_n][dim2_index]; \
  83         } \
  84       } \
  85     } while (0)
  86 
  87   
  88   #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
  89     free(OMPI_ARRAY_NAME_CONVERT(in))
  90 
  91   
  92   #define OMPI_SINGLE_FINT_2_INT(in) \
  93     OMPI_ARRAY_NAME_CONVERT(in) = (int) *(in)
  94 
  95   
  96   #define OMPI_SINGLE_INT_2_FINT(in) \
  97     *(in) = OMPI_ARRAY_NAME_CONVERT(in)
  98 
  99   
 100   #define OMPI_ARRAY_INT_2_FINT(in, n) \
 101     do { \
 102       int converted_n = (int)(n); \
 103       while(--converted_n >= 0) { \
 104         in[converted_n] = OMPI_ARRAY_NAME_CONVERT(in)[converted_n]; \
 105       } \
 106       free(OMPI_ARRAY_NAME_CONVERT(in)); \
 107     } while (0)
 108 #else 
 109   #define OMPI_ARRAY_NAME_DECL(a) int *c_##a
 110   #define OMPI_2_DIM_ARRAY_NAME_DECL(a, dim2) int (*c_##a)[dim2], dim2_index
 111   #define OMPI_SINGLE_NAME_DECL(a) int c_##a
 112   #define OMPI_ARRAY_NAME_CONVERT(a) c_##a
 113   #define OMPI_SINGLE_NAME_CONVERT(a) &c_##a
 114   #define OMPI_INT_2_FINT(a) (MPI_Fint)(a)
 115   #define OMPI_FINT_2_INT(a) (a)
 116   #define OMPI_PFINT_2_PINT(a) a
 117 
 118   
 119   #define OMPI_ARRAY_FINT_2_INT_ALLOC(in, n) \
 120     OMPI_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
 121 
 122   #define OMPI_ARRAY_FINT_2_INT(in, n) \
 123     do { \
 124       int converted_n = (int)(n); \
 125       OMPI_ARRAY_NAME_CONVERT(in) = malloc(converted_n * sizeof(int)); \
 126       while(--converted_n >= 0) { \
 127         OMPI_ARRAY_NAME_CONVERT(in)[converted_n] = in[converted_n]; \
 128       } \
 129     } while (0)
 130 
 131   #define OMPI_2_DIM_ARRAY_FINT_2_INT(in, n, dim2) \
 132     do { \
 133       int converted_n = (int)(n); \
 134       OMPI_ARRAY_NAME_CONVERT(in) = (int (*)[dim2]) malloc(converted_n * sizeof(*OMPI_ARRAY_NAME_CONVERT(in))); \
 135       while(--converted_n >= 0) { \
 136         for(dim2_index = 0; dim2_index < dim2; ++dim2_index) { \
 137           OMPI_ARRAY_NAME_CONVERT(in)[converted_n][dim2_index] = in[converted_n][dim2_index]; \
 138         } \
 139       } \
 140     } while (0)
 141 
 142   #define OMPI_ARRAY_FINT_2_INT_CLEANUP(in) \
 143     free(OMPI_ARRAY_NAME_CONVERT(in))
 144 
 145   #define OMPI_SINGLE_FINT_2_INT(in) \
 146      OMPI_ARRAY_NAME_CONVERT(in) = *(in)
 147 
 148   #define OMPI_SINGLE_INT_2_FINT(in) \
 149     *in = (MPI_Fint) OMPI_ARRAY_NAME_CONVERT(in)
 150 
 151   #define OMPI_ARRAY_INT_2_FINT(in, n) \
 152     do { \
 153       int converted_n = (int)(n); \
 154       while(--converted_n >= 0) { \
 155         in[converted_n] = OMPI_ARRAY_NAME_CONVERT(in)[converted_n]; \
 156       } \
 157       free(OMPI_ARRAY_NAME_CONVERT(in)); \
 158     } while (0)
 159 
 160 #endif
 161 
 162 
 163 
 164 
 165 
 166 
 167 
 168 
 169 
 170 
 171 
 172 
 173 
 174 
 175 
 176 
 177 
 178 
 179 
 180 
 181 #if (OMPI_SIZEOF_FORTRAN_LOGICAL == SIZEOF_INT) && (OMPI_FORTRAN_VALUE_TRUE == 1)
 182 #  define OMPI_LOGICAL_NAME_DECL(in)               
 183 #  define OMPI_LOGICAL_NAME_CONVERT(in)        in  
 184 #  define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) in 
 185 #  define OMPI_LOGICAL_ARRAY_NAME_DECL(in)         
 186 #  define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)  in  
 187 #  define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n)     
 188 #  define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in)     
 189 
 190 #  define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT    0
 191 #  define OMPI_LOGICAL_2_INT(a) a
 192 #  define OMPI_INT_2_LOGICAL(a) a
 193 #  define OMPI_ARRAY_LOGICAL_2_INT(in, n)
 194 #  define OMPI_ARRAY_INT_2_LOGICAL(in, n)
 195 #  define OMPI_SINGLE_INT_2_LOGICAL(a)            
 196 #else
 197 
 198 
 199 
 200 #  define OMPI_FORTRAN_MUST_CONVERT_LOGICAL_2_INT    1
 201 #  define OMPI_LOGICAL_NAME_DECL(in)           int c_##in
 202 #  define OMPI_LOGICAL_NAME_CONVERT(in)        c_##in
 203 #  define OMPI_LOGICAL_SINGLE_NAME_CONVERT(in) &c_##in
 204 #  define OMPI_LOGICAL_ARRAY_NAME_DECL(in)     int * c_##in
 205 #  define OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)  c_##in
 206 #  define OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in,n) \
 207       OMPI_LOGICAL_ARRAY_NAME_CONVERT(in) = malloc(n * sizeof(int))
 208 #  define OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in) \
 209       free(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in))
 210 
 211 #  if OMPI_FORTRAN_VALUE_TRUE == 1
 212 #    define OMPI_LOGICAL_2_INT(a) (int)a
 213 #    define OMPI_INT_2_LOGICAL(a) (ompi_fortran_logical_t)a
 214 #    define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
 215 #  else
 216 #    define OMPI_LOGICAL_2_INT(a) ((a)==0? 0 : 1)
 217 #    define OMPI_INT_2_LOGICAL(a) ((a)==0? 0 : OMPI_FORTRAN_VALUE_TRUE)
 218 #    define OMPI_SINGLE_INT_2_LOGICAL(a) *a=(OMPI_INT_2_LOGICAL(OMPI_LOGICAL_NAME_CONVERT(a)))
 219 #  endif
 220 #  define OMPI_ARRAY_LOGICAL_2_INT(in, n) do { \
 221        int converted_n = (int)(n); \
 222        OMPI_ARRAY_LOGICAL_2_INT_ALLOC(in, converted_n + 1); \
 223        while (--converted_n >= 0) { \
 224          OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[converted_n]=OMPI_LOGICAL_2_INT(in[converted_n]); \
 225        } \
 226      } while (0)
 227 #  define OMPI_ARRAY_INT_2_LOGICAL(in, n) do { \
 228        int converted_n = (int)(n); \
 229        while (--converted_n >= 0) { \
 230          in[converted_n]=OMPI_INT_2_LOGICAL(OMPI_LOGICAL_ARRAY_NAME_CONVERT(in)[converted_n]); \
 231        } \
 232        OMPI_ARRAY_LOGICAL_2_INT_CLEANUP(in); \
 233      }  while (0)
 234 #endif 
 235 
 236 
 237 #endif