/*
**	termGlobal.h
**
**	Global data and symbol definitions
**
**	Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
**		All Rights Reserved
*/

#ifdef DEBUG
#include "termDebug.h"
#endif	/* DEBUG */

	/* Jump table entry. */

typedef BYTE (* __regargs JUMP)(UBYTE Char);

	/* Pointer to function returning nothing. */

typedef VOID (* VPTR)();

	/* Menu item codes. */

enum	{	MEN_SAVE_AS_PICTURE=1,MEN_SAVE_AS_TEXT,MEN_PRINT_SCREEN,MEN_PRINT_CLIP,MEN_CAPTURE_TO_FILE,
		MEN_CAPTURE_TO_PRINTER,MEN_ICONIFY,MEN_ABOUT,MEN_QUIT,

		MEN_COPY,MEN_PASTE,MEN_CLEAR,

		MEN_EXECUTE_DOS_COMMAND,MEN_EXECUTE_REXX_COMMAND,

		MEN_PHONEBOOK,MEN_REDIAL,MEN_DIAL_NUMBER,MEN_SEND_BREAK,
		MEN_HANG_UP,MEN_WAIT,MEN_FLUSH_BUFFER,MEN_RELEASE_DEVICE,

		MEN_UPLOAD_ASCII,MEN_DOWNLOAD_ASCII,MEN_UPLOAD_TEXT,MEN_DOWNLOAD_TEXT,MEN_EDIT_AND_UPLOAD_TEXT,
		MEN_UPLOAD_BINARY,MEN_DOWNLOAD_BINARY,

		MEN_CLEAR_BUFFER,MEN_DISPLAY_BUFFER,MEN_CLOSE_BUFFER,MEN_FREEZE_BUFFER,MEN_OPEN_BUFFER,
		MEN_SAVE_BUFFER_AS,

		MEN_CLEAR_SCREEN,MEN_RESET_FONT,MEN_RESET_STYLES,MEN_RESET_TERMINAL,

		MEN_SERIAL,MEN_MODEM,MEN_SCREEN,MEN_TERMINAL,MEN_SET_EMULATION,MEN_CLIPBOARD,MEN_CAPTURE,MEN_COMMANDS,
		MEN_MISC,MEN_PATH,MEN_TRANSFER_PROTOCOL,MEN_TRANSFER,MEN_TRANSLATION,MEN_MACROS,
		MEN_CURSORKEYS,MEN_FAST_MACROS,MEN_HOTKEYS,MEN_SPEECH,MEN_SOUND,MEN_SET_CONSOLE,MEN_OPEN_SETTINGS,MEN_SAVE_SETTINGS,
		MEN_SAVE_SETTINGS_AS,

		MEN_STATUS_WINDOW,MEN_REVIEW_WINDOW,MEN_PACKET_WINDOW,MEN_FAST_MACROS_WINDOW };

	/* Menu item code limit, required by the quick dial menu. */

#define DIAL_MENU_LIMIT 1000

	/* How many phone book entries will be stored in
	 * the quick dial menu.
	 */

#define DIAL_MENU_MAX	50

	/* Undefine the following symbols, the preferences header file
	 * will use the same names and the same values.
	 */

#undef PARITY_NONE
#undef PARITY_EVEN
#undef PARITY_ODD
#undef PARITY_MARK
#undef PARITY_SPACE

	/* Serial settings. */

enum	{	PARITY_NONE,PARITY_EVEN,PARITY_ODD,PARITY_MARK,PARITY_SPACE };

enum	{	HANDSHAKING_NONE,HANDSHAKING_RTSCTS,HANDSHAKING_RTSCTS_DSR };
enum	{	DUPLEX_FULL,DUPLEX_HALF };
enum	{	FLOW_NONE,FLOW_XON_XOFF };

	/* Terminal settings. */

enum	{	CR_IGNORE,CR_ASCR,CR_ASCRLF };
enum	{	LF_IGNORE,LF_ASLF,LF_ASLFCR };
enum	{	EMULATION_ANSIVT100,EMULATION_ATOMIC,EMULATION_TTY,EMULATION_EXTERNAL,EMULATION_HEX };
enum	{	COLOUR_AMIGA,COLOUR_EIGHT,COLOUR_SIXTEEN,COLOUR_MONO };

	/* Protocol types. */

enum	{	PROTOCOL_XMODEM,PROTOCOL_XMODEMCRC,PROTOCOL_YMODEM,PROTOCOL_ZMODEM };

	/* Font types. */

enum	{	FONT_STANDARD,FONT_IBM,FONT_IBM_RAW };

	/* Bell modes. */

enum	{	BELL_NONE, BELL_VISIBLE, BELL_AUDIBLE, BELL_BOTH, BELL_SYSTEM };

	/* Data flow scanner indices. */

enum	{	SCAN_NOCARRIER, SCAN_ZMODEM, SCAN_CONNECT, SCAN_VOICE, SCAN_RING, SCAN_BUSY, SCAN_NODIALTONE,
		SCAN_OK, SCAN_ERROR, SCAN_COUNT };

	/* Status types. */

enum	{	STATUS_READY,STATUS_HOLDING,STATUS_DIALING,STATUS_UPLOAD,
		STATUS_DOWNLOAD,STATUS_BREAKING,STATUS_HANGUP };

	/* Sound types. */

enum	{	SOUND_BELL,SOUND_CONNECT,SOUND_DISCONNECT,SOUND_GOODTRANSFER,
		SOUND_BADTRANSFER,SOUND_RING,SOUND_VOICE,SOUND_COUNT };

	/* Settings types. */

enum	{	PREF_ALL,PREF_SERIAL,PREF_MODEM,PREF_COMMAND,PREF_SCREEN,
		PREF_TERMINAL,PREF_PATH,PREF_MISC,PREF_CLIP,PREF_CAPTURE,
		PREF_FILE,PREF_EMULATION,PREF_TRANSFER };

	/* Status line modes. */

enum	{	STATUSLINE_DISABLED,STATUSLINE_STANDARD,STATUSLINE_COMPRESSED };

	/* Capture filter modes. */

enum	{	FILTER_NONE,FILTER_ESCAPE,FILTER_CONTROL,FILTER_BOTH };

	/* Scrolling modes. */

enum	{	SCROLL_JUMP,SCROLL_SMOOTH };

	/* Auto-capture file creation. */

enum	{	AUTOCAPTURE_DATE_NAME,AUTOCAPTURE_DATE_INCLUDE };

	/* Cursor and numeric keypad modes. */

enum	{	KEYMODE_STANDARD,KEYMODE_APPLICATION };

	/* Font scales. */

enum	{	SCALE_NORMAL,SCALE_HALF };
enum	{	SCALE_ATTR_NORMAL,SCALE_ATTR_TOP2X,SCALE_ATTR_BOT2X,SCALE_ATTR_2X };

	/* Character tables. */

enum	{	TABLE_ASCII,TABLE_GFX };

	/* Transfer types. */

enum	{	TRANSFER_BINARY,TRANSFER_TEXT,TRANSFER_ASCII };

	/* Translation table entry types. */

enum	{	TRANSLATE_SINGLE,TRANSLATE_STRING };

	/* Upload panel actions. */

enum	{	UPLOAD_TEXT=1,UPLOAD_BINARY,UPLOAD_IGNORE,UPLOAD_ABORT };

	/* Alert types. */

enum	{	ALERT_NONE,ALERT_BEEP,ALERT_SCREEN,ALERT_BEEP_SCREEN };

	/* Online time display modes. */

enum	{	ONLINETIME_TIME,ONLINETIME_COST,ONLINETIME_BOTH };

	/* Clipboard read errors. */

