/*
 * $RCSfile: pt.c,v $
 *
 * x-kernel v3.3
 *
 * Copyright (c) 1996,1994  Arizona Board of Regents
 */

#include <unistd.h>
#include "pt.h"

/* #define XK_ETC "../../../etc" */
#define XK_ETC "../../simulator/etc"
#define XK_ETC_CS "/cs/x33/simulator/etc"

#define DONT_INCLUDE
#include "xkernel.h"
#include "evtrace.h"
#include "simul.h"

extern int QueueOnlyFlag, JournalFlag, Top2Flag;
extern char *PlotList;
int     PlotCnt=0;
int	Ntics=10;
int	StripBegTime, StripEndTime;
int	PageFlag=0, PageCnt=1;
int	BigFlag=0, PutHeaderFlag=0, PutShowPageFlag=0;
int	Auto1Flag=0, Auto2Flag=0;
int	NumStrips=1;
int	Min, Max;
float 	Aylen=1.5, Axpos=1.0, Axlen=6.3, X0=1.0, Y0=10.4;
char	TimeArray[3000];
char	PageName[50], DataName[100];
char	*FileName, *OutFilename="t.ps";
char	*OpenType="w";
int	PlotLostSntTimeBars=1, PlotIndex=0;
FILE	*Fout;

char 	array[200];

int 	plotPort0Flag=0, plotPort1Flag=0, plotQueueFlag=0;

float 	PlotIt(), PrintHeader();
unsigned long getTime(char *, int);

char	*PlotTypes[10];
int 	PlotTypesN=0;
char    *Note=NULL;


