#include <exec/types.h>
#include <exec/exec.h>
#include <stdio.h>
#include <stdlib.h>
#include "dh1:source/doors/romconf/doorheader.h"
#define BPTR long
#define sm sendmessage
#define pm prompt
#define gu getuserstring
#define pu putuserstring
#define TIMEOUT 1
#define hk hotkey
static char MsgBuf[100][80];
#define ACCESS_WRITE -1
#define ACCESS_READ -2
#define LOCK 1
#define NOLOCK 0
#define li lineinput
int ErrorLevel=0;
int Lines=0;
int ActiveConf=0;
void end(void);
int strnicmp(char *str1,char *str2,int len);
int Edit(void);
void Editor(void);
void SaveMsg();
void GiveNet();
int MsgToHeader(int opt);
void MsgReceiveHeader();
BPTR LockUserBase(void);
void MsgNetHeader(int opt);
void Upload_A_File(int);
void free_pdir();
void InitBuffer();
void ReplyMyMsg();
void PackNet();
int Allowed(void);
void CleanPlayPen();
void Pause();
void UnPackNet();
int MsgSubjectHeader(int opt);
void SaveUser(void);
struct FileLock      *pdir = NULL;
   struct FileInfoBlock *dir_info = NULL;
int MsgHeaders(int opt);
void ReadMsg();

void BufferMsg(long msg);
int ALine=0;
int ACPError=0;
int ProcessLine(char *pat, char *vorig, char *dest);
int YesNo(UWORD flag);
int stats=0;
char NetAddress[200];
void CreateFile(char *str);
struct User
{
  char Name[31];
  char Handle[31];
  USHORT Slot_Number;
  ULONG AutoMsg;
  ULONG LastMsg;
  ULONG MsgsPosted;
  ULONG Mail_Received;
} U;
ULONG ConfMsg;

struct MyStats
{
  ULONG NMsg;
} Stats;