enum	{	CLIPERR_NONE,CLIPERR_NOTEXT,CLIPERR_IFF,CLIPERR_OPEN,CLIPERR_MEM };

	/* What to print. */

enum	{	PRINT_SCREEN,PRINT_CLIP };

	/* Dial command types. */

enum	{	DIAL_IGNORE,DIAL_LIST,DIAL_REDIAL };

	/* Errors returned by ReconfigureSerial(). */

enum	{	RECONFIGURE_FAILURE,RECONFIGURE_NOCHANGE,RECONFIGURE_SUCCESS };

	/* Operation codes for SetItem(). */

enum	{	SETITEM_SETCHECK,SETITEM_CLRCHECK,SETITEM_ON,SETITEM_OFF };

	/* File identification actions. */

enum	{	IDENTIFY_IGNORE,IDENTIFY_FILETYPE,IDENTIFY_SOURCE };

	/* Generic list types. */

enum	{	GLIST_UPLOAD,GLIST_DOWNLOAD,GLIST_DIAL,GLIST_WAIT,GLIST_COUNT };

	/* Generic list add operations. */

enum	{	ADD_GLIST_BOTTOM,ADD_GLIST_TOP,ADD_GLIST_BEHIND,ADD_GLIST_BEFORE };

	/* Transfer window boxes and gadgets. */

enum	{	BOX_TRANSFER_1,BOX_TRANSFER_2,
		BOX_TRANSFER_LEFT1,BOX_TRANSFER_RIGHT1,
		BOX_TRANSFER_LEFT2,BOX_TRANSFER_RIGHT2 };

enum	{	GAD_TRANSFER_INFORMATION_LIST,
		GAD_TRANSFER_PERCENT,GAD_TRANSFER_TIME,
		GAD_TRANSFER_ABORT,GAD_TRANSFER_SKIP };

	/* XPR options setting. */

enum	{	GAD_XPROPTIONS_USE=42,GAD_XPROPTIONS_CANCEL };

	/* AmigaGuide help context. */

enum	{	CONTEXT_MAIN,CONTEXT_SERIAL,CONTEXT_MODEM,CONTEXT_SCREEN,
		CONTEXT_TERMINAL,CONTEXT_CLIP,CONTEXT_CAPTURE,CONTEXT_COMMAND,
		CONTEXT_MISC,CONTEXT_PATHS,CONTEXT_TRANSLATION,CONTEXT_MACROS,
		CONTEXT_CURSOR,CONTEXT_FASTMACROS,CONTEXT_HOTKEYS,CONTEXT_SPEECH,
		CONTEXT_EMULATION,CONTEXT_TRANSFER,CONTEXT_PHONEBOOK,CONTEXT_DATE,
		CONTEXT_DAY,CONTEXT_IMPORT,CONTEXT_RATES,CONTEXT_TIME,
		CONTEXT_COPY,CONTEXT_PASSWORDUSER,CONTEXT_DIAL,CONTEXT_PRINT,
		CONTEXT_TEXTBUFFER,CONTEXT_PACKETWINDOW,CONTEXT_SOUND,
		CONTEXT_LIBS,CONTEXT_ASCII };

	/* Character types. */

enum	{	CHAR_VANILLA,CHAR_CURSOR,CHAR_FUNCTION,CHAR_HELP,
		CHAR_XON,CHAR_XOFF,CHAR_ENTER,CHAR_RETURN };

	/* Review window positioning codes. */

enum	{	REVIEW_MOVE_TOP,REVIEW_MOVE_BOTTOM,REVIEW_MOVE_UP,REVIEW_MOVE_DOWN };

	/* File type classes. */

enum	{	FILETYPE_NONE,FILETYPE_DIR,FILETYPE_FILE,FILETYPE_TEXT,FILETYPE_SOUND,
		FILETYPE_PICTURE,FILETYPE_PREFS,FILETYPE_ARCHIVE,
		FILETYPE_PROGRAM,

		FILETYPE_COUNT };

	/* Text pacing modes. */

enum	{	PACE_DIRECT,PACE_ECHO,PACE_ANYECHO,PACE_PROMPT,PACE_DELAY,PACE_KEYBOARD };

	/* Where to open the buffer text window. */

enum	{	BUFFER_TOP,BUFFER_END };

	/* Where to place the buffer screen horizontally. */

enum	{	SCREEN_LEFT,SCREEN_CENTRE,SCREEN_RIGHT };

	/* Some raw key codes. */

#define HELP_CODE		95
#define RAMIGA_CODE		103

#define CURSOR_UP_CODE		76
#define CURSOR_DOWN_CODE	77
#define CURSOR_RIGHT_CODE	78
#define CURSOR_LEFT_CODE	79

#define F01_CODE		80
#define F02_CODE		81
#define F03_CODE		82
#define F04_CODE		83
#define F05_CODE		84
#define F06_CODE		85
#define F07_CODE		86
#define F08_CODE		87
#define F09_CODE		88
#define F10_CODE		89

	/* A couple of useful minterms. */

#define MINTERM_ZERO		0
#define MINTERM_ONE		ABC | ABNC | ANBC | ANBNC | NABC | NABNC | NANBC | NANBNC
#define MINTERM_COPY		ABC | ABNC | NABC | NABNC
#define MINTERM_NOT_C		ABNC | ANBNC | NABNC | NANBNC
#define MINTERM_B_AND_C		ABC | NABC
#define MINTERM_NOT_B_AND_C	ANBC | NANBC
#define MINTERM_B_OR_C		ABC | ABNC | NABC | NABNC | ANBC | NANBC

	/* Printer control bits. */

#define PRINT_SERIAL	(1 << 0)
#define PRINT_MODEM	(1 << 1)
#define PRINT_SCREEN	(1 << 2)
#define PRINT_TERMINAL	(1 << 3)
#define PRINT_USERNAME	(1 << 4)
#define PRINT_COMMENT	(1 << 5)
#define PRINT_SIZE	(1 << 6)
#define PRINT_DATE	(1 << 7)
#define PRINT_BITS	(1 << 8)

	/* Day of week flags. */

#define DAY_MONDAY	(1 << 0)
#define DAY_TUESDAY	(1 << 1)
#define DAY_WEDNESDAY	(1 << 2)
#define DAY_THURSDAY	(1 << 3)
#define DAY_FRIDAY	(1 << 4)
#define DAY_SATURDAY	(1 << 5)
#define DAY_SUNDAY	(1 << 6)

	/* These signal masks will make life a bit easier. */

#define SIG_WINDOW	(1 << Window -> UserPort -> mp_SigBit)
#define SIG_SERIAL	(1 << ReadPort -> mp_SigBit)
#define SIG_PACKET	(1 << PacketWindow -> UserPort -> mp_SigBit)
#define SIG_TIMER	(1 << TimePort -> mp_SigBit)
#define SIG_REVIEW	((1 << ReviewPort -> mp_SigBit) | (1 << ReviewWindow -> UserPort -> mp_SigBit))
#define SIG_CLIP	(1 << ClipBit)
#define SIG_CHECK	(1 << CheckBit)
#define SIG_WORKBENCH	(1 << WorkbenchPort -> mp_SigBit)

#ifdef USE_AREXX
#define SIG_REXX	(1 << TermRexxPort -> mp_SigBit)
#else
#define SIG_REXX	NULL
#endif	/* USE_AREXX */

	/* Task termination and handshake signal. Note: don't try this at
	 * home kids, we are all trained professionals here!
	 */

#define SIG_KILL	SIGBREAKF_CTRL_C
#define SIG_HANDSHAKE	SIGF_SINGLE

	/* Double-buffered file server command. */

