Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

195 lines
4.0 KiB

#include "std.h"
#define FOREGROUND_BLACK 0
#define FOREGROUND_CYAN FOREGROUND_BLUE | FOREGROUND_GREEN
#define FOREGROUND_MAGENTA FOREGROUND_BLUE | FOREGROUND_RED
#define FOREGROUND_YELLOW FOREGROUND_GREEN | FOREGROUND_RED
#define FOREGROUND_WHITE FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
#define BACKGROUND_BLACK 0
#define BACKGROUND_CYAN BACKGROUND_BLUE | BACKGROUND_GREEN
#define BACKGROUND_MAGENTA BACKGROUND_BLUE | BACKGROUND_RED
#define BACKGROUND_YELLOW BACKGROUND_GREEN | BACKGROUND_RED
#define BACKGROUND_WHITE BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED
#define TERMINAL_ROWS 25
#define TERMINAL_COLUMNS 80
HANDLE termpCreateTerminalBuffer();
PTERMINAL termpCreateTerminal();
void termpDestroyTerminal(PTERMINAL pTerminal);
PTERMINAL termpCreateTerminal()
{
PTERMINAL pResult;
pResult = malloc(
sizeof(TERMINAL));
if (pResult!=NULL)
{
ZeroMemory(
pResult,
sizeof(TERMINAL));
pResult->hInput = INVALID_HANDLE_VALUE;
pResult->hOutput = INVALID_HANDLE_VALUE;
pResult->hSavedBuffer = INVALID_HANDLE_VALUE;
pResult->hNewBuffer = INVALID_HANDLE_VALUE;
pResult->wAttributes = FOREGROUND_WHITE;
pResult->fInverse = FALSE;
pResult->fBold = FALSE;
pResult->fEscapeValid = FALSE;
pResult->fEscapeInvalid = TRUE;
pResult->wEscapeParamCount = 0;
pResult->chEscapeCommand = 0;
pResult->chEscapeFirstChar = 0;
pResult->pTxProc = NULL;
}
else
{
SetLastError(
ERROR_NOT_ENOUGH_MEMORY);
}
return pResult;
}
void termpDestroyTerminal(PTERMINAL pTerminal)
{
if (pTerminal!=NULL)
{
free(pTerminal);
}
}
PTERMINAL termInitialize(TERMTXPROC pTxProc)
{
PTERMINAL pResult;
BOOL fResult;
pResult = termpCreateTerminal();
if (pResult==NULL)
{
goto Error;
}
pResult->hSavedBuffer = GetStdHandle(
STD_OUTPUT_HANDLE);
if (pResult->hSavedBuffer==INVALID_HANDLE_VALUE)
{
goto Error;
}
pResult->hNewBuffer = termpCreateTerminalBuffer();
if (pResult->hNewBuffer==INVALID_HANDLE_VALUE)
{
goto Error;
}
fResult = SetConsoleActiveScreenBuffer(
pResult->hNewBuffer);
if (!fResult)
{
goto Error;
}
return pResult;
Error:
termFinalize(pResult);
return NULL;
}
void termFinalize(PTERMINAL pTerminal)
{
if (pTerminal!=NULL)
{
if (pTerminal->hSavedBuffer!=INVALID_HANDLE_VALUE)
{
SetConsoleActiveScreenBuffer(
pTerminal->hSavedBuffer);
}
if (pTerminal->hNewBuffer!=INVALID_HANDLE_VALUE)
{
CloseHandle(
pTerminal->hNewBuffer);
}
free(pTerminal);
}
}
HANDLE termpCreateTerminalBuffer()
{
HANDLE hNewBuffer;
BOOL bResult;
COORD Coord;
hNewBuffer = CreateConsoleScreenBuffer(
GENERIC_READ | GENERIC_WRITE,
0, // No sharing allowed
NULL, // No inheritance allowed
CONSOLE_TEXTMODE_BUFFER, // The only supported value
NULL); // Reserved, must be null
if (hNewBuffer==INVALID_HANDLE_VALUE)
{
goto Error;
}
Coord.Y = TERMINAL_ROWS;
Coord.X = TERMINAL_COLUMNS;
bResult = SetConsoleScreenBufferSize(
hNewBuffer,
Coord);
if (!bResult)
{
goto Error;
}
bResult = SetConsoleTextAttribute(
hNewBuffer,
FOREGROUND_WHITE);
if (!bResult)
{
goto Error;
}
Coord.X = 0;
Coord.Y = 0;
bResult = SetConsoleCursorPosition(
hNewBuffer,
Coord);
if (!bResult)
{
goto Error;
}
return hNewBuffer;
Error:
if (hNewBuffer!=INVALID_HANDLE_VALUE)
{
CloseHandle(hNewBuffer);
}
return INVALID_HANDLE_VALUE;
}