struct MyHeader
{
  char Subject[31];
  char FName[31];
  char TName[31];
  char TNName[31];
  char FNName[31];
  ULONG MsgNum;
  ULONG Received;
  ULONG Written;
  char Type;
  BOOL Net;
  BOOL Deleted;
} Head;
char ConfName[80],ConfLoc[80];
int Conf;
void strlim(char *str1,char *str2,int limit);
void sr(char *str);
long LookUp(char *str);
void AddUser(void);
void InitUser();
void Validate(char *str);
int GetConf(char *str,int num);
void GetHighMsg(int opt);
BPTR LockMsgBase(void);
void InitStats(void);
void InitHeader();
void LoadUser(char *str);
void LastCommand(void);
BOOL expert=FALSE;
char Upload_To[200];
int Security;
int node;
char BBSloc[200];
char OldConfName[200];
char OldConfLoc[200];
void Terminate(void);
#define PRV_COMMAND 508
main(int argc,char *argv[])
{
  char temp[200];
  char t[200];
  char BBName[400];
  
  long timeleft;
  int stop;
  if(argc!=2)
  {
    printf("AEConf version 1.1, written by Joseph Hodge\n");
    printf("This is an AmiExpress 2.03+ (XIM)\n\n");
    exit(0);
  }
  Register(argv[1][0]-'0');node=argv[1][0]-'0';
  gu(temp,DT_SECSTATUS); Security=atoi(temp);
  gu(temp,DT_EXPERT);
  if(temp[0]=='X') expert=TRUE;
  gu(BBSloc,BB_LOCAL);gu(NetAddress,JH_BBSName);
  gu(OldConfName,BB_CONFNAME);
  gu(OldConfLoc,BB_CONFLOCAL); 
 gu(temp,BB_MAINLINE);
 
  while(1)
  { stop=0;
    Conf=atoi(&temp[1]);
    if(Conf==0 && (temp[0]=='J' || temp[0]=='j'))
    {
      while(1)
      {
        sprintf(t,"%sNode%d/JoinConf",BBSloc,argv[1][0]-'0');
        showgfile(t);
        pm("[0mConference Number: ",t,10);
        Conf=atoi(t);
        if(Conf==0) continue; 
        else{sprintf(temp,"J %d",Conf); break;}
      }
    }
    if(Conf<=9)
    {
      //strcpy(temp,"J");
      
      pu(temp,RETURNCOMMAND);
      
      Terminate();
      end();
    }
    
    Conf -=9;
    sprintf(t,"%sCustomConf",BBSloc);
    if(!GetConf(t,Conf))
    {
      strcpy(temp,"J 0"); continue;
    }
    if(Security<255)
    {
      if(!Allowed())
      {
        sm("",1);
        sm("[36mSorry, Conference Access denied![0m",1);
        sm("",1);strcpy(temp,"J 0"); 
        Pause(); sm("",1); continue;
      }
      
    }
    InitHeader();
    InitStats();
    sm("",1);sm("",1);
    sm("[32mJoining Conference[33m: [0m",0);
    sm(ConfName,1);
    sm("",1);
    GetHighMsg(LOCK);
    InitUser();
    ActiveConf=1;
    sprintf(t,"%sBULL",ConfLoc);
    pu(ConfName,BB_CONFNAME);
    pu(ConfLoc,BB_CONFLOCAL);
    if(CheckToDisplay(t)) Pause();
    sm("",1);
    sm("[32mHighest Msg[33m: [0m",0);
    sprintf(t,"%ld",Stats.NMsg-1L);
    sm(t,1);
    sm("[32mL/Msg. Read[33m: [0m",0);
    sprintf(t,"%ld",U.LastMsg);
    sm(t,1);
    sm("[32mL/Msg. Auto[33m: [0m",0);
    sprintf(t,"%ld",U.AutoMsg);
    sm(t,1);
    sm("",1);
    sm("",1);
    
    while(1)
    {
      if(!expert)
      {
        Pause();
        
        sm("",1);
        sprintf(t,"%sMenu",ConfLoc);
        showgfile(t);
      }
      gu(t,JH_BBSName);gu(temp,DT_TIMELIMIT); timeleft=atol(temp);gu(temp,DT_TIMEUSED);
      timeleft -=atol(temp); 
      sprintf(BBName,"[35m%s [0m[[36m%d[34m:[36m%s[0m] Menu ([33m%ld[37m mins. left[0m): ",
          t,Conf+9,ConfName,timeleft/60L);
      pm(BBName,temp,200);
      strupr(temp);
      if(temp[0]=='\0' || temp[0]==' ') { sm("",1); continue; }
      switch(temp[0])
      {
        //case 'Q': sm("",1);ShutDown(); end(); break;
        case 'J': stop=1;break;
        case 'E': Editor(); break;
        case 'R': if(temp[1]=='Z')
                   pu(temp,PRV_COMMAND); 
                  else ReadMsg(temp);  break;
        case 'N': if(temp[1]=='E') { GiveNet(); break;}
                  pu(temp,PRV_COMMAND); break;
        case 'G': stop=1; break;
        case 'C': Editor(); break;
        case 'M': if(temp[1]=='C' || temp[1]=='E') Edit();
                  else pu(temp,PRV_COMMAND); break;
        case 'Z': if(temp[1]=='O'){
                  sm("",1); sm("Zoom not allowed in Net conferences",1);}
                  else pu(temp,PRV_COMMAND); break;
        default:
           pu(temp,PRV_COMMAND);
      }
      sm("",1);
      if(stop) break;
    }
    if(temp[0]=='\0') { Terminate(); end(); }
  }
  
  Terminate();
  end();
}
void GiveNet()
{
  FILE *fi,*fo;
  char image[200];
  char t[200];
  char filename[200];
  char temp[200];
  char opt[10];
  while(1)
  {
  sm("",1);
  sm("[36mNetWork Master Control[0m",1);
  sm("",1);
  sm("[33m 1>[34m Show NetLog[0m",1);
  sm("[33m 2>[34m Show NetAccess[0m",1);
  sm("[33m 3>[34m PackNet[0m",1);
  sm("[33m 4>[34m UnPackNet[0m",1);
  if(Security==255)
  {
  sm("[33m   --v--[32msysop only[33m--v--[0m",1);
  sm("[33m 5>[34m Add NetAcess[0m",1);
  sm("[33m 6>[34m Remove NetAccess[0m",1);
  sm("[33m 7>[34m Delete NetLog[0m",1);
  sm("[33m 8>[34m Delete NetAccess[0m",1);
  }
  sm("[33m Q>[31m Exit Net control[0m",1);
  hk("[36m  >:[0m",opt); opt[1]='\0';
  sm(opt,1);
  switch(opt[0])
  {
    case '1': sprintf(image,"%sNet/NetLog",ConfLoc);
              CheckToDisplay(image); break;
    case '5': if(Security!=255) break;pm("[32m   Enter Handle [33m>:[0m",image,30);strupr(image);
              if(LookUp(image))
              {
                pm("[32m   Enter Net BBS Name [33m>:[0m",t,30);
                sprintf(filename,"%-30.30s-%-30.30s",image,t);
                sprintf(image,"%sNet/NetAccess.txt",ConfLoc);
                fi=fopen(image,"a");
                fprintf(fi,"%s\n",filename);
                fclose(fi);
              }
              else sm("[36mCan't locate account[0m",1);
              break;
    case '6': if(Security!=255) break;pm("[32m   Enter Handle [33m>:[0m",image,30);strupr(image);
              if(LookUp(image))
              {
                strupr(image);
                sprintf(filename,"%s/Net/NetAccess.old",ConfLoc);
                if(TLock(filename)) DeleteFile(filename);
                sprintf(t,"%s/Net/NetAccess.txt",ConfLoc);
                if(TLock(t))
                {
                  Rename(t,filename);
                  fi=fopen(filename,"r");fo=fopen(t,"w");
                  while(fgets(t,80,fi)!=NULL)
                  {
                    sr(t); strcpy(temp,t); temp[29]='\0'; sr(temp);
                    strupr(temp);
                    if(strcmp(temp,image)) fprintf(fo,"%s\n",t);
                  }
                  fclose(fi);
                  fclose(fo);
                  DeleteFile(filename);
                }
              }
              break;
    case '2': sprintf(t,"%sNet/NetAccess",ConfLoc);sm("",1); CheckToDisplay(t);
              break;
    case '3': PackNet(); break;
    case '4': UnPackNet(); break;
    case '7': if(Security!=255) break;
              sprintf(image,"%sNet/NetLog.txt",ConfLoc); 
              if(TLock(image)) DeleteFile(image);
              break;
    case '8': if(Security!=255) break;
              sprintf(image,"%sNet/NetAccess.txt",ConfLoc);
              if(TLock(image)) DeleteFile(image); break;
    case 'Q': return; break;
    case 'q': return; break;
   }
  }
}              
void PackNet()
{
   register int i;
   long lock;
   char Address[200];
   char Name[200],NetName[200];
   FILE *fi=NULL,*fi1=NULL,*fo1=NULL,*fi2=NULL;
   char NetFileName[200];
   char HeaderName[200];
   char MsgName[200];
   long NextPosition;
   long PriorPosition;
   long TimeVar;
   int MsgCount=0;fi=NULL;
   strcpy(Name,U.Handle);strupr(Name);
   sprintf(Address,"%sNet/NetAccess.txt",ConfLoc);
   if(!TLock(Address))
   {
     sm("[36m You are not on the NetAccess list[0m",1);
     return;
   }
   sprintf(NetFileName,"%sNode%d/PlayPen/NetMail.DAT",BBSloc,node);
   sprintf(HeaderName,"%sMsgBase/HeaderFile",ConfLoc);
   if(!TLock(HeaderName))
   {
     sm("[36m Sorry, there is no mail today[0m",1);
     return;
   }
   fi=fopen(Address,"r");
   while(fgets(Address,80,fi)!=NULL)
   {
      sr(Address); strcpy(NetName,&Address[31]);
      Address[30]='\0'; sr(Address);
      
      if(!strcmp(Address,Name))
      {
        lock=LockMsgBase();fclose(fi); fi=NULL;
        fo1=fopen(NetFileName,"w");
        fi1=fopen(HeaderName,"r+b");
        fseek(fi1,(U.LastMsg-1L)*(long)sizeof(struct MyHeader),SEEK_SET);
        PriorPosition=ftell(fi1);
        while(fread((APTR)&Head,sizeof(struct MyHeader),1,fi1)!=NULL)
        {
          
          NextPosition=ftell(fi1);
          if(!Head.Deleted)
          {
            if(!strcmp(NetName,&Head.TNName) || Head.Type=='P')
            {
              if(Head.Type=='R' || !strcmp(NetName,&Head.TNName))
              {
                fseek(fi1,PriorPosition,SEEK_SET);
                
                fwrite((APTR)&Head,sizeof(struct MyHeader),1,fi1);
                fseek(fi1,NextPosition,SEEK_SET);
              }
              sm(".",0);
              fprintf(fo1,"BEGIN:\n");
              fprintf(fo1," FROMNET  :%s\n",Head.FNName);
              fprintf(fo1," TONET    :%s\n",Head.TNName);
              fprintf(fo1," DATE     :%ld\n",time(NULL));
              fprintf(fo1," RECEIVED :%ld\n",Head.Received);
              fprintf(fo1," FROMUSER :%s\n",Head.FName);
              fprintf(fo1," TOUSER   :%s\n",Head.TName);
              fprintf(fo1," SUBJECT  :%s\n",Head.Subject);
              fprintf(fo1," TYPE     :%c\n",Head.Type);
              fprintf(fo1," ----------\n");
              MsgCount +=1;
              Head.Received=time(NULL);
              sprintf(MsgName,"%sMsgBase/%ld",ConfLoc,Head.MsgNum);
              if(TLock(MsgName))
              {
                fi2=fopen(MsgName,"r");
                while(fgets(MsgName,90,fi2)!=NULL)
                {
                  fprintf(fo1," %s",MsgName);
                }
                fclose(fi2);
              }
              fprintf(fo1,"END:\n");
           } PriorPosition=ftell(fi1);
         }
         U.LastMsg +=1L;
       }
       UnLock(lock);  
       GetHighMsg(LOCK);
       if(U.LastMsg>=Stats.NMsg) U.LastMsg=Stats.NMsg-1L;
       fprintf(fo1,"TOTALMSG THIS PACKET: %5.5d FROM:%s\n",MsgCount,BBSloc);
       fprintf(fo1,"PACKET FROM %s CONF:%s\n",NetAddress,ConfName);
       fclose(fo1);fclose(fi1);
       sprintf(NetFileName,"%sNet/NetLog.TXT",ConfLoc);
       fi1=fopen(NetFileName,"a");
       TimeVar=time(NULL);
       sprintf(MsgName,"%s",ctime(&TimeVar));
       MsgName[strlen(MsgName)-1]='\0';
       fprintf(fi1,"[36m%-20.20s[33m >[34m%5.5d[36m Packed for[32m %s[0m\n",MsgName,MsgCount,NetName);
       fprintf(fi1,"                     [33m>[35mby %s[0m\n",Name);
       fclose(fi1);
       
     }
     if(fi==NULL) break;
   }
   if(fi!=NULL) fclose(fi);
   sm("",1);
   sprintf(MsgName,"[32mTOTAL MESSAGES PACKED [36m:[33m%5.5d[0m",MsgCount);
   sm(MsgName,1); sm("",1);
   if(MsgCount>0)
   {
     sm("[36mDo you wish to download this PACKET ",0);
     if(YesNo(1)) 
     {
       sprintf(NetFileName,"%sNode%d/PlayPen/NetMail.DAT",BBSloc,node);
       sm("[36mPrepare for Zmodem Download",1);
       Pause();
       sm("",1);
       pu(NetFileName,ZMODEMSEND); DeleteFile(NetFileName);
     }
   }
}
void UnPackNet()
{
   register int i;
   long lock;
   char Address[200];
   char Name[200],NetName[200],NetMail[200];
   FILE *fi=NULL,*fi1=NULL,*fo1=NULL,*fo2=NULL,*fo3=NULL;
   char NetFileName[200];
   char HeaderName[200];
   char MsgName[200];
   char Location[200];
   long NextPosition;
   long PriorPosition;
   long TimeVar;
   int MsgCount=0;fi=NULL;
   strcpy(Name,U.Handle);strupr(Name);
   sprintf(Address,"%sNet/NetAccess.txt",ConfLoc);
   if(!TLock(Address))
   {
     sm("[36m You are not on the NetAccess list[0m",1);
     return;
   }
   sprintf(NetFileName,"%sNode%d/PlayPen/NetMail.DAT",BBSloc,node);
   
   sprintf(HeaderName,"%sMsgBase/HeaderFile",ConfLoc);
   fi=fopen(Address,"r");
   while(fgets(Address,80,fi)!=NULL)
   {
      sr(Address); strcpy(NetName,&Address[31]);
      Address[30]='\0'; sr(Address);
      strupr(Address);
      if(!strcmp(Address,Name))
      {
        fclose(fi); fi=NULL;
        if(!TLock(NetFileName))
        {
          sm("[33mDo you wish to upload NetMail.Dat [0m",0);
          if(YesNo(1))
          {
            sprintf(NetName,"%sNode%d/PlayPen/",BBSloc,node);
            sm("[32mPrepare for Zmodem Upload[0m",1);
            Pause();
            sm("",1);
            pu(NetName,ZMODEMRECEIVE);  sprintf(NetFileName,"%sNetMail.Dat",NetName);
            if(!TLock(NetFileName))
            {
               sm("[36mCan't locate NetMail.Dat[0m",1);
              return;
            }
          }
          else
          {
            pm("[32mEnter Path to NetMail.Dat [33m>:[0m",Address,80);
            if(Address[0]!='\0')
            { 
              if(Address[strlen(Address)-1]!=':' && Address[strlen(Address)-1]!='/')
               Address[strlen(Address)-1]='\0';
            }
            sprintf(NetFileName,"%sNetMail.Dat",Address);
            if(!TLock(NetFileName))
            {
              sm("[36mCan't locate NetMail.Dat[0m",1);
              return;
            }
          }
        }
        strcpy(Location,NetFileName);
        lock=LockMsgBase();
        GetHighMsg(NOLOCK); 
        fi1=fopen(NetFileName,"r");
        fo1=fopen(HeaderName,"ab");
        Head.Received=0L;
        fo2=NULL;
        while(fgets(Address,90,fi1)!=NULL)
        {
          sr(Address);
          if(!strnicmp(Address,"BEGIN:",6)) 
          {
            Head.MsgNum=Stats.NMsg; Stats.NMsg+=1L;
            sprintf(NetName,"%sMsgBase/%ld",ConfLoc,Stats.NMsg-1L);
            fo2=fopen(NetName,"w");continue;
          }
          if(!strnicmp(Address," FROMNET  :",11))
          {
            strcpy(Head.FNName,&Address[11]); continue;
          }
          if(!strnicmp(Address," TONET    :",11))
          {
            strcpy(Head.TNName,&Address[11]); continue;
          }
          if(!strnicmp(Address," DATE     :",11))
          {
            Head.Written=atol(&Address[11]); continue;
          }
          if(!strnicmp(Address," RECEIVED :",11))
          {
            Head.Received=atol(&Address[11]); continue;
          }
          if(!strnicmp(Address," FROMUSER :",11))
          { 
             strcpy(Head.FName,&Address[11]); continue;
          }
          if(!strnicmp(Address," TOUSER   :",11))
          {
             strcpy(Head.TName,&Address[11]); continue;
          }
          if(!strnicmp(Address," SUBJECT  :",11))
          {
             strcpy(Head.Subject,&Address[11]); continue;
          }
          if(!strnicmp(Address," TYPE     :",11))
          {
             Head.Type=Address[11]; continue;
          }
          if(!strnicmp(Address," ----------",11)) continue;
          if(!strnicmp(Address,"END",3))
          {
            Head.Deleted=FALSE; Head.Net=TRUE;
            fwrite((APTR)&Head,sizeof(struct MyHeader),1,fo1);
            U.LastMsg +=1L;MsgCount +=1; if(fo2){fclose(fo2);fo2=NULL;}
          
            
             continue;
          };
          if(!strnicmp(Address,"TOTAL",5)) continue;
          if(!strnicmp(Address,"PACKET",5))
          {
              
              sprintf(Name,"%sNet/NetLog.TXT",ConfLoc);
             fo3=fopen(Name,"a");
             TimeVar=time(NULL);
             sprintf(MsgName,"%s",ctime(&TimeVar));
             MsgName[strlen(MsgName)-1]='\0';
             fprintf(fo3,"[36m%-20.20s[33m >[34m%5.5d[36m unpacked from\n[0m",MsgName,MsgCount);
             fprintf(fo3,"                     [33m>[32m%s[0m\n",&Address[12]);
             fprintf(fo3,"                     [33m>[35mby %s[0m\n",U.Handle);
              fclose(fo3);
            sprintf(MsgName,"[32mTOTAL MESSAGES UNPACKED [36m:[33m%5.5d[0m",MsgCount);
            sm(MsgName,1); sm("",1);
            MsgCount=0;
             continue;
          }
          if(fo2)fprintf(fo2,"%s\n",&Address[1]);
        }
        fclose(fi1);
        fclose(fo1);
        if(fo2)fclose(fo2);
        sprintf(NetMail,"%sMsgBase/MailStats",ConfLoc);
        fi1=fopen(NetMail,"wb"); fwrite((APTR)&Stats,sizeof(struct MyStats),1,fi1);
        fclose(fi1);
        if(lock)UnLock(lock);
        DeleteFile(Location);

     }
     if(fi==NULL) break;
   }
   if(fi!=NULL) fclose(fi);
   sm("",1);
   //sprintf(MsgName,"[32mTOTAL MESSAGES UNPACKED [36m:[33m%5.5d[0m",MsgCount);
   //sm(MsgName,1); sm("",1);
}
   