#define	SIG_COMMAND	SIGBREAKF_CTRL_D

	/* ARexx break signal. */

#define SIG_BREAK	SIGBREAKF_CTRL_D

	/* Hotkey reset command. */

#define SIG_RESET	SIGBREAKF_CTRL_D

	/* Skip dial entry. */

#define SIG_SKIP	SIGBREAKF_CTRL_D

	/* Status bell command. */

#define SIG_BELL	SIGBREAKF_CTRL_D

	/* Buffer special signals. */

#define SIG_TOFRONT	SIGBREAKF_CTRL_D
#define SIG_UPDATE	SIGBREAKF_CTRL_E
#define SIG_MOVEUP	SIGBREAKF_CTRL_F

	/* A port signal mask. */

#define PORTMASK(P)	(1 << (((struct MsgPort *)(P)) -> mp_SigBit))

	/* Replacements for CheckItem() and OnMenu()/OffMenu(). */

#define CheckItem(ID,Mode)	SetItem(ID,Mode ? SETITEM_SETCHECK : SETITEM_CLRCHECK)
#define OnItem(ID)		SetItem(ID,SETITEM_ON)
#define OffItem(ID)		SetItem(ID,SETITEM_OFF)

	/* A handy signal macro. */

#define ClrSignal(Signals)	SetSignal(0,Signals)

	/* Definitions to access the line signal setting functions supported by
	 * some IO serial boards (namely the ASDG board).
	 */

#define SIOCMD_SETCTRLLINES	(CMD_NONSTD + 7)
#define SIOB_RTSB		0
#define SIOB_DTRB		1
#define SIOB_RTSF		(1 << SIOB_RTSB)
#define SIOB_DTRF		(1 << SIOB_DTRB)

	/* Turn time of day into `compressed' format. */

#define DT_GET_TIME(Hour,Minute) ((Minute) / 10 + (Hour) * 6)

	/* Vector offsets for the TimeDate structure. */

enum	{ DT_FIRST_UNIT,DT_NEXT_UNIT };

	/* Multiply lines and columns with the current font size. */

#define MUL_X(x)		OffsetXTable[x]
#define MUL_Y(y)		OffsetYTable[y]

	/* A handy and short alias. */

#define TICK			(CHECKIT | MENUTOGGLE)

	/* For now the maximum length of a path/file name. */

#define MAX_FILENAME_LENGTH	256

	/* The maximum width of a line to be stored in the text buffer. */

#define BUFFER_LINE_MAX		255

	/* User interface definitions. */

#define SZLV_Display	1		/* Listview includes display */
#define SZLV_String	2		/* Listview includes string */

#define FOLDER_KIND	42		/* Folder selection button. */
#define FILE_KIND	43		/* File selection button. */
#define PASSWORD_KIND	44		/* Password entry string gadget. */
#define SCREEN_KIND	45		/* Screen selection button. */

#define SZ_Adjust	TAG_USER+1	/* Adjust object */
#define SZ_AutoWidth	TAG_USER+2	/* Use default width? */
#define SZ_AlignExtra	TAG_USER+3	/* Add extra space to top edge */
#define SZ_NewColumn	TAG_USER+4	/* Start new column */
#define SZ_Lines	TAG_USER+5	/* Number of lines in object */
#define SZ_Chars	TAG_USER+6	/* Number of chars (width) in object */
#define SZ_AlignLeft	TAG_USER+7	/* Align to left border */
#define SZ_AlignRight	TAG_USER+8	/* Align to right border */
#define SZ_AlignCentre	TAG_USER+9	/* Centre it */
#define SZ_AlignBottom	TAG_USER+10	/* Align to window bottom */
#define SZ_GroupCount	TAG_USER+11	/* Create a group with N objects */
#define SZ_GroupNext	TAG_USER+12	/* Skip to next position */
#define SZ_SaveX	TAG_USER+13	/* Don't touch the left edge position. */
#define SZ_SaveY	TAG_USER+14	/* Don't touch the top edge position. */
#define SZ_UseLeft	TAG_USER+15	/* Use this coordinate as left edge. */
#define SZ_UseTop	TAG_USER+16	/* Use this coordinate as top edge. */
#define SZ_UseWidth	TAG_USER+17	/* Use this gadget width. */
#define SZ_UseHeight	TAG_USER+18	/* Use this gadget height. */
#define SZ_FullWidth	TAG_USER+19	/* Use full window width for gadget. */
#define SZ_FullHeight	TAG_USER+20	/* Use full window height for gadget. */
#define SZ_SmallSpace	TAG_USER+21	/* Provide small alignment space. */
#define SZ_LeaveFolder	TAG_USER+22	/* Leave space for folder icon. */
#define SZ_PlaceLeft	TAG_USER+23	/* Place left to current object, don't modify next object position. */
#define SZ_PlaceBelow	TAG_USER+24	/* Place below current object, don't modify next object position. */
#define SZ_InterHeight	TAG_USER+25	/* Use this inter-object space. */

	/* Status gadget properties. */

#define SGA_FullWidth	(TAG_USER+42)
#define SGA_Mode	(TAG_USER+43)

	/* Sizing gadget sizes. */

#define SIZE_GADGET_WIDTH_HIGH	18
#define SIZE_GADGET_WIDTH_LOW	13

	/* Box information types. */

enum	{	BOX_LEFT,BOX_TOP,BOX_WIDTH,BOX_HEIGHT };

	/* Some windows to be opened on the main screen. */

enum	{	WINDOW_PACKET,WINDOW_STATUS,WINDOW_FILE,
		WINDOW_REVIEW,WINDOW_FAST,WINDOW_FONT,
		WINDOW_SCREEN,WINDOW_PERF,

		WINDOW_COUNT };

	/* Window alignment information. */

#define WC_ALIGNLEFT	(1<<0)
#define WC_ALIGNRIGHT	(1<<1)
#define WC_ALIGNTOP	(1<<2)
#define WC_ALIGNBOTTOM	(1<<3)
#define WC_EXPANDWIDTH	(1<<4)
#define WC_EXPANDHEIGHT	(1<<5)
#define WC_ALIGNSIDE	(1<<6)
#define WC_ALIGNBELOW	(1<<7)

	/* Window alignment data. */

struct WindowInfo
{
	UWORD	ID;
	UWORD	WindowFlags;

	LONG	Left,
		Top,
		Width,
		Height;
};

	/* Special character treatment. */

struct SpecialKey
{
	UBYTE	Key;
	BYTE	(* __regargs Routine)(VOID);
};

	/* Cursor backup data. */

struct CursorData
{
	struct TextFont		*CurrentFont;
	WORD			 CursorX,
				 CursorY;
	BYTE			 Charset;
	BYTE			 CharMode[2];
	BYTE			 Attributes;
	BYTE			 FgPen,
				 BgPen;
	UBYTE			 Style;
};

	/* File transfer information. */

struct FileTransferNode
{
	struct MinNode		 Node;
	ULONG			 Size;
	STRPTR			 Name;
};

struct FileTransferInfo
{
	struct MinList		 FileList;
	ULONG			 TotalSize;
	LONG			 TotalFiles;

	ULONG			 DoneSize;
	LONG			 DoneFiles;

	struct FileTransferNode	*CurrentFile;
	ULONG			 CurrentSize;
};

	/* Global data link. */

struct TermPort
{
	struct MsgPort		 ExecNode;

	struct Window		*TopWindow;

	struct SignalSemaphore	 OpenSemaphore;

	LONG			 ID,OpenCount,HoldIt;
	LONG			 Reserved[5];
};

	/* Buffer search support. */

