mirror of https://github.com/lianthony/NT4.0
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.
186 lines
3.7 KiB
186 lines
3.7 KiB
/* zmaux.c - helper routines for WZMAIL
|
|
*
|
|
* HISTORY:
|
|
* 02-Apr-1987 mz Add whiteskip/whitescan
|
|
* 11-Apr-1987 mz Use PASCAL/INTERNAL
|
|
* 21-Aug-1987 mz Add better screen clearing
|
|
* 31-Aug-1987 bw Port to OS/2
|
|
* 24-Sep-87 danl Add cLines to ClearScrn
|
|
* 07-Mar-88 danl Get tools.h from <> not ""
|
|
* 04-May-91 daveth Add NT support
|
|
*/
|
|
|
|
#define INCL_DOSINFOSEG
|
|
#define INCL_KBD
|
|
#include "wzport.h"
|
|
|
|
#include <stdio.h>
|
|
#include <tools.h>
|
|
#if defined(OS2)
|
|
KBDINFO oldmode = { 10 , 0 , 0 , 0 , 0 };
|
|
#elif defined(NT)
|
|
|
|
extern PCHAR_INFO pBlankScreen;
|
|
extern COORD localScreenSize;
|
|
|
|
DWORD oldmode;
|
|
#else
|
|
#include <dos.h>
|
|
static UCHAR oldstate;
|
|
#endif
|
|
|
|
#include "dh.h"
|
|
|
|
#include "zm.h"
|
|
|
|
/* whiteskip - advance a pointer over whitespace
|
|
*
|
|
* p character pointer to test
|
|
*
|
|
* returns character pointer to first non-whitespace char
|
|
*/
|
|
PSTR PASCAL INTERNAL whiteskip (PSTR p)
|
|
{
|
|
return strbskip (p, strWHITE);
|
|
}
|
|
|
|
/* whitescan - find whitespace
|
|
*
|
|
* p character pointer to test
|
|
*
|
|
* returns character pointer to first whitespace char
|
|
*/
|
|
PSTR PASCAL INTERNAL whitescan (PSTR p)
|
|
{
|
|
return strbscan (p, strWHITE);
|
|
}
|
|
|
|
/* ToRaw - place stdin into raw mode */
|
|
VOID PASCAL INTERNAL ToRaw (VOID)
|
|
{
|
|
#if defined(OS2)
|
|
/*
|
|
* This gets you Raw keyboard with No echo within your own screen group
|
|
*
|
|
*/
|
|
KBDINFO newmode;
|
|
|
|
newmode.cb = 10;
|
|
|
|
KbdGetStatus (&newmode , 0 );
|
|
oldmode = newmode;
|
|
|
|
newmode.fsMask &= 0xFFF0; /* Input Mode and Echo State flags OFF */
|
|
newmode.fsMask |= 0x0006; /* Set Raw Mode and Echo Off */
|
|
|
|
KbdSetStatus (&newmode , 0 );
|
|
|
|
#elif defined(NT)
|
|
|
|
GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &oldmode);
|
|
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0); /* no echo */
|
|
/* no line mode */
|
|
/* no windows aware */
|
|
|
|
#else
|
|
|
|
union REGS regs;
|
|
|
|
regs.x.ax = 0x3300;
|
|
intdos ( ®s, ®s );
|
|
oldstate = regs.h.dl;
|
|
regs.x.ax = 0x3301;
|
|
regs.h.dl = 0x00;
|
|
intdos ( ®s, ®s );
|
|
|
|
for (regs.x.bx = 0; regs.x.bx < 2; regs.x.bx++) {
|
|
regs.x.ax = 0x4400;
|
|
intdos (®s, ®s);
|
|
if (regs.x.dx & 0x80) {
|
|
regs.h.dh = 0;
|
|
regs.h.dl |= 0x20;
|
|
regs.x.ax = 0x4401;
|
|
intdos (®s, ®s);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
/* ToCooked - place stdin into cooked mode */
|
|
VOID PASCAL INTERNAL ToCooked (VOID)
|
|
{
|
|
#if defined(OS2)
|
|
|
|
KbdSetStatus (&oldmode , 0);
|
|
|
|
#elif defined(NT)
|
|
|
|
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), oldmode);
|
|
|
|
#else
|
|
|
|
union REGS regs;
|
|
|
|
regs.x.ax = 0x3301;
|
|
regs.h.dl = oldstate;
|
|
intdos ( ®s, ®s );
|
|
|
|
for (regs.x.bx = 0; regs.x.bx < 2; regs.x.bx++) {
|
|
regs.x.ax = 0x4400;
|
|
intdos (®s, ®s);
|
|
if (regs.x.dx & 0x80) {
|
|
regs.h.dh = 0;
|
|
regs.h.dl &= ~0x20;
|
|
regs.x.ax = 0x4401;
|
|
intdos (®s, ®s);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/* ClearScrn - clear entire screen to a particular attribute
|
|
*
|
|
* attr attribute to use for filling
|
|
* cLines number of lines to be cleared
|
|
*/
|
|
|
|
VOID ClearScrn (INT attr, INT cLines)
|
|
{
|
|
|
|
#ifdef NT
|
|
|
|
int i;
|
|
SMALL_RECT screenArea;
|
|
COORD bufferCoord;
|
|
|
|
for ( i = 0; i < (cLines * xSize); i++)
|
|
pBlankScreen[i].Attributes = (WORD) attr;
|
|
|
|
screenArea.Left = 0;
|
|
screenArea.Right = (SHORT) xSize;
|
|
screenArea.Top = 0;
|
|
screenArea.Bottom = (SHORT) cLines;
|
|
|
|
bufferCoord.X = 0;
|
|
bufferCoord.Y = 0;
|
|
|
|
if ( ! WriteConsoleOutput ( GetStdHandle (STD_OUTPUT_HANDLE),
|
|
pBlankScreen,
|
|
localScreenSize,
|
|
bufferCoord,
|
|
&screenArea ) ) {
|
|
ZMDbgPrint ( "Console screen blanking error" );
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
register INT row;
|
|
|
|
for (row = 0; row < cLines; row++)
|
|
LineOutB (0, row, NULL, 0, attr);
|
|
|
|
#endif
|
|
}
|