#include <stdio.h>

#define global
#define bool	    int
#define false	    0
#define true	    1
#define seq(s1,s2)  (strcmp(s1,s2) == 0)

#define MAXDATA	    8192
#define PATHLIMIT   200
#define GRAPHHGT    179.0   /* mm; accurate value depends on printer */

extern double log();


global main (argc, argv) int argc; char **argv;
  { static double data[MAXDATA];
    int ndata = 0;
    double val, min, max, xscale, yscale; int i, code;
    bool logopt = false, quopt = false;
    if (argc >= 2)
      { if (argc == 2 && seq(argv[1],"-log")) logopt = true;
	else if (argc == 2 && seq(argv[1],"-qu")) quopt = true;
	else
	  { fprintf(stderr, "Usage: psplot [-log] [-qu]\n");
	    exit(1);
	  }
      }
    code = scanf (" %lf", &val);
    while (ndata < MAXDATA && code > 0)
      { if (logopt)
	  { if (val < 0.1e-6)
	      { fprintf(stderr, "psplot: warning; setting log(%f) to %f\n", val, min);
		val = min;
	      }
	    else val = log(val);
	  }
	data[ndata] = val;
	if (ndata == 0) { min = val; max = val; }
	if (val<min) min = val;
	if (val>max) max = val;
	ndata++; code = scanf (" %lf", &val);
      }
    if (code > 0) fprintf (stderr, "psplot: warning; data ignored\n");
    xscale = 720.0 / (ndata-1);
    yscale = 504.0 / (max-min);
    if (quopt) yscale /= 2.0; /* ! */
    printf("%%! PostScript generated by psplot (AJF)\n");
    printf ("-90 rotate -780 60 translate 0 setlinewidth\n");
    printf ("newpath\n");
    printf ("0 0 moveto 720 0 lineto\n");
    for (i=0; i < ndata; i++)
      { double x = i*xscale;
	double y = (data[i]-min)*yscale;
	printf ("%d %d ", (int) x, (int) y);
	printf (i==0 ? "moveto" : "lineto");
	putchar ('\n');
	if (i%PATHLIMIT == 0)
	  { printf("stroke newpath\n");
	    printf("%d %d moveto\n", (int) x, (int) y);
	  }
      }
    printf ("stroke showpage\n");
    fprintf (stderr, "ndata %d   X range 0 %d   y range %.10g %.10g", ndata, ndata-1, min, max);
    if (logopt) fprintf(stderr, "   10dB = %.10g mm", (GRAPHHGT*log(10.0)) / (max-min));
    putc('\n', stderr);
    exit(0);
  }