struct SearchInfo
{
	UBYTE	Distance[256],
		Pattern[256];
	LONG	FoundX,
		FoundY;
	WORD	PatternWidth;
	WORD	Index;
	BOOL	Forward;
};

	/* Support for optimized scrolling routines. */

struct ScrollLineInfo
{
	UWORD			 Left,Right,Width,
				 ColourMask;
};

	/* A dial list entry. */

struct PhoneNode
{
	struct Node		 VanillaNode;

	UBYTE			 LocalName[50];

	struct PhoneEntry	*Entry;
};

	/* A Fast! macro list entry. */

struct MacroNode
{
	struct MacroNode	*mn_Succ;	/* Modeled after the default Node. */
	struct MacroNode	*mn_Pred;

	WORD			 mn_Pad;	/* Included only for Node compatibility. */

	UBYTE			*mn_Macro;	/* = ln_Name, title */
	UBYTE			*mn_Code;	/* The execution code. */
};

	/* Speech preferences. */

struct SpeechConfig
{
	WORD			Rate,
				Pitch;
	LONG			Frequency;
	BYTE			Sex,
				Volume,
				Enabled,
				Pad;
};

	/* Sound preferences */

struct SoundConfig
{
	UBYTE			BellFile[MAX_FILENAME_LENGTH],

				ConnectFile[MAX_FILENAME_LENGTH],
				DisconnectFile[MAX_FILENAME_LENGTH],

				GoodTransferFile[MAX_FILENAME_LENGTH],
				BadTransferFile[MAX_FILENAME_LENGTH],

				RingFile[MAX_FILENAME_LENGTH],
				VoiceFile[MAX_FILENAME_LENGTH];

	BYTE			Preload,
				Pad;
};

	/* Macro Preferences. */

struct MacroKeys
{
	UBYTE			Keys[4][10][256];
};

	/* Cursor key preferences. */

struct CursorKeys
{
	UBYTE			Keys[4][4][256];
};

	/* Translation table entry. */

struct TranslationEntry
{
	STRPTR			String;		/* Corresponding code string. */
	UBYTE			Type;		/* Table entry type. */
	UBYTE			Len;		/* String length if any. */
	UBYTE			Extra;		/* Saves space, don't need to allocate memory for this one. */
	UBYTE			Null;		/* Terminating null. */
};

struct TranslationHeader
{
	UBYTE			Type;		/* Table entry type. */
	UBYTE			Code;		/* Table offset. */
	UBYTE			Len;		/* Entry length. */
	UBYTE			Pad;
};

	/* Buffer translation handle. */

struct TranslationHandle
{
	STRPTR			LocalBuffer;
	LONG			LocalLen;

	STRPTR			SourceBuffer;
	LONG			SourceLen;

	STRPTR			DestinationBuffer;
	LONG			DestinationLen;

	struct TranslationEntry	**Table;
};

	/* term hotkey configuration. */

struct HotkeysOld
{
	UBYTE			termScreenToFront[256];
	UBYTE			BufferScreenToFront[256];
	UBYTE			SkipDialEntry[256];
	BYTE			CommodityPriority;
	BYTE			HotkeysEnabled;

	ULONG			Reserved[25];
};

struct Hotkeys
{
	UBYTE			termScreenToFront[256];
	UBYTE			BufferScreenToFront[256];
	UBYTE			SkipDialEntry[256];
	BYTE			CommodityPriority;
	BYTE			HotkeysEnabled;

	ULONG			Reserved[25];

	UBYTE			AbortARexx[256];
};

	/* Time/date structure. */

struct TimeDate
{
	LONG			 Count;		/* Table size. */
	WORD			 PayPerUnit[2],	/* Pay for each unit. */
				 SecPerUnit[2];	/* Number of seconds each unit lasts. */
	UBYTE			 Time,		/* The time associated with this entry. */
				 Pad;
};

	/* Time date header information. */

struct TimeDateHeader
{
	UBYTE			 Comment[22];	/* Comment for this entry. */

	BYTE			 Month,		/* Month of year or -1 -> Day = bitmapped days of week. */
				 Day;		/* Day of month or -1 -> standard settings. */
};

struct TimeDateNode
{
	struct Node		 VanillaNode;	/* Default node entry. */
	UBYTE			 Buffer[30];	/* Name buffer. */

	struct TimeDate		*Table;		/* Table of time/date entries. */

	struct TimeDateHeader	 Header;	/* Header information. */
};

struct TimeNode
{
	struct Node		 VanillaNode;	/* Default node entry. */
	UBYTE			 Name[6];	/* Name string. */
	UBYTE			 Time;		/* The time for this entry. */
};

	/* Serial settings. */

struct SerialSettings
{
	ULONG	BaudRate;		/* Baud rate. */
	ULONG	BreakLength;		/* Length of break signal in microseconds. */
	ULONG	SerialBufferSize;	/* Size of serial read/write buffer. */

	UBYTE	SerialDevice[MAX_FILENAME_LENGTH];
					/* Serial device name. */
	LONG	UnitNumber;		/* Serial device unit number. */

	BYTE	BitsPerChar;		/* Bits per character. */
	BYTE	Parity;			/* Parity check mode. */
	BYTE	StopBits;		/* Number of stop bits. */
	BYTE	HandshakingProtocol;	/* Handshaking protocol (RTS/CTS, etc.). */
	BYTE	Duplex;			/* Full- or half-duplex? */

	BYTE	xONxOFF;		/* xON/xOFF handshaking enabled? */
	BYTE	HighSpeed;		/* Radboogie? */
	BYTE	Shared;			/* Shared device access? */
	BYTE	StripBit8;		/* Strip high-order bit? */
	BYTE	CheckCarrier;		/* Track the carrier signal? */
	BYTE	PassThrough;		/* Pass xON/xOFF characters through to modem? */
	BYTE	Pad;

	ULONG	Quantum;		/* Buffer read quantum. */
};

	/* Modem settings. */

struct ModemSettings
{
	UBYTE	ModemInit[80];		/* Modem init string. */
	UBYTE 	ModemExit[80];		/* Modem exit string. */
	UBYTE 	ModemHangup[80];	/* Modem hangup string. */
	UBYTE	DialPrefix[80];		/* Dial command prefix. */
	UBYTE	DialSuffix[80];		/* Dial command suffix. */

	UBYTE	NoCarrier[16];		/* `No carrier' string. */
	UBYTE	NoDialTone[16];		/* `No dialtone' string. */
	UBYTE	Connect[16];		/* `Connect' string. */
	UBYTE	Voice[16];		/* `Voice' string. */
	UBYTE	Ring[16];		/* `Ring' string. */
	UBYTE	Busy[16];		/* `Busy' string. */

	LONG	RedialDelay;		/* Length of redial delay. */
	LONG	DialRetries;		/* Number of dial retries. */
	LONG	DialTimeout;		/* Length of dial timeout. */
	BYTE	ConnectAutoBaud;	/* Use baud rate returned by modem? */
	BYTE	DropDTR;		/* Drop the DTR signal on hangup? */
	BYTE	RedialAfterHangup;	/* Redial list after hangup? */
	BYTE	Pad;

	UBYTE	Ok[16];			/* `Ok' string. */
	UBYTE	Error[16];		/* `Error' string. */

	BYTE	NoCarrierIsBusy;	/* Treat `NO CARRIER' as `BUSY' signal? */
	BYTE	Pad1;

	WORD	ConnectLimit;				/* Connection limit. */
	UBYTE	ConnectLimitMacro[MAX_FILENAME_LENGTH];	/* Macro to be executed when limit is reached. */

	LONG	TimeToConnect;		/* Number of seconds to pass between modem picking up
					 * the line and issuing the `CONNECT' message.
					 */
};

	/* Command settings. */

