/*********************************************************************
 *  a terminal program that has ascii and xmodem transfer capability
 *			:ts=8
 *
 *	v2.9 ACS - See change summary.
 *	v2.8a 880331 ACS - Update title to 2.8A.
 *	v2.7 870825 ACS - See README.
 *	v2.6 870227 DBW - bug fixes for all the stuff in v2.5
 *	v2.5 870214 DBW - more additions (see readme file)
 *	v2.4 861214 DBW - lots of fixes/additions (see readme file)
 *	v2.3 861101 DBW - minor bug fixes
 *	v2.2 861012 DBW - more of the same
 *	v2.1 860915 DBW - new features (see README)
 *	     860823 DBW - Integrated and rewrote lots of code
 *	v2.0 860809 DBW	- Major release.. LOTS of changes
 *	v1.1 860720 DBW	- Switches, 80 cols, colors, bug fixes
 *	v1.0 860712 DBW	- First version released
 *
 *  use esc to abort xmodem transfer
 *
 *  written by Michael Mounier
 *  new version by Dave Wecker 860621
 ********************************************************************/

/********* major version (used for title of terminal window) *********/
#define	VERSION	"VT100 (V2.9 ACS 891003) Terminal Window"

/*********** ########  define the compiler type here ######## ********/
#define	LATTICE	0
#define MANX	1

/*  compiler directives to fetch the necessary header files */
#include <exec/types.h>
#include <exec/exec.h>
#include <intuition/intuition.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <graphics/text.h>
#include <graphics/regions.h>
#include <graphics/copper.h>
#include <graphics/gels.h>
#include <devices/serial.h>
#include <devices/keymap.h>
#include <devices/inputevent.h>
#include <devices/audio.h>
#include <hardware/blit.h>

			/* for Lattice you may have to change these with: */
#include <stdio.h>	/* #include <lattice/stdio.h> and */
#include <ctype.h>	/* #include <lattice/ctype.h>	 */

#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <devices/timer.h>

#if LATTICE
#include <stdlib.h>
#include <string.h>
#include <proto/exec.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/dos.h>
#include <proto/timer.h>
#endif

#if AREXX
#include <rexx/rxslib.h>
#include <rexx/storage.h>
#endif /* AREXX */

#if MANX
#include <functions.h>
#undef NULL
#define   NULL   ((void *)0)
#endif /* MANX */

#define INTUITION_REV 1L
#define GRAPHICS_REV  1L

/* things for xmodem send and recieve */
#define GOODREAD    0
#define TIMEOUT	    1
#define USERABORT   2
#define SECSIZ   0x80
#define TTIME_SHORT 5		/* number of seconds for short timeout */
#define TTIME_LONG  50		/* number of seconds for long  timeout */
#define TTIME_KERMIT 10		/* number of seconds for KERMIT timeout*/
#define MAXLONGPKS 1000		/* Maximum long msgpkt size */
#define BufSize  0x1080		/* Text buffer for XMODEM */
#define ERRORMAX 10		/* Max errors before abort */
#define RETRYMAX 10		/* Maximum retrys before abort */
#define SOH      1		/* Start of sector char */
#define EOT      4		/* end of transmission char */
#define ACK      6		/* acknowledge sector transmission */
#define NAK      21		/* error in transmission detected */

#define FILEMAX 6	/* number of file menu items */
#define MODEMAX 4	/* number of mode menu items */
#define EXTMAX 10	/* number of external xfer pgms allowed */
#define COMMAX 4	/* number of communication sub menus */
#define RSMAX 5		/* speed menu items */
#define PARMAX 5	/* parity items */
#define XFMAX 4		/* transfer mode items */
#define SCRIPTMAX 3	/* script menu items */
#define UTILMAX 12	/* utility menu */
#define MAXMENU 4	/* total number of menu entries */

#define MAXGADSTR 80	/* Max size of prompts and inputs */

#define FSF_REVERSE 256	/* fake font style to flag INVERSVID mode */

#define FONTNAMESIZE	40
#define FONTSUFFIX	".font"
#define MAXFONTVARLEN	34	/* 40 minus sizeof(".font") */

extern char myfontname[];

#define SERNAMESIZE	80

extern char mysername[];


/*   Structure to hold the external xfer program names and command strings */
struct ExternalXfer {
    char *dispname;		/* Display name - shown on menu */
    char *downname;		/* downcased name for cmd_short() */
    char *send;			/* Command string to use for send */
    char *receive;		/* Command string to use for receive */
    char cmdkey;		/* Command key equivalent */
};

