#include <exec/types.h>
#include <exec/exec.h>
#include <stdio.h>
#include <stdlib.h>
#include "work:romconf/doorheader.h"
#include "AEDEFINES:defines.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 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[1000];
int NumChoose[1000];
void main(int argc,char *argv[]);
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.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');
  while(i<1000)
  {
    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.1  written by [34mJoseph Hodge[0m",1);
  ViewDesc(); 
  ShutDown();
  end();
}
void ViewDesc()
{
  FILE *fi;
  char Dir[200];
  char FileName[200];
  char Date[10];
  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;
  strcpy(Numbers,"");
  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);
  sm("[33mWhich Dir listing would you like to FlagFrom [36m>:",0);
  pm("",Dir,3);
  if(atoi(Dir)>ndir || atoi(Dir)<1)
  {
    sm("",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);
  pm("[33mEnter From Date [32mmm-dd-yy[33m or[35m [RETURN]>:[0m",Date,8);
  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)
    {
      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<1000)
   {
      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<1000L)
            {

              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);
}