/*	talk.c by Juha 11-Feb-92
	wrap bug fixed 02-Mar-92 */

#include <proto/dos.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>

#include "/lib/misc.h"

#define LEN 100
#define CON 0
#define TTY 1
#define ANSI "\033["
#define SCRCLR ANSI"1;1H"ANSI"J"

char	User[LEN]="",
		Realname[LEN]="",
		del[4]="\b \b",
		jono1[LEN],
		jono2[LEN];
int		console,
		index1=0,
		index2=0,
		caller,
		rows,
		done=0,p,
		laststream=0,
		console_x=1,		console_console_y=1,
							console_caller_y=1,
		caller_x=1,			caller_console_y=1,
							caller_caller_y=1;

void __regargs __chkabort(void);
void __regargs __chkabort(void){}
void chkabort(void);
/* int CXBRK() {return 0;} */


void putstring(unsigned char c, int stream, BOOL clearnext);
void updateall(void);
void movecursor(int x, int y, int stream);
void tavuta(int stream);

void putstring(unsigned char c, int stream, BOOL clearnext)
{	int i;

	if(stream==console)
	{	if(laststream!=console)
		{	movecursor(console_x,console_console_y,console);
			movecursor(console_x,console_caller_y,caller);
			laststream=console;
		}

		if(c==13 || c==10)
		{	console_x=console_x=1;
			if(++console_console_y>9)	console_console_y=1;
			if(++console_caller_y>rows)	console_caller_y=rows/2+1;
			laststream=c=index1=0;
			if(clearnext)
			{	i=console_console_y;
				if(++i>9) i=1;
				movecursor(0,i,console);
				i=console_caller_y;
				if(++i>rows) i=rows/2+1;
				movecursor(0,i,caller);
			}
		}
		if(c==1)
		{	for(i=0;i<p;i++)
				putstring(10,console,FALSE);
		}
		if(c==9)
		{	for(i=0;i<4;i++)
				putstring(32,console,TRUE);
			c=laststream=0;
		}
		if(c==8 || c==127)
		{	if(--console_x<1)
				console_x=1;
			else
			{	Write(console,&del[0],3);
				Write(caller,&del[0],3);
				index1--;
			}
			c=0;
		}
		if(c==3)
		{	done=1;
			c=0;
		}
		if(laststream!=console)
		{	movecursor(console_x,console_console_y,console);
			movecursor(console_x,console_caller_y,caller);
			laststream=console;
		}
		if(c)
		{	Write(console,&c,1);
			Write(caller,&c,1);
			jono1[index1++]=c;
			if(++console_x>75)
			{	laststream=0;
				tavuta(console);
			}
		}

	}
	else
	{	if(laststream!=caller)
		{	movecursor(caller_x,caller_console_y,console);
			movecursor(caller_x,caller_caller_y,caller);
			laststream=caller;
		}
		if(c==13 || c==10)
		{	caller_x=caller_x=1;
			if(++caller_console_y>20)	caller_console_y=11;
			if(++caller_caller_y>rows/2-1)	caller_caller_y=1;
			laststream=c=index2=0;
			if(clearnext)
			{	i=caller_console_y;
				if(++i>20) i=11;
				movecursor(0,i,console);
				i=caller_caller_y;
				if(++i>rows/2-1) i=1;
				movecursor(0,i,caller);
			}
		}
		if(c==9)
		{	for(i=0;i<4;i++)
				putstring(32,caller,TRUE);
			c=laststream=0;
		}
		if(c==1)
		{	for(i=0;i<p;i++)
				putstring(10,caller,FALSE);
		}
		if(c==8 || c==127)
		{	if(--caller_x<1)
				caller_x=1;
			else
			{	Write(console,&del[0],3);
				Write(caller,&del[0],3);
				index2--;
			}
			c=0;
		}
		if(laststream!=caller)
		{	movecursor(caller_x,caller_console_y,console);
			movecursor(caller_x,caller_caller_y,caller);
			laststream=caller;
		}
		if(c==3)
		{	done=1;
			c=0;
		}
		if(c)
		{	Write(console,&c,1);
			Write(caller,&c,1);
			jono2[index2++]=c;
			if(++caller_x>75)
			{	laststream=0;
				tavuta(caller);
			}
		}
	}
}