struct CommandSettings
{
	UBYTE	StartupMacro[256];	/* Startup macro. */
	UBYTE	LogoffMacro[256];	/* Macro executed after carrier has dropped or hung up. */
	UBYTE	UploadMacro[256];	/* Macro to execute after a successful upload. */
	UBYTE	DownloadMacro[256];	/* Macro to execute after a successful download. */
};

	/* Screen settings. */

struct ScreenSettings
{
	ULONG	DisplayMode;			/* Screen display mode. */
	WORD	ColourMode;			/* The terminal colour mode. */
	UWORD	Colours[16];			/* Colour palette. */
	UBYTE	FontName[MAX_FILENAME_LENGTH];	/* Default user interface font. */
	WORD	FontHeight;			/* Default user interface font height. */

	BYTE	MakeScreenPublic;		/* Are we to make our screen public? */
	BYTE	ShanghaiWindows;		/* Are we to `shanghai' windows? */

	BYTE	Blinking;			/* Screen blinking enabled? */
	BYTE	FasterLayout;			/* Faster screen layout? */
	BYTE	TitleBar;			/* Is the screen title bar enabled? */
	BYTE	StatusLine;			/* Which mode is the status line in? */

	BYTE	UseWorkbench;			/* Use the Workbench screen for the terminal window? */

	UBYTE	PubScreenName[MAXPUBSCREENNAME + 1];	/* Name of public screen to open window upon. */

	BYTE	TimeMode;			/* Online time/fee display. */
	BYTE	Pad;
};

	/* Terminal settings. */

struct TerminalSettings
{
	BYTE	BellMode;				/* The bell mode. */
	BYTE	AlertMode;				/* The user alert mode. */
	BYTE	EmulationMode;				/* The terminal emulation mode. */
	BYTE	FontMode;				/* The font mode. */

	BYTE	SendCR;					/* Standard translations. */
	BYTE	SendLF;
	BYTE	ReceiveCR;
	BYTE	ReceiveLF;

	UWORD	NumColumns,				/* Size of the terminal window. */
		NumLines;

	UBYTE	KeyMapFileName[MAX_FILENAME_LENGTH];	/* Name of custom keymap file. */
	UBYTE	EmulationFileName[MAX_FILENAME_LENGTH];	/* External emulation file name. */
	UBYTE	BeepFileName[MAX_FILENAME_LENGTH];	/* Name of the custom beep sound file. */

	UBYTE	TextFontName[MAX_FILENAME_LENGTH];	/* Terminal text font name. */
	WORD	TextFontHeight;				/* Terminal text font height. */
};

	/* Path settings. */

struct PathSettings
{
	UBYTE	ASCIIUploadPath[MAX_FILENAME_LENGTH];		/* Default ASCII upload file path. */
	UBYTE	ASCIIDownloadPath[MAX_FILENAME_LENGTH];		/* Default ASCII download file path. */

	UBYTE	TextUploadPath[MAX_FILENAME_LENGTH];		/* Default text upload file path. */
	UBYTE	TextDownloadPath[MAX_FILENAME_LENGTH];		/* Default text download file path. */

	UBYTE	BinaryUploadPath[MAX_FILENAME_LENGTH];		/* Default binary data upload file path. */
	UBYTE	BinaryDownloadPath[MAX_FILENAME_LENGTH];	/* Default binary data download file path. */

	UBYTE	DefaultStorage[MAX_FILENAME_LENGTH];		/* Default configuration storage path. */

	UBYTE	Editor[MAX_FILENAME_LENGTH];			/* Text file editor to use. */

	UBYTE	HelpFile[MAX_FILENAME_LENGTH];			/* Help text file. */
};

	/* Miscellaneous settings. */

struct MiscSettings
{
	BYTE	Priority;		/* Program priority. */
	BYTE	BackupConfig;		/* Save the configuration between calls? */

	BYTE	OpenFastMacroPanel;	/* Open the fast! macro panel? */
	BYTE	ReleaseDevice;		/* Release serial device when iconified? */

	BYTE	TransferServer;		/* Enable data transfer server? */
	BYTE	EmulationServer;	/* Enable terminal emulation server? */

	BYTE	OverridePath;		/* Override the protocol transfer path? */
	BYTE	AutoUpload;		/* Enable the auto-upload panel? */
	BYTE	SetArchivedBit;		/* Set the archived bit for files sent? */
	BYTE	IdentifyFiles;		/* Try to identify files after download? */

	BYTE	TransferIcons;		/* Transfer files along with their icons? */
	BYTE	CreateIcons;		/* Create icons for files saved? */

	BYTE	SimpleIO;		/* Use simple file I/O? */
	BYTE	PerfMeter;		/* Transfer performance meter enabled? */
};

	/* Clipboard settings. */

struct ClipSettings
{
	WORD	ClipboardUnit;		/* Clipboard unit to use. */

	WORD	LineDelay,		/* Insert line delay. */
		CharDelay;		/* Insert character delay. */

	UBYTE	InsertPrefix[80];	/* Line insertion prefix. */
	UBYTE	InsertSuffix[80];	/* Line insertion suffix. */

	UBYTE	LinePrompt[256];	/* Line wait prompt. */
	WORD	SendTimeout;		/* Line send timeout. */
	UBYTE	PacingMode;		/* Text pacing mode. */
	BYTE	Pad;
};

	/* Capture and logfile settings. */

struct CaptureSettings
{
	BYTE	LogActions;				/* Create logfile? */
	BYTE	LogCall;				/* Create callinfo-compatible logfile? */
	UBYTE	LogFileName[MAX_FILENAME_LENGTH];	/* Default logfile name. */

	LONG	MaxBufferSize;				/* Maximum text buffer size. */
	BYTE	BufferEnabled;				/* Is the text buffer enabled? */

	BYTE	ConnectAutoCapture;			/* Open capture file on logon? */
	BYTE	CaptureFilterMode;			/* The capture filter mode. */
	UBYTE	CapturePath[MAX_FILENAME_LENGTH];	/* The default path for capture files. */

	UBYTE	CallLogFileName[MAX_FILENAME_LENGTH];	/* Name of the call log file. */
	UBYTE	BufferPath[MAX_FILENAME_LENGTH];	/* Text buffer save path. */

	BYTE	AutoCaptureDate;			/* Where to include the creation date? */
	BYTE	Pad;

	BYTE	OpenBufferWindow;			/* Where to open the buffer window. */
	BYTE	OpenBufferScreen;			/* Where to open the buffer screen. */

	BYTE	BufferScreenPosition;			/* Where to place the buffer screen (horizontal) */
	UBYTE	BufferWidth;				/* How long each line in the buffer should be. */

	BYTE	RememberBufferWindow;			/* Remember buffer window context? */
	BYTE	RememberBufferScreen;			/* Remember buffer screen context? */
};

	/* File settings. */

struct FileSettings
{
	UBYTE	ProtocolFileName[MAX_FILENAME_LENGTH];		/* Transfer protocol file name. */
	UBYTE	TranslationFileName[MAX_FILENAME_LENGTH];	/* Character translation file name. */
	UBYTE	MacroFileName[MAX_FILENAME_LENGTH];		/* Keyboard macro file name. */
	UBYTE	CursorFileName[MAX_FILENAME_LENGTH];		/* Cursor key file name. */
	UBYTE	FastMacroFileName[MAX_FILENAME_LENGTH];		/* Fast macro file name. */
};

	/* Emulation settings. */

struct EmulationSettings
{
	BYTE	CursorMode;		/* Are the cursor keys switched to application mode? */
	BYTE	NumericMode;		/* Is the numeric keypad switched to application mode? */

