/* 94,10,4 add *.fit filename */
/* 94,11,29 add "prin\0"      */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#define  keyword	10
FILE *fp,*fp1,*fp2;
char f1[40],f2[40],task[20];
int i,i1,i2,i3,j,k,l,m,n,idel,iprint;
static char name[keyword][5]={"dark\0","bias\0","flat\0","data\0",
            "mean\0","medi\0","dele\0","file\0","colo\0","prin\0"};
char c, a[80],b6[7],b4[5],m5[6];
struct stat stus;
/* ajob: task define, (flat_?)
   bjob: want flat?
   numc: N0. ? is color key_words */
char ajob[20]; int najob=0;
char bjob[20]; int nbjob=0;
int numc=0;
char ai[20], ni[10][40], nni=0;		/* flat_? changename, jindex is color */

jindex(a,c)
char a[],c;
{
  int i,j;
  j=strlen(a);
  for(i=0;i<j;i++)if(a[i]==c)break;
  return (i<j)?i:-1; 
}

main(ac,av)
int ac; char *av[];
{
  if(ac<2){
    printf("\n\n\t Usage: pip task_file [!]  *****2000.7\n\n");
    printf("    in task_file, add following lines:\n"); 
    printf("\t Keywords: \n");
    printf("\t          for:  **dark:   [/mean /median /dele]\n");
    printf("\t          for:  **flat_?: [/mean /median /dele /file=???]\n");
    printf("\t          for:  **data:    /color=11 [/dele] [/print]\n\n");
    printf("\t data line:     filename [x]\n");
    printf("\n\t\t\t\t\t94,9,21(ignore bias)\n");
    printf("\n\t\t\t\t\t94,11,29(add keyword /print)\n");
    exit(0);
  }
  strcpy(task,av[1]);
  if(check()!=0)exit(0);
//  if(ac<3 || av[2][0]!='!')if(look_ccd()!=0)exit(0);
  printf("Start_job time:\n"); system("date");
  dooverscan();
  if(dodark()!=0)printf("dark ok!\n");           
  for(m=0; m<najob; m++)if(doflat(m)==0)printf("flat_%c ok!\n",ajob[m]); 
  strcpy(b6,"flat_?");
  dodata();
  printf("End_job time:\n"); system("date");
  exit(0);
}

/*
look_ccd()
{
l10:
  printf("input look_ccd filename: (q for exit; qq for stop_task) ");
  gets(f1); fflush(stdin);
  k=0;
  if(f1[1]=='q')k=1;
  if(f1[0]=='q')return(k);
  k=jindex(f1,'.');
  if(k==-1)strcat(f1,".fit");
  if((fp=fopen(f1,"rb"))==NULL)printf("\t\7FILE not found:\n");
  else {
    stat(f1,&stus); 
    fclose(fp);
    if(stus.st_size>8300000)strcpy(a,"tv_ccd ");
    else strcpy(a,"tv_300 ");
    strcat(a,f1);
    system(a);
  }
  goto l10;
} 
*/
  