/*-------------------------  initPlot  -------------------------
*/
initPlot (protocol)
  int  protocol;
{
  float x, y, z;
  char	*cp, buf[100];
  int	i, j, k, n, ns, kinc, osCnt=0;
  FILE  *fin, *fout;

  if (PlotTypesN == 0)
    PlotTypes[PlotTypesN++] = "queue";

  for (k=strlen(FileName)-1; k>=0 && FileName[k]!='/'; k--)
    ;
  k++;
  if (k >= 3) 
    strcpy(DataName, &FileName[k-3]);
  else 
    strcpy(DataName, &FileName[k]);

  if (BigFlag) {
    X0 = 0.7;
    Y0 = 5.2;
  }
  x = X0, y = Y0;
  if (Auto2Flag) 
    Fout = fopen(OutFilename, "a");
  else if (PutHeaderFlag)
    InitPsFile();
  else
    Fout = fopen(OutFilename, OpenType);
  if (PutHeaderFlag)
    BeginPage(x, y);

  y = PrintHeader(x, y);

  Ntics = Xtime/Xtics;
  if (BigFlag &&  Ntics%2 != 0) {
    Ntics += 1;
    Xtics = Xtime/Ntics;
  }
  if (Xend-Xbeg <= (Xtime + 10000))
    i = Xtime;
  else if ((Xend-Xbeg)%Xtime <= 10000)
    i = Xend-Xbeg;
  else
    i = (Xend-Xbeg) + (Xtime - (Xend-Xbeg)%Xtime);
  NumStrips = i/Xtime;
    
  /* --- Do strips! */
  for (ns=1; ns<=NumStrips; ns++) {
    kinc = 1;
    strcpy(TimeArray, "[ ");
    if (BigFlag) {
      for (k=1; k<=Ntics/2; k++) {
	sprintf(TimeArray+strlen(TimeArray), "(%.1f) ", 
		(Xbeg+((ns-1)*Xtime)/1000000.0 + k)*Xtics/1000000.0);
      }
    }
    else {
      for (k=1; k<=Ntics; k++) {
	sprintf(TimeArray+strlen(TimeArray), "(%.1f) ", 
		(Xbeg+(ns-1)*Xtime)/1000000.0 + k*Xtics/1000000.0);
      }
    }
    strcat(TimeArray, "]");
    if (BigFlag) {
      StripBegTime = Xbeg + (ns - 1)*Xtime/2;
      StripEndTime = StripBegTime + Xtime/2;
      fprintf(Fout, "/xfix { %d sub %d div } def\n", StripBegTime, 
	      Xtics);
    }
    else {
      StripBegTime = Xbeg + (ns - 1)*Xtime;
      StripEndTime = StripBegTime + Xtime;
      fprintf(Fout, "/xfix { %d sub %d div } def\n", StripBegTime, Xtics);
    }
      
/*     for (j=0; j<PlotTypesN; j++) { */
/*       for (k=0; PlotTypeArray[k]!=NULL; k++) */
/* 	if (!strcmp(PlotTypes[j], PlotTypeArray[k])) { */
/* 	  if (!strcmp(PlotTypes[j], "queue")) */
/* 	    plotQueueFlag = 1; */
/* 	  else if (!strcmp(PlotTypes[j], "port0")) */
/* 	    plotPort0Flag = 1; */
/* 	  else if (!strcmp(PlotTypes[j], "port1")) */
/* 	    plotPort1Flag = 1; */

    for (j=0; j<PlotsN; j++) {
      PlotIndex = j;
      if (Plots[j].main == 0)
	continue;
      if (PlotList != NULL  &&  PlotList[PlotCnt] != 'x') {
        PlotCnt++;
        continue;
      }
      if (PlotList != NULL  &&  PlotList[PlotCnt] == '\0')
        break;
      if (Top2Flag &&  PlotCnt >= 2)
        break;
      PlotCnt++;
      if (BigFlag && ((++osCnt)%2 == 0)) 
	y = PlotIt(&Plots[j], y, 0.7);
      else
	y = PlotIt(&Plots[j], y, 0.3);

/*         y = PlotFunArray[k](y, 0.7, 0); */
/*       else */
/* 	y = PlotFunArray[k](y, 0.3, 0); */

      /* --- Show lost groups */
/*       fprintf(Fout, "%%\n%% Begin Loss Groups\n%%\n"); */
/*       for (k=0; k<LostGroupsN; k++) { */
/* 	LostGroups[k][1] = Max+(Max-Min)*0.15; */
/* 	if (k%2 == 1) { */
/* 	  PlotFunEr(0, 2, &LostGroups[k-1][0], "%d %d\n", */
/* 		    "3 0.8 plotStraightLines\n", 1); */
/* 	} */
/*       } */

      for (k=0; k<SpecialPlotsN; k++) {
	sprintf(buf, SpecialPlots[k].plotType, Min*SpecialPlots[k].minF +
		Max*SpecialPlots[k].maxF + (Max-Min)*SpecialPlots[k].minMaxF);
	PlotFun(0, SpecialPlots[k].arrayN, SpecialPlots[k].array, "%d %d\n",
		buf, 0);
      }
      for (k=0; k<EventsN; k++)
	PlotEvent(Events[k].event, Events[k].symbol, Min*Events[k].minF +
		  Max*Events[k].maxF + (Max-Min)*Events[k].minMaxF);

/*       if (protocol == TRACE_ROUTER_FCFS) { */
/* 	if (EventFlag & E_DROP) PlotEvent(E_DROP, P_VBAR, Min*1.0); */
/* 	if (EventFlag & E_COLL) PlotEvent(E_COLL, P_NLBAR_WCIRCLE, Min*1.0); */
/* 	if (EventFlag & E_BACKOFF) PlotEvent(E_BACKOFF, P_NLBAR_WDOT,  */
/* 					     Min*1.0); */
/* 	if (EventFlag & E_ERROR) PlotEvent(E_ERROR, P_UDIAMOND,  */
/* 					   Max+(Max-Min)*0.10); */
/* 	if (BusyN > 0) { */
/* 	  sprintf(buf, "0 %f 6 plotNumPercent\n", Max+(Max-Min)*0.03); */
/* 	  PlotFun(0, BusyN, Busy, "%d %d\n", buf, 0); */
/* 	} */
/*       } */
/*       else if (protocol == TRACE_PROTL_TRAFFIC) { */
/* 	if (EventFlag & E_SMTP) PlotEvent(E_SMTP, P_VBAR, Min*1.0); */
/*       if (EventFlag & E_TELNET) PlotEvent(E_TELNET, P_VBAR_WCIRCLE,  */
/* 					  Min*1.0);  */
/* 	if (EventFlag & E_FTP) PlotEvent(E_FTP, P_LVBAR_WCIRCLE, Min*1.0); */
/* 	if (EventFlag & E_NNTP) PlotEvent(E_NNTP, P_VBAR_WDOT, Min*1.0); */
/*       } */
    }
  }

  if (PutShowPageFlag)
    EndPage();
  if (Fout != NULL &&  PutShowPageFlag)
    fprintf(Fout, "end\n");
  fclose(Fout);
  if (Auto1Flag || Auto2Flag) {
    if ((fout = fopen("trace.page", "w")) != NULL) {
      fprintf(fout, "%d\n", PageCnt);
      fclose(fout);
    }
  }

} /* End of initPlot  .............................................*/



