blob: b124476f8f09487c3ae949577d93bd49b827107c [file] [log] [blame]
#include <stdlib.h>
#include <stdio.h>
#include <ISO_Fortran_binding.h>
#include "dump-descriptors.h"
extern void ctest1 (CFI_cdesc_t *a, int first, int last, int step);
extern void ctest2 (CFI_cdesc_t *a, int first, int last, int step);
extern void ftest1 (CFI_cdesc_t *a, int first, int last, int step);
extern void ftest2 (CFI_cdesc_t *a, int first, int last, int step);
#if 0
static void
dump_array (CFI_cdesc_t *a, const char *name, const char *note)
{
int i;
fprintf (stderr, "%s\n", note);
for (i = 0; i < a->dim[0].extent; i++)
{
int j = i + a->dim[0].lower_bound;
int elt;
CFI_index_t sub[1];
sub[0] = j;
elt = *((int *) CFI_address (a, sub));
fprintf (stderr, "%s[%d] = %d\n", name, j, elt);
}
fprintf (stderr, "\n");
}
#else
#define dump_array(a, name, note)
#endif
static void
ctest (CFI_cdesc_t *a, int first, int last, int step,
void (*fn) (CFI_cdesc_t *, int, int, int))
{
int i;
/* Dump the descriptor contents to test that we can access the fields
correctly, etc. */
dump_CFI_cdesc_t (a);
dump_array (a, "a", "a on input to ctest");
/* Make sure we got a valid descriptor. */
if (!a->base_addr)
abort ();
if (a->elem_len != sizeof(int))
abort ();
if (a->rank != 1)
abort ();
if (a->type != CFI_type_int)
abort ();
if (a->attribute != CFI_attribute_other)
abort ();
/* Pass it to the Fortran function fn. */
(*fn) (a, first, last, step);
dump_CFI_cdesc_t (a);
dump_array (a, "a", "a after calling Fortran fn");
}
/* Entry points for the Fortran side.
Note that the Fortran code has already created the array section
and these functions were declared without the CONTIGUOUS attribute
so they receive a non-contiguous array. The magic is supposed to
happen when we pass them back into a Fortran function declared with
the CONTIGUOUS attribute. */
void
ctest1 (CFI_cdesc_t *a, int first, int last, int step)
{
ctest (a, first, last, step, ftest1);
}
void
ctest2 (CFI_cdesc_t *a, int first, int last, int step)
{
ctest (a, first, last, step, ftest2);
}