#include <exec/types.h>
#include <exec/exec.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "sc:ae/CModGlue/doorheader.h"
#include "sc:ae/CModGlue/glue.h"
#define SM sendmessage
#define sm sendmessage
#define pm prompt
#define PM prompt
#define HK hotkey
#define hk hotkey
#define GU getuserstring
#define gu getuserstring
#define sr StripReturn
char Date[12];
void end(void);
void GetLocal(void);
void ListIt(void);
void Help(void);
void ViewIt(void);
void StripReturn(char *s);
void ViewDesc(int dirnum,char *startdate,int shortlist);
 char MasterFile[200];
int Reserved(char *Str,char Filter[]);
int Yes=0;
void FlagThem(void);
void MarkNumbers(char *str);
long NumList[2000];
int NumChoose[2000];
void ConvertDate(long);
void main(int argc,char *argv[]);
void LastCommand(void);
void creds(void);
char command[200];
FILE *fi=NULL;
void main(int argc,char *argv[])
{
  int i=0;int j;
  char startdate[100];
  int dirnum=0;
  int shortlist=0;
  strcpy(startdate,"");
  if(argc!=2)
  {
     printf("FlagFile v2.1, written by Joseph Hodge\n");
     printf("Compatible with AmiExpress v1.1u+\n");
     printf("This is a type 'X' door.\n");
     exit(0);
  }
  Register(argv[1][0]-'0');
  gu(command,BB_MAINLINE);
  i=0;
  while(command[i]!='\0' && command[i]!=' ') i++;
  if(command[i]==' ')
  {
    i++;
    j=0;
    while(command[i]!='\0' && command[i]!=' '){ startdate[j]=command[i];i++;j++; }
    startdate[j]='\0';

    if(command[i]==' ')
    { 
      i++;   
      if(command[i]=='U' || command[i]=='u')
      {
        dirnum=-1;
      }else dirnum=atoi(&command[i]);
     while(command[i]!='\0' && command[i]!=' ') i++;
     if(command[i]==' ') shortlist=1;
    }
  }
  i=0;
  while(i<2000)
  {
    NumList[i]=-1L;
    NumChoose[i]=-1;
    i++;
  }
  ViewDesc(dirnum,startdate,shortlist); 
  ShutDown();
  end();
}
void ViewDesc(int dirnum,char *startdate,int shortlist)
{
  char Dir[200];
  char FileName[200];
  int ndir;
  int Lines;
  long TheDate;
  int cline;
  long Position;
  long Ks;
  int ns=0;
  int broke=0;
  int needflags=0;
  int j,i,occurance;
  int size;
  int k;
  long FileNum=0L;
  char Numbers[200];
  char Number[200];
  BOOL GoodDate=FALSE;
  LONG timelast;

  PutInfo(1,BB_NONSTOPTEXT);
  strcpy(Numbers,"");
  GU(Dir,DT_TIMELASTON);
  timelast=atol(Dir);
  GU(Dir,DT_LINELENGTH);
  Lines=atoi(Dir);
  GU(Dir,BB_CONFLOCAL);
  strcat(Dir,"ndirs");
  sm("",1);
  if(startdate[0]=='?')
  {
    creds(); return;
  }
  fi=fopen(Dir,"r");
  if(fi==NULL)
  {
    sm("[33mFiles are not supported in this conference.",1);
    return;
  }
  fgets(Dir,80,fi); fclose(fi); ndir=atoi(Dir);
  
  if(startdate[0]=='\0')
  {
  ConvertDate(timelast);
     sprintf(Dir,"Date as (mm-dd-yy) to begin list (Enter)=%s: ",Date);
  pm(Dir,Date,8);
  }else sprintf(Date,"%-8.8s",startdate);
  if(Date[0]=='S' || Date[0]=='s') strcpy(Date,"");
  if(Date[0]=='-')
  {
    i=atoi(Date);
    timelast += (LONG)(i*24*60*60);
    ConvertDate(timelast);
  }
  
  sr(Date);
  
  if(dirnum==-1) dirnum=ndir;
  if(dirnum<=0 || dirnum>ndir)
  {
      sprintf(Dir,"[0mDirectories: (1-%d), (Upload), (Enter)=none? ",ndir);
      pm(Dir,Dir,3);
  if(Dir[0]=='\0') strcpy(Dir,"Q"); 
   if(Dir[0]=='U' || Dir[0]=='u') sprintf(Dir,"%d",ndir);
  if(atoi(Dir)>ndir || atoi(Dir)<1 || Dir[0]=='Q' || Dir[0]=='q')
  {
    
    if(Dir[0]=='Q' || Dir[0]=='q') return;
    sm("[0m",1);
    sm("That Directory does not exist.",1);
    return;
  }
  
  ndir=atoi(Dir);
  }else ndir=dirnum;
  GU(Dir,BB_CONFLOCAL);
  sprintf(FileName,"%sdir%d",Dir,ndir);
  
  if(Date[0]=='\0') ConvertDate(timelast);
  i=0;j=0;occurance=0;
  TheDate=0L;
  strcat(Date," ");
  while(Date[i]!='\0')
  {
      if(Date[i]<'0' || Date[i]>'9')
      {
        Date[i]='\0'; 
        switch(occurance)
        {
           case 0: TheDate +=(atol(&Date[j])*32L); j=i+1; occurance +=1; break;
           case 1: TheDate +=(atol(&Date[j])); j=i+1; occurance +=1; break;
           case 2: TheDate +=(atol(&Date[j])*365L); j=i+1; occurance +=1; break;
        }
      }
      i++;
  }
  GoodDate=FALSE;
 
  fi=fopen(FileName,"r"); 
  if(fi==NULL)
  {
    sm("[31mError![36m Cannot locate that directory listing.[0m",1);
    return;
  }strcpy(MasterFile,FileName);
  cline = Lines-3;
  Position=ftell(fi);
  sm("",1);

  while(fgets(Dir,180,fi)!=NULL)
  {
    if(broke) goto passthru;
    if(FetchKey()) 
    { 
      cline=0; sm("",1); sm("[33m***break[0m",1); 
      broke=1;
      if(!Yes) { fclose(fi); fi=NULL; return; }
      goto passthru; }
    if(!cline && !ns)
    {
      needflags=0;
      cline=Lines-3;
      sm("[32m([33mPause[32m)[34m...[32m([33mf[32m)[36mlags",0);
      sm(", More[32m([33mY[32m/[33mn[32m/[33mns[32m)[0m? ",0);
      pm("",Number,180); 
      sm("[A[K",0);
      if(!strnicmp(Number,"NS",2)) { ns=1; goto passthru; }
      if(Number[0]=='n' || Number[0]=='N') 
      { 
        broke=1; cline=0; ns=1; 
        if(!Yes) {fclose(fi); fi=NULL; return; } 
        goto passthru;
      }
      if(Number[0]=='f' || Number[0]=='F')
     {
      if(strlen(Number)>2)
      {
        k=0;
        while(Number[k]!='\0') { Number[k]=Number[k+2]; k++; }
      }else
      {
      sprintf(Number,"[36mFile[33m#[32m([31ms[32m)[36m to flag: [32m([33mEnter[32m)[36m=none[0m? ");
      pm(Number,Number,200);
      sm("[A[K",0);
      }        
      if(Number[0]!='\0')
      {
         MarkNumbers(Number);}
     }  
    
    }
    else if(GoodDate && !shortlist)cline--;
    
    sr(Dir);

passthru:

    if(Dir[0]!='\0' && Dir[25]=='-' && Dir[28]=='-' && Dir[27]!='-')
    {
      FileNum +=1L;
      if(FileNum==1999L)
      {
        i=0;
        if(Yes) FlagThem();
        Yes=0;
        
        while(i<2000)
        {
          NumList[i]=-1L;
          NumChoose[i]=-1;
          i++;
        }
        FileNum=1L;
      }
      NumList[FileNum]=Position;
      if(!broke)
      {
        Ks=atol(&Dir[14]);
        if(Ks>999L){ Ks /=1000L; size='k'; } else size='b';
        
       /*
        if(Dir[13]=='P')
        sprintf(FileName,"[33m%4d[0m[36m.[0m%-13.13s[36m%4d[32mK[35m%-9.9s[0m%s",FileNum,Dir,Ks,&Dir[22],&Dir[32]);
         else
        sprintf(FileName,"[31m%4d[0m[36m.[0m%-13.13s[36m%4d[32mK[35m%-9.9s[0m%s",FileNum,Dir,Ks,&Dir[22],&Dir[32]);
       */
        if(Dir[13]=='P')
        sprintf(FileName,"[33m%4d[0m %-13.13s%4d%c%-9.9s%s",FileNum,Dir,Ks,size,&Dir[22],&Dir[32]);
         else
        sprintf(FileName,"[31m%4d[0m %-13.13s%4d%c%-9.9s%s",FileNum,Dir,Ks,size,&Dir[22],&Dir[32]);
    
        if(TheDate<=atol(&Dir[29])*365L+atol(&Dir[23])*32L+atol(&Dir[26]))
        { GoodDate=TRUE; if(shortlist) cline--; }
        if(GoodDate){
        sm(FileName,1); needflags=1;}
      
     }
    }else if(GoodDate && !shortlist && !broke)sm(Dir,1);
    Position=ftell(fi);
  }

   if(((cline && GoodDate==TRUE) || needflags) && !ns && !broke)
    {
   sm("[32m([33mlast entry[32m)[34m...[32m([33mf[32m)[36mlags",0);
      sm(", [32m([33mEnter[32m)[36m=none[0m? ",0);
      pm("",Number,180); 
   
      sm("[A[K",0);
      if(Number[0]=='f' || Number[0]=='F')
      {
        if(strlen(Number)>2)
      {
        k=0;
        while(Number[k]!='\0') { Number[k]=Number[k+2]; k++; }
      }else
      {
      sprintf(Number,"[36mFile[33m#[32m([31ms[32m)[36m to flag: [32m([33mEnter[32m)[36m=none[0m? ");
      pm(Number,Number,200);
      sm("[A[K",0);
      }
      if(Number[0]!='\0')
      {
         MarkNumbers(Number);}
      
     }
    }
  
  fclose(fi); fi=NULL;
  if(Yes) 
  {
    FlagThem();
  }
}
void FlagThem(void)
{
   register int i;
   register int total=0;
   FILE *fi;
   char image[200];
   char temp[200];
   fi=fopen(MasterFile,"rb");
   i=1; while(i<2000)
   {
      if(NumChoose[i]==1 && NumList[i]>-1L)
      {
         
         fseek(fi,NumList[i],SEEK_SET);
         fgets(image,13,fi);
         sr(image); total +=1;
         FlagFile(image);
      }
      i++;
   }
   
   fclose(fi);
   sm("",1);
   sprintf(temp,"[0m%d files have been flagged",total);
   sm(temp,1);
}
void MarkNumbers(char *str)
{
  char Number[200];
  register int i;
  register int j;
  register int k;
  long num=0L;
  long prevnum=0L;
  long t;
  strcpy(Number,str);
  i=0;
  k=strlen(Number);
  j=1;
  while(i<k)
  {
    if(j)
    {
      
      while(Number[i]<'0' && Number[i]>'9' && Number[i]!='\0') i++;
      if(Number[i]=='\0') break; 
    }
    if(j) { num=atol(&Number[i]); 
            if(prevnum<num && prevnum)
            {
              t=num; for(num=prevnum+1L;num<=t;num++)
              {
                if(num>0L && num<2000L)
                {

                     NumChoose[num]=1; Yes=1;
                }
              }    
            }
            else
            {
              if(num>0L && num<2000L)
              {

                  NumChoose[num]=1; Yes=1;
              }
            }
          }

    if(Number[i]==',' || Number[i]==' ' || Number[i]=='-') j=1; else j=0;
    if(Number[i]=='-') prevnum=num; else prevnum=0L;
    i++;
  }
}
  