printUsage()
{
  fprintf(stderr, "USAGE: ...\n");
}

GetMaxMin (array, inc, count, amin, amax)

  int *array, inc, count, *amin, *amax;
{
  int min, max, k, *ip;

  ip = array;
  min = max = *ip;
  for (k=0; k<count; k++) {
    if (*ip < min)
      min = *ip;
    if (*ip > max)
      max = *ip;
    ip += inc;
  }
  *amin = min;
  *amax = max;
}

SetGraph (ydec, aymin, aymax, rnd, ytic, inc, mtics, xtit, ytit, fixstr, 
	  yticFunp, fixv)
  
  float ydec;
  int   *aymin, *aymax, rnd, ytic, inc, mtics, fixv;
  char  *xtit, *ytit, *fixstr, *(*yticFunp)();
{
  char str[100];
  int i, j, k, ymin, ymax;

  ymin = *aymin, ymax = *aymax;
  if (ydec != 0.0)
    fprintf(Fout, "yy %f sub dup /aypos exch def .25 sub /yy exch def \n", 
	    ydec);
  fprintf(Fout, "%s\n", TimeArray);
  if (abs(ymin)%rnd != 0) {
    if (ymin > 0)
      ymin = ymin + (rnd - ymin%rnd);
    else
      ymin = -(abs(ymin) + (rnd - abs(ymin)%rnd));
  }
  if (abs(ymax)%rnd != 0) {
    if (ymax > 0)
      ymax = ymax + (rnd - ymax%rnd);
    else
      ymax = -(abs(ymax) + (rnd - abs(ymax)%rnd));
  }
  i = ytic;
  while ((ymax-ymin)/i > mtics)
    i += inc;
  if (ymax%i != 0)
    ymax = ymax + (i - ymax%i);
  for(k=ymax; k>ymin; k-=i)
    ;
  ymin = k;
  *aymin = ymin, *aymax = ymax;

  fprintf(Fout, "1 setlinewidth\n");
  strcpy(array, "[ ");
  for (k=ymin+i; k<=ymax; k+=i) {
    if (yticFunp != NULL)
      sprintf(array+strlen(array), "(%s) ", (*yticFunp)(k));
    else
      sprintf(array+strlen(array), "(%d) ", k);
  }
  strcat(array, "]");
  fprintf(Fout, "%s\n", array);
  fprintf(Fout, "(%s)\n(%s)\naxes\n1\n1\ngrid\n", xtit, ytit);
  if (ymin == 0)
    sprintf(str, "/yfix { %s %d div } def\n", fixstr, i);
  else
    sprintf(str, "/yfix { %d sub %s %d div } def\n", ymin, fixstr, i);

  fprintf(Fout, str, fixv);
  return i;
}