void Upload_A_File(int opt)
{
  /* 
   char Desc[8][50];
   char CMD[200];
   char temp[200];
   if((dir_info =(struct FileInfoBlock *)AllocMem((long)sizeof(struct FileInfoBlock),0L)) == NULL)
   {
     sm("Memory Allocation Error. Please Leave message with Sysop",1);
     Delay(300L);
     return;
   }
   if(!opt)
   {
      sm("[33mZmodem Upload selected.[0m",1); Pause();
      sm("",1);
      pu(Upload_To,ZMODEMRECEIVE);
   }
   if (! (pdir=(struct FileLock *)Lock(Upload_To,(ULONG)ACCESS_READ)) )
  {
    free_pdir();
      return;
  }
  if ( ! Examine((BPTR)pdir, dir_info) )
  {
    free_pdir();
    return;
  }
  while(ExNext((BPTR)pdir,dir_info))
  {
    if(dir_info->fib_DirEntryType < 0L )
    {
      
      sprintf(CMD,"[33m%-12s P %7ld    ",dir_info->fib_FileName,dir_info->fib_Size);
      SM(CMD,0); 
   }
    else
    {
      sprintf(CMD,"[32m%-25s           ",dir_info->fib_FileName);
      SM(CMD,0);
    }
    j++;
    if(j==2)
    {
      j=0;
      SM("[0m",1);
      i++;
    }
    SM("[0m",0);
    if(i>17)
    {
      while(1)
      {
         HK("\r\nPress <Q>uit <F>lag,  <RETURN> to continue listing >:",CMD);
         strupr(CMD);  
     switch(CMD[0])
      {
         case 'Q': 
          SM("Quit.",1);
          free_pdir();
          return;
         case 'F': SM("Flag.",1);
          Flag(); break;
         default: SM("Continue.",1); break;
      }
     
      if(ch!='F') break; 
     } 
     i=0;
    }
  }
    while(1)
    {
        HK("\r\nPress <F>lag,  <RETURN> to exit listing >:",CMD);strupr(CMD);
      switch(CMD[0])
      {
         case 'Q': 
          SM("Quit.",1);
          free_pdir();
          return;
         case 'F': SM("Flag.",1);
          Flag(); break;
         default: SM("Continue.",1); free_pdir(); return;
      }
     
      if(ch!='F') break; 
     } 
  */
}