void end(void)
{
  if(fi!=NULL) fclose(fi);
  exit(0);
}
void ConvertDate(long t)
{
  struct tm *tp;
  int M,D,Y;
  long tg;
  char Day[4],Month[5],Year[3];
  char TheTime[27];
  tg=t;
  tp=localtime(&tg);
  sprintf(TheTime,"%s",asctime(tp));
  sprintf(Day,"%.2s",&TheTime[8]);
  sprintf(Month,"%.3s",&TheTime[4]);
  sprintf(Year,"%.2s",&TheTime[22]);
   D=atoi(Day);
   Y=atoi(Year);

  if(!strncmp(Month,"Jan",3)) M=1;
  if(!strncmp(Month,"Feb",3)) M=2;
  if(!strncmp(Month,"Mar",3)) M=3;
  if(!strncmp(Month,"Apr",3)) M=4;
  if(!strncmp(Month,"May",3)) M=5;
  if(!strncmp(Month,"Jun",3)) M=6;
  if(!strncmp(Month,"Jul",3)) M=7;
  if(!strncmp(Month,"Aug",3)) M=8;
  if(!strncmp(Month,"Sep",3)) M=9;
  if(!strncmp(Month,"Oct",3)) M=10;
  if(!strncmp(Month,"Nov",3)) M=11;
  if(!strncmp(Month,"Dec",3)) M=12; 
  sprintf(Date,"%02d-%02d-%02d",M,D,Y);
}
void LastCommand(void)
{
 PutInfo(0,BB_NONSTOPTEXT);

 sm("",1);
}

