1 #include <stdlib.h>
2 #include <stdio.h>
3 
4 #include <ISO_Fortran_binding.h>
5 #include "dump-descriptors.h"
6 
7 extern void ctest (CFI_cdesc_t *a);
8 extern void ftest (CFI_cdesc_t *a, CFI_cdesc_t *b);
9 
10 struct m {
11   int i;
12   int j;
13 };
14 
15 #define imax 10
16 #define jmax 5
17 
18 void
ctest(CFI_cdesc_t * a)19 ctest (CFI_cdesc_t *a)
20 {
21 
22   struct m bdata[imax][jmax];
23   CFI_CDESC_T(2) bdesc;
24   CFI_cdesc_t *b = (CFI_cdesc_t *) &bdesc;
25   int i, j;
26   CFI_index_t subscripts[2];
27   struct m* mp;
28 
29   /* Dump the descriptor contents to test that we can access the fields
30      correctly, etc.  */
31   dump_CFI_cdesc_t (a);
32 
33   if (a->rank != 2)
34     abort ();
35   if (a->attribute != CFI_attribute_other)
36     abort ();
37   if (a->dim[0].lower_bound != 0)
38     abort ();
39   if (a->dim[0].extent != imax)
40     abort ();
41   if (a->dim[1].lower_bound != 0)
42     abort ();
43   if (a->dim[1].extent != jmax)
44     abort ();
45 
46   /* Transpose a's contents into bdata.  */
47   for (j = 0; j < jmax; j++)
48     {
49       subscripts[1] = j;
50       for (i = 0; i < imax; i++)
51 	{
52 	  subscripts[0] = i;
53 	  mp = (struct m *) CFI_address (a, subscripts);
54 	  if (mp->i != i + 1)
55 	    abort ();
56 	  if (mp->j != j + 1)
57 	    abort ();
58 	  bdata[i][j].i = mp->i;
59 	  bdata[i][j].j = mp->j;
60 	}
61     }
62 
63   /* Fill in bdesc.  */
64   subscripts[0] = jmax;
65   subscripts[1] = imax;
66   check_CFI_status ("CFI_establish",
67 		    CFI_establish (b, bdata, CFI_attribute_other,
68 				   CFI_type_struct,
69 				   sizeof (struct m), 2, subscripts));
70 
71   /* Sanity checking to make sure the descriptor has been initialized
72      properly.  */
73   dump_CFI_cdesc_t (b);
74   if (b->version != CFI_VERSION)
75     abort ();
76   if (b->rank != 2)
77     abort ();
78   if (b->attribute != CFI_attribute_other)
79     abort ();
80   if (b->dim[0].lower_bound != 0)
81     abort ();
82   if (b->dim[0].extent != jmax)
83     abort ();
84   if (b->dim[1].lower_bound != 0)
85     abort ();
86   if (b->dim[1].extent != imax)
87     abort ();
88 
89   /* Call back into Fortran, passing both the a and b arrays.  */
90   ftest (a, b);
91 }
92