#ifndef lint
static char *RCSid = "$Id: bf_test.c%v 3.38.2.100 1993/03/22 03:23:10 woo Exp woo $";
#endif


/*
 * Test routines for binary files
 * cc bf_test.c -o bf_test binary_files.o -lm
 *
 * Copyright (c) 1992 Robert K. Cunningham, MIT Lincoln Laboratory
 *
 */
#include <stdio.h>
#if !defined(apollo) && !defined(sequent) && !defined(u3b2)
#include <stdlib.h>
#else
extern char *malloc();
#endif
#include <math.h>
float *vector();
float *extend_vector();
float *retract_vector();
float **matrix();
float **extend_matrix();
float **retract_matrix();
void free_matrix();
void free_vector();

typedef struct {
  float xmin, xmax;
  float ymin, ymax;
} range;

#define NUM_PLOTS 2
range TheRange[] = {{-3,3,-2,2},
                    {-3,3,-3,3},
                    {-3,3,-3,3}};/* Sampling rate causes this to go from -3:6*/

/*---- Stubs to make this work without including huge libraries ----*/
void int_error(error_text,dummy)
     char *error_text;
     int dummy;
{
  fprintf(stderr,"Fatal error..\n");
  fprintf(stderr,"%s\n",error_text);
  fprintf(stderr,"...now exiting to system ...\n");
  exit(1);
}

char *alloc(i)
unsigned long i;
{
  return(malloc(i));
}
/*---- End of stubs ----*/

float function(p,x,y)
int p;
double x,y;
{
  float t;
  switch (p){
  case 0:
    t = 1.0/(x*x+y*y+1.0);
    break;
  case 1:
    t = sin(x*x + y*y)/(x*x + y*y);
    if (t> 1.0)  t = 1.0;
    break;
  case 2:
    t = sin(x*x + y*y)/(x*x + y*y);
    t *= sin(4.*(x*x + y*y))/(4.*(x*x + y*y));  /* sinc modulated sinc */
    if (t> 1.0)  t = 1.0;
    break;
  default:
    fprintf(stderr, "Unknown function\n");
    break;
  }
  return t;
}

#define ISOSAMPLES (double)5
int
main()
{
  int plot;
  int i,j;
  float x,y;
  float *rt,*ct;
  float **m;
  int xsize,ysize;
  char buf[256];
  FILE *fout;
/*  Create a few standard test interfaces */

  for(plot = 0; plot < NUM_PLOTS; plot++){
    xsize = (TheRange[plot].xmax - TheRange[plot].xmin)*ISOSAMPLES +1;
    ysize = (TheRange[plot].ymax - TheRange[plot].ymin)*ISOSAMPLES +1;

    rt = vector(0,xsize-1);
    ct = vector(0,ysize-1);
    m =  matrix(0,xsize-1,0,ysize-1);

    for(y=TheRange[plot].ymin,j=0;j<ysize;j++,y+=1.0/(double)ISOSAMPLES){
      ct[j] = y;
    }

    for(x=TheRange[plot].xmin,i=0;i<xsize;i++,x+=1.0/(double)ISOSAMPLES){
      rt[i] = x;
      for(y=TheRange[plot].ymin,j=0;j<ysize;j++,y+=1.0/(double)ISOSAMPLES){
        m[i][j] = function(plot,x,y);
      }
    }

    sprintf(buf,"binary%d",plot+1);
#ifdef UNIX
    if(!(fout = fopen(buf,"w")))
#else
    if(!(fout = fopen(buf,"wb")))
#endif
      int_error("Could not open file",0);
    else{
      fwrite_matrix(fout,m,0,xsize-1,0,ysize-1,rt,ct);
    }
    free_vector(rt,0,ysize-1);
    free_vector(ct,0,xsize-1);
    free_matrix(m,0,xsize-1,0,ysize-1);
  }

  /* Show that it's ok to vary sampling rate, as long as x1<x2, y1<y2... */
  xsize = (TheRange[plot].xmax - TheRange[plot].xmin)*ISOSAMPLES +1;
  ysize = (TheRange[plot].ymax - TheRange[plot].ymin)*ISOSAMPLES +1;

  rt = vector(0,xsize-1);
  ct = vector(0,ysize-1);
  m =  matrix(0,xsize-1,0,ysize-1);

  for(y=TheRange[plot].ymin,j=0;j<ysize;j++,y+=1.0/(double)ISOSAMPLES){
    ct[j] = y>0?2*y:y;
  }
  for(x=TheRange[plot].xmin,i=0;i<xsize;i++,x+=1.0/(double)ISOSAMPLES){
    rt[i] = x>0?2*x:x;
    for(y=TheRange[plot].ymin,j=0;j<ysize;j++,y+=1.0/(double)ISOSAMPLES){
      m[i][j] = function(plot,x,y);
    }
  }

  sprintf(buf,"binary%d",plot+1);
#ifdef UNIX
  if(!(fout = fopen(buf,"w")))
#else
  if(!(fout = fopen(buf,"wb")))
#endif
    int_error("Could not open file",0);
  else{
    fwrite_matrix(fout,m,0,xsize-1,0,ysize-1,rt,ct);
  }
  free_vector(rt,0,ysize-1);
  free_vector(ct,0,xsize-1);
  free_matrix(m,0,xsize-1,0,ysize-1);

  return(0);
}
