#include <exec/types.h>
#include <exec/exec.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "dh1:source/doors/romconf/doorheader.h"
#include "code:express.h"
struct Commands Cmds;
#define SM sendmessage
#define sm sendmessage
#define pm prompt
#define PM prompt
#define HK hotkey
#define hk hotkey
#define GU getuserstring
#define sr StripReturn
char Date[12];
char MenuLocal[]="DOORS:AEShell/Menu";
void end();
void GetLocal();
void MoveIt();
void DeleteIt();
void CopyIt();
void ListIt();
void Help();
void ViewIt();
void DeterAccess();
void MoveToNode();
void RenameIt();
void MakeIt();
void DisplayError();
void StripReturn();
void ViewDesc();
 char MasterFile[200];
int Reserved(char *Str,char Filter[]);
int MakeU=0;
int MakeH=0;
int Yes=0;
void FlagThem();
void MarkNumbers(char *str);
long NumList[2000];
int NumChoose[2000];
void ConvertDate(long);
void main(int argc,char *argv[]);
void LastCommand(void);
void main(int argc,char *argv[])
{
  char CMD[200];
  char CD[200];
  char conf[200];
  char BBS[200];
  FILE *fi;
  int i=0;
  if(argc!=2)
  {
     printf("FlagFile v1.2, 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');
  while(i<2000)
  {
    NumList[i]=-1L;
    NumChoose[i]=-1;
    i++;
  }
  GU(CMD,BB_LOCAL);
  strcpy(BBS,CMD);
  sprintf(CD,"[34m%s[33m>[0m",CMD);
  strcat(CMD,"Config1");
  fi=fopen(CMD,"rb");
  fread((APTR)&Cmds,sizeof(struct Commands),1,fi);
  fclose(fi);
  SM("FlagFile v1.2  written by [34mJoseph Hodge[0m",1);
  ViewDesc(); 
  ShutDown();
  end();
}
void ViewDesc()
{
  FILE *fi;
  char Dir[200];
  char FileName[200];
  int ndir;
  int Lines;
  long TheDate;
  int FoundDate;
  long NumberFiles=0L;
  int cline=0;
  long Position;
  long Ks;
  long FileNum=0L;
  char Numbers[200];
  char Number[200];
  BOOL GoodDate=FALSE;
  LONG timelast;
  strcpy(Numbers,"");
  GU(Dir,DT_TIMELASTON);
  timelast=atol(Dir);
  GU(Dir,DT_LINELENGTH);
  Lines=atoi(Dir);
  GU(Dir,BB_CONFLOCAL);
  strcat(Dir,"ndirs");
  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);
  sm("",1);
  sprintf(Dir,"[36mThere are [31m%d [36mDir listings in this conference.",ndir);
  sm(Dir,1);
  sprintf(Dir,"[33mWhich Dir listing would you like to FlagFrom,<Q>, or [ENTER=%d] [36m>:",ndir);
  sm(Dir,0);
  pm("",Dir,3);
  if(Dir[0]=='\0') 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("[31mThat Dir listing does not exist![0m",1);
    return;
  }
  ndir=atoi(Dir);
  GU(Dir,BB_CONFLOCAL);
  sprintf(FileName,"%sdir%d",Dir,ndir);
  sm("",1);
  ConvertDate(timelast);
  sprintf(Dir,"[33mEnter From Date [32mmm-dd-yy[33m or[35m [[36mENTER=%s[35m]>:[0m",Date);
  pm(Dir,Date,8);
  if(Date[0]=='\0') ConvertDate(timelast); 
  if(strlen(Date)==8)
  {
     TheDate=atol(&Date[6])*365L+atol(Date)*32L+atol(&Date[3]);
  }
  else { TheDate=0; GoodDate=TRUE;}
  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("          [43m [0m num = Passed Test  [41m [0m num = Test Not Required",1);
  sm("",1);

  while(fgets(Dir,180,fi)!=NULL)
  {
    if(!cline)
    {
      sm("Press [Return],Q)uit or FileNum seperated by commas",1);
      pm(">:",Number,200);
      if(Number[0]=='Q' || Number[0]=='q') { fclose(fi); break;}
        
      if(Number[0]!='\0')
      {
         MarkNumbers(Number);}
         cline=Lines-3;
      
    }
    else if(GoodDate)cline--;
    
    sr(Dir);
   
    if(Dir[25]=='-' && Dir[28]=='-' && Dir[27]!='-')
    {
      FileNum +=1L;
      NumList[FileNum]=Position;
      Ks=atol(&Dir[14])/1000;
      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(TheDate<=atol(&Dir[29])*365L+atol(&Dir[23])*32L+atol(&Dir[26]))
      GoodDate=TRUE;
      if(GoodDate)
      sm(FileName,1);
    }
    else if(GoodDate)sm(Dir,1);
    Position=ftell(fi);
  }
   if(cline && GoodDate==TRUE)
    {
      sm("Press [Return],or FileNum seperated by commas",1);
      pm(">:",Number,200);
      if(Number[0]!='\0')
      {
         MarkNumbers(Number);}
         cline=Lines-3;
      
    }
  
  fclose(fi);
  if(Yes) 
  {
    sm("[33mFlagging Files, Please standby[0m",1);
    FlagThem();
  }
}
void FlagThem()
{
   register int i;
   FILE *fi;
   char image[200];
   char temp[200];
   long Position;
   fi=fopen(MasterFile,"rb");
   i=1; while(i<2000)
   {
      if(NumChoose[i]==1)
      {
         
         fseek(fi,NumList[i],SEEK_SET);
         fgets(image,13,fi);
         sr(image);
         sprintf(temp,"[34mflagged file [36m[[33m%3d[36m] [32m%s[0m",i,image);
         sm(temp,1);
         FlagFile(image);
      }
      i++;
   }
   fclose(fi);
}
void MarkNumbers(char *str)
{
  char Number[200];
  register int i;
  register int j;
  register int k;
  long num;
  strcpy(Number,str);
  i=0;
  k=strlen(Number);
  j=1;
  while(i<k)
  {
    if(j) { num=atol(&Number[i]); 
            if(num>0L && num<2000L)
            {

              if(NumList[num]>-1L)
              {
                NumChoose[num]=1; Yes=1;
              }
            }
          }
    if(Number[i]==',') j=1; else j=0;
    i++;
  }
}
  