void tavuta(int stream)
{	int 	len,i;
	BOOL	done=FALSE,wrap=TRUE;

	if(stream==console)
	{	len=index1;
		while(!done)
		{	if(	jono1[len]=='.' ||
				jono1[len]==' ' ||
				jono1[len]=='!' ||
				jono1[len]=='?' ||
				jono1[len]==',' ||
				jono1[len]==';' ||
				jono1[len]==':')
				done=TRUE;
			
			if(!done)
			{	len--;
				if(len<=0 || index1-len>15)
				{	done=TRUE;
					wrap=FALSE;
				}	
			}
		}
		if(wrap)
		{	for(i=0;i<(index1-len-1);i++)
			{	Write(console,&del[0],3);
				Write(caller,&del[0],3);
			}
			i=index1;
			putstring(10,console,TRUE);	
			Write(console,&jono1[len+1],i-len-1);
			Write(caller,&jono1[len+1],i-len-1);
			strcpy(jono1,jono1+len+1);
			index1=i-len-1;
			console_x=index1+1;
		}
		else
		{	putstring(10,console,TRUE);
			index1=0;
			console_x=1;
		}	

	}
	else
	{	len=index2;
		while(!done)
		{	if(	jono2[len]=='.' ||
				jono2[len]==' ' ||
				jono2[len]=='!' ||
				jono2[len]=='?' ||
				jono2[len]==',' ||
				jono2[len]==';' ||
				jono2[len]==':')
				done=TRUE;
			
			if(!done)
			{	len--;
				if(len<=0 || index2-len>15)
				{	done=TRUE;
					wrap=FALSE;
				}	
			}
		}
		if(wrap)
		{	for(i=0;i<(index2-len-1);i++)
			{	Write(console,&del[0],3);
				Write(caller,&del[0],3);
			}
			i=index2;
			putstring(10,caller,TRUE);	
			Write(console,&jono2[len+1],i-len-1);
			Write(caller,&jono2[len+1],i-len-1);
			strcpy(jono2,jono2+len+1);
			index2=i-len-1;
			caller_x=index2+1;
		}
		else
		{	putstring(10,caller,TRUE);
			index2=0;
			caller_x=1;
		}	

	}
}



void movecursor(int x, int y, int stream)
{	char temp[40];
	

	sprintf(temp,ANSI"%d;%dH"ANSI"K",y,x);
	Write(stream,temp,strlen(temp));
}

void updateall(void)
{	char *rivi=ANSI"7m *** AX-Talk v1.2 --- ^C to quit  ^A to clear screen *************************"ANSI"0m";

	Write(caller,SCRCLR,strlen(SCRCLR));
	Write(console,SCRCLR,strlen(SCRCLR));
	movecursor(1,rows/2,caller);
	movecursor(1,10,console);
	Write(caller,rivi,strlen(rivi));
	Write(console,rivi,strlen(rivi));
}

void main(int argc, char *argv[])
{	unsigned char	temp[80],c;

	caller=Input();
	if(who(COM_GET,NULL,"user",User))
		strcpy(User,"user-variable not set");

	who(COM_GET,NULL,"rows",temp);

	rows=atoi(temp);
	if(!rows)
		rows=24;

	console_caller_y=rows/2+1;
	caller_console_y=11;
	p=(11>(rows/2)) ? 11:(rows/2);

	sprintf(temp,"raw:0/22/668/208/%s",User);
	if ((console=Open(temp,MODE_NEWFILE))!=-1)
	{	updateall();

		while(!done)
		{	if (WaitForChar(caller,4000))
			{	Read(caller,&c,1);
				if(c==27)	c=0;
				if(c)
					putstring(c,caller,TRUE);
			}
			if (WaitForChar(console,4000))
			{	Read(console,&c,1);
				if(c==27) c=0;
				if(c)
					putstring(c,console,TRUE);
			}
		}
		Close(console);
		sprintf(temp,ANSI"%d;1H\nEnd of consoletalk\n\n",rows);
		Write(caller,temp,strlen(temp));
	}
}