extern struct ExternalXfer *(ExtXfer[EXTMAX]);	/* Defined in vt100.c */
extern int NumExts;				/* Number of ExtXfers */

/* things for script support */

#define GOTOLABEL   1
#define	NEXTCOMMAND 0
#define ONCOMMAND   2

#define	WAIT_TIMER  2
#define WAIT_STRING 1

/* exe_cmd return values */
#define CMDOK		0	/* Command OK				*/
#define CMDWARN		5	/* Command issued WARNING msg		*/
#define CMDNF		10	/* Command Not Found			*/
#define CMDBS		11	/* Bad State (e.g. INIT only)		*/
#define CMDFAIL		13	/* Command failed			*/

/* things for 'beep' support */
#define BEEPSIZE    10L
#define BEEPFREQ    1000L
#define COLORCLOCK  3579545L

/* things for MENUPICK support */
#define REDOFILE	1
#define REDOCOMM	2
#define REDOUTIL	4

extern struct	MsgPort *CreatePort();

extern int		CmdFromRexx;	/* Command came from the AREXX port	*/

#if AREXX
extern struct RexxMsg *CreateRexxMsg();
extern STRPTR	*CreateArgstring();
extern struct MsgPort	*FromRexxPort;	/* Port we receive AREXX msgs on	*/

#define HOSTNAMEROOT "VT100-"

/*   Indices into rexxerrmsgs[] in init.c  */

#define NORXLIB		1		/* No AREXX library		*/
#define NORXPORT	2		/* No AREXX port		*/
#define NORXMSG		3		/* Can't create AREXX message	*/
#define NOHOSTMEM	4		/* Can't get memory for HostName*/
#define HAVEVT100PORT	5		/* VT100 port already exists	*/
#define NOPORTMEM	6		/* Can't get mem for a port	*/

extern char *rexxerrmsgs[];		/* in init.c			*/
extern int makerexxport();		/* in init.c			*/

extern char		*HostName;	/* Our host port name for AREXX		*/
extern char		*ForwardPortName; /* Port to which to forward data	*/
extern int		forwarding;	/* Flag to indicate if we should fwd	*/
#endif /* AREXX */

#if MANX
extern char	*malloc(),*strcpy(),*fgets();
#endif /* MANX */

extern long	ftell();

extern int	multi;			/* flags multi file transfers */
extern int	server;
extern char     *bufr;			/* Buffer that XMODEM uses */
extern int	fd, timeout, ttime;
extern long	bytes_xferred;
extern char	MyDir[60];
extern BPTR	StartLock;
extern struct	IntuitionBase *IntuitionBase;
extern struct	GfxBase *GfxBase;
extern struct	Library *DiskfontBase;

#if AREXX
extern struct RxsLib *RexxSysBase;
#endif /* AREXX */

extern struct	TextAttr myattr;
extern struct	TextFont *myfont;
extern struct	NewScreen NewScreen;
extern struct	NewWindow NewWindow;
extern struct	NewWindow NewReqWindow;
extern struct	Screen *myscreen;
extern struct	Window *mywindow;
extern struct	Window *reqwindow;
extern struct	ViewPort *myviewport;
extern struct	RastPort *myrastport;
extern struct	IntuiMessage *NewMessage;
extern struct	Preferences  *Prefs;
extern char	InpBuf[80],UndoBuf[80],Prompt[80];
extern struct	StringInfo mystrinfo;
extern struct	Gadget     mystrgad;
extern struct	IntuiText  donetxt;
extern struct	Gadget	   mydonegad;
extern struct	IntuiText  mystrtxt;
extern struct	Requester  myrequest;
extern int	numreqs;
extern int	reqwinup;
extern struct	MenuItem FileItem[FILEMAX];
extern struct	IntuiText FileText[FILEMAX];
extern struct	MenuItem ModeItem[MODEMAX+EXTMAX];
extern struct	IntuiText ModeText[MODEMAX+EXTMAX];
extern struct	MenuItem CommItem[COMMAX];
extern struct	IntuiText CommText[COMMAX];
extern struct	MenuItem RSItem[RSMAX];
extern struct	IntuiText RSText[RSMAX];
extern struct	MenuItem ParItem[PARMAX];
extern struct	IntuiText ParText[PARMAX];
extern struct	MenuItem XFItem[XFMAX];
extern struct	IntuiText XFText[XFMAX];
extern struct	MenuItem ScriptItem[SCRIPTMAX];
extern struct	IntuiText ScriptText[SCRIPTMAX];
extern struct	MenuItem UtilItem[UTILMAX];
extern struct	IntuiText UtilText[UTILMAX];
extern struct	Menu menu[MAXMENU];
extern struct	timerequest Timer, Script_Timer;
extern struct	MsgPort *Timer_Port, *Script_Timer_Port;
extern struct	IOExtSer *Read_Request;
extern char	*rs_in;
extern struct	IOExtSer *Write_Request;
extern char	rs_out[2];
extern int	x,y,curmode;
extern int	Xsize, MINX,MAXX,Ysize,MINY,MAXY,BaseLine,top,bot,savx,savy;
extern int	savmode,nlmode,alt,savalt,a[2],sa[2];
extern int	inesc,inctrl,private,badseq,maxcol;
extern struct	IOAudio Audio_Request;
extern struct	MsgPort *Audio_Port;
extern UBYTE	*BeepWave;
extern UBYTE	Audio_AllocMap[4];
extern int	p_baud,p_screen,p_interlace,p_depth,p_buffer,p_wbcolors;
extern int	p_foreground,p_background,p_bold,p_cursor,p_lines,p_mode;
extern int	p_parity,p_volume,p_wrap,p_echo,p_keyapp,p_curapp,p_bs_del;
extern int	p_xbeep, p_xproto, p_convert,p_autochop, p_kmaxpack, p_unit;
extern int	p_fontsize, p_shared, p_mouse_up, p_mouse_down;
extern char	p_keyscript;
extern long	p_break;
extern char	*p_font, *p_device, *p_f[11],*p_F[10];
extern int	script_on;
extern int	script_wait;
extern int	doing_init;