void DeterAccess()
{
  char NAME[200];
  char CMD[200];
  char FileName[200];
  char Password[200];
  FILE *fi;
  register int i=0;
  getuserstring(NAME,DT_NAME);
  strupr(NAME);
  strcpy(CMD,"DOORS:AEShell/CoSysops");
  strcpy(FileName,CMD);
  sm("Enter Password >:",0);
  strcpy(Password,"");
  i=0;
  do
  {
     hk("",CMD); strupr(CMD);
     if(CMD[0]!=13 && CMD[0]!='\0'){ strcat(Password,CMD);sm("X",0);}
     i++;
   }while(CMD[0]!=13 && CMD[0]!='\0' && i<20);
   sm("",1);
    fi=fopen(FileName,"r");
    if(fi==NULL)
    {
     SM("You are not a CoSysop for this Bulletin Board.",1);
      ShutDown();
      end();
    }
    strcat(NAME,"-");
    strcat(NAME,Password);
    while(fgets(CMD,80,fi)!=NULL)
    {
      StripReturn(CMD);
      strupr(CMD);
      
      if(!strcmp(NAME,CMD))
      { 
        SM("Access Authenticated.",1);
        fclose(fi);
        return;
      }
  }  
  fclose(fi);
  SM("Access Denied, Please consult the Sysop regarding Access.",1);
  ShutDown();
  end();  
}

void StripReturn(char *str)
{
   register int i;
   i=strlen(str);
   while(i>0)
   {
      if(*(str+i)<32) *(str+i)='\0'; else return;
      i--;
   }
}
void end()
{
  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)
{
}