check()                 /* check: keyword, size, flat_? */
			/* get ajob, color=numc */
			/* check all flat_? */
{
  if((fp=fopen(task,"rb"))==NULL){ printf("File not found !\n"); exit(0);}
  i=0; m=0; 
l10:
  i++;
  k=readf(fp,a); if(k==-1)goto read_finish;
  if(a[0]=='#'||a[0]<=' ')goto l10;
  if(a[0]=='*'){
/* to see keyword_line file name is illeagle */
    strncpy(b4,&a[2],4); b4[4]=0;
    l= -1; for(j=0;j<4;j++) if(strcmp(b4,name[j])==0)l=j;
    if(l==-1)prror();                 /* prror used: i,a,m */
    j=7; 
    if(a[2]=='f'){			/* get ajob */
      if(a[6]!='_'||a[8]!=':')prror();
      if(a[7]>'z'||a[7]<'R')prror();
      ai[najob]= -1;
      ajob[najob++]=a[7];
      j=j+2;
    } 
/* to see job existed ? */
    for(idel=0;idel<20;idel++)f1[idel]=0;
    idel=0;
    strncpy(f1,&a[2],4);
    if(a[2]=='f')strncpy(f1,&a[2],6);
    strcat(f1,".fit");
    if((fp2=fopen(f1,"rb"))!=NULL){
      fclose(fp2);
      idel=1;
    }
/* to see keywords is illeagle */
l20:
    if(j>=k)goto l10;
    for(i1=j; i1<k; i1++){
      if(a[i1]==0)goto l10;
      if(a[i1]=='/')goto l30;
      if(a[i1]!=' ')prror();
    }
    goto l10;
l30:
    j=i1+1;
    strncpy(b4,&a[j],4); b4[4]=0;
    i1= -1; for(i2=4;i2<keyword;i2++) if(strcmp(b4,name[i2])==0)i1=i2;
    if(i1==-1)prror(); 
    if(i1==8){
      for(i3=j; i3<k; i3++)if(a[i3]=='=')break;
      sscanf(&a[++i3],"%d",&numc); numc--;
    } 
    for(i3=j+3; i3<k; i3++)if(a[i3]==' ')break;
    if(i1==7){				/* substute file, check file exist */
      for(i2=0;i2<30;i2++)f1[i2]=0;
      strncpy(f1,&a[j+5],i3-j-5);
      i2=jindex(f1,'.');
      if(i2==-1)strcat(f1,".fit");
      if((fp2=fopen(f1,"rb"))==NULL){
        printf("\t\7FILE not found: %2d,   %s\n",i,a);
        m++;
      } else {
        stat(f1,&stus); 
        fclose(fp2);
        if(stus.st_size<16000000){
          printf("\t\7FILE not 2k*2k: %2d,   %s\n",i,f1); 
          m++;
        } else {
	  if(l==2){ai[najob-1]=nni; strcpy(ni[nni++],f1);}
	  idel=1;
        } 
      }
    }
    j=i3;
    goto l20;
  } 
/* check file size & exist && not data */
  if(l!=3){
    if(idel==0){
      k=jindex(a,'.');
      if(k==-1)strcat(a,".fit");
      if((fp2=fopen(a,"rb"))==NULL){
        printf("\t\7FILE not found: %2d,   %s\n",i,a);
        m++;
      }
      else {
        stat(a,&stus); 
        fclose(fp2);
        if(stus.st_size<8394000){
          printf("\t\7FILE not 2k*2k: %2d,   %s\n",i,a); 
          m++;
        }
      }
    }
  } else {
/* for data */
    k=jindex(a,'.');
    if(k==-1)strcat(a,".fit");
    k=jindex(a,'.');
    strcpy(f1,a);
    strcpy(&f1[k],".fit");
    if((fp2=fopen(f1,"rb"))!=NULL){
      fclose(fp2);
      goto l10;
    }
    if((fp2=fopen(a,"rb"))==NULL){
      printf("\t\7FILE not found: %2d,   %s\n",i,a);
      m++;
      goto l10;
    }
    fclose(fp2);
/* save bjob */
    c=a[numc];
    for(j=0;j<nbjob;j++)if(c==bjob[j])goto l10;
    bjob[nbjob++]=c;
  }
  goto l10;
read_finish:
  fclose(fp);
  if(numc==0){m++; printf("Number ? is color keyword not define !\n");}
/* to see (bjob-ajob)'s flat_? exist ? */
  strcpy(f1,"flat_?.fit");
  for(i=0;i<nbjob;i++){
    c=bjob[i];
    for(j=0;j<najob;j++)if(c==ajob[j])goto l90;
    f1[5]=c;
    if((fp=fopen(f1,"rb"))==NULL){
      m++;
      printf("\007error: %s not existed\n",f1);
    }
    else fclose(fp);
l90:
    continue;
  }
  return(m);
}

prror()
{
  printf("\t\7ERROR  at line: %2d,   %s\n",i,a);
  m++;
}

dooverscan()
{
  fp=fopen(task,"r"); 
l10:
  k=readx(fp,a);
  if(k==-1)return;
  strcpy(f1,"overscan ");
  strcat(f1,a);
  strcat(f1," !");
  dosystem(f1);
  goto l10;
}