	BYTE	CursorWrap;		/* Is cursor position wrapping enabled? */
	BYTE	LineWrap;		/* Is character line wrapping enabled? */

	BYTE	InsertMode;		/* Is the character insertion mode enabled? */
	BYTE	NewLineMode;		/* Is the newline mode enabled? */

	BYTE	FontScale;		/* Which font scale is enabled? */
	BYTE	ScrollMode;		/* Is smooth scrolling enabled? */
	BYTE	DestructiveBackspace;	/* Backspace erases characters? */
	BYTE	SwapBSDelete;		/* DEL and BS keys are swapped? */
	BYTE	PrinterEnabled;		/* Printer commands enabled? */
	BYTE	CLSResetsCursor;	/* Clear screen command resets cursor position? */

	UBYTE	AnswerBack[80];		/* Answer-back message. */
};

	/* File transfer library settings. */

struct TransferSettings
{
	UBYTE	DefaultLibrary[MAX_FILENAME_LENGTH],
		ASCIIUploadLibrary[MAX_FILENAME_LENGTH],
		ASCIIDownloadLibrary[MAX_FILENAME_LENGTH],
		TextUploadLibrary[MAX_FILENAME_LENGTH],
		TextDownloadLibrary[MAX_FILENAME_LENGTH],
		BinaryUploadLibrary[MAX_FILENAME_LENGTH],
		BinaryDownloadLibrary[MAX_FILENAME_LENGTH];
	BYTE	InternalASCIIUpload,
		InternalASCIIDownload,
		QuietTransfer,
		Pad;
};

	/* The new configuration settings. */

struct Configuration
{
	struct SerialSettings		*SerialConfig;
	struct ModemSettings		*ModemConfig;
	struct ScreenSettings		*ScreenConfig;
	struct TerminalSettings		*TerminalConfig;
	struct EmulationSettings	*EmulationConfig;
	struct ClipSettings		*ClipConfig;
	struct CaptureSettings		*CaptureConfig;
	struct CommandSettings		*CommandConfig;
	struct MiscSettings		*MiscConfig;
	struct PathSettings		*PathConfig;
	struct FileSettings		*FileConfig;
	struct TransferSettings		*TransferConfig;
};

	/* Phonebook entry header. */

struct PhoneHeader
{
	UBYTE	Name[40],		/* BBS name. */
		Number[100],		/* Phone number. */
		Comment[100];		/* Comment. */

	UBYTE	UserName[100],		/* User name for this BSS. */
		Password[100];		/* Password for user name. */

	BYTE	QuickMenu;		/* This entry appears in the quick dial menu? */
	BYTE	Pad;
};

	/* A phonebook entry. */

struct PhoneEntry
{
	struct PhoneNode	*Node;

	struct MinList		 TimeDateList;

	LONG			 Count;

	struct PhoneHeader	*Header;
	struct Configuration	*Config;
};

	/* A text box for several lines of text. */

struct TextBox
{
	struct TextBox		*NextBox;		/* Next box in chain. */

	LONG			 Left,Top,		/* Position and size. */
				 Width,Height;

	LONG			 LineWidth,		/* Line width in pixels. */
				 LineHeight;		/* Line height in pixels. */

	LONG			 NumChars,		/* Number of chars per line. */
				 NumLines;		/* Number of lines. */

	STRPTR			*Title,			/* Line titles. */
				*Text;			/* Line texts. */
};

	/* Block marker structure. */

struct BlockMarker
{
		/* The object to manipulate. */

	APTR			Object;

		/* Selection and unselection routines. */

	VOID		 (* Select)(struct BlockMarker *Marker,LONG Left,LONG Top,LONG Width,LONG Height);
	VOID		 (* Unselect)(struct BlockMarker *Marker,LONG Left,LONG Top,LONG Width,LONG Height);

		/* Origin anchor point. */

	LONG			OriginX,
				OriginY;

		/* First and last selected line. */

	LONG			FirstLine,
				LastLine;

		/* First and last selected column. */

	LONG			FirstColumn,
				LastColumn;

		/* Top of display window, lines in the buffer and size of
		 * the display window.
		 */

	LONG			Top,
				Lines,
				Width,
				Height;

		/* Canvas left and top edge. */

	LONG			LeftEdge,
				TopEdge;

		/* Last mouse position. */

	LONG			LastX,
				LastY;

		/* Single character dimensions. */

	LONG			TextFontWidth,
				TextFontHeight;

		/* Plane write mask. */

	UBYTE			WriteMask;
};

	/* Global data flow <-> term interface. */

struct FlowInfo
{
	BYTE			Changed;

	BYTE			NoCarrier,
				ZModemUpload;

	BYTE			Connect,
				Voice,
				Ring,
				Busy,
				NoDialTone,
				Ok,
				Error;
};

	/* A scan sequence, somewhat similar to the FlowInfo structure. */

struct WaitNode
{
	struct Node	Node;
	LONG		Count;		/* Number of characters matched. */
};

struct DialNode
{
	struct Node		 Node;
	struct PhoneEntry	*Entry;
};

	/* A list as employed by the ARexx interface. */

struct GenericList
{
	struct MinList		 ListHeader;
	struct Node		*ListNode;
	LONG			 ListCount;
	struct SignalSemaphore	 ListSemaphore;
};

	/* Number of buffers to be used for buffered I/O. */

#define BUFFER_NUMBER		2

	/* Auxiliary structure for buffered file I/O. */

struct Buffer
{
	struct Message			 Message;			/* Vanilla message header. */

	BYTE				 SimpleIO;			/* Real simple I/O? */
	BYTE				 Pad;

	BYTE				 Read;				/* Last access has read data. */
	BYTE				 Written;			/* Last access has written data. */

	LONG				 Action;			/* Action to perform. */
	LONG				 ActionData[2];			/* Seek and the like. */
	LONG				 Result;			/* Return value. */

	BPTR				 FileHandle;			/* Dos filehandle. */

	UBYTE				*Data;				/* Data buffer. */
	LONG				 BufLength;			/* Length of data buffer. */

	LONG				 BufPosition;			/* Read/write pointer into buffer. */

	LONG				 ReadBufFull;			/* How many bytes are still to be read from the buffer? */
	LONG				 WriteBufFull;			/* How many bytes are still to be written to the buffer?*/

	LONG				 RealPosition;			/* Real position in file. */
	LONG				 Cached;			/* How many bytes in pre-load cache. */

	UBYTE				*DataBuffer[BUFFER_NUMBER];	/* The data buffers. */
	LONG				 DataLength[BUFFER_NUMBER];	/* The lengths of the data buffers. */
	WORD				 DataCount;			/* Which buffer to use. */
	BYTE				 WriteAccess;			/* TRUE if a write file handle. */
	BYTE				 LastActionFailed;		/* TRUE if last action failed -> abort actions. */

	struct Process			*Child;
	struct Process			*Caller;			/* Synchronization. */

	BPTR				 DirLock;
	struct InfoData __aligned	 InfoData;

	BYTE				 Fresh;				/* TRUE if no read/write access has taken place yet. */
	BYTE				 Used;				/* Did any access take place at all? */

	struct DateStamp		 OpenDate;			/* Date and time when file was opened. */
};

	/* xpr serial bits. */

#define ST_PARTYON	(1 << 0)
#define ST_PARTYODD	(1 << 1)
#define ST_7WIRE	(1 << 2)
#define ST_QBREAK	(1 << 3)
#define ST_RADBOOGIE	(1 << 4)
#define ST_SHARED	(1 << 5)
#define ST_EOFMODE	(1 << 6)
#define ST_XDISABLED	(1 << 7)
#define ST_PARTYMARKON	(1 << 8)
#define ST_PARTYMARK	(1 << 9)
#define ST_2BITS	(1 << 10)
#define ST_READ7	(1 << 11)
#define ST_WRITE7	(1 << 12)

	/* Miscellaneous definitions. */