void StripReturn(char *s)
{
  register int i;
  i=strlen(s)-1;
  while(i>-1)
  {
    if(*(s+i)<=32) *(s+i)='\0'; else break;
    i--;
  }
}

void creds(void)
{
  sm("",1);
  sm( "[36m           .-----------------------------------------------------.[0m",1);
  sm( "[36m           |[0m           Ami-Express [36mFlagFile[0m Version 2.1         [36m |[0m",1);
  sm( "[36m           |[0m              [0m Written by [33mJoseph Hodge[35m.              [36m|[0m",1);
  sm( "[36m           |      [44m[33m/X[36m Development Team[0m[37m -[35m The Silent Achievers [36m    |[0m",1);
  sm( "[36m           `-----------------------------------------------------'[0m",1);
  sm("",1);
        sm("          Syntax: <command> <mm-dd-yy | a | s > <directory | u > [b]",1);
        sm("",1);
        sm("              command = sysop defined",1);
        sm("",1);
        sm("             mm-dd-yy = date to display from",1);
        sm("                    a = display from beginning of directory",1);
        sm("                    s = display since last display date",1);
        sm("",1);
        sm("            directory = directory number to list",1);
        sm("                    u = upload directory to list",1);
        sm("",1);
        sm("                    b = display one line descriptions",1);
        sm("",1);

}