/*******************************************************/

void free_pdir()
{
   if ( pdir )
      {
      UnLock((BPTR)pdir);
      pdir=NL;
       }
   return;   
}
void InitHeader()
{
  strcpy(Head.FName,"");
  strcpy(Head.TName,"");
  strcpy(Head.Subject,"");
  strcpy(Head.TNName,"");
  strcpy(Head.FNName,"");
  Head.Net=FALSE;
  Head.MsgNum=-1L;
  Head.Received=0L;
  Head.Written=0L;
  Head.Type=' ';
  Head.Deleted=FALSE;
}
void InitStats(void)
{
  Stats.NMsg=1L;
}

BPTR LockMsgBase(void)
{
  char GSTR3[200];
BPTR lock;
UWORD loop=0;
LONG error;
sprintf(GSTR3,"%sMsgBase/MailLock",ConfLoc);
do
	{
	lock=Lock(GSTR3,ACCESS_WRITE);
	if(!lock)
		{
		error=IoErr();
		if(error==205)
			{
			CreateFile(GSTR3); continue;
			}
		}
	if(!lock)
		{
		Delay(120L);
		sm(".",0);
		}
	} while(!lock&&loop++<30);
if(loop) sm("",1);
return(lock);
}
BPTR LockUserBase(void)
{
  char GSTR3[200];
BPTR lock;
UWORD loop=0;
LONG error;
sprintf(GSTR3,"%sUser.lock",ConfLoc);
do
	{
	lock=Lock(GSTR3,ACCESS_WRITE);
	if(!lock)
		{
		error=IoErr();
		if(error==205)
			{
			CreateFile(GSTR3);
			}
		}
	if(!lock)
		{
		Delay(120L);
		sm(".",0);
		}
	} while(!lock&&loop++<30);
if(loop) sm("",1);
return(lock);
}
void GetHighMsg(int opt)
{
  char t[200];
  long lock;
  FILE *fi;
  if(opt)
  {
  lock=LockMsgBase(); 
  if(!lock)
  {
    sm("[35m Error, can't lock msgbase[0m",1);
    Terminate();
    end();
  }
  }
  sprintf(t,"%sMsgBase/MailStats",ConfLoc);
  if(!TLock(t))
  {
    fi=fopen(t,"wb");
    fwrite((APTR)&Stats,sizeof(struct MyStats),1,fi);
    fclose(fi);
    if(opt)UnLock(lock);
    return;
  }
  fi=fopen(t,"rb");
  fread((APTR)&Stats,sizeof(struct MyStats),1,fi);
  fclose(fi);
  if(opt)UnLock(lock);
}
  
