#include "config.h"
#include <assert.h>
#include "libgfortran.h"
extern void transpose_c8 (gfc_array_c8 * ret, gfc_array_c8 * source);
export_proto(transpose_c8);
void
transpose_c8 (gfc_array_c8 * ret, gfc_array_c8 * source)
{
index_type rxstride, rystride;
GFC_COMPLEX_8 *rptr;
index_type sxstride, systride;
const GFC_COMPLEX_8 *sptr;
index_type xcount, ycount;
index_type x, y;
assert (GFC_DESCRIPTOR_RANK (source) == 2);
if (ret->data == NULL)
{
assert (GFC_DESCRIPTOR_RANK (ret) == 2);
assert (ret->dtype == source->dtype);
ret->dim[0].lbound = 0;
ret->dim[0].ubound = source->dim[1].ubound - source->dim[1].lbound;
ret->dim[0].stride = 1;
ret->dim[1].lbound = 0;
ret->dim[1].ubound = source->dim[0].ubound - source->dim[0].lbound;
ret->dim[1].stride = ret->dim[0].ubound+1;
ret->data = internal_malloc_size (sizeof (GFC_COMPLEX_8) * size0 (ret));
ret->base = 0;
}
if (ret->dim[0].stride == 0)
ret->dim[0].stride = 1;
if (source->dim[0].stride == 0)
source->dim[0].stride = 1;
sxstride = source->dim[0].stride;
systride = source->dim[1].stride;
xcount = source->dim[0].ubound + 1 - source->dim[0].lbound;
ycount = source->dim[1].ubound + 1 - source->dim[1].lbound;
rxstride = ret->dim[0].stride;
rystride = ret->dim[1].stride;
rptr = ret->data;
sptr = source->data;
for (y=0; y < ycount; y++)
{
for (x=0; x < xcount; x++)
{
*rptr = *sptr;
sptr += sxstride;
rptr += rystride;
}
sptr += systride - (sxstride * xcount);
rptr += rxstride - (rystride * xcount);
}
}