PlotFun(kbeg, kend, array, dformat, pformat, inter)

  int  kbeg, kend, *array, inter;
  char *dformat, *pformat;
{
  int   k, c=0, y, x0, y0, y1, ftime=1, xv, yv;

  fprintf(Fout, "beginFunction\n");
  for (k=kbeg; k<kend; k++) {
    xv = *(array + k*2);
    if (ftime  &&  xv >= StripBegTime) {
      ftime = 0;
      if (inter  &&  k > 0) {
	x0 = *(array + (k-1)*2);
	y0 = *(array + (k-1)*2 + 1);
	y1 = *(array + k*2 + 1);
	y = y0 + (StripBegTime-x0)*(y1-y0)/(xv-x0);
	fprintf(Fout, dformat, StripBegTime, y);
      }
    }
    if (xv > StripEndTime) {
      if (inter  &&  k > kbeg  &&  (x0=*(array + (k-1)*2)) < StripEndTime) {
	y0 = *(array + (k-1)*2 + 1);
	y1 = *(array + k*2 + 1);
	y = y0 + (StripEndTime-x0)*(y1-y0)/(xv-x0);
	fprintf(Fout, dformat, StripEndTime, y);
      }
      break;
    }
    if (xv >= StripBegTime) {
      yv = *(array + k*2 + 1);
      fprintf(Fout, dformat, xv, yv);
      c++;
      if (c%1000 == 0) {
	fprintf(Fout, "endFunction\n");
	fprintf(Fout, pformat);
	fprintf(Fout, "beginFunction\n");
      }
      else if (c%200 == 0) 
	fprintf(Fout, "endFunctionInter\n");
    }
  }
  fprintf(Fout, "endFunction\n");
  fprintf(Fout, pformat);
  return 0;
}

PlotFunEr(kbeg, kend, array, dformat, pformat, inter)

  int  kbeg, kend, *array, inter;
  char *dformat, *pformat;
{
  int   k, c=0, y, x0, y0, y1, ftime=1, xv, xv0, xv1, yv, yv0=-3, yv1=-1;

  fprintf(Fout, "beginFunction\n");
  for (k=kbeg; k<kend; k++) {
    xv = *(array + k*2);
    if (ftime  &&  xv >= StripBegTime) {
      ftime = 0;
      if (inter  &&  (kbeg == 0  ||  k > kbeg)) {
	if (k > 0) {
	  x0 = *(array + (k-1)*2);
	  y0 = *(array + (k-1)*2 + 1);
	  y1 = *(array + k*2 + 1);
	  y = y0 + (StripBegTime-x0)*(y1-y0)/(xv-x0);
	  fprintf(Fout, dformat, StripBegTime, y);
	  xv0 = xv1 = StripBegTime;
	  yv0 = yv1 = y;
	}
	else {
	  xv0 = xv1 = xv, yv0 = yv1 = *(array + k*2 + 1);
	  fprintf(Fout, dformat, xv0, yv0);
	}
      }
      else {
	xv0 = xv1 = xv, yv0 = yv1 = *(array + k*2 + 1);
	fprintf(Fout, dformat, xv0, yv0);
      }
    }
    if (xv > StripEndTime) {
      fprintf(Fout, dformat, xv1, yv1);
      if (inter  &&  k > kbeg  &&  (x0=*(array + (k-1)*2)) < StripEndTime) {
	y0 = *(array + (k-1)*2 + 1);
	y1 = *(array + k*2 + 1);
	y = y0 + (StripEndTime-x0)*(y1-y0)/(xv-x0);
	fprintf(Fout, dformat, StripEndTime, y);
	xv1 = StripEndTime, yv1 = y;
      }
      break;
    }
    if (xv >= StripBegTime) {
      if ((yv = *(array + k*2 + 1)) == yv1  &&  yv0 == yv1) 
	xv1 = xv, yv1 = yv;
      else {
	fprintf(Fout, dformat, xv1, yv1);
	yv0 = yv1;
	xv1 = xv, yv1 = yv;
	c++;
	if (c%1000 == 0) {
	  fprintf(Fout, "endFunction\n");
	  fprintf(Fout, pformat);
	  fprintf(Fout, "beginFunction\n");
	}
	else if (c%200 == 0) 
	  fprintf(Fout, "endFunctionInter\n");
      }
    }
  }
  fprintf(Fout, dformat, xv1, yv1);
  fprintf(Fout, "endFunction\n");
  fprintf(Fout, pformat);
  return 0;
}