int GetConf(char *str,int num)
{
   register int i=0;
   FILE *fi;
   char t[200];
   num -=1;
   if(!TLock(str)) return(0);
   fi=fopen(str,"r");
   while(fgets(t,80,fi)!=NULL)
   {
     sr(t);
     if(i==num)
     {
       fclose(fi);
       if(strlen(t)<30)
       {
         sm("",1);
         sm("",1);
         sm("[32m Error, CustomConf is invalid[0m",0);
         sm("",1);
         return(0);
         //ShutDown();
         //end();
       }
       else
       {
       strcpy(ConfLoc,&t[29]);
if(ConfLoc[strlen(ConfLoc)-1]!=':' && ConfLoc[strlen(ConfLoc)-1]!='/') 
       strcat(ConfLoc,"/");
       
        Validate(ConfLoc);
       strlim(ConfName,t,25);sr(ConfName);
       
       return(1);
      }
    }
     i +=1;
   }
   fclose(fi);
  // strcpy(t,"J");
  // pu(t,RETURNCOMMAND);
  // ShutDown();
  // end();
  return(0);
}
void Validate(char *str)
{
  char t[200];
  long lock;
  strcpy(t,str);
  if(t[strlen(t)-1]=='/') t[strlen(t)-1]='\0';
  if(!TLock(t)) { lock=CreateDir(t); 
                  if(lock) UnLock(lock); 
                  else
                  {
                  sm("[35mError can't create Conference[0m",1);
                  ShutDown();
                  end();
                  }
                }
  sprintf(t,"%sUpload",str);
  if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  sprintf(t,"%sPartUpload",str);
  if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  sprintf(t,"%sMsgBase",str);
  if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  sprintf(t,"%sBulletins",str);
  if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
  sprintf(t,"%sHold",str);
  if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
   sprintf(t,"%sNet",str);
  if(!TLock(t)){ lock=CreateDir(t); if(lock)UnLock(lock); }
}
  
    
void InitUser()
{
  char temp[100];
  gu(temp,DT_NAME);
  strcpy(U.Handle,temp);
  strcpy(U.Name,"");

  U.LastMsg=1L;
  U.AutoMsg=0L;
  U.MsgsPosted=0L;
  U.Mail_Received=0L;
  LoadUser(temp);
}
void LoadUser(char *str)
{
  long deleted=-1L;
  FILE *fi;
  long slot=0L;
  struct User t;
  char image[200];
  long lock;
  lock=LockUserBase();
  sprintf(image,"%sUserBase",ConfLoc);
  if(!lock)
  {
    sm("",1);
    Terminate();
    end();
  }
  if(!TLock(image))
  {
    U.Slot_Number=0L;
    sprintf(image,"%sUserBase",ConfLoc);
    fi=fopen(image,"wb");
    fwrite((APTR)&U,sizeof(struct User),1,fi);
    fclose(fi);
    UnLock(lock);
    return;
  }
  fi=fopen(image,"rb");
  while(fread((APTR)&t,sizeof(struct User),1,fi)!=NULL)
  {
    if(!strcmp(t.Handle,str))
    {
       U=t; fclose(fi); if(lock)UnLock(lock); return;
    }
    if(t.Slot_Number==-1L && deleted==-1L) deleted=slot;
    slot++;
  }
  fclose(fi);
  if(deleted==-1L)
  {
    fi=fopen(image,"ab");
    U.Slot_Number=slot;
    fwrite((APTR)&U,sizeof(struct User),1,fi);
    fclose(fi);
  }
  else
  {
    fi=fopen(image,"r+b");
    U.Slot_Number=deleted;
    fseek(fi,deleted*(long)sizeof(struct User),SEEK_SET);
    fwrite((APTR)&U,sizeof(struct User),1,fi);
    fclose(fi);
  }
  if(lock)UnLock(lock);
  return;
  
}
void SaveUser(void)
{
  long deleted=-1L;
  FILE *fi;
  long slot=0L;
  struct User t;
  char image[200];
  long lock;
  lock=LockUserBase();
  sprintf(image,"%sUserBase",ConfLoc);
  if(!lock)
  {
    sm("",1);
    Terminate();
    end();
  }
  fi=fopen(image,"r+b");
  fseek(fi,U.Slot_Number*(long)sizeof(struct User),SEEK_SET);
  fwrite((APTR)&U,sizeof(struct User),1,fi);
  fclose(fi);
  if(lock)UnLock(lock);
}
long LookUp(char *str)
{
  long deleted=-1L;
  FILE *fi;
  long slot=0L;
  struct User t;
  char image[200];
  long lock;
  lock=LockUserBase();
  sprintf(image,"%sUserBase",ConfLoc);
  if(!lock)
  {
    sm("",1);
    Terminate();
    end();
  }
  fi=fopen(image,"rb");
  while(fread((APTR)&t,sizeof(struct User),1,fi)!=NULL)
  {
    strupr(&t.Handle);
    if(!strcmp(t.Handle,str) && t.Slot_Number!=-1L)
    {
       fclose(fi); UnLock(lock); return(slot+1);
    }
    slot++;
  }
  fclose(fi);
  UnLock(lock);
  return(0);
  
}
void end(void)
{
 if(ActiveConf){ CleanPlayPen();
  SaveUser();}
  exit(0);
}

void CleanPlayPen()
{
  char FileName[200];
  sprintf(FileName,"DELETE %sNode%d/PlayPen/#? QUIET",BBSloc,node);
  Execute(FileName,NULL,NULL);
}



/****************************** EDITOR **********************************/

