#include "bbs.h"

extern int CHATF, ChatSerFlag,ChatConFlag;
//extern UBYTE GUB1;
extern UBYTE serin[],conin[];
int BypassCSI=0;
int XIMPort=0;

//int CheckSerCSI(void);   remove from console.c

static int readser(ULONG wait)
{
 UBYTE gub1;

 if(SEROUT) {
	    SetTimer(wait,0L); /* wait for n seconds */
	    while(TRUE)	{
		    Wait( SerCharSig | TimerSig);
		    if(CheckSer()) {
			    AbortIO(TimerMsg);
			    WaitIO(TimerMsg);
			    WaitIO(ReadSerReq);
			    gub1 = (int)serin[0];
			    SendIO(ReadSerReq);
			    return((int)gub1);
		    }
		    if(CheckIO(TimerMsg)) {
			    WaitIO(TimerMsg);
			    return(TIMEOUT);
		    }
		}
	}
 return(SUCCESS);
}

static int CheckSerCSI(void)
{
 extern UBYTE NumHistItems,WhichHist;
 extern long DoHistory,LineHasChanged;
 extern int  HistorySelect;

 int ch;

 ch=readser(3L);
 if(ch=='[')	{
	    ch=readser(3L);
	    if((!DoHistory)||NumHistItems==0)
         {
           if((ch>='A' )&&(ch<'E')&&!RawArrow)	return(FALSE);
         }
	    if(ch=='A') {
          if(RawArrow) return(UPARROW);
		    HistorySelect--;
		    if(HistorySelect<0)	{
			    if(NumHistItems==MAXHIST)	HistorySelect=MAXHIST-1;
			    else {
				    HistorySelect=0;
				    if(LineHasChanged)	{
					    LineHasChanged=0;
					    return(HISTORY);
				    }
				    return(FAILURE);
			    }
		    }
		    return(HISTORY);
	    }

	    if(ch=='B')	{
 if(RawArrow) return(DOWNARROW);
	
		    HistorySelect++;
		    if(NumHistItems!=MAXHIST) {
			    if(HistorySelect>=WhichHist) {
				    HistorySelect--;
				    if(LineHasChanged)	{
					    LineHasChanged=0;
					    return(HISTORY);
				    }
				    return(FAILURE);
			    }
		    } else {
			    if(HistorySelect>=MAXHIST)		HistorySelect=0;
		    }
		    return(HISTORY);
	    }
if(ch=='C'||ch=='D')
	{
       if(RawArrow)
       {
         if(ch=='C')return(LEFTARROW);
         return(RIGHTARROW);
       }
	return(FALSE);
	}

	}
return(FALSE);
}
int ReadChar(ULONG wait)
{
int ch,flag;
long sig;
BOOL SERVERCMD;
//char hex[8];

flag=0;
if((long)wait>70L)
	{
	flag=1;
	wait=wait-60L;
	}

ChatConFlag=0;
ChatSerFlag=0;
SetTimer((long)wait,0L);
FOREVER
	{
	if(KEYIN)
		{
		if(SEROUT)
			{
			sig=Wait(SerCharSig | ConCharSig | TimerSig | IconifySig | RexxSig | DoorSig);
			}
		else
			{
			sig=Wait(ConCharSig | TimerSig | IconifySig | RexxSig | DoorSig);
			}
		}
	else
		{
		if(SEROUT)
               {
               sig=Wait(SerCharSig | TimerSig | IconifySig | DoorSig | RexxSig);
			}
		else
			{
			sig=Wait(TimerSig | IconifySig | DoorSig | RexxSig);
			}
		}
OneMin:
    if(Whence_The_Logon==REMOTE_LOGON)
		{
		GI1=CheckCarrier();
		if(GI1==FALSE)
			{
			AbortIO(TimerMsg);
			WaitIO(TimerMsg);
			return(NO_CARRIER);
			}
		}
        if(CheckSer())
		{
          XIMPort=SERIAL_PORT;
		AbortIO(TimerMsg);
		WaitIO(TimerMsg);
		WaitIO(ReadSerReq);
		ch = (int)serin[0];
		SendIO(ReadSerReq);
		if(IO_Flags[IOFLAG_SER_IN]>0)
			{
			ChatSerFlag=1;
			if(ch == 27)
				{
                    if(BypassCSI) return(ch);
				GI1=CheckSerCSI();
                    switch(GI1)
                    {
                         case HISTORY:
                              return(HISTORY);
                         case LEFTARROW:
                         case RIGHTARROW:
                         case UPARROW:
                         case DOWNARROW:
                              return(GI1);
                    }
				SetTimer(wait,0L);
				goto OneMin;//goto OneMin;
				}
	
			return(ch);
			}
		else
			{
			if(Whence_The_Logon!=REMOTE_LOGON)
				{
PurgeLine();
				return(0);
				}
			SetTimer(wait,0L);
			flag=1;
			goto OneMin;
			}
		}
		if(CheckCon())
			{
               XIMPort=CONSOLE_PORT;
			AbortIO(TimerMsg);
			WaitIO(TimerMsg);
			WaitIO(ReadConReq);
			ch = (int)conin[0];
			SendIO(ReadConReq);
			if(ch == CSI)
				{
                    if(BypassCSI) return(ch);
				GI1=CheckCSI();
				switch(GI1)
					{
					case HISTORY:
						return(HISTORY);
					case NO_CARRIER:
						return(GI1);
					case EXITCHAT:
						return(0);
					case 1:
						if(CHATF==1)
							{
							return(13);
							}
						return(0);
						break;
					case 0:
						if(wait==1)
							{
							return(0);
							}
						break;
                         case LEFTARROW:
                         case RIGHTARROW:
                         case UPARROW:
                         case DOWNARROW:
                              return(GI1);
					}
				SetTimer(wait,0L);
				goto OneMin;
				}
			ChatConFlag=1;
			return(ch);
			}

	
	if(CheckIO(TimerMsg))
		{
		WaitIO(TimerMsg);
		if(flag==1)
			{
			if(!Sopt->Toggles[4])SendChar('\07');
			wait=60L;
			SetTimer(wait,0L);
			if(!Sopt->Toggles[4]) flag=0; 
               goto OneMin; 

			}
		return(TIMEOUT);
		}
    
     SERVERCMD=CheckDoorMsg(1);
     if(SERVERCMD)
		{
		  AbortIO(TimerMsg);
		  WaitIO(TimerMsg);
           if(ServerCmd)
           {
              switch(ServerCmd)
              {
                    case SV_CHAT:
                    CHATF=1;
				ChatFlag=!ChatFlag;
				if(ChatFlag==0) { return(0); }
                    SetEnvStat(ENV_CHAT);
				if(Chat()==NO_CARRIER)
					{
					return(NO_CARRIER);
					}
                    
                    break;
              }
              ServerCmd=0;
            }
		  ch = (int)serverin[0];
		  if(ch == CSI)
			{
			GI1=CheckCSI();
			switch(GI1)
				{
				case HISTORY:
					return(HISTORY);
				case NO_CARRIER:
					return(GI1);
				case EXITCHAT:
					return(0);
				case 1:
					if(CHATF==1)
						{
						return(13);
						}
					return(0);
					break;
				case 0:
					if(wait==1)
						{
						return(0);
						}
					break;
                         case LEFTARROW:
                         case RIGHTARROW:
                         case UPARROW:
                         case DOWNARROW:
                              return(GI1);
				}
			SetTimer(wait,0L);
			goto OneMin;
			}
		ChatConFlag=1;
		return(ch);
			
		}
     
	CheckIconifyMsg(); 
	CheckRexxMessage();
        
        
	}
return(SUCCESS);
}
int ReadExtChar(ULONG wait,ULONG mysig)
{
int ch,flag;
long sig;
BOOL SERVERCMD;
//char hex[8];

flag=0;
if((long)wait>70L)
	{
	flag=1;
	wait=wait-60L;
	}

ChatConFlag=0;
ChatSerFlag=0;
SetTimer((long)wait,0L);
FOREVER
	{
	if(KEYIN)
		{
		if(SEROUT)
			{
			sig=Wait(SerCharSig | ConCharSig | TimerSig | IconifySig | RexxSig | DoorSig | mysig);
			}
		else
			{
			sig=Wait(ConCharSig | TimerSig | IconifySig | RexxSig | DoorSig | mysig);
			}
		}
	else
		{
		if(SEROUT)
               {
               sig=Wait(SerCharSig | TimerSig | IconifySig | DoorSig | RexxSig | mysig);
			}
		else
			{
			sig=Wait(TimerSig | IconifySig | DoorSig | RexxSig | mysig);
			}
		}
          if(sig&mysig) { SetTimer(wait,0L); return(0);}
OneMin:
    if(Whence_The_Logon==REMOTE_LOGON)
		{
		GI1=CheckCarrier();
		if(GI1==FALSE)
			{
			AbortIO(TimerMsg);
			WaitIO(TimerMsg);
			return(NO_CARRIER);
			}
		}
        if(CheckSer())
		{
		AbortIO(TimerMsg);
		WaitIO(TimerMsg);
		WaitIO(ReadSerReq);
		ch = (int)serin[0];
		SendIO(ReadSerReq);
		if(IO_Flags[IOFLAG_SER_IN]>0)
			{
			ChatSerFlag=1;
			if(ch == 27)
				{
				if((GI1=CheckSerCSI())==HISTORY)
					{
					return(HISTORY);
					}
                    switch(GI1)
                    {
                         case LEFTARROW:
                         case RIGHTARROW:
                         case UPARROW:
                         case DOWNARROW:
                              return(GI1);
                    }
				SetTimer(wait,0L);
				goto OneMin;//goto OneMin;
				}
	
			return(ch);
			}
		else
			{
			if(Whence_The_Logon!=REMOTE_LOGON)
				{
PurgeLine();
				return(0);
				}
			SetTimer(wait,0L);
			flag=1;
			goto OneMin;
			}
		}
		if(CheckCon())
			{
			AbortIO(TimerMsg);
			WaitIO(TimerMsg);
			WaitIO(ReadConReq);
			ch = (int)conin[0];
			SendIO(ReadConReq);
			if(ch == CSI)
				{
				GI1=CheckCSI();
				switch(GI1)
					{
					case HISTORY:
						return(HISTORY);
					case NO_CARRIER:
						return(GI1);
					case EXITCHAT:
						return(0);
					case 1:
						if(CHATF==1)
							{
							return(13);
							}
						return(0);
						break;
					case 0:
						if(wait==1)
							{
							return(0);
							}
						break;
                         case LEFTARROW:
                         case RIGHTARROW:
                         case UPARROW:
                         case DOWNARROW:
                              return(GI1);
					}
				SetTimer(wait,0L);
				goto OneMin;
				}
			ChatConFlag=1;
			return(ch);
			}

	
	if(CheckIO(TimerMsg))
		{
		WaitIO(TimerMsg);
		if(flag==1)
			{
			if(!Sopt->Toggles[4])SendChar('\07');
			wait=60L;
			SetTimer(wait,0L);
			if(!Sopt->Toggles[4])flag=0;
			goto OneMin;
			}
		return(TIMEOUT);
		}
     SERVERCMD=CheckDoorMsg(1);
     if(SERVERCMD)
		{
		  AbortIO(TimerMsg);
		  WaitIO(TimerMsg);
           if(ServerCmd)
           {
              switch(ServerCmd)
              {
                    case SV_CHAT:
                    CHATF=1;
				ChatFlag=!ChatFlag;
				if(ChatFlag==0) { return(0); }
                    SetEnvStat(ENV_CHAT);
				if(Chat()==NO_CARRIER)
					{
					return(NO_CARRIER);
					}
                    
                    break;
              }
              ServerCmd=0;
            }
		  ch = (int)serverin[0];
		  if(ch == CSI)
			{
			GI1=CheckCSI();
			switch(GI1)
				{
				case HISTORY:
					return(HISTORY);
				case NO_CARRIER:
					return(GI1);
				case EXITCHAT:
					return(0);
				case 1:
					if(CHATF==1)
						{
						return(13);
						}
					return(0);
					break;
				case 0:
					if(wait==1)
						{
						return(0);
						}
					break;
                         case LEFTARROW:
                         case RIGHTARROW:
                         case UPARROW:
                         case DOWNARROW:
                              return(GI1);
				}
			SetTimer(wait,0L);
			goto OneMin;
			}
		ChatConFlag=1;
		return(ch);
			
		}
	CheckIconifyMsg(); 
	CheckRexxMessage();
        
        
	}
return(SUCCESS);
}