PlotFunErZ(kbeg, kend, array, zarray, dformat, pformat, inter)

  int  kbeg, kend, *array, *zarray, inter;
  char *dformat, *pformat;
{
  int   k, c=0, y, x0, y0, y1, ftime=1, xv, xv0, xv1, yv, yv0=-3, yv1=-1;
  int   z, zv, z0, z1, zv0=-3, zv1=-1;

  fprintf(Fout, "beginFunction\n");
  for (k=kbeg; k<kend; k++) {
    xv = *(array + k*2);
    if (ftime  &&  xv >= StripBegTime) {
      ftime = 0;
      if (inter  &&  (kbeg == 0  ||  k > kbeg)) {
	if (k > 0) {
	  x0 = *(array + (k-1)*2);
	  y0 = *(array + (k-1)*2 + 1);
	  y1 = *(array + k*2 + 1);
	  y = y0 + (StripBegTime-x0)*(y1-y0)/(xv-x0);
	  z0 = zarray[k-1];
	  z1 = zarray[k];
	  z = z0 + (StripBegTime-x0)*(z1-z0)/(xv-x0);
	  fprintf(Fout, dformat, StripBegTime, y, z);
	  xv0 = xv1 = StripBegTime;
	  yv0 = yv1 = y;
	  zv0 = zv1 = z;
	}
	else {
	  xv0 = xv1 = xv, yv0 = yv1 = *(array + k*2 + 1);
	  zv0 = zv1 = zarray[k];
	  fprintf(Fout, dformat, xv0, yv0, zv0);
	}
      }
      else {
	xv0 = xv1 = xv, yv0 = yv1 = *(array + k*2 + 1);
	zv0 = zv1 = zarray[k];
	fprintf(Fout, dformat, xv0, yv0, zv0);
      }
    }
    if (xv > StripEndTime) {
      fprintf(Fout, dformat, xv1, yv1, zv1);
      if (inter  &&  k > kbeg  &&  (x0=*(array + (k-1)*2)) < StripEndTime) {
	y0 = *(array + (k-1)*2 + 1);
	y1 = *(array + k*2 + 1);
	y = y0 + (StripEndTime-x0)*(y1-y0)/(xv-x0);
	z0 = array[k-1];
	z1 = array[k];
	z = z0 + (StripEndTime-x0)*(z1-z0)/(xv-x0);
	fprintf(Fout, dformat, StripEndTime, y, z);
	xv1 = StripEndTime, yv1 = y, zv1 = z;
      }
      break;
    }
    if (xv >= StripBegTime) {
/*       if ((yv = *(array + k*2 + 1)) == yv1  &&  yv0 == yv1  && */
/* 	  (zv = zarray[k]) == zv1  &&  zv0 == zv1) */
/* 	xv1 = xv, yv1 = yv, zv1 = zv; */
/*       else { */
        yv = *(array + k*2 + 1);
        zv = zarray[k];
	fprintf(Fout, dformat, xv1, yv1, zv1);
	yv0 = yv1;
	zv0 = zv1;
	xv1 = xv, yv1 = yv, zv1 = zv;
	c++;
	if (c%1000 == 0) {
	  fprintf(Fout, "endFunctionZ\n");
	  fprintf(Fout, pformat);
	  fprintf(Fout, "beginFunction\n");
	}
	else if (c%200 == 0) 
	  fprintf(Fout, "endFunctionZInter\n");
/*       } */
    }
  }
  fprintf(Fout, dformat, xv1, yv1, zv1);
  fprintf(Fout, "endFunctionZ\n");
  fprintf(Fout, pformat);
  return 0;
}

