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, CFI_cdesc_t *b);
8 extern void ftest2 (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,CFI_cdesc_t * b)19 ctest (CFI_cdesc_t *a, CFI_cdesc_t *b)
20 {
21   CFI_index_t i, j;
22   CFI_index_t s[2];
23   struct m *mpa, *mpb;
24 
25   /* Dump the descriptor contents to test that we can access the fields
26      correctly, etc.  */
27   dump_CFI_cdesc_t (a);
28   if (a->rank != 2)
29     abort ();
30   if (a->attribute != CFI_attribute_other)
31     abort ();
32   if (a->dim[0].lower_bound != 0)
33     abort ();
34   if (a->dim[0].extent != imax)
35     abort ();
36   if (a->dim[1].lower_bound != 0)
37     abort ();
38   if (a->dim[1].extent != jmax)
39     abort ();
40 
41   dump_CFI_cdesc_t (b);
42   if (b->rank != 2)
43     abort ();
44   if (b->attribute != CFI_attribute_other)
45     abort ();
46   if (b->dim[0].lower_bound != 0)
47     abort ();
48   if (b->dim[0].extent != jmax)
49     abort ();
50   if (b->dim[1].lower_bound != 0)
51     abort ();
52   if (b->dim[1].extent != imax)
53     abort ();
54 
55   /* Call back into Fortran, passing both the a and b arrays.  */
56   ftest2 (a, b);
57 
58   /* Check that we got a valid b array back.  */
59   dump_CFI_cdesc_t (b);
60   if (b->rank != 2)
61     abort ();
62   if (b->attribute != CFI_attribute_other)
63     abort ();
64   if (b->dim[0].lower_bound != 0)
65     abort ();
66   if (b->dim[0].extent != jmax)
67     abort ();
68   if (b->dim[1].lower_bound != 0)
69     abort ();
70   if (b->dim[1].extent != imax)
71     abort ();
72 
73   for (j = 0; j < jmax; j++)
74     for (i = 0; i < imax; i++)
75       {
76 	s[0] = i;
77 	s[1] = j;
78 	mpa = (struct m *) CFI_address (a, s);
79 	s[0] = j;
80 	s[1] = i;
81 	mpb = (struct m *) CFI_address (b, s);
82 	if (mpa->i != mpb->i)
83 	  abort ();
84 	if (mpa->j != mpb->j)
85 	  abort ();
86       }
87 }
88