/* PR middle-end/63762 */
/* { dg-do assemble } */
/* { dg-options "-O2" } */

#include <stdlib.h>

void *astFree ();
void *astMalloc ();
void astNegate (void *);
int astGetNegated (void *);
void astGetRegionBounds (void *, double *, double *);
int astResampleF (void *, ...);

extern int astOK;

int
MaskF (int inside, int ndim, const int lbnd[], const int ubnd[],
       float in[], float val)
{

  void *used_region;
  float *c, *d, *out, *tmp_out;
  double *lbndgd, *ubndgd;
  int *lbndg, *ubndg, idim, ipix, nax, nin, nout, npix, npixg, result = 0;
  if (!astOK) return result;
  lbndg = astMalloc (sizeof (int)*(size_t) ndim);
  ubndg = astMalloc (sizeof (int)*(size_t) ndim);
  lbndgd = astMalloc (sizeof (double)*(size_t) ndim);
  ubndgd = astMalloc (sizeof (double)*(size_t) ndim);
  if (astOK)
    {
      astGetRegionBounds (used_region, lbndgd, ubndgd);
      npix = 1;
      npixg = 1;
      for (idim = 0; idim < ndim; idim++)
        {
          lbndg[ idim ] = lbnd[ idim ];
          ubndg[ idim ] = ubnd[ idim ];
          npix *= (ubnd[ idim ] - lbnd[ idim ] + 1);
          if (npixg >= 0) npixg *= (ubndg[ idim ] - lbndg[ idim ] + 1);
        }
      if (npixg <= 0 && astOK)
        {
          if ((inside != 0) == (astGetNegated( used_region ) != 0))
            {
              c = in;
              for (ipix = 0; ipix < npix; ipix++) *(c++) = val;
              result = npix;
            }
        }
      else if (npixg > 0 && astOK)
        {
          if ((inside != 0) == (astGetNegated (used_region) != 0))
            {
              tmp_out = astMalloc (sizeof (float)*(size_t) npix);
              if (tmp_out)
                {
                  c = tmp_out;
                  for (ipix = 0; ipix < npix; ipix++) *(c++) = val;
                  result = npix - npixg;
                }
              out = tmp_out;
            }
          else
            {
              tmp_out = NULL;
              out = in;
            }
          if (inside) astNegate (used_region);
          result += astResampleF (used_region, ndim, lbnd, ubnd, in, NULL,
                                  NULL, NULL, 0, 0.0, 100, val, ndim,
                                  lbnd, ubnd, lbndg, ubndg, out, NULL);
          if (inside) astNegate (used_region);
        }
    }
  return result;
}