PlotFunErW(kbeg, kend, array, zarray, dformat, pformat, inter)

  int  kbeg, kend, *array, *zarray, inter;
  char *dformat, *pformat;
{
  int   k, c=0, y, x0, y0, y1, ftime=1, xv, xv0, xv1, yv, yv0=-3, yv1=-1;
  int   z, zv, z0, z1, zv0=-3, zv1=-1;

  fprintf(Fout, "beginFunction\n");
  for (k=kbeg; k<kend; k++) {

    xv = *(array + k*2);
    zv = *(array + k*2 + 1);
    if (zv <= StripBegTime  ||  xv > StripEndTime)
      continue;
    if (xv < StripBegTime)
      xv = StripBegTime;
    if (zv > StripEndTime)
      zv = StripEndTime;
    fprintf(Fout, dformat, xv, zv, zarray[k]);
    c++;
    if (c%1000 == 0) {
      fprintf(Fout, "endFunctionW\n");
      fprintf(Fout, pformat);
      fprintf(Fout, "beginFunction\n");
    }
    else if (c%200 == 0) 
      fprintf(Fout, "endFunctionWInter\n");
  }
  fprintf(Fout, "endFunctionW\n");
  fprintf(Fout, pformat);
  return 0;
}

PlotEvent(event, symbol, yval)

  int   event, symbol;
  float yval;
{
  char str[30];
  int  i=0, k, t;

  if (yval ==  ((int) yval)) 
    sprintf(str, "%d", (int)yval);
  else {
    sprintf(str, "%f", yval);
    k = strlen(str) - 1;
    while (str[k] == '0')
      k--;
    str[k+1] = '\0';
  }

  fprintf(Fout, "beginFunction\n");
  for (k=0; k<EventN; k++) {
    if ((t=EventA[k][0]) > StripEndTime)
      continue;
    if (t >= StripBegTime) {
      if (EventA[k][1] & event) {
	fprintf(Fout, "%d %s\n", EventA[k][0], str);
	i++;
	if (i%1000 == 0) {
	  fprintf(Fout, "endFunction\n");
	  fprintf(Fout, "%d plotSymbols\n", symbol);
	  fprintf(Fout, "beginFunction\n");
	}
	else if (i%200 == 0) 
	  fprintf(Fout, "endFunctionInter\n");
      }
    }
  }
  fprintf(Fout, "endFunction\n");
  if (i > 0)
    fprintf(Fout, "%d plotSymbols\n", symbol);
}

PlotBars(array, kend)

  int   *array, kend;
{
  int  i=0, k, t;

  fprintf(Fout, "beginFunction\n");
  for (k=0; k<kend; k++) {
    if ((t=array[k]) > StripEndTime)
      break;
    if (t >= StripBegTime) {
      fprintf(Fout, "%d 0\n", array[k]);
      if (++i%200 == 0) 
	fprintf(Fout, "endFunction\n");
    }
  }
  fprintf(Fout, "endFunction\n");
  if (i > 0)
    fprintf(Fout, "plotVBars\n");
}

