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.
 
 
 
 
 
 

274 lines
6.3 KiB

/* File: D:\WACKER\emu\vt52.c (Created: 28-Dec-1993)
*
* Copyright 1994, 1998 by Hilgraeve Inc. -- Monroe, MI
* All rights reserved
*
* $Revision: 3 $
* $Date: 5/09/01 4:47p $
*/
#include <windows.h>
#pragma hdrstop
#include <tdll\stdtyp.h>
#include <tdll\chars.h>
#include <tdll\print.h>
#include <tdll\mc.h>
#include <tdll\htchar.h>
#include <tdll\assert.h>
#include "emu.h"
#include "emu.hh"
#include "emuid.h"
#include "emudec.hh"
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* vt52PrintCommands
*
* DESCRIPTION:
* Processes vt52 printing commands.
*
* ARGUMENTS:
* none
*
* RETURNS:
* nothing
*/
void vt52PrintCommands(const HHEMU hhEmu)
{
int line;
ECHAR code;
ECHAR aechBuf[10];
code = hhEmu->emu_code;
switch (code)
{
case ETEXT('^'): /* auto print on */
hhEmu->print_echo = TRUE;
break;
case ETEXT('_'): /* auto print off */
hhEmu->print_echo = FALSE;
break;
case ETEXT(']'): /* print screen */
for (line = 0; line < 24; ++line)
printEchoLine(hhEmu->hPrintHost,
hhEmu->emu_apText[row_index(hhEmu, line)],
emuRowLen(hhEmu, row_index(hhEmu, line)));
CnvrtMBCStoECHAR(aechBuf, sizeof(aechBuf), TEXT("0x0C"),
StrCharGetByteCount(TEXT("0x0C")));
printEchoLine(hhEmu->hPrintHost, aechBuf, sizeof(ECHAR));
break;
case ETEXT('V'): /* print cursor line */
printEchoLine(hhEmu->hPrintHost,
hhEmu->emu_apText[row_index(hhEmu, hhEmu->emu_currow)],
emuRowLen(hhEmu, row_index(hhEmu, hhEmu->emu_currow)));
break;
case ETEXT('W'): /* enter printer controller mode */
hhEmu->state = 4; /* start vt52_prnc() */
break;
case ETEXT('X'): /* exit printer controller mode */
break;
default:
break;
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* vt52Print
*
* DESCRIPTION:
* Stores character and prints saved string of characters when termination
* character is received.
*
* ARGUMENTS:
* none
*
* RETURNS:
* nothing
*/
void vt52Print(const HHEMU hhEmu)
{
const PSTDECPRIVATE pstPRI = (PSTDECPRIVATE)hhEmu->pvPrivate;
ECHAR ccode;
ccode = hhEmu->emu_code;
*pstPRI->pntr++ = ccode;
*pstPRI->pntr = 0;
++pstPRI->len_s;
if (pstPRI->len_s >= pstPRI->len_t &&
memcmp(pstPRI->terminate,
&pstPRI->storage[pstPRI->len_s - pstPRI->len_t],
sizeof(pstPRI->terminate)) == 0)
{
/* received termination string, wrap it up */
emuPrintChars(hhEmu, pstPRI->storage, pstPRI->len_s - pstPRI->len_t);
pstPRI->pntr = pstPRI->storage;
pstPRI->len_s = 0;
hhEmu->state = 0; /* drop out of this routine */
// Finish-up print job.
//
printEchoClose(hhEmu->hPrintHost);
return;
}
/* haven't received termination sequence yet, is storage filled? */
if ((unsigned)pstPRI->len_s >= (sizeof(pstPRI->storage) - 1))
{
/* copy most of string to print buffer */
emuPrintChars(hhEmu, pstPRI->storage, pstPRI->len_s - pstPRI->len_t);
/* move end of string to beginning of storage */
memmove(pstPRI->storage,
&pstPRI->storage[pstPRI->len_s - pstPRI->len_t],
(unsigned)pstPRI->len_t);
pstPRI->pntr = pstPRI->storage + pstPRI->len_t;
pstPRI->len_s = pstPRI->len_t;
}
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* vt52_id
*
* DESCRIPTION:
* Transmits the VT52 id code--ESC/Z.
*
* ARGUMENTS:
* none
*
* RETURNS:
* nothing
*/
void vt52_id(const HHEMU hhEmu)
{
TCHAR *sp;
ECHAR ech[10];
sp = TEXT("\033/Z");
CnvrtMBCStoECHAR(ech, sizeof(ech), TEXT("\033/Z"),
StrCharGetByteCount(TEXT("\033/Z")));
emuSendString(hhEmu, ech, (int)StrCharGetStrLength(sp));
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* vt52_CUP
*
* DESCRIPTION:
* Positions the cursor for the VT52 emulator.
*
* ARGUMENTS:
* none
*
* RETURNS:
* nothing
*/
void vt52_CUP(const HHEMU hhEmu)
{
char_pn(hhEmu);
(*hhEmu->emu_setcurpos)(hhEmu,
hhEmu->num_param[0] - 1,
hhEmu->num_param[1] - 1);
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* vt52_kbdin
*
* DESCRIPTION:
* Processes local keyboard keys for the VT52 emulator.
*
* ARGUMENTS:
* key -- key to process
* fTest -- if TRUE, just checks if it is an emulator key.
*
* RETURNS:
* nothing
*/
int vt52_kbdin(const HHEMU hhEmu, int key, const int fTest)
{
int index;
/* -------------- Check Backspace & Delete keys ------------- */
if (hhEmu->stUserSettings.fReverseDelBk && ((key == VK_BACKSPACE) ||
(key == DELETE_KEY) || (key == DELETE_KEY_EXT)))
{
key = (key == VK_BACKSPACE) ? DELETE_KEY : VK_BACKSPACE;
}
/* -------------- Mapped PF1-PF4 keys ------------- */
if (hhEmu->stUserSettings.fMapPFkeys &&
(index = emuKbdKeyLookup(hhEmu, key, &hhEmu->stEmuKeyTbl3)) != -1)
{
if (!fTest)
emuSendKeyString(hhEmu, index, &hhEmu->stEmuKeyTbl3);
}
/* -------------- Keypad Application mode ------------- */
else if (hhEmu->mode_DECKPAM &&
(index = emuKbdKeyLookup(hhEmu, key, &hhEmu->stEmuKeyTbl2)) != -1)
{
if (!fTest)
emuSendKeyString(hhEmu, index, &hhEmu->stEmuKeyTbl2);
}
/* -------------- Normal mode keys ------------- */
else if ((index = emuKbdKeyLookup(hhEmu, key, &hhEmu->stEmuKeyTbl)) != -1)
{
if (!fTest)
emuSendKeyString(hhEmu, index, &hhEmu->stEmuKeyTbl);
}
else
{
index = std_kbdin(hhEmu, key, fTest);
}
return index;
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* emuVT52Unload
*
* DESCRIPTION:
* Unloads current emulator by freeing used memory.
*
* ARGUMENTS:
* none
*
* RETURNS:
* nothing
*/
void emuVT52Unload(const HHEMU hhEmu)
{
assert(hhEmu);
if (hhEmu->pvPrivate)
{
free(hhEmu->pvPrivate);
hhEmu->pvPrivate = 0;
}
//
// Make sure to free the key tables that were created when the emulator
// was loaded, otherwise there is a memory leak. REV: 05/09/2001
//
emuKeyTableFree(&hhEmu->stEmuKeyTbl);
emuKeyTableFree(&hhEmu->stEmuKeyTbl2);
emuKeyTableFree(&hhEmu->stEmuKeyTbl3);
return;
}
/* end of vt52.c */