void ReadMsg(char str1[])
{
  long lock;
  FILE *fi=NULL;
  long TimeVar;
  long oldmsg;
  BOOL mine=FALSE;
  char Name[40];
  char image[200];
  char date[100];
  char temp[255];
   char str[200];
  register int i;
  GetHighMsg(LOCK);
  U.LastMsg= atoi(&str1[1])==0 ? U.LastMsg:atoi(&str1[1]);
  strcpy(Name,U.Handle);
  strupr(Name);
  sprintf(image,"%sMsgBase/HeaderFile",ConfLoc);
  //if(U.LastMsg==Stats.NMsg-1L) return;

  while(U.LastMsg<Stats.NMsg)
  {
    if(U.LastMsg==0) U.LastMsg=1;
    mine=FALSE;
    lock=LockMsgBase();
    if(!lock)
    {
      sm("[34m Can't get lock on MsgBase[0m",1); return;
    }
    fi=fopen(image,"r+b");
    fseek(fi,(U.LastMsg-1L)*sizeof(struct MyHeader),SEEK_SET);
    fread((APTR)&Head,sizeof(struct MyHeader),1,fi);
    strupr(Head.TName); strupr(Head.FName);
    if(!Head.Deleted)
    {
      if(!strcmp(Head.TName,Name) && Head.Received==NULL)
      {
        Head.Received=time(NULL);
        fseek(fi,(U.LastMsg-1L)*sizeof(struct MyHeader),SEEK_SET);
        fwrite((APTR)&Head,sizeof(struct MyHeader),1,fi);
        
      }
      
    }
    fclose(fi); fi=NULL;
    if(!Head.Deleted)BufferMsg(U.LastMsg);
    else
    {
      sprintf(str,"[32m([33m%ld[32m)[0m",U.LastMsg);
     // U.LastMsg +=1L;
      sm("",1);
      sm("[36mMessage ",0);sm(str,0);sm("[36m is deleted.[0m",1);
     // sm("",1); if(U.LastMsg>=Stats.NMsg) U.LastMsg=Stats.NMsg-1L;return;
    }
    if(lock)UnLock(lock);
    
if(!strcmp(Head.TName,Name) || !strcmp(Head.FName,Name))
      {
        mine=TRUE;
      }
      if(!mine && Head.Type=='R' && Security!=255)
      {
         sm("[32m Receiver Only [0m",1);
      }
      
NoPass:

    while(1)
	{
       if(!((!mine && Head.Type=='R' && Security!=255) || Head.Deleted))
       {
         TimeVar=Head.Written;
         sprintf(date,"%s",ctime(&TimeVar));
         date[strlen(date)-1]='\0';
         sprintf(str,"[32mDate   [33m: [0m%-30s  [32mNumber[33m: [0m%ld",date,Head.MsgNum);
         sm("",1);
         sm(str,1);
         if(Head.Net)
         {
           sprintf(str,"[32mToNet  [33m: [0m%-30s  [32mFrmNet[33m: [0m%-30.30s",Head.TNName,Head.FNName);
           sm(str,1);
         }
         sprintf(str,"[32mTo     [33m: [0m%-30s  [32mRecv'd[33m:[0m ",Head.TName);
         sm(str,0);
         if(!strcmp(Head.TName,"ALL"))
         {
           sm("N/A.",1);
         }
         else
         {
           if(Head.Received==NULL)
           {
             sm("No.",1);
           }
           else
           {
             TimeVar=Head.Received;
             sprintf(date,"%s",ctime(&TimeVar));
             date[strlen(date)-1]='\0';
             sm(date,1);
           }
         }
         sprintf(str,"[32mFrom   [33m: [0m%-30s  [32mStatus[33m:[0m ",Head.FName);
         sm(str,0);
         if(Head.Type=='P')
         {
           sm("Public Message.",1);
         }
         else sm("Receiver only.",1);
        
         sprintf(str,"[32mSubject[33m: [0m%-30s",Head.Subject);
         sm(str,1); sm("",1);
         i=0;
         while(i<Lines)
         {
           sm(MsgBuf[i],1);
           i++;
         }
       }
         sm("",1);
         if(U.LastMsg==Stats.NMsg-1L)
         strcpy(str,"QUIT");else
         sprintf(str,"%ld+%ld",U.LastMsg+1L,Stats.NMsg-1L); 
      if(mine || Security==255)
       {
    
	   strcpy(temp,"[33mA[32m>[36mgain [33mD[32m>[36melete [33mR[32m>[36meply");
        sm(temp,0);
        sprintf(temp," [33mQ[32m>[36muit [32m<[33mCR[32m>[0m=[33mNext [32m([0m %s[32m )[0m?",str);
       } 
       else
       {
    	    strcpy(temp,"[33mA[32m>[36mgain [33mR[32m>[36meply");
         sm(temp,0);
         sprintf(temp," [33mQ[32m>[36muit [32m<[33mCR[32m>[0m=[33mNext [32m([0m %s[32m )[0m? ",str);
       }
       sm(temp,0);
       pm("",temp,10); strupr(temp);
       sm("",1);
       if(temp[0]=='R')
       {
         oldmsg=Head.MsgNum;
         if(Head.Net)strcpy(Head.TNName,Head.FNName);
         if(Head.Net)strcpy(Head.FNName,ConfName); 
         strcpy(Head.TName,Head.FName);
         strcpy(Head.FName,U.Handle);
         Head.Received=0L;
         MsgHeaders(0);
         ReplyMyMsg();
         if(Edit()==0) SaveMsg();
         if(mine)
         {
           sm("[34mDelete orignial message ",0); 
           if(YesNo(2)) temp[0]='D';
         }
         if(temp[0]!='D')break; Head.MsgNum=oldmsg;
       }

       if((mine || Security==255) && temp[0]=='D')
       {
         Head.Deleted=TRUE;
         lock=LockMsgBase();
         if(!lock)
         {
           sm("[34m  Error, can't lock msgbase[0m",1);
         }
         else
         {
            sprintf(str,"%sMsgBase/%ld",ConfLoc,Head.MsgNum);
            DeleteFile(str);
            sprintf(str,"%sMsgBase/HeaderFile",ConfLoc);
            fi=fopen(str,"r+b");
            fseek(fi,(Head.MsgNum-1L)*(long)sizeof(struct MyHeader),SEEK_SET);
            fwrite((APTR)&Head,sizeof(struct MyHeader),1,fi);
            fclose(fi);
            if(lock)UnLock(lock);
            sm("[34m   Message Deleted.[0m",1);
            break;
         }
       }
       if(temp[0]=='Q' || temp[0]=='\0') break;
    }
    if(temp[0]=='Q') break;
    U.LastMsg +=1L;
    GetHighMsg(LOCK);
  }
  if(U.LastMsg>=Stats.NMsg) U.LastMsg=Stats.NMsg-1L;
}
void ReplyMyMsg()
{
  int i,i1,i2,i3;
  char str[200];
	sm("  [36mQuote in Reply ",0);
	stats=YesNo(2);
	if(stats<0)  return;
	sm("",1);
     //Lines=0;
     //while(MsgBuf[Lines][0]!='\0') Lines++;
	for(i=0; i<Lines; i++)
		{
		sprintf(str,"%2d> %s",i+1,MsgBuf[i]);
		sm(str,1);
		}
	for(;;)
		{
                  sm("",1);
		sm(" Enter Startline,Endline or (*=ALL, A=Abort): ",0);
		pm("",str,6);
		stats=str[0];
		if(stats=='A'||stats=='a')
			{
			i=(-1);
			Lines=0;
			break;
			}
		if(stats=='*')
			{
			i=1;
			i2=Lines;
			}
		else
			{
			sscanf(str,"%d,%d",&i,&i2);
			}
		if((i>0&&i<=Lines)&&(i2>0&&i2<=Lines)&&(i<=i2))
			{
			break;
			}
		}
	if(i!=(-1))
		{
		for(i3=0; i3<=(i2-i); i3++)
			{
			if(i3<98)
				{
				MsgBuf[i+i3-1][78]='\0';
				sprintf(str,">%s",MsgBuf[i+i3-1]);
				strcpy(MsgBuf[i3],str);
				}
			}
		if(i3<98)
			{
			Lines=i3;
			}
		else
			{
			Lines=98;
			}
		strcpy(MsgBuf[Lines++]," ");
		MsgBuf[Lines][0]='\0';
		}
	else
		{
		for(i=0; i<100; i++)
			{
			MsgBuf[i][0]='\0';
			}
		}
}
void BufferMsg(long msg)
{
  FILE *fi;
  char image[100];

  register int i=0;
  InitBuffer();
  Lines=0;
  sprintf(image,"%sMsgBase/%ld",ConfLoc,msg);
  if(!TLock(image))
  {
    strcpy(MsgBuf[0],"Can't locate message");
    return;
  }
  fi=fopen(image,"r");
  while(fgets(image,80,fi)!=NULL)
  {
     sr(image);
     strcpy(MsgBuf[i],image);
     i++; Lines++;
     if(i==99) break;
  }
  fclose(fi);
}
     
void Editor()
{
  Lines=0;
  if(MsgHeaders(1)) if(Edit()==0) SaveMsg();
}

void SaveMsg()
{
  long lock;
  char image[200];
  int i=0;
  FILE *fi;
  
  GetHighMsg(LOCK);
lock=LockMsgBase();
  if(!lock)
  {
    sm("",1);
    sm("[36m   Error can't access msgbase. Message not saved[0m",1);
    return;
  }
  Head.MsgNum=Stats.NMsg;
  if(Head.TNName[0]!=NULL)
  {
    Head.Net=TRUE;
  }
  Head.Deleted=FALSE;
  Head.Written=time(NULL);
  Head.Received=0L;
  sprintf(image,"%sMsgBase/HeaderFile",ConfLoc);
  fi=fopen(image,"ab");
  fwrite((APTR)&Head,sizeof(struct MyHeader),1,fi);
  fclose(fi);
  Stats.NMsg+=1;
  sprintf(image,"%sMsgBase/MailStats",ConfLoc);
  fi=fopen(image,"wb");
  fwrite((APTR)&Stats,sizeof(struct MyStats),1,fi);
  fclose(fi);
  if(lock)UnLock(lock);
  sprintf(image,"%sMsgBase/%ld",ConfLoc,Head.MsgNum);
  fi=fopen(image,"w");
  while(i<Lines)
  {
    fprintf(fi,"%s\n",MsgBuf[i]);
    i++;
  }
  fclose(fi);
  sprintf(image,"%ld",Head.MsgNum);
  sm("",1);
  sm("     [36mSaving message number [34m([33m",0);
  sm(image,0);sm("[34m).[0m",1);
  sm("",1);
}
int MsgHeaders(int opt)
{
   MsgNetHeader(opt);
  if(!MsgToHeader(opt)) return(0);
  if(!MsgSubjectHeader(opt)) return(0);
  MsgReceiveHeader();
  return(1);
}
void MsgReceiveHeader()
{
  if(!strcmp(Head.TName,"ALL")) { Head.Type='P';return;}
   sm("   [36mReceiver only ",0); if(!YesNo(2)) Head.Type='P';
   else Head.Type='R';
}  