#define MILLION		1000000

	/* Raster text line attributes. */

#define	ATTR_UNDERLINE	1
#define	ATTR_HIGHLIGHT	2
#define ATTR_BLINK	4
#define	ATTR_INVERSE	8

	/* Audio channels. */

#define LEFT0F  1
#define RIGHT0F  2
#define RIGHT1F  4
#define LEFT1F  8

	/* Program revision and the approriate info structure. */

struct TermInfo
{
	UWORD	Version;
	UWORD	Revision;
};

	/* termTag.asm */

extern LONG			TermVersion,
				TermRevision;

extern UBYTE			TermName[],
				TermDate[];

	/* termData.c */

extern struct ExecBase		*SysBase;
extern struct DosLibrary	*DOSBase;

extern struct IntuitionBase	*IntuitionBase;
extern struct GfxBase		*GfxBase;
extern struct RxsLib		*RexxSysBase;
extern struct LocaleBase	*LocaleBase;
extern struct Library		*GadToolsBase,
				*DiskfontBase,
				*ConsoleDevice,
				*TimerBase,
				*UtilityBase,
				*AslBase,
				*IFFParseBase,
				*CxBase,
				*IconBase,
				*LayersBase,
				*TranslatorBase,
				*WorkbenchBase,
				*AmigaGuideBase,
				*XEmulatorBase;

extern BYTE			 Kick30;

extern struct timerequest	*TimeRequest;
extern struct MsgPort		*TimePort;

extern struct IOStdReq		*ConsoleRequest;
extern struct KeyMap		*KeyMap;
extern BPTR			 KeySegment;

extern struct Screen		*Screen,
				*DefaultPubScreen;
extern struct Window		*Window;
extern LONG			 WindowWidth,
				 WindowHeight,
				 WindowLeft,
				 WindowTop;
extern struct Window		*StatusWindow;
extern struct Gadget		*StatusGadget;
extern UWORD			 StatusOffset;
extern APTR			 OldWindowPtr;
extern struct BitMap		*InterleavedBitMap;
extern struct Requester		*RequesterList;
extern UBYTE			 ScreenTitle[80];
extern UBYTE			 DepthMask;
extern LONG			 RenderPens[4],
				 MappedPens[2][32],
				 SafeTextPen;
extern struct DrawInfo		*DrawInfo;
extern LONG			 ScreenWidth,
				 ScreenHeight;
extern BYTE			 UseMasking;

extern struct BlockMarker	*WindowMarker;
extern ULONG			 ClickSecs,ClickMicros;
extern BYTE			 FirstClick,HoldClick;
extern LONG			 ClickX,ClickY;

extern struct AppWindow		*WorkbenchWindow;
extern struct MsgPort		*WorkbenchPort;

extern struct ViewPort		*VPort;
extern struct RastPort		*RPort;
extern struct Region		*ClipRegion,
				*OldRegion;
extern struct TextFont		*GFX,*CurrentFont,*UserTextFont;
extern WORD			 UserFontHeight,UserFontWidth,UserFontBase;
extern struct TTextAttr		 UserFont;
extern struct TextFont		*TextFont;
extern WORD			 TextFontHeight,TextFontWidth,TextFontBase;
extern struct TTextAttr		 TextAttr;
extern UBYTE			 TextFontName[40],UserFontName[40];
extern struct TagItem		 TagDPI[2];
extern APTR			 VisualInfo;
extern UWORD			 FontRightExtend;

extern ULONG			(* __regargs ReadAPen)(struct RastPort *RPort);
extern ULONG			(* __regargs ReadBPen)(struct RastPort *RPort);
extern ULONG			(* __regargs ReadDrMd)(struct RastPort *RPort);
extern ULONG			(* __regargs SetWrMsk)(struct RastPort *RPort,ULONG Mask);

extern UWORD			 StandardPens[];
extern UWORD			 ANSIPens[];
extern UWORD			 EGAPens[];
extern UWORD			 AtomicColours[16],
				 EGAColours[16],
				 ANSIColours[16];
extern UWORD			 DefaultColours[32],
				 BlinkColours[32],
				 NormalColours[32],
				 StandardColours[32],
				 PaletteSize;

extern LONG			*OffsetXTable,
				*OffsetYTable;

extern struct Process		*ThisProcess;
extern struct Process		*RexxProcess,
				*RexxBackgroundProcess;
extern struct MsgPort		*TermRexxPort;
extern struct Process		*StatusProcess;
extern struct Process		*BufferProcess;
extern struct WBStartup		*WBenchMsg;
extern BPTR			 WBenchLock;
extern BYTE			 ClipBit,
				 CheckBit;
extern BYTE			 InRexx;
extern WORD			 LimitCount;
extern UBYTE			 LimitMacro[MAX_FILENAME_LENGTH];

extern struct InputEvent	*FakeInputEvent;

extern struct IOExtSer		*ReadRequest;
extern struct IOExtSer		*WriteRequest;
extern struct MsgPort		*ReadPort;
extern APTR			 ReadBuffer,
				 HostReadBuffer;
extern UBYTE			*SerialMessage;
extern ULONG			 DTERate;

extern LONG			 BaudRates[],
				 NumBaudRates;

extern UBYTE			 NewDevice[MAX_FILENAME_LENGTH];
extern LONG			 NewUnit;
extern BYTE			 UseNewDevice,
				 UseNewUnit;

extern struct Catalog		*Catalog;
extern struct Locale		*Locale;

extern struct Hotkeys		 Hotkeys;
extern struct NewBroker		 NewTermBroker;

extern struct TextAttr		 DefaultFont;
extern struct TextAttr		 GFXFont;

extern UWORD __chip		 Stopwatch[(1 + 16 + 1) * 2];

extern ULONG __chip		 Crosshatch,Ghosting;

extern BYTE			 IsPrintable[256],
				 CharType[256];
extern UBYTE			 IBMConversion[256];
extern BYTE			 GfxTable[256];

extern struct SpecialKey	 SpecialKeys[13];
extern JUMP			*SpecialTable;

extern BYTE			 AbortMap[256];
extern JUMP			*AbortTable;

extern VOID			(* __regargs ConDump)(STRPTR,LONG);
extern VOID			(* __regargs ConOutput)(STRPTR,LONG);
extern VOID			(* __regargs ConProcessData)(register STRPTR,register LONG);

extern UBYTE			 SharedBuffer[512];
extern UBYTE			 ARexxCommandBuffer[256],
				 AmigaDOSCommandBuffer[256];

extern struct NewMenu		 TermMenu[];
extern struct Menu		*Menu;

extern struct TermPort		*TermPort;

extern struct Configuration	*Config,
				*PrivateConfig,
				*BackupConfig;
extern struct SpeechConfig	 SpeechConfig;
extern BYTE			 English;
extern BYTE			 Status;
extern BYTE			 Online,WasOnline;
extern ULONG			 OnlineMinutes,OnlinePlus;
extern UWORD			 PublicModes;

extern UBYTE			 LastConfig[MAX_FILENAME_LENGTH];
extern UBYTE			 DefaultPubScreenName[MAXPUBSCREENNAME + 1],
				 SomePubScreenName[MAXPUBSCREENNAME + 1];

extern struct Buffer		*FileCapture;
extern BPTR			 PrinterCapture;
extern UBYTE			 CaptureName[MAX_FILENAME_LENGTH];
extern BYTE			 StandardPrinterCapture,
				 ControllerActive;
extern LONG			 BufferFlushCount;

