/**********************
   BBS!

  Routines:

û  1)  get baud rate and set modem to that rate.
û  2)  ask name, password.  New user info if not in database.
   3)  *** BBS STUFF. ***
û  4)  hang up modem and exit program.

  Comments:

û  1)  X00 or BNU used for comm routines (INT 14h).
û  2)  Can use block send but need character by character read.
û  3)  Need to echo all characters back to sender.
û  4)  Need echo back "*" for each character when password entry.
û  5)  Need try capitalizing names.
   6)  Still need BBS main routines.
   7)  Need to add time routines.
**********************/

#include "dos.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "io.h"
#include "fcntl.h"
#include "time.h"
#include "sys\stat.h"

struct REGPACK regs;
int baud, commport, port;
int comm = 1;
char birthdate[9];

int checkdate(void);
void send(char *);
void getit(char *);
void sendchar(char);
char receivechar(void);
int datawaiting(void);
int carrier(void);
int getstatus(void);
int initialize(void);
void deinitialize(void);
void writedate(void);
void flushsendbuffer(void);

void main(argc,argv)
int argc;
char *argv[];
{	if (argc < 2)
		baud = 0;
	else
	{	baud = atoi(argv[1]);
		if (argc > 2)
			comm = atoi(argv[2]);
	}
	commport = comm - 1;
	if (baud == 0)
		commport = 0xFF;
	port = commport;
	initialize();
GETDATE:
	send("What is your birthdate?  (MM-DD-YY)?  ");
	getit(birthdate);
	send("Thank you.  Processing date.\n");
	if (!checkdate())
	{	send("Invalid date!  Try again!\n");
		goto GETDATE;
	}
    writedate();
    flushsendbuffer();
	deinitialize();
}

int checkdate(void)
{	char datebuf[3][3];
	int dateb[3],i = 0,j = 0,k = 0;
	while((birthdate[i] != '-') && (birthdate[i] != 0))
		datebuf[j][k++] = birthdate[i++];
	datebuf[j++][k] = 0;
	k = 0;
	i++;
	while((birthdate[i] != '-') && (birthdate[i] != 0))
		datebuf[j][k++] = birthdate[i++];
	datebuf[j++][k] = 0;
	k = 0;
	i++;
	while((birthdate[i] != '-') && (birthdate[i] != 0))
		datebuf[j][k++] = birthdate[i++];
	datebuf[j++][k] = 0;
	dateb[0] = atoi(datebuf[0]);
	dateb[1] = atoi(datebuf[1]);
	dateb[2] = atoi(datebuf[2]);
	sprintf(birthdate,"%2d-%2d-%2d",dateb[0],dateb[1],dateb[2]);
	if ((dateb[0] > 0) && (dateb[0] < 13))
		if ((dateb[1] > 0) && (dateb[1] < 32))
			return(-1);
	return(0);
}

void send(char *s)
{	while (*s != 0)
	{       sendchar(*s);
		if (*s == '\n')
			sendchar('\r');
		printf("%c",*s);
		*s++;
		if (!carrier())
			exit(-1);
		if ((datawaiting()) || (kbhit()))
			goto ABORTSEND;
	}
ABORTSEND:
	;
}

void getit(char *s)
{	char buffer[80];
	int bp,c;
	bp = 0;
LOOP2:
	if (!carrier())
		exit(-1);
	if (kbhit())
	{	c = getch();
		if (c == 0)
			c = getch() + 256;
	}
	else
	{       if (datawaiting())
			c = receivechar();
		else
			goto LOOP2;
	}
	switch(c)
	{	case 8:
			if (bp > 0)
			{	send("\b \b");
				bp--;
			}
			if ((bp == 3) || (bp == 6))
			{	send("\b \b");
				bp--;
			}
			goto LOOP2;
		case 13:
			send("\n");
			buffer[bp] = 0;
			break;
		case 27:
			while (bp > 0)
			{	send("\b \b");
				bp--;
			}
			goto LOOP2;
		default:
			if ((bp == 2) || (bp == 5))
			{	buffer[bp++] = '-';
				printf("-");
				sendchar('-');
			}
			if (bp > 7)
			{	printf("\a");
				sendchar('\a');
				goto LOOP2;
			}
			if ((c < 48) || (c > 57))
				goto LOOP2;
			sendchar(c);
			printf("%c",c);
			buffer[bp++] = c;
			goto LOOP2;
	}
	strcpy(s,buffer);
}

void sendchar(char c)
{       if (baud > 0)
	{	regs.r_ax = 0x100 + c;
		regs.r_dx = port;
		intr(0x14,&regs);
	}
}

char receivechar(void)
{       char c;
	regs.r_ax = 0x200;
	regs.r_dx = port;
	intr(0x14,&regs);
	c = (regs.r_ax - ((regs.r_ax / 0x100) * 0x100));
	return(c);
}

int datawaiting(void)
{	int r;
	if (baud == 0)
		return(kbhit());
	r = getstatus() & 0x100;
	if (r == 0)
		return(r);
	return(-1);
}

int carrier(void)
{	int r;
	if (baud == 0)
		return(-1);
	r = getstatus() & 0x80;
	if (r == 0)
		return(r);
	return(-1);
}

int getstatus(void)
{       int r;
	regs.r_ax = 0x300;
	regs.r_dx = port;
	intr(0x14,&regs);
	r = regs.r_ax;
	return(r);
}

int initialize(void)
{	regs.r_ax = 0x400;
	regs.r_bx = 0;
	regs.r_dx = port;
	intr(0x14,&regs);
	if (regs.r_ax == 0x1954)
		return(-1);
	return(0);
}

void deinitialize(void)
{	regs.r_ax = 0x500;
	regs.r_dx = port;
	intr(0x14,&regs);
}

void writedate(void)
    {
        int exitinfo;
        long int off = 1080;
        if( (exitinfo = open("exitinfo.bbs", O_WRONLY|O_BINARY)) == -1)
            {
                printf("Error opening exitinfo.bbs\n");
            }
        lseek(exitinfo, off, SEEK_SET);
        write(exitinfo, "\x08", 1);
        write(exitinfo, birthdate,8);
        close(exitinfo);

    }

void flushsendbuffer(void)
    {
        regs.r_ax = 0x800;
        regs.r_dx = port;
        intr(0x14,&regs);
    }