/* vt100.c */
extern int  do_send(),do_capture();
extern void cleanup();
extern ULONG handle_menupick();
extern void setserpar(), setserbaud(), setparams(), redoutil(), redofile(),
	    redocomm();

/* init.c */
extern void InitDevs(),InitFileItems(),InitCommItems(),
	 InitScriptItems(),InitUtilItems(),InitMenu();
extern char *InitDefaults();
extern int maxrows;	/* number of scan lines available */

/* window.c */
extern	void	swap_bs_del(),req(),emits(),emit(),emitbatch(),cursorflip();
extern	int	toasc();
extern void	ScrollInfoMsg(), InfoMsgNoScroll(), InfoMsg1Line(),
		InfoMsg2Line();

/* xmodem.c */
extern	void sendchar(),sendstring(),sendbreak(),multi_xfer(),
	No_XON(),Do_XON();
extern	int  readchar(),XMODEM_Read_File(),XMODEM_Send_File();

/* remote.c */
extern	void doremote(),doindex(),doctrl(),doesc(),doerase();

/* kermit.c */
extern	int	doksend(), dokreceive();
extern	void	encode(), decode(), rpar(), spar(), saybye();

/* script.c */
extern int	script_start(), chk_script(),
		do_script_cmd();
extern char	*next_wrd(), *tostring();
extern int	exit_script(), do_ext();

		/* init commands */
extern int	cmd_bkg(), cmd_bold(), cmd_buf(), cmd_cursor(), cmd_depth(),
		cmd_device(), cmd_display(), cmd_fore(), cmd_font(),
		cmd_fonts(), cmd_inter(), cmd_lines(), cmd_screen(),
		cmd_unit(), cmd_volume(), cmd_wb(), cmd_null(),

		/* script commands */
		cmd_as(), cmd_beep(), cmd_cap(), cmd_cd(), cmd_delay(),
		cmd_goto(), cmd_goto(), cmd_kb(), cmd_kg(), cmd_kr(),
		cmd_ks(), cmd_msg(), cmd_on(), cmd_recf(), cmd_sb(),
		cmd_send(), cmd_sendf(), cmd_wait(), cmd_xr(), cmd_xs(),

		/* init and script commands */
		cmd_ac(), cmd_appcur(), cmd_baud(), cmd_bt(), cmd_conv(),
		cmd_echo(), cmd_exit(), cmd_ext(), cmd_fnc(), cmd_key(),
		cmd_kmode(), cmd_kmaxpk(), cmd_mode(), cmd_mouse(),
		cmd_numkey(), cmd_parity(), cmd_share(), cmd_short(),
		cmd_swap(), cmd_wrap(), cmd_xbeep(), cmd_xproto();

		/* rexx-only commands */
extern int	cmd_rx(), cmd_fwd();

/* expand.c */
extern char **expand();
extern void set_dir(), free_expand();
