19fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
29fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCopyright (C) 1996-1997 Id Software, Inc.
39fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
49fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is free software; you can redistribute it and/or
59fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammodify it under the terms of the GNU General Public License
69fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamas published by the Free Software Foundation; either version 2
79fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamof the License, or (at your option) any later version.
89fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
99fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is distributed in the hope that it will be useful,
109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambut WITHOUT ANY WARRANTY; without even the implied warranty of
119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSee the GNU General Public License for more details.
149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamYou should have received a copy of the GNU General Public License
169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamalong with this program; if not, write to the Free Software
179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// conproc.c
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include <windows.h>
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "conproc.h"
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHANDLE	heventDone;
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHANDLE	hfileBuffer;
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHANDLE	heventChildSend;
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHANDLE	heventParentSend;
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHANDLE	hStdout;
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamHANDLE	hStdin;
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDWORD RequestProc (DWORD dwNichts);
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLPVOID GetMappedBuffer (HANDLE hfileBuffer);
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid ReleaseMappedBuffer (LPVOID pBuffer);
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL GetScreenBufferLines (int *piLines);
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL SetScreenBufferLines (int iLines);
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL ReadText (LPTSTR pszText, int iBeginLine, int iEndLine);
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL WriteText (LPCTSTR szText);
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint CharToCode (char c);
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL SetConsoleCXCY(HANDLE hStdout, int cx, int cy);
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid InitConProc (HANDLE hFile, HANDLE heventParent, HANDLE heventChild)
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DWORD	dwID;
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CONSOLE_SCREEN_BUFFER_INFO	info;
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		wheight, wwidth;
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// ignore if we don't have all the events.
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!hFile || !heventParent || !heventChild)
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hfileBuffer = hFile;
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	heventParentSend = heventParent;
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	heventChildSend = heventChild;
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// so we'll know when to go away.
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	heventDone = CreateEvent (NULL, FALSE, FALSE, NULL);
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!heventDone)
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_SafePrintf ("Couldn't create heventDone\n");
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!CreateThread (NULL,
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   0,
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   (LPTHREAD_START_ROUTINE) RequestProc,
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   0,
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   0,
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					   &dwID))
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CloseHandle (heventDone);
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_SafePrintf ("Couldn't create QHOST thread\n");
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// save off the input/output handles.
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hStdout = GetStdHandle (STD_OUTPUT_HANDLE);
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	hStdin = GetStdHandle (STD_INPUT_HANDLE);
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// force 80 character width, at least 25 character height
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SetConsoleCXCY (hStdout, 80, 25);
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid DeinitConProc (void)
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (heventDone)
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SetEvent (heventDone);
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDWORD RequestProc (DWORD dwNichts)
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		*pBuffer;
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DWORD	dwRet;
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	HANDLE	heventWait[2];
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		iBeginLine, iEndLine;
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	heventWait[0] = heventParentSend;
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	heventWait[1] = heventDone;
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dwRet = WaitForMultipleObjects (2, heventWait, FALSE, INFINITE);
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// heventDone fired, so we're exiting.
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (dwRet == WAIT_OBJECT_0 + 1)
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pBuffer = (int *) GetMappedBuffer (hfileBuffer);
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// hfileBuffer is invalid.  Just leave.
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!pBuffer)
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_SafePrintf ("Invalid hfileBuffer\n");
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		switch (pBuffer[0])
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			case CCOM_WRITE_TEXT:
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// Param1 : Text
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pBuffer[0] = WriteText ((LPCTSTR) (pBuffer + 1));
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			case CCOM_GET_TEXT:
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// Param1 : Begin line
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// Param2 : End line
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				iBeginLine = pBuffer[1];
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				iEndLine = pBuffer[2];
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pBuffer[0] = ReadText ((LPTSTR) (pBuffer + 1), iBeginLine,
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream									   iEndLine);
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			case CCOM_GET_SCR_LINES:
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// No params
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pBuffer[0] = GetScreenBufferLines (&pBuffer[1]);
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			case CCOM_SET_SCR_LINES:
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// Param1 : Number of lines
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pBuffer[0] = SetScreenBufferLines (pBuffer[1]);
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				break;
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ReleaseMappedBuffer (pBuffer);
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SetEvent (heventChildSend);
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return 0;
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamLPVOID GetMappedBuffer (HANDLE hfileBuffer)
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	LPVOID pBuffer;
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pBuffer = MapViewOfFile (hfileBuffer,
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return pBuffer;
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid ReleaseMappedBuffer (LPVOID pBuffer)
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	UnmapViewOfFile (pBuffer);
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL GetScreenBufferLines (int *piLines)
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CONSOLE_SCREEN_BUFFER_INFO	info;
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	BOOL						bRet;
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bRet = GetConsoleScreenBufferInfo (hStdout, &info);
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bRet)
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*piLines = info.dwSize.Y;
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return bRet;
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL SetScreenBufferLines (int iLines)
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return SetConsoleCXCY (hStdout, 80, iLines);
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL ReadText (LPTSTR pszText, int iBeginLine, int iEndLine)
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COORD	coord;
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DWORD	dwRead;
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	BOOL	bRet;
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	coord.X = 0;
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	coord.Y = iBeginLine;
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bRet = ReadConsoleOutputCharacter(
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		hStdout,
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pszText,
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		80 * (iEndLine - iBeginLine + 1),
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		coord,
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		&dwRead);
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// Make sure it's null terminated.
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bRet)
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pszText[dwRead] = '\0';
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return bRet;
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL WriteText (LPCTSTR szText)
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	DWORD			dwWritten;
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	INPUT_RECORD	rec;
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char			upper, *sz;
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sz = (LPTSTR) szText;
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*sz)
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// 13 is the code for a carriage return (\n) instead of 10.
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (*sz == 10)
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			*sz = 13;
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		upper = toupper(*sz);
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.EventType = KEY_EVENT;
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.Event.KeyEvent.bKeyDown = TRUE;
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.Event.KeyEvent.wRepeatCount = 1;
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.Event.KeyEvent.wVirtualKeyCode = upper;
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.Event.KeyEvent.wVirtualScanCode = CharToCode (*sz);
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.Event.KeyEvent.uChar.AsciiChar = *sz;
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.Event.KeyEvent.uChar.UnicodeChar = *sz;
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.Event.KeyEvent.dwControlKeyState = isupper(*sz) ? 0x80 : 0x0;
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		WriteConsoleInput(
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			hStdin,
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			&rec,
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			1,
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			&dwWritten);
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		rec.Event.KeyEvent.bKeyDown = FALSE;
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		WriteConsoleInput(
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			hStdin,
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			&rec,
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			1,
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			&dwWritten);
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sz++;
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return TRUE;
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint CharToCode (char c)
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char upper;
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	upper = toupper(c);
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	switch (c)
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case 13:
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return 28;
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		default:
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (isalpha(c))
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return (30 + upper - 65);
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (isdigit(c))
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return (1 + upper - 47);
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return c;
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamBOOL SetConsoleCXCY(HANDLE hStdout, int cx, int cy)
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CONSOLE_SCREEN_BUFFER_INFO	info;
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COORD						coordMax;
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	coordMax = GetLargestConsoleWindowSize(hStdout);
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cy > coordMax.Y)
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cy = coordMax.Y;
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cx > coordMax.X)
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cx = coordMax.X;
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!GetConsoleScreenBufferInfo(hStdout, &info))
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return FALSE;
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// height
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    info.srWindow.Left = 0;
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    info.srWindow.Right = info.dwSize.X - 1;
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    info.srWindow.Top = 0;
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    info.srWindow.Bottom = cy - 1;
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cy < info.dwSize.Y)
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!SetConsoleWindowInfo(hStdout, TRUE, &info.srWindow))
3159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return FALSE;
3169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		info.dwSize.Y = cy;
3189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!SetConsoleScreenBufferSize(hStdout, info.dwSize))
3209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return FALSE;
3219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
3229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    else if (cy > info.dwSize.Y)
3239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    {
3249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		info.dwSize.Y = cy;
3259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!SetConsoleScreenBufferSize(hStdout, info.dwSize))
3279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return FALSE;
3289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!SetConsoleWindowInfo(hStdout, TRUE, &info.srWindow))
3309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return FALSE;
3319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    }
3329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!GetConsoleScreenBufferInfo(hStdout, &info))
3349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return FALSE;
3359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// width
3379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	info.srWindow.Left = 0;
3389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	info.srWindow.Right = cx - 1;
3399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	info.srWindow.Top = 0;
3409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	info.srWindow.Bottom = info.dwSize.Y - 1;
3419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cx < info.dwSize.X)
3439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!SetConsoleWindowInfo(hStdout, TRUE, &info.srWindow))
3459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return FALSE;
3469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		info.dwSize.X = cx;
3489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!SetConsoleScreenBufferSize(hStdout, info.dwSize))
3509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return FALSE;
3519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (cx > info.dwSize.X)
3539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		info.dwSize.X = cx;
3559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!SetConsoleScreenBufferSize(hStdout, info.dwSize))
3579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return FALSE;
3589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!SetConsoleWindowInfo(hStdout, TRUE, &info.srWindow))
3609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return FALSE;
3619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return TRUE;
3649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
366