doflat(m)		/* mean.median.del will done here */
int m;
{
  char fn[12];
  if(ai[m]>=0)return(1);
  strcpy(fn,"flat_");
  strncat(fn,&ajob[m],1);
  strcat(fn,".fit\0");
  if((fp=fopen(fn,"r"))!=NULL){
    printf("%s existed !\n",fn);
    fclose(fp);
    return(1);
  }
  fp=fopen(task,"rb");
  exist_del("flat.tmp");
  fp1=fopen("flat.tmp","w");
  i=0;
l10:
  k=readf(fp,a); if(k==-1)goto read_eof;
  if(a[0]=='#'||a[0]<=' ')goto l10;
  if(a[0]=='*'){
/* to see keyword flat_?  */
    strncpy(b6,&a[2],6); b6[6]=0;
    if(strncmp(b6,fn,6)!=0)goto l10;
/* get keywords mean or median; dele */
  idel=njindex(a,"dele");
  strcpy(m5,"    ");
  if(njindex(a,"mean")>0)strcpy(m5," mean");
  if(njindex(a,"medi")>0)strcpy(m5," medi");
l20:
    k=readf(fp,a); 
    if(a[0]=='*'||a[0]=='#'||k<9)goto l10;
    fprintf(fp1,"%s\n",a);
    i++;
    goto l20;
  }
  goto l10;
read_eof:
  fclose (fp);
  fclose (fp1);
  if(i==0)system("rm flat.tmp");
  else {
    dosystem("mean_val flat.tmp ");
    strcpy(a,"superflat flat.tmp ");
    strcat(a,fn);
    strcat(a," ");
    strcat(a,m5);
    dosystem(a);   
  }
  if(idel>0){                           /* *.fit must existed then can dele */
    if((fp=fopen(fn,"rb"))!=NULL){
      fclose(fp);
      stat(fn,&stus); 
      if(stus.st_size<830000)return (i);
      fp=fopen("flat.tmp","r");
      for(j=0;j<i;j++){
        k=readf(fp,f1);
        strcpy(a,"rm ");
        strcat(a,f1);
        system(a);    
      }
      fclose(fp);
    }
  }
  return (i);
}

  
dodark()
{
  if((fp=fopen("dark.fit","r"))!=NULL){
    printf("dark.fit existed !");
    fclose(fp);
    return(1);
  }
  fp=fopen(task,"rb");
  exist_del("dark.tmp");
  fp1=fopen("dark.tmp","w");
  i=0;
l10:
  k=readf(fp,a); if(k==-1)goto read_eof;
  if(a[0]=='#'||a[0]<=' ')goto l10;
  if(a[0]=='*'){
/* to see keyword dark */
    strncpy(b4,&a[2],4); b4[4]=0;
    if(strcmp(b4,"dark")!=0)goto l10;
/* get keywords mean or median; dele */
  idel=njindex(a,"dele");
  strcpy(m5,"    ");
  if(njindex(a,"mean")>0)strcpy(m5," mean");
  if(njindex(a,"medi")>0)strcpy(m5," medi");
l20:
    k=readf(fp,a);
    if(a[0]=='*'||a[0]=='#'||k<9)goto l10;
    fprintf(fp1,"%s\n",a);
    i++;
    goto l20;
  }
  goto l10;
read_eof:
  fclose (fp);
  fclose (fp1);
  if(i==0)system("rm dark.tmp");
  else {
    strcpy(a,"superdark dark.tmp dark");
    strcat(a,m5);
    dosystem(a);		
  }
  if(idel>0){				/* *.fit must existed then can dele */
    if((fp=fopen("dark.fit","r"))!=NULL){
      fclose(fp);
      fp=fopen("dark.tmp","r");
      stat("dark.fit",&stus); 
      if(stus.st_size<830000)return (i);
      for(j=0;j<i;j++){
        k=readf(fp,f1);
        strcpy(a,"rm ");
        strcat(a,f1);
        system(a);
      }
      fclose(fp);
    }
  }
  return (i);
}

