Leaked source code of windows server 2003
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.
 
 
 
 
 
 

596 lines
21 KiB

/* File: D:\WACKER\emu\emu.hh (Created: 08-Dec-1993)
*
* Copyright 1994-2001 by Hilgraeve Inc. -- Monroe, MI
* All rights reserved
*
* $Revision: 13 $
* $Date: 7/26/01 1:44p $
*/
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 CLEAR_CURSOR_TO_SCREEN_END 0
#define CLEAR_SCREEN_START_TO_CURSOR 1
#define CLEAR_ENTIRE_SCREEN 2
#define CLEAR_CURSOR_TO_LINE_END 0
#define CLEAR_LINE_START_TO_CURSOR 1
#define CLEAR_ENTIRE_LINE 2
#define CLEAR_TAB_AT_CURSOR 0
#define CLEAR_TABS_IN_LINE 3
#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; // Contains all the settings made by the
// user. They are initilaized from values
// stored 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 */
stEmuKeyTbl5; /* 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,
fUse8BitCodes, // Applies to the VT220/320 emulators.
fAllowUserKeys, // Ditto.
#if defined(INCL_PRINT_PASSTHROUGH)
fPrintRaw,
#endif // INCL_PRINT_PASSTHROUGH
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().
//
#if defined(EXTENDED_FEATURES)
int (*emu_datain) (const HHEMU hhEmu, const ECHAR ccode);
#else
int (*emu_datain) (const HEMU hEmu, const ECHAR ccode);
#endif
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);
#ifdef INCL_TERMINAL_SIZE_AND_COLORS
void (*emu_setscrsize) (const HHEMU hhEmu); // Added 10 Jun 98 rde
#endif
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);
};
// These are a group of settings saved in the session file as a block. Later
// settings were added to the session file individually rather than in a
// structure. Do not add or remove any items from this structure!! rde 8 Jun 1998
struct stEmuBaseSFSettings
{
int nEmuId, // 100 = EMU_AUTO
// 101 = EMU_ANSI
// 102 = EMU_MINI
// 109 = EMU_VIEW
// 110 = EMU_TTY
// 111 = EMU_VT100
// 112 = EMU_VT220
// 113 = EMU_VT320
// 115 = EMU_VT52
// 116 = EMU_VT100J
// 117 = EMU_ANSIW
// 118 = EMU_VT100PLUS
// 119 = EMU_VTUTF8
//
nTermKeys, // 0 = EMU_KEYS_ACCEL
// 1 = EMU_KEYS_TERM
// 2 = EMU_KEYS_SCAN
//
nCursorType, // 1 = EMU_CURSOR_BLOCK
// 2 = EMU_CURSOR_LINE
// 3 = EMU_CURSOR_NONE
//
nCharacterSet, // 0 = EMU_CHARSET_ASCII
// 1 = EMU_CHARSET_UK
// 2 = EMU_CHARSET_SPECIAL
//
nAutoAttempts, // Count of connections using the Auto
// Detect Emulator. At
// EMU_MAX_AUTODETECT_ATTEMPTS, we switch
// to Ansi emulation. Note, this may
// get moved into a Statictics Handle
// if we ever develop one.
//
fCursorBlink, // Blinking cursor. True\False.
fMapPFkeys, // PF1-PF4 to top row of keypad.True\False.
fAltKeypadMode, // Alternate keypad mode. True\False.
fKeypadAppMode, // Keypad application mode. True\False.
fCursorKeypadMode, // Cursor keypad mode. True\Fales.
fReverseDelBk, // Reverse Del and Backsp. True\False.
f132Columns, // 132 column display. True\False.
fDestructiveBk, // Destructive backspace. True\False.
fWrapLines, // Wrap lines. True\False.
fLbSymbolOnEnter, // Send # symbol on Enter. True\False.
// Note: The following two variables were added for the VT220/320. rde:24 Jan 98
fUse8BitCodes, // 8-bit control codes True\False.
fAllowUserKeys; // User defined keys allowed True\False.
// Note: The following two variables are only used if the "Include
// User Defined Backspace and Telnet Terminal Id" feature is enabled.
// There is no compile switch here because this entire structure gets
// written to the session file in one large chunk. Using a compile
// switch could potentially cause version problems later on down
// the road. - cab:11/15/96
//
int nBackspaceKeys; // 1 = EMU_BKSPKEYS_CTRLH
// 2 = EMU_BKSPKEYS_DEL
// 3 = EMU_BKSPKEYS_CTRLHSPACE
TCHAR acTelnetId[EMU_MAX_TELNETID]; // Telnet terminal ID
};
// 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);
#ifdef INCL_TERMINAL_SIZE_AND_COLORS
void std_setscrsize(const HHEMU hhEmu);
#endif
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_CBT(const HHEMU hhEmu);
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);
int DEC_HHC(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);
#if defined(EXTENDED_FEATURES)
int vt_char_emulatecmd(const HHEMU hhEmu, const ECHAR ccode);
#else
int vt_char_emulatecmd(const HEMU hEmu, const ECHAR ccode);
#endif
// 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);
int emuStdDataIn(const HHEMU hhEmu, const ECHAR ccode);
// From vtutf8ini.c
//
void vtutf8_init(const HHEMU hhEmu);
int vtUTF8_kbdin(const HHEMU hhEmu, int key, const int fTest);
void vtUTF8FirstDataByte(const HHEMU hhEmu);
void vtUTF8MiddleDataByte(const HHEMU hhEmu);
void vtUTF8LastDataByte(const HHEMU hhEmu);
void emuVTUTF8Unload(const HHEMU hhEmu);