Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

485 lines
16 KiB

/* File: D:\WACKER\emu\emu.hh (Created: 08-Dec-1993)
*
* Copyright 1994 by Hilgraeve Inc. -- Monroe, MI
* All rights reserved
*
* $Revision: 1.63 $
* $Date: 1995/03/17 17:33:32 $
*/
typedef struct stEmuInternal *HHEMU;
// Maximum column definitions.
// They're one more than zero base maximums. Lines won't
// wrap until next char is displayed.
//
#define VT_MAXCOL_80MODE 79
#define VT_MAXCOL_132MODE 131
// Define terminal modes using ANSI terminology.
//
#define SET TRUE
#define RESET FALSE
// Character constants.
//
#define SOH 001
#define STX 002
#define ETX 003
#define EOT 004
#define ENQ 005
#define ACK 006
#define BELL 007
#define BS 010
#define LF 012
#define FF 014
#define RET 015
#define DLE 020
#define DC3 023
#define NAK 025
#define CAN 030
#define ESC 033
#define DEL 177
#define IND 204
#define SS3 217
#define CSI 233
// Definitions for double high, double wide character processing.
//
#define NO_LINE_ATTR 0
#define DBL_WIDE_HI 1
#define DBL_WIDE_LO 2
#define DBL_WIDE_SINGLE_HEIGHT 3
#define MAX_STATE 35 /* Maximum states in FSA */
#define MAX_TRANSITION 200 /* Maximum state-to-state transitions */
#define MAX_NUM_PARAM 10 /* Max # numeric parameters in one cmd */
#define MAX_SELECTOR 10 /* Max # selectors in one terminal command */
#define NEW_STATE 255 /* Special marker to indicate new state */
#define CS_STATE 0
#define CSCLEAR_STATE 1
#define EMU_BLANK_LINE (-1)
#define EMU_BLANK_CHAR TEXT('\x20')
// Key table definitions.
//
#define VK_BACKSPACE (VK_BACK | VIRTUAL_KEY)
#define DELETE_KEY (VK_DELETE | VIRTUAL_KEY)
#define DELETE_KEY_EXT (VK_DELETE | VIRTUAL_KEY | EXTENDED_KEY)
/* -------------- Key Table Transalation ------------- */
typedef struct
{
int key;
int fPointer; // TRUE means we use the CHAR * portion of the union.
int uLen; // length of stored keystring.
union
{
TCHAR achKeyStr[sizeof(LPTSTR)]; // want real chars here.
TCHAR *pachKeyStr; // want real chars here.
} u;
} KEY;
typedef KEY * PSTKEY;
typedef struct
{
int iMaxKeys;
PSTKEY pstKeys;
} KEYTABLE;
typedef KEYTABLE * PSTKEYTABLE;
typedef struct KeyTblStorage
{
int KeyCode;
TCHAR achKeyStr[15];
} KEYTBLSTORAGE;
typedef struct emuNameTable
{
TCHAR acName[EMU_MAX_NAMELEN];
int nEmuId;
} STEMUNAMETABLE;
typedef STEMUNAMETABLE * PSTEMUNAMETABLE;
/* Define the Finite State Automaton (FSA) which parses commands.
* There is an array of states which points into an array of transitions
* from that state.
*/
struct state_entry
{
struct trans_entry *first_trans; /* Pointer into transition array */
int number_trans; /* Number of paths out of state */
};
struct trans_entry
{
int next_state; /* Next state after match */
ECHAR lochar, hichar; /* Match range of input chars */
void (*funct_ptr)(const HHEMU hhEmu); /* Pointer to function */
};
// The internal Emulator Handle
//
struct stEmuInternal
{
CRITICAL_SECTION csEmu; // Used to synchronize access
void *pvPrivate;
HSESSION hSession; // Session hdl that created this.
HPRINT hPrintEcho, // Print hdl for Printer Echo.
hPrintHost; // Print hdl for Host directed printing.
TCHAR acAnswerback[21];
PSTEMUNAMETABLE pstNameTable;
int nEmuLoaded, // Identifies the emulator that is
// currently loaded. Use in emuLoad
// to determine if requested emulator
// is already loaded.
iCurType, // cursor type
fWasConnected; // used with auto attempts
STEMUSET stUserSettings; // These structures are used to hold the
// settings made by the user. They are
// initilaized from values storred in
// the session file.
// Variables for state table processing.
//
struct state_entry state_tbl[MAX_STATE];
struct trans_entry trans_tbl[MAX_TRANSITION];
int state, /* State table state */
num_param[MAX_NUM_PARAM], /* Numeric valued parameters */
num_param_cnt, /* Number of parameters */
selector[MAX_SELECTOR], /* (Hex) option selectors */
selector_cnt; /* Number of selectors */
ECHAR emu_code, /* current character to process */
emu_highchar; /* highest CHAR to bypass state table */
// Keyboard processing tables and variables.
//
KEYTABLE stEmuKeyTbl, /* the dreaded keytable */
stEmuKeyTbl2, /* modal keytable */
stEmuKeyTbl3, /* modal keytable */
stEmuKeyTbl4; /* modal keytable */
// Character attribute state information.
//
int iCurAttrState;
STATTR attrState[2];
// Virtual image variables
//
int emu_maxrow, /* maximum virtual row of emulator */
emu_maxcol, /* maximum virtual column of emualtor */
emu_currow, /* emulator's cursor row */
emu_curcol, /* emulator's cursor column */
emu_imgtop, /* line in image array of screen row 0 */
emu_imgrow, /* line in image array of cursor */
top_margin,
bottom_margin,
scr_scrollcnt; /* Keeps track of screen scrolls */
// Is the loaded emulator DBCS Enabled
int fDBCSSupported; /* Emulator is DBCS Enabled True\False. */
// JFH:2/22/95 TCHAR dspchar[256]; /* Character display map */
ECHAR dspchar[256]; /* Character display map */
int tab_stop[MAX_EMUCOLS + 1],
print_echo;
// Pointers to text, attribute and end of line arrays.
//
ECHAR *(*emu_apText);
PSTATTR *emu_apAttr;
int *emu_aiEnd;
// Character attribute variables.
//
STATTR emu_clearattr, /* current CHAR attribute for clearing */
emu_clearattr_sav, /* Used for HA/Win - mrw */
emu_charattr; /* current physical character attribute */
// Emulator mode variables
//
int mode_KAM, /* Keyboard Action Mode. RESET=enabled */
mode_IRM, /* Insertion-Replacement. RESET=replace chars */
mode_VEM, /* Vertical Editing. RESET=ins/del lines below cursor */
mode_HEM, /* Horizontal Editing. RESET=ins/del chars after cursor */
mode_SRM, /* Send-Receive. RESET=local character echo */
mode_AWM, /* AutoWrap (not ANSI). RESET=wrap to next line */
mode_LNM, /* Line feed New line. RESET=LF moves vertically only */
mode_DECCKM, /* cursor key codes. RESET=cursor, SET=application */
mode_DECKPAM, /* keypad key codeas. RESET=numeric, SET=application */
mode_DECOM, /* DEC origin mode. RESET=cursor posn screen relative */
mode_DECCOLM, /* DEC column mode. RESET=80 column display */
mode_DECPFF, /* Print form feed. RESET=OFF */
mode_DECPEX, /* Print extent. RESET=scroll rgn., SET=full screen */
mode_DECSCNM, /* Screen mode. RESET=normal video, SET=reverse video */
mode_DECTCEM, /* Cursor enable. RESET=hidden, SET=visible */
mode_25enab, /* When true (SET), emulator can use 25th line */
mode_protect, /* When true (SET), protected mode is on */
mode_block, /* When true (SET), block mode is on */
mode_local, /* When true (SET), local mode is on */
mode_vt220,
mode_vt280, /* Acts as a Kanji/Katakana terminal */
mode_vt320,
iZmodemState; // This variable is used by all of the emulators
// for processing AutoStart Zmodem codes.
int DEC_private; // Set when '?' is part of sequence
// Function pointer definitions. These pointers get assigned to
// emulator functions during the loading and initialization of a
// specific emulator...emuLoad().
//
int (*emu_datain) (const HEMU hEmu, ECHAR ccode);
int (*emu_kbdin) (const HHEMU hhEmu, int kcode, const int fTest);
int (*emu_getscrollcnt) (const HHEMU hhEmu);
int (*EmuScreenMode) (const HHEMU hhEmu, int d);
int (*emuResetTerminal) (const HHEMU hhEmu, int n);
void (*emu_graphic) (const HHEMU hhEmu);
void (*emu_setcolors) (const HHEMU hhEmu, int fore, int back);
void (*emu_getcolors) (const HHEMU hhEmu, int *fore, int *back);
void (*emu_initcolors) (const HHEMU hhEmu);
void (*emu_getscrsize) (const HHEMU hhEmu, int *rows, int *cols);
void (*emu_getcurpos) (const HHEMU hhEmu, int *row, int *col);
void (*emu_setcurpos) (const HHEMU hhEmu, int row, int col);
void (*emu_clearscreen) (const HHEMU hhEmu, int selector);
void (*emu_clearline) (const HHEMU hhEmu, int selector);
void (*emu_setattr) (const HHEMU hhEmu, PSTATTR pstAttr);
void (*emu_scroll) (const HHEMU hhEmu, int nlines, BOOL direction);
void (*emu_deinstall) (const HHEMU hhEmu);
void (*EmuSetCursorType)(const HHEMU hhEmu, int iCurType);
void (*emu_ntfy) (const HHEMU hhEmu, const int nNtfy);
void (*emu_clearrgn) (const HHEMU hhEmu,
int toprow,
int leftcol,
int botmrow,
int rightcol);
ECHAR (*EmuGetPrnChar) (const HHEMU hhEmu, ECHAR uch);
STATTR (*emu_getattr) (const HHEMU hhEmu);
int (*emuHomeHostCursor)(const HHEMU hhEmu);
};
// This macro returns the virtual image row of the supplied row number. That is,
// what appears as row 10 on the terminal image may actually be row 5 in the
// virtual image.
//
#define row_index(h, r) (((r) + h->emu_imgtop + MAX_EMUROWS) % (MAX_EMUROWS))
// The emualtor image is an array of characters. emu_aiEnd is an array that
// contains the column number of the rightmost character in a given row.
// This macro returns the a number representing the length of the image for
// the supplied row, from location 0 to the rightmost column. It
// simplifies accessing a row of the emulator as though it were a string.
// Remember, the emualtor matrix is zero based, and EMU_BALNK_LINE indicates
// that there are no characters in the row.
//
#define emuRowLen(h, r) ((h->emu_aiEnd[r] == EMU_BLANK_LINE) ? 0 : h->emu_aiEnd[r] + 1)
// from emu_std.c
//
int std_kbdin(const HHEMU hhEmu, int kcode, const int fTest);
int std_getscrollcnt(const HHEMU hhEmu);
void std_getscrsize(const HHEMU hhEmu, int *rows, int *cols);
void std_getcurpos(const HHEMU hhEmu, int *row, int *col);
void std_setcurpos(const HHEMU hhEmu, const int iRow, const int iCol);
STATTR std_getattr(const HHEMU hhEmu);
void std_setattr(const HHEMU hhEmu, PSTATTR pstAttr);
void std_setcolors(const HHEMU hhEmu, const int fore, const int back);
void std_getcolors(const HHEMU hhEmu, int *fore, int *back);
void std_initcolors(const HHEMU hhEmu);
void std_restorescreen(const HHEMU hhEmu);
void std_clearscreen(const HHEMU hhEmu, const int nClearSelect);
void std_clearline(const HHEMU hhEmu, const int nClearSelect);
void std_clearrgn(const HHEMU hhEmu, int toprow, int leftcol, int botmrow, int rightcol);
void EmuStdSetCursorType(const HHEMU hhEmu, int iCurType);
void EmuChkChar(const HHEMU hhEmu);
void EmuStdChkZmdm(const HHEMU hhEmu);
void std_dsptbl(const HHEMU hhEmu, int bit8);
void std_scroll(const HHEMU hhEmu, const INT nlines, const BOOL direction);
void std_deinstall(const HHEMU hhEmu);
void vt_dsptbl(const HHEMU hhEmu, ECHAR left, ECHAR right);
void vt_setdtbl(const HHEMU hhEmu, ECHAR tbl[], ECHAR cset);
int stdResetTerminal(const HHEMU hhEmu, const int);
void std_emu_ntfy(const HHEMU hhEmu, const int nNtfy);
int std_HomeHostCursor(const HHEMU hhEmu);
// from emu_scr.c
//
void backspace(const HHEMU hhEmu);
void carriagereturn(const HHEMU hhEmu);
void emuLineFeed(const HHEMU hhEmu);
void emuPrintChars(const HHEMU hhEmu, ECHAR *bufr, int nLen);
void scrolldown(const HHEMU hhEmu, int nlines);
void scrollup(const HHEMU hhEmu, int nlines);
void tab(const HHEMU hhEmu);
void backtab(const HHEMU hhEmu);
void tabn(const HHEMU hhEmu);
void emu_bell(const HHEMU hhEmu);
void emu_clearword(const HHEMU hhEmu, int fromcol, int tocol);
void clear_imgrow(const HHEMU hhEmu, int iRow);
// From autoinit.c
//
void emuAutoInit(const HHEMU hhEmu);
// From emu_ansi.c
//
void ANSI_CNL(const HHEMU hhEmu, int nlines);
void ANSI_CUB(const HHEMU hhEmu);
void ANSI_CUD(const HHEMU hhEmu);
void ANSI_CUF(const HHEMU hhEmu);
void ANSI_CUP(const HHEMU hhEmu);
void ANSI_CUU(const HHEMU hhEmu);
void ANSI_DL(const HHEMU hhEmu);
void ANSI_ED(const HHEMU hhEmu);
void ANSI_EL(const HHEMU hhEmu);
void ANSI_DCH(const HHEMU hhEmu);
void AnsiFormFeed(const HHEMU hhEmu);
void ANSI_HTS(const HHEMU hhEmu);
void ANSI_ICH(const HHEMU hhEmu);
void ANSI_IL(const HHEMU hhEmu);
void ANSI_IND(const HHEMU hhEmu);
void ANSI_NEL(const HHEMU hhEmu);
void ANSI_Pn(const HHEMU hhEmu);
void ANSI_Pn_Clr(const HHEMU hhEmu);
void ANSI_Pn_End(const HHEMU hhEmu);
void ANSI_RI(const HHEMU hhEmu);
void ANSI_RIS(const HHEMU hhEmu);
void ANSI_SGR(const HHEMU hhEmu);
void ANSI_TBC(const HHEMU hhEmu);
// From emu.c
//
void nothing(const HHEMU hhEmu);
void char_pn(const HHEMU hhEmu);
void commanderror(const HHEMU hhEmu);
void emuStdGraphic(const HHEMU hhEmu);
int emuCreateTextAttrBufs(const HEMU hEmu, const size_t nRows, size_t nCols);
void emuDestroyTextAttrBufs(const HEMU hEmu);
void emu_cleartabs(const HHEMU hhEmu, int selector);
void emu_reverse_image(const HHEMU hhEmu);
int emu_is25lines(const HHEMU hhEmu);
int emuKbdKeyLookup(const HHEMU hhEmu, const int key, const PSTKEYTABLE pstKeyTbl);
void emuInstallStateTable(const HHEMU hhEmu, struct trans_entry const *, int iSize);
//int emuKeyTableLoad(const HHEMU hhEmu, const int nTableId, PSTKEYTABLE const pstKeyTbl);
int emuKeyTableLoad(const HHEMU hhEmu, const KEYTBLSTORAGE pstKeySource[], const int nNumKeys, PSTKEYTABLE const pstKeyTbl);
int emu_kbdlocked(const HHEMU hhEmu, int key, const int fTest);
void emuSendKeyString(const HHEMU hhEmu, const int index, const PSTKEYTABLE pstKeyTbl);
void emuSendString(const HHEMU hhEmu, ECHAR *str, int strln);
void emuKeyTableFree(PSTKEYTABLE const pstKeyTbl);
int emuSetEmuName(const HEMU hEmu, const int nEmuId);
void emuAutoDetectLoad(const HHEMU hhEmu, const int nEmuID);
// From vt_xtra.c
//
void emuSetDecColumns(const HHEMU hhEmu, const int nColumns, const int fClear);
void ANSI_DSR(const HHEMU hhEmu);
void vt_scrollrgn(const HHEMU hhEmu);
void ANSI_RM(const HHEMU hhEmu);
void ANSI_SM(const HHEMU hhEmu);
void vt_alt_kpmode(const HHEMU hhEmu);
void vt_screen_adjust(const HHEMU hhEmu);
void DEC_STBM(const HHEMU hhEmu, int top, int bottom);
void vt52_toANSI(const HHEMU hhEmu);
void vt_DCH(const HHEMU hhEmu);
void vt_IL(const HHEMU hhEmu);
void vt_DL(const HHEMU hhEmu);
void vt_clearline(const HHEMU hhEmu, const int nSelect);
void vt_clearscreen(const HHEMU hhEmu, const int nSelect);
void vt_backspace(const HHEMU hhEmu);
void vt_CUB(const HHEMU hhEmu);
// From ansi.c
//
void ansi_setmode(const HHEMU hhEmu);
void ansi_resetmode(const HHEMU hhEmu);
int ansi_kbdin(const HHEMU hhEmu, int key, const int fTest);
void ansi_savecursor(const HHEMU hhEmu);
void DoorwayMode(const HHEMU hhEmu);
void emuAnsiUnload(const HHEMU hhEmu);
// From ansiinit.c
//
int emuAnsiReset(const HHEMU hhEmu, const int fHostRequest);
void emuAnsiInit(const HHEMU hhEmu);
void csrv_init(const HHEMU hhEmu, const int new_emu);
// From vt100.c
//
int vt100_kbdin(const HHEMU hhEmu, int key, const int fTest);
void ANSI_DA(const HHEMU hhEmu);
void vt100_savecursor(const HHEMU hhEmu);
void vt100_hostreset(const HHEMU hhEmu);
int vt100_reset(const HHEMU hhEmu, const int host_request);
int fakevt_kbdin(const HHEMU hhEmu, int key, const int fTest);
void vt100_prnc(const HHEMU hhEmu);
void vt100PrintCommands(const HHEMU hhEmu);
void vt100_answerback(const HHEMU hhEmu);
void vt100_report(const HHEMU hhEmu);
void emuDecGraphic(const HHEMU hhEmu);
void emuSetDoubleAttr(const HHEMU hhEmu);
void emuSetSingleAttrRow(const HHEMU hhEmu);
void emuSetDoubleAttrRow(const HHEMU hhEmu, const int iLineAttr);
void emuFromDblToSingle(const HHEMU hhEmu);
void emuDecTab(const HHEMU hhEmu);
void emuDecCUF(const HHEMU hhEmu);
void emuDecCUP(const HHEMU hhEmu);
void emuDecCUB(const HHEMU hhEmu);
void emuDecED(const HHEMU hhEmu);
void emuVT100Unload(const HHEMU hhEmu);
void emuDecIND(const HHEMU hhEmu);
void emuDecRI(const HHEMU hhEmu);
void emuDecCUU(const HHEMU hhEmu);
void emuDecCUD(const HHEMU hhEmu);
void emuDecSetCurPos(const HHEMU hhEmu, const int iRow, const int iCol);
void emuDecClearScreen(const HHEMU hhEmu, const int iSelector);
// From vt100ini.c
//
void vt100_init(const HHEMU hhEmu);
// From vt_chars.c
//
void vt_charset_init(const HHEMU hhEmu);
void vt_charset_save(const HHEMU hhEmu);
void vt_charset_restore(const HHEMU hhEmu);
void vt_charshift(const HHEMU hhEmu);
void vt_scs1(const HHEMU hhEmu);
void vt_scs2(const HHEMU hhEmu);
int vt_char_emulatecmd(const HEMU hEmu, ECHAR);
// From vt52.c
//
void vt52PrintCommands(const HHEMU hhEmu);
void vt52Print(const HHEMU hhEmu);
void vt52_id(const HHEMU hhEmu);
void vt52_CUP(const HHEMU hhEmu);
int vt52_kbdin(const HHEMU hhEmu, int key, const BOOL fTest);
void emuVT52Unload(const HHEMU hhEmu);
// From vt52init.c
//
void vt52_init(const HHEMU hhEmu);
// From emuhdl.c
int emuCreateNameTable(const HHEMU hhEmu);