/*-------------------------  InitPsFile  -------------------------
*/
InitPsFile ()
{
  char *cp, headerFname[200],com[200], *getenv();

  sprintf(headerFname, "%s/graph.ps", XK_ETC);
  if ( access(headerFname, R_OK) != 0 ) {
    sprintf(headerFname, "%s/graph.ps", XK_ETC_CS);
    if ( access(headerFname, R_OK) != 0 ) {
      fprintf(stderr, "ERROR: Could not find file graph.ps in %s nor %s\n",
              XK_ETC, XK_ETC_CS );
      exit(1);
    }
  }

  sprintf(com, "cp %s %s; chmod u+w %s", headerFname, OutFilename,
         OutFilename);
  system(com);
  if ((Fout = fopen(OutFilename, "a")) == NULL) {
    fprintf(stderr, "ERROR: Could not open file '%s' for append\n",
            OutFilename);
    exit(1);
  }
  fprintf(Fout, "%%\n%%   Initializations\n%%\n");
  fprintf(Fout, "/showit { x y moveto show y 8 sub /y exch def } def\n");
  fprintf(Fout, "/showit1 { x y moveto show } def\n");
  fprintf(Fout, "/showit2 { x 2.25 in add y moveto show } def\n");
  fprintf(Fout, 
	  "/showit3 { x 4.5 in add y moveto show y 8 sub /y exch def } def\n");
  fprintf(Fout, "/EndPage { showpage } def\n");
  fprintf(Fout, "/BeginPage { dup in 72 div dup /yy exch def /aypos0 exch def\n");
  fprintf(Fout, "  /y exch in def /x exch in def\n");
  fprintf(Fout, "  /aypos aypos0 def /yy aypos0 def } def\n");
  fprintf(Fout, "/checkEOP { yy exch sub .3 lt \n");
  fprintf(Fout, "  { EndPage %.3f %.3f BeginPage } if } def\n", X0, Y0);

  /* --- Init graphs */
  fprintf(Fout, "/axpos %f def\n", Axpos);
  fprintf(Fout, "/axlen %f def\n", Axlen);
  fprintf(Fout, "/aylen %f def\n", Aylen);


} /* End of InitPsFile  .............................................*/

/*-------------------------  BeginPage  -------------------------
*/
BeginPage (x, y)

float x, y;
{
  fprintf(Fout, "%%\n%%   Begin Page\n%%\n");
  if (PageFlag)
    fprintf(Fout, "%%%%Page: %d %s\n", PageCnt, PageName);

  if (BigFlag) {
    fprintf(Fout, "1.75 1.75 scale\n");
    fprintf(Fout, "%f in 72 div dup /yy exch def /aypos0 exch def\n", 
	    y);
    fprintf(Fout, "8 Cfont /x %f in def /y %f in def\n", x, y);
    fprintf(Fout, "/aypos aypos0 def /yy aypos0 def\n");
    fprintf(Fout, "8 HBfont ");
    if (Note != NULL)
      fprintf(Fout, ".3 in 5.8 in moveto (%s) show\n", Note);
    fprintf(Fout, "(%s) dup stringwidth pop 4.3 in exch sub \n", DataName);
    fprintf(Fout, "  5.8 in moveto show\n");
    fprintf(Fout, "6 HBfont (  %d) show\n", PageCnt++);
  }
  else {
    fprintf(Fout, "%f in 72 div dup /yy exch def /aypos0 exch def\n", 
	    y);
    fprintf(Fout, "8 Cfont /x %f in def /y %f in def\n", x, y);
    fprintf(Fout, "/aypos aypos0 def /yy aypos0 def\n");
    fprintf(Fout, "12 HBfont ");
    if (Note != NULL)
      fprintf(Fout, "40 758 moveto (%s) show\n", Note);
    fprintf(Fout, "(%s) dup stringwidth pop 575 exch sub 758 moveto show\n", 
	    DataName);
    fprintf(Fout, "10 HBfont (  %d) show\n", PageCnt++);
  }
  fprintf(Fout, "%%   End of Begin Page\n");

} /* End of BeginPage  .............................................*/


/*-------------------------  EndPage  -------------------------
*/
EndPage ()
{
  fprintf(Fout, "showpage\n");

} /* End of EndPage  .............................................*/


/*-------------------------  PrintHeader  -------------------------
*/
float PrintHeader (x, y)

float x, y;
{
  int k;
  
  fprintf(Fout, "%%\n%%    Header\n%%\n");
  if (JournalFlag)
    return;
  fprintf(Fout, "8 Cfont  /x %f in def\n", x);
  if (*OpenType == 'a') {
    y -= 2*8/72.0;
    fprintf(Fout, "(  ) showit  (  )  showit\n");
  }
  for (k=0; k<HeadStrN; k++) {
    fprintf(Fout, "(%s) showit\n", HeadStr[k]);
  }
  fprintf(Fout, "/yy yy %f sub def\n", 8.0*(k-1)/72.0);
    
  y -= 8*(k-1)/72.0;
/*   fprintf(Fout, "/yy %f def\n", y); */
  return y;

} /* End of PrintHeader  .............................................*/


