#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CLOCK2TIME(c) (((double)((c)-start))/((double) clock))

void main(int argc, char **argv)
{
  int maxtrack,clock,clock10;
  FILE *in,*plots,*ly,*group,*lk,*sk,*lksk;
  int nly,track,i,lastgroup;
  char inbuf[1024],*cp,*cp2;
  long cl,startly,start,finish;
  double x1;

  if(argc>2)
    clock=atoi(argv[2]);
  else
    clock=460850;
  clock10=clock/10;

  /* Pass 1 find maxtrack and start */

  in=fopen(argv[1], "r");
  maxtrack=0;
  start=0;
  finish=0;

  while(fgets(inbuf, sizeof(inbuf)-1, in)!=NULL)
  {
    if(!strncmp(inbuf, "LK", 2))
    {
      // LK      618     3       23082267096
      cp=inbuf;
      for(i=0;i<3;i++)
      {
	while(*cp != '\t') cp++;
	cp++;
	if(i==1) cp2=cp;
      }
      cp[-1]='\0';
      sscanf(cp, "%ld", &cl);
      sscanf(cp2, "%d", &track);
      if(start==0) start=cl;
      if(track>maxtrack) maxtrack=track;
    }
    else if(!strncmp(inbuf, "SK", 2))
    {
      // SK	119	18	23278899176
      cp=inbuf;
      for(i=0;i<3;i++)
      {
	while(*cp != '\t') cp++;
	cp++;
	if(i==1) cp2=cp;
      }
      cp[-1]='\0';
      sscanf(cp, "%ld", &cl);
      sscanf(cp2, "%d", &track);
      if(start==0) start=cl;
      if(track>maxtrack) maxtrack=track;
    }
  }
  fclose(in);
  printf("maxtrack=%d\n",maxtrack);

  /* pass 2 generate files */

  in=fopen(argv[1], "r");

  plots=fopen("plots.gnu","a");
  ly=fopen("ly.dat","w");
  lk=fopen("lk.dat","w");
  sk=fopen("sk.dat","w");
  lksk=fopen("lksk.dat","w");
  group=fopen("group.dat","w");

  nly=0;
  startly=0;
  lastgroup=-1;

  while(fgets(inbuf, sizeof(inbuf)-1, in)!=NULL)
  {
//  printf("line: %s", inbuf);
    if(!strncmp(inbuf, "LY", 2))
    {
      // LY: 64 CR clock: 23098654813
      cp=strstr(inbuf, "clock:");
      sscanf(cp+7, "%ld", &cl);
      nly++;
      if(startly==0) startly=cl;
      if(cl>finish) finish=cl;
    }
    else if(!strncmp(inbuf, "LK", 2))
    {
      // LK      618     3       23082267096
      cp=inbuf;
      for(i=0;i<3;i++)
      {
	while(*cp != '\t') cp++;
	cp++;
	if(i==1) cp2=cp;
      }
      cp[-1]='\0';
      sscanf(cp, "%ld", &cl);
      sscanf(cp2, "%d", &track);
      if(cl>finish) finish=cl;
      x1=CLOCK2TIME(cl);
      fprintf(lk, "%.8f %d\n", x1, track);
      fprintf(lksk, "%.8f %d\n", x1, track);
    }
    else if(!strncmp(inbuf, "SK", 2))
    {
      // SK	119	18	23278899176
      cp=inbuf;
      for(i=0;i<3;i++)
      {
	while(*cp != '\t') cp++;
	cp++;
	if(i==1) cp2=cp;
      }
      cp[-1]='\0';
      sscanf(cp, "%ld", &cl);
      sscanf(cp2, "%d", &track);
      if(cl>finish) finish=cl;
      x1=CLOCK2TIME(cl);
      fprintf(sk, "%.8f %d\n", x1, track);
      fprintf(lksk, "%.8f\t%d\n", x1, track);
    }
    else if(!strncmp(inbuf, "IL command", 10))
    {
      // IL command 23082297815 to disk unit 8, block length 600, buffer address: 1550 track: 3
      sscanf(inbuf+11,"%ld",&cl);
      if(cl>finish) finish=cl;
      x1 = CLOCK2TIME(cl);
      fprintf(plots,"set arrow from %g,0 to %g,%d nohead lc rgb 'blue'\n",x1,x1,maxtrack);
    }
    else if(!strncmp(inbuf, "Execute", 7))
    {
      // Execute[248h]: ck 10, ac (242)   clock: 23084405519 29 950
      if(cp=strstr(inbuf, "clock:"))
      {
	sscanf(cp+7, "%ld", &cl);
	if(cl>finish) finish=cl;
	if((cl-startly)>clock10)
	{
          x1 = CLOCK2TIME(cl);
	  fprintf(ly, "%.8f %d\n", x1, nly*10);
	  nly=0;
	  startly=cl;
	}
      }
    }
    else if(cp=strstr(inbuf, " tg: "))
    {
      sscanf(cp+5, "%d", &i);
      if(i != lastgroup)
      {
	x1 = CLOCK2TIME(cl);
	fprintf(group, "%.8f %d\n", x1, i);
	lastgroup = i;
      }
    }
  }
  fclose(in);
  fclose(ly);
  fclose(lk);
  fclose(sk);
  fclose(lksk);
  x1=CLOCK2TIME(finish);
  printf("elapsed=%.8f\n",x1);
}