void MsgNetHeader(int opt)
{
 char temp[200];
 sm("",1);
 sm("                       [32m([33m------------------------------[32m)[0m",1);
 sm("    [36mNet[33m: [32m([33mEnter[32m)[0m=[32m'[33mN/A[32m'[32m?[0m ",0);
 if(opt)
 { 
   pm("",temp,29); strcpy(&Head.TNName,temp);
   strcpy(&Head.FNName,NetAddress); 
 }
 else sm(Head.TNName,1);
}
int MsgToHeader(int opt)
{
 char temp[200];
 sm("     [36mTo[33m: [32m([33mEnter[32m)[0m=[32m'[33mALL[32m'[32m?[0m ",0);
 if(opt)
 {
   pm("",temp,29);
   strcpy(&Head.FName,U.Handle);
   if(temp[0]=='\0') { strcpy(&Head.TName,"ALL"); return(1);}else strcpy(&Head.TName,temp);
   strupr(&Head.TName);
   if(!strcmp(&Head.TName,"ALL")) return(1);
   if(Head.TNName[0]==NULL)
   if(!LookUp(&Head.TName))
   {
     sm("",1);
     sm("[36m    User does not have access to this conference[0m",1);
     sm("",1);
     return(0);
   }
 }
 else sm(Head.TName,1);
 return(1);
}
int MsgSubjectHeader(int opt)
{
 char temp[200];
 sm("[36mSubject[33m: [32m([33mBlank[32m)[0m=[33mabort[32m?[0m ",0);
 if(opt)pm("",temp,29);
 else li(Head.Subject,temp,29);
 //sm("",1);
 if(opt)
 if(temp[0]=='\0') return(0);
 strcpy(Head.Subject,temp);
 return(1);
}
void InitBuffer()
{
  register int i=0;
  while(i<99)
  {
    strcpy(MsgBuf[100],"");
    i++;
  }
}

int Edit(void)
{
register int c;
int cn,j,x,back,BKFlag;
static char str[200],SPACE[90],str2[10],temp[170];
char t[10];
/* Clear msg buffer */
InitBuffer();
str[0]='\0';
x=0;
BKFlag=0;

sm("",1);
sm("   Enter your text. (Enter) alone to end. (75 chars/line, 100 lines, max)",1);
sm("   (*-------*-------*-------*-------*-------*-------*-------*-------*-------*--)",1);

if(Lines!=0)
	{
	for(j=0; j<Lines; j++)
		{
		sprintf(SPACE,"%2d> %s",j+1,MsgBuf[j]);
		sm(SPACE,1);
		}
	}

SPACE[0]='\0';

do
	{
	BEG_IN:
	strcpy(MsgBuf[Lines],SPACE);
	sprintf(str,"%2d> %s",Lines+1,MsgBuf[Lines]);
	sm(str,0);
	for(;;)
		{
		Next2:
//		c=Check_Online_Status();
//		if(c<0) { return(c); }
          hk("",t);c=t[0];
//		c=ReadChar(KEYBOARD_TIMEOUT);
		if(c<0) { return(c); }
		if(c=='\r')
			{
			if(SPACE[0]=='\0')
				{
				MsgBuf[Lines][0]='\0';
				BKFlag=1;
				break;
				}
			strcpy(MsgBuf[Lines],SPACE);
			SPACE[0]='\0';
			sm("",1);
			x=0;
			break;
			}
		if(c=='\30')
			{
			while(x)
				{
				sm("\b \b",0);
				--x;
				}
			SPACE[x]='\0';
			goto Next2;
			}
		if(c=='\b' || c=='\177')
			{
			if(x>0)
				{
				x-=1;
				SPACE[x]='\0';
				sm("\b \b",0);
				goto Next2;
				}
			goto Next2;
			}
		if(c=='\t')
			{
			c=x%8;
			if(x+(8-c)>72)
				{
				c='\t';
				}
			else
				{
				for(;c<8; c++)
					{
					str2[0]=(char)' ';
					str2[1]='\0';
					sm(" ",0);//sendchar(' ');
					strcat(SPACE,str2);
					x++;
					}
				}
			}
		if(c<' ')
			{
			goto Next2;
			}
		x+=1;
		sm(t,0);//sendchar(c);
		str2[0]=(char)c;
		str2[1]='\0';
		strcat(SPACE,str2);
		if(x>75)
			{
			back=0;
			for(cn=x; cn>=0; cn--)
				{
				if(SPACE[cn-1]==' ')
					{
					back=x-cn;
					SPACE[cn-1]='\0';
					break;
					}
				}
			if(back==0)
				{
				strcpy(MsgBuf[Lines],SPACE);
				sm("",1);
				SPACE[0]='\0';
				x=0;
				break;
				}
			str[0]='\0';
			for(cn=(x-back); cn<x; cn++)
				{
				str2[0]=SPACE[cn];
				str2[1]='\0';
				strcat(str,str2);
				}
			x=strlen(str);
			strcpy(MsgBuf[Lines],SPACE);
			strcpy(SPACE,str);
			for(cn=0; cn<x; cn++)
				{
				sm("\b \b",0);
				}
			sm("",1);
			break;
			}
		}
	Lines+=1;
	if(Lines==98&&BKFlag==0)
		{
           sm("",1);
		sm("Warning two lines remaining.",1);sm("",1);
		}
	} while(BKFlag==0&&Lines<100);
if(Lines<100)
	{
	Lines-=1;
	}
else
	{
	Lines=100;
	}
sm("",1);

do
	{
      sm("",1);
	 sm("[33mA[32m)[36mbort, [33mC[32m)[36mont, [33mD[32m)[36melete,",0);sm(" [33mE[32m)[36mdit, [33mF[32m)[36mile, [33mL[32m)[36mist, [33mS[32m)[36mave Option[0m? ",0);
	 pm("",str,10);
	if(str[0]=='D'||str[0]=='d')
		{
		do
			{
			if(Lines==0)
				{
                    sm("",1);
				sm("No lines to delete.",1);
				stats=0;
				break;
				}
			sprintf(str,"[36mLine number to delete [32m[[33m1[32m..[33m%d[32m][0m? ",Lines);
               sm("",1);
			sm(str,0);
			pm("",str,5);stats=atoi(str);
			if(stats<0) { break; }
			if(str[0]=='\0') { stats=0; break; }
			sscanf(str,"%d",&stats);
			if(stats<1||stats>Lines)
				{
                    sm("",1);
				sprintf(str,"Line %d does not exist.",stats);
				sm(str,1);
				}
			} while(stats<1||stats>Lines);
		if(stats<0) { break; }
		if(stats==0) { continue; }
		sm("",1);
          sprintf(str,"%2d> %s",stats,MsgBuf[stats-1]);
		sm(str,1);sm("",1);
		sm("[36mIs this the correct line [32m([33mY[32m/[33mN[32m)[0m? ",0);
		cn=YesNo(0);
		if(cn<0) { break; }
		if(cn)
			{
			for(j=(stats-1); j<Lines; j++)
				{
				strcpy(MsgBuf[j],MsgBuf[j+1]);
				}
               sm("",1);
			sprintf(str,"Deleted line %d.",stats);
			Lines-=1;
			sm(str,1);
			}
		continue;
		}
	if(str[0]=='C'||str[0]=='c')
		{
		sm("",1);
		Lines-=1;
		if(Lines<0)
			{
			Lines=0;
			}
		strcpy(SPACE,MsgBuf[Lines]);
		BKFlag=0;
		x=strlen(SPACE);
		goto BEG_IN;
		}
	if(str[0]=='E'||str[0]=='e')
		{
		if(Lines<1)
			{
               sm("",1);
			sm("No Lines to edit!",1);
			continue;
			}
		LoopHere:
          sm("",1);
		sprintf(str,"[36mLine number to edit [32m[[33m1[32m..[33m%d[32m][0m? ",Lines);
		sm(str,0);
		pm("",str,5); stats=atoi(str);
		if(stats<0)
			{
			return(1);
			}
		if(str[0]=='\0')
			{
			continue;
			}
		sscanf(str,"%d",&x);
		if(x<1||x>Lines)
			{
               sm("",1);
			sprintf(str,"Line %d does not exist.",x);
			sm(str,1);
			goto LoopHere;
			}
          sm("",1);
		sprintf(SPACE,"%2d> %s",x,MsgBuf[x-1]);
		sm(SPACE,1);
          sm("",1);
		sm("    Old string;New string",0);sm("",1);
		sm("   (------------------------------------------------------------)",0);
		sm("",1); sm("   :",0);
		pm("",str,60); 
		if(str[0]=='\0')
			{
			continue;
			}
		stats=ProcessLine(str,MsgBuf[x-1],temp);
		if(stats==0)
			{
               sm("",1);
			sm("String not found!",1);
			continue;
			}
		else
			{
               sm("",1);
			sm("    NewLine:",1);sm("    --------",1);sm("   >",0);
			sm(temp,0);
			sm("",1);sm("",1);sm("Correct ",0);
			stats=YesNo(1);
			if(stats<0) { return(stats); }
			if(!stats)
				{
				continue;
				}
			strcpy(MsgBuf[x-1],temp);
			}
		continue;
		}
	if(str[0]=='L'||str[0]=='l')
		{
		sm("",1);
		for(j=0; j<Lines; j++)
			{
			sprintf(SPACE,"%2d> %s",j+1,MsgBuf[j]);
			sm(SPACE,1);
			}
		continue;
		}
/*
	if(str[0]=='F'||str[0]=='f')
		{
		if(User.Sec_Status>250)
			{
			for(;;)
				{
				AEPutStr("\r\nEnter path/filename to attach ('5 <DIR>'=DIR): ");
				stats=LineInput("",AttachedFile,250,KEYBOARD_TIMEOUT);
				if(stats<0)
					{
					return(stats);
					}
				if(AttachedFile[0]=='5'&&AttachedFile[1]==' ')
					{
					strcpy(MAINMENU_Li,AttachedFile);
					AttachedFile[0]='\0';
					MyDirAnyWhere();
					continue;
					}
				if(AttachedFile[0]!='\0')
					{
					BPTR fh;

					strlwr(AttachedFile);

					if(fh=Open(AttachedFile,MODE_OLDFILE))
						{
						Close(fh);
						AEPutStr("Delete file when message is deleted ");
						stats=YesNo(2);
						if(stats<0)
							{
							return(stats);
							}
						if(stats)
							{
							AttachedFile[0]=toupper(AttachedFile[0]);
							}
						}
					else
						{
						sprintf(GSTR3,"%s not found, try another.\r\n",AttachedFile);
						AEPutStr(GSTR3);
						AttachedFile[0]='\0';
						continue;
						}
					}
				break;
				}
			}
		else
			{
			AEPutStr("\r\nCommand requires higher access.\r\n");
			}
		}
*/
	if(str[0]=='S'||str[0]=='s')
		{
		//User.Messages_Posted++;
		return(0);
		}

	if(str[0]=='A'||str[0]=='a')
		{
		sm("",1);sm("Abort message entry (y/n)? ",0);
		stats=YesNo(0);
		if(stats<0)
			{
			break;
			}
		if(stats)
			{
			return(-1);
			}
		}
	} while(stats>=0);
return(stats);
}