/*-------------------------  PlotIt  -------------------------
*/
float PlotIt (ps, y, ydec)

PlotStruct 	*ps;
float 		y, ydec;
{
  char		buf[100];
  int   	zero=0, j, k, n;
  float 	x;
  PlotStruct 	*os;

  if (QueueOnlyFlag  &&  !strstr(ps->id, "queue"))
    return;
  fprintf(Fout, "%%\n%%   Plot %s\n%%\n", ps->id);

  fprintf(Fout, "%.2f checkEOP\n", Aylen+ydec);
  y -= Aylen + ydec;
  if (y < 0.3) {
    /*
    EndPage(); 
    BeginPage(X0, Y0); 
    */
    y = Y0 - (Aylen + ydec);
  }
  if (ps->zFlag == 1) {
    GetMaxMin(&ps->array[0][1], 2, ps->arrayN, &n, &Max);
    GetMaxMin(&ps->zarray[0], 1, ps->arrayN, &Min, &n);
  }
  else if (ps->zFlag == 2)
    GetMaxMin(&ps->zarray[0], 1, ps->arrayN, &Min, &Max);
  else
    GetMaxMin(&ps->array[0][1], 2, ps->arrayN, &Min, &Max);

/*   Min -= 1; */
/*   Max++; */

  if (Min == Max)
    Max = Min + ps->yticSizeInc;

  SetGraph(Aylen+ydec, &Min, &Max, ps->yticRound, ps->yticSizeInit, 
	   ps->yticSizeInc, ps->yticMaxNum, "Time in seconds",
	   ps->ytitle, " ", ps->yticFun, 0);

  if (ps->zFlag == 1)
    PlotFunErZ(0, ps->arrayN, ps->array, ps->zarray, "%d %d %d\n",
	     ps->plotType, 0);
  else if (ps->zFlag == 2)
    PlotFunErW(0, ps->arrayN, ps->array, ps->zarray, "%d %d %d\n",
	       ps->plotType, 1);
  else
    PlotFunEr(1, ps->arrayN, ps->array, "%d %d\n", ps->plotType, 1);
  
  if ((os=ps->other) != NULL) {
    sprintf(buf, os->plotType, Min*os->minF +
		Max*os->maxF + (Max-Min)*os->minMaxF);
    PlotFun(0, os->arrayN, os->array, "%d %d\n", buf, 0);
  }
  for (k=PlotIndex+1; (Plots[k].main == 0) && (k < PlotsN); k++) {
    ps = &Plots[k];
    if (ps->zFlag == 1)
      PlotFunErZ(0, ps->arrayN, ps->array, ps->zarray, "%d %d %d\n",
		 ps->plotType, 0);
    else if (ps->zFlag == 2)
      PlotFunErW(0, ps->arrayN, ps->array, ps->zarray, "%d %d %d\n",
		 ps->plotType, 1);
    else if (ps->zFlag == 3) {
      sprintf(buf, ps->plotType, Min*ps->minF +
	      Max*ps->maxF + (Max-Min)*ps->minMaxF);
      PlotFun(0, ps->arrayN, ps->array, "%d %d\n", buf, 0);
    }
    else
      PlotFunEr(1, ps->arrayN, ps->array, "%d %d\n", ps->plotType, 1);
  
/*     if ((os=ps->other) != NULL) { */
/*       sprintf(buf, os->plotType, Min*os->minF + */
/* 	      Max*os->maxF + (Max-Min)*os->minMaxF); */
/*       PlotFun(0, os->arrayN, os->array, "%d %d\n", buf, 0); */
/*     } */
  }

  return y;

} /* End of PlotIt  .............................................*/