extern UBYTE			**BufferLines;
extern LONG			 Lines;
extern struct SignalSemaphore	*BufferSemaphore;
extern LONG			 MaxLines;
extern LONG			 BufferSpace;
extern BYTE			 BufferClosed;
extern BYTE			 BufferFrozen;

extern struct SoundConfig	 SoundConfig;
extern BYTE			 SoundChanged;

extern struct PhoneEntry	**Phonebook;
extern LONG			 PhoneSize;
extern LONG			 NumPhoneEntries;
extern UBYTE			 PhonePassword[256];
extern BYTE			 PhonePasswordUsed,
				 RebuildMenu;
extern UBYTE			 Password[100];
extern UBYTE			 UserName[100];
extern UBYTE			 GlobalPassword[256];

extern UBYTE			 CurrentBBSName[40],
				 CurrentBBSNumber[100],
				 CurrentBBSComment[100];

extern UBYTE			 LastPhone[MAX_FILENAME_LENGTH];
extern UBYTE			 LastKeys[MAX_FILENAME_LENGTH];
extern UBYTE			 LastMacros[MAX_FILENAME_LENGTH];
extern UBYTE			 LastTranslation[MAX_FILENAME_LENGTH];
extern UBYTE			 LastCursorKeys[MAX_FILENAME_LENGTH];
extern UBYTE			 LastSpeech[MAX_FILENAME_LENGTH];
extern UBYTE			 LastSound[MAX_FILENAME_LENGTH];

extern struct MacroKeys		*MacroKeys;
extern struct CursorKeys	*CursorKeys;

extern UBYTE			*StripBuffer;

extern UWORD			 LastLine,LastColumn,LastPixel;
extern BYTE			 Charset,Attributes,FgPen,BgPen;
extern WORD			 CursorX,CursorY,Top,Bottom;
extern BYTE			 UseRegion,RegionSet,InSequence,Quiet,Blocking;
extern BYTE			*TabStops;
extern UWORD			 TabStopMax;
extern BYTE			 CharMode[2];

extern BYTE			 ResetDisplay,
				 DisplayReopened,
				 FixPubScreenMode,
				 FixScreenSize,
				 Apocalypse;

extern STRPTR			 AttentionBuffers[SCAN_COUNT];
extern BYTE			 BaudPending,FullCheck,UseFlow;
extern UBYTE			 BaudBuffer[80],BaudCount;

extern struct FlowInfo		 FlowInfo;
extern STRPTR			 DataHold;
extern LONG			 DataSize;

extern BYTE			 BinaryTransfer;
extern LONG			 TransferBits;
extern VOID			(* __regargs ConTransfer)(STRPTR,LONG);

extern struct Window		*TransferWindow,
				*TransferPerfWindow;
extern struct Menu		*TransferMenu;
extern struct Gadget		*TransferGadgetArray[GAD_TRANSFER_SKIP + 1];
extern struct List		 TransferInfoList;
extern struct TextBox		*TransferBoxArray[BOX_TRANSFER_RIGHT2 + 1],
				*TransferBoxList;

extern struct FileTransferInfo	*FileTransferInfo;

extern UBYTE			*DownloadPath;
extern BYTE			 Uploading;
extern BYTE			 DidTransfer;

extern struct Library		*XProtocolBase;
extern struct XPR_IO		*XprIO;

extern UBYTE			 ProtocolOptsBuffer[256];
extern BYTE			 NewLibrary,NewOptions;
extern UBYTE			 LastXprLibrary[MAX_FILENAME_LENGTH];
extern UBYTE			 ConvNumber[30],ConvNumber10[30];
extern BYTE			 UsesZModem,SendAbort,TransferAborted,TransferFailed,TransferError;

extern UBYTE			 ZModemCancel[20];

extern LONG			 CurrentPay;
extern LONG			 PayPerUnit[2];
extern LONG			 SecPerUnit[2];
extern LONG			 WhichUnit;
extern struct PhoneEntry	*ChosenEntry;
extern BYTE			 ChosenInUse;

extern UBYTE			 WindowName[256];

extern BYTE			 WeAreBlocking;

extern struct List		*DialList;

extern BYTE			 SendStartup;

extern BYTE			 ReleaseSerial;
extern BYTE			 ResetSerial;
extern BYTE			 BatchMode;
extern BYTE			 MainTerminated,
				 IconTerminated,
				 DoIconify,
				 DoDial;
extern BYTE			 ConfigChanged,PhonebookChanged,TranslationChanged,
				 MacroChanged,CursorKeysChanged,FastMacrosChanged,
				 HotkeysChanged,SpeechChanged,BufferChanged;

extern UBYTE			 LastDownload[MAX_FILENAME_LENGTH];
extern UBYTE			 LastUpload[MAX_FILENAME_LENGTH];

extern struct Hook		 CommandHook,
				 PasswordHook;
extern BYTE			 DontActivate;

extern struct Window		*CommandWindow;
extern struct Gadget		*CommandGadget;
extern struct Gadget		*ActiveGadget;

extern struct Process		*ClipProcess;
extern struct MsgPort		*ClipPort;
extern BYTE			 ClipInput,
				 ClipXerox,
				 ClipPrefix;

extern UBYTE			 SendPrompt[256];
extern LONG			 SendPromptLen;
extern BYTE			(* __regargs SendLine)(register STRPTR,register LONG);

extern struct Window		*PacketWindow;
extern struct Gadget		*PacketGadgetArray[2];
extern struct Menu		*PacketMenu;
extern struct Gadget		*PacketGadgetList;
extern struct List		 PacketHistoryList;

extern struct NewMenu		 GetsMenu[];

extern BYTE			 Initializing,LoadColours;

extern UBYTE			*Raster,*RasterAttr;
extern LONG			 RasterWidth,RasterHeight;
extern BYTE			 Marking;
extern struct SignalSemaphore	*RasterSemaphore;
extern BYTE			 RasterEnabled;

extern struct GenericList	*GenericListTable[GLIST_COUNT];

extern ULONG			 VersionProps[2];

extern struct Window		*TopWindow;
extern struct Window		*WindowStack[5];
extern WORD			 WindowStackPtr;

extern LONG			 TermID;
extern UBYTE			 TermIDString[];
extern UBYTE			 RexxPortName[256];

extern struct List		 FastMacroList;
extern LONG			 FastMacroCount;
extern UBYTE			 LastFastMacros[MAX_FILENAME_LENGTH];
extern struct Window		*FastWindow;
extern WORD			 FastWindowLeft,
				 FastWindowTop,
				 FastWindowHeight;

extern struct List		 DoubleBufferList;
extern struct SignalSemaphore	 DoubleBufferSemaphore;

extern struct XEM_IO		*XEM_IO;
extern ULONG			 XEM_Signal;
extern struct XEmulatorHostData	 XEM_HostData;
extern UBYTE			*OptionTitle;
extern struct List		 XEM_MacroList;
extern struct XEmulatorMacroKey	*XEM_MacroKeys;
extern UBYTE			 EmulationName[40];

extern struct List		 EmptyList;

extern UWORD			 ScrollLineFirst,ScrollLineLast,
				 ScrollLineCount;
extern struct ScrollLineInfo	*ScrollLines;

extern struct MsgPort		*ReviewPort;
extern struct Window		*ReviewWindow;

extern ULONG			 BytesIn,
				 BytesOut;
extern struct DateStamp		 SessionStart;
extern struct Window		*InfoWindow;

extern LONG			 InterWidth,
				 InterHeight;

extern struct TranslationEntry	**SendTable,
				**ReceiveTable;

extern struct WindowInfo	 WindowInfoTable[];

	/* And now for something completely different... */

#include "termProtos.h"
