50 lines
1.3 KiB
C
50 lines
1.3 KiB
C
/* Passing from fortran to C by value, using VALUE. This is identical
|
|
to c_by_val_1.c, which performs the same function for %VAL.
|
|
|
|
Contributed by Paul Thomas <pault@gcc.gnu.org> */
|
|
|
|
/* We used to #include <complex.h>, but this fails for some platforms
|
|
(like cygwin) who don't have it yet. */
|
|
#define complex __complex__
|
|
#define _Complex_I (1.0iF)
|
|
|
|
extern float *f_to_f__ (float, float*);
|
|
extern int *i_to_i__ (int, int*);
|
|
extern void c_to_c__ (complex float*, complex float, complex float*);
|
|
extern void abort (void);
|
|
|
|
/* In f_to_f and i_to_i we return the second argument, so that we do
|
|
not have to worry about keeping track of memory allocation between
|
|
fortran and C. All three functions check that the argument passed
|
|
by value is the same as that passed by reference. Then the passed
|
|
by value argument is modified so that the caller can check that
|
|
its version has not changed.*/
|
|
|
|
float *
|
|
f_to_f__(float a1, float *a2)
|
|
{
|
|
if ( a1 != *a2 ) abort();
|
|
*a2 = a1 * 2.0;
|
|
a1 = 0.0;
|
|
return a2;
|
|
}
|
|
|
|
int *
|
|
i_to_i__(int i1, int *i2)
|
|
{
|
|
if ( i1 != *i2 ) abort();
|
|
*i2 = i1 * 3;
|
|
i1 = 0;
|
|
return i2;
|
|
}
|
|
|
|
void
|
|
c_to_c__(complex float *retval, complex float c1, complex float *c2)
|
|
{
|
|
if ( c1 != *c2 ) abort();
|
|
c1 = 0.0 + 0.0 * _Complex_I;
|
|
*retval = *c2 * 4.0;
|
|
return;
|
|
}
|
|
|