#include "config.h"
#include <stdlib.h>
#include <assert.h>
#include "libgfortran.h"
void
__all_l4 (gfc_array_l4 * retarray, gfc_array_l4 *array, index_type *pdim)
{
index_type count[GFC_MAX_DIMENSIONS - 1];
index_type extent[GFC_MAX_DIMENSIONS - 1];
index_type sstride[GFC_MAX_DIMENSIONS - 1];
index_type dstride[GFC_MAX_DIMENSIONS - 1];
GFC_LOGICAL_4 *base;
GFC_LOGICAL_4 *dest;
index_type rank;
index_type n;
index_type len;
index_type delta;
index_type dim;
dim = (*pdim) - 1;
rank = GFC_DESCRIPTOR_RANK (array) - 1;
assert (rank == GFC_DESCRIPTOR_RANK (retarray));
if (array->dim[0].stride == 0)
array->dim[0].stride = 1;
if (retarray->dim[0].stride == 0)
retarray->dim[0].stride = 1;
len = array->dim[dim].ubound + 1 - array->dim[dim].lbound;
delta = array->dim[dim].stride;
for (n = 0; n < dim; n++)
{
sstride[n] = array->dim[n].stride;
extent[n] = array->dim[n].ubound + 1 - array->dim[n].lbound;
}
for (n = dim; n < rank; n++)
{
sstride[n] = array->dim[n + 1].stride;
extent[n] =
array->dim[n + 1].ubound + 1 - array->dim[n + 1].lbound;
}
for (n = 0; n < rank; n++)
{
count[n] = 0;
dstride[n] = retarray->dim[n].stride;
if (extent[n] <= 0)
len = 0;
}
base = array->data;
dest = retarray->data;
while (base)
{
GFC_LOGICAL_4 *src;
GFC_LOGICAL_4 result;
src = base;
{
result = 1;
if (len <= 0)
*dest = 1;
else
{
for (n = 0; n < len; n++, src += delta)
{
if (! *src)
{
result = 0;
break;
}
}
*dest = result;
}
}
count[0]++;
base += sstride[0];
dest += dstride[0];
n = 0;
while (count[n] == extent[n])
{
count[n] = 0;
base -= sstride[n] * extent[n];
dest -= dstride[n] * extent[n];
n++;
if (n == rank)
{
base = NULL;
break;
}
else
{
count[n]++;
base += sstride[n];
dest += dstride[n];
}
}
}
}