dodata()
{
  char color;
  fp=fopen(task,"rb");
l10:
  k=readf(fp,a); if(k==-1){ fclose(fp); return; }
  if(a[0]=='#'||a[0]<=' ')goto l10;
  if(a[0]=='*'){
/* to see keyword data */
    strncpy(b4,&a[2],4); b4[4]=0;
    if(strcmp(b4,"data")!=0)goto l10;
/* get keywords dele */
    idel=njindex(a,"dele");
/* get keywords prin */
    iprint=njindex(a,"prin");
l20:
    k=readf(fp,a); if(k==-1){ fclose(fp); return; }
    if(a[0]=='*'||a[0]=='#'||k<9)goto l10;
/* do here */
    strcpy(f1,a);
    k=jindex(f1,'.');			/* to see p????.fit exist ? */
    if(k<0)strcat(f1,".fit");
    strcpy(f2,f1);			/* f1~d..fit   f2~p..fit    */
    f2[0]='p';
/* if p..fit existed, do coord only */
    if((fp1=fopen(f2,"rb"))!=NULL){
      fclose(fp1);
      stat(f2,&stus); 
      if(stus.st_size>0){ 
        printf("%s existed !\n",f2);
        if(stus.st_size>16000000 && iprint>0){
          strcpy(a,"coord ");
          strcat(a,f2);
          strcat(a," p");
          dosystem(a);
        }
        goto l20;
      }
    }
/* do flaten */
    b6[5]=f1[numc];			/* determin flat_? */
    stat(f1,&stus); 
    if(stus.st_size>8300000)strcpy(a,"flaten ");
    else strcpy(a,"flaten_300 ");
    strcat(a,f1);
    strcat(a," ");
    for(i=0;i<najob;i++)if(b6[5]==ajob[i] && ai[i]>=0){
      c=ai[i];
      strcat(a," ");
      strcat(a,ni[c]);
      goto l21;
    }
    strcat(a,b6);
l21:
    dosystem(a);
/* do coord */
    if(stus.st_size>8300000){
      strcpy(a,"coord ");
      strcat(a,f2);
//    strcat(a," !");
      if(iprint>0)strcat(a," p");
      dosystem(a);
/* do statsky */
      strcpy(a,"statsky ");
      strcat(a,f2);
      system(a);	
    }
/* do dele */
    if(idel>0){                 /* *.fit must existed then can dele */
      if((fp2=fopen(f2,"r"))!=NULL){
        fclose(fp2);
        stat(f2,&stus); 
        if(stus.st_size==0)goto l20;
        strcpy(a,"rm ");
        strcat(a,f1);
        system(a);   
      }
    }
    goto l20;
  }
  goto l10;
}

exist_del(f1)
char f1[];
{
  FILE *fp2;
  if((fp2=fopen(f1,"r"))==NULL)return;
  fclose(fp2);
  strcpy(a,"rm ");
  strcat(a,f1);
  system(a);
} 

readf(fp,a)
FILE *fp; char a[];
/* 94,9,21, ignore tail's blank & x */
{
  int i;
  char c;
  i=0; while((c=fgetc(fp))!=10){ a[i++]=c; if(feof(fp))return(-1); }
  a[i++]=0; 
  if(a[0]!='*' && a[0]!='#'){
l10:    
    if(a[i-1]==' '||a[i-1]==0){i--; goto l10; }
    if((a[i-1]=='x'||a[i-1]=='X')&&a[i-2]==' '){ i--; goto l10; }
    a[i]=0;
  }
  return(i);
}

readx(fp,a)
FILE *fp; char a[];
/* 94,9,21, pickup none_tail's_x file*/
{
  int i;
  char c;
l10:
  i=0; while((c=fgetc(fp))!=10){ a[i++]=c; if(feof(fp))return(-1); }
  a[i++]=0;
  if(a[0]=='*' || a[0]=='#')goto l10;
  if(i<9)goto l10;
l20:
  if(a[i-1]==' '||a[i-1]==0){i--; goto l20;}
  if((a[i-1]=='x'||a[i-1]=='X')&&a[i-2]==' ')goto l10;
  a[i]=0;
  return(i);
}

dosystem(a)
char a[];
{ printf("**%s\n",a); sleep(1);  system(a);}

njindex(a,b)
char a[],b[];
{
  int i,j,k;
  char c;
  j=strlen(a);
  k=strlen(b);
  c=b[0];
  for(i=0;i<j;i++)if(a[i]==c && strncmp(&a[i],b,k)==0)break;
  return (i<j)?i:-1; 
}