int ProcessLine(char *pat, char *vorig, char *dest)
{
int i,i2,nff;
char rep[80],orig[100];

strcpy(orig,vorig);
for(i=0; i<=strlen(pat); i++)
	{
	if(pat[i]==';')
		{
		break;
		}
	}
if(i>=strlen(pat))
	{
	return(0);
	}
pat[i]='\0';
strcpy(rep,(char *)&pat[i+1]);

dest[0]='\0';

for(i=0; i<=(strlen(orig)-strlen(pat)); i++)
	{
	nff=1;
	if(pat[0]==orig[i])
		{
		nff=0;
		for(i2=i+1; (i2-i)<strlen(pat); i2++)
			{
			if(pat[i2-i]!=orig[i2])
				{
				nff=1;
				break;
				}
			}
		}
	if(nff!=1)
		{
		orig[i]='\0';
		strcpy(dest,orig);
		strcat(dest,rep);
		if(i2<strlen(vorig))
			{
			strcat(dest,(char *)&orig[i2]);
			}
		dest[75]='\0';
		return(1);
		}
	}
return(0);
}

int YesNo(UWORD flag)
{
int ch;
char temp[10];
if(flag)
	{
	ch=flag-1;
	sm((ch?"[32m([33my[32m/[33mN[32m)[32m?[0m ":"[32m([33mY[32m/[33mn[32m)[32m?[0m "),0);
	}

for(;;)
	{
     hotkey("",temp);ch=temp[0];
	if(ch<0) return(ch);
	if(ch=='\r'||ch=='\n')
		{
		if(flag==1)
			{
			ch='y';
			}
		if(flag==2)
			{
			ch='n';
			}
		}
	if(ch=='y'||ch=='Y')
		{
		sm("Yes",1);
		return(1);
		}
	if(ch=='n'||ch=='N')
		{
		sm("No",1);
		return(0);
		}
	}
}
void sr(char *str)
{
  register int i;
  i=strlen(str)-1;
  while(i>-1)
  {
    if(*(str+i)<=32) *(str+i)='\0'; else break;
    i--; 
  }
}

void strlim(char *str1,char *str2,int limit)
{
  register int i=0;
  if(strlen(str2)>limit)
  {
    printf("Error in line %d , setting is limited to %d characters\n",ALine,limit);
    printf(">%s\n\n",str2);
    ACPError=TRUE;
  }
  while(i<limit)
  {
    if(*(str2)=='\0') break;
    *(str1+i)=*(str2+i);
    i++;
  }
}
void CreateFile(char *str)
{
  FILE *fi;
  fi=fopen(str,"wb");
  fclose(fi);
}
int strnicmp(char *str1,char *str2,int len)
{
  register int i;
  strupr(str1);
  strupr(str2);
  i=0;
  while(i<len)
  {
    if(*(str1+i)!=*(str2+i)) return(1);
    i++;
  }
  return(0);
}
void Pause()
{
  char t[10];
sm("[32m([33mPause[32m)[34m...[32mSpace to Resume[33m:[0m",0);
        do
        {
          hk("",t);
        }
        while(t[0]!=32 && t[0]!=13 && t[0]!=12);
   sm("",1);
}
void Terminate(void)
{
  pu(OldConfName,BB_CONFNAME);
  pu(OldConfLoc,BB_CONFLOCAL);
  ShutDown();
}
void LastCommand(void)
{
  sm("",1);sm("",1);
  pu(OldConfName,BB_CONFNAME);
  pu(OldConfLoc,BB_CONFLOCAL);

}

int Allowed(void)
{
  FILE *fi;
  char image[200];
  char FileName[200];
  gu(image,DT_NAME);
  sprintf(FileName,"%sUsersAllowed",ConfLoc);
  fi=fopen(FileName,"r");
  if(fi==NULL) return(0);
  strupr(image); sr(image);
  while(fgets(FileName,80,fi)!=NULL)
  {
     sr(FileName);
     strupr(FileName);
     if(!strcmp(image,FileName))
     {
       fclose(fi); return(1);
     }
  }
  fclose(fi);
  return(0);
}