enderalse/SKSE/Plugins/fs_skse_plugin_functions/common/IConsole.cpp
2021-10-06 02:45:46 +02:00

117 lines
2.1 KiB
C++

#include "common/IConsole.h"
#include <cstdarg>
#include <cstring>
#include <Windows.h>
IConsole::IConsole()
{
AllocConsole();
SetConsoleTitle("Console");
inputHandle = GetStdHandle(STD_INPUT_HANDLE);
outputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
ASSERT_STR(inputHandle, "IConsole: couldn't get input handle");
ASSERT_STR(outputHandle, "IConsole: couldn't get output handle");
SetConsoleMode(inputHandle, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT);
SetConsoleMode(outputHandle, ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT);
}
IConsole::~IConsole()
{
}
/**
* Writes a string to the console
*/
void IConsole::Write(char * buf)
{
UInt32 charsWritten;
WriteConsole(outputHandle, buf, std::strlen(buf), &charsWritten, NULL);
}
/**
* Writes a formatted string to the console
*
* You may specify a temp buffer to use for the formatted text, but if NULL
* is used a local buffer will be provided.
*
* @param buf a temporary buffer, or NULL to use the internal buffer
* @param fmt the format string
*/
void IConsole::Write(char * buf, UInt32 bufLen, const char * fmt, ...)
{
static char tempBuf[4096];
if(!buf)
{
buf = tempBuf;
bufLen = sizeof(tempBuf);
}
va_list args;
va_start(args, fmt);
vsprintf_s(buf, bufLen, fmt, args);
va_end(args);
Write(buf);
}
/**
* Reads a single character from the console
*/
char IConsole::ReadChar(void)
{
char data;
UInt32 charsRead;
ReadConsole(inputHandle, &data, 1, &charsRead, NULL);
return data;
}
/**
* Reads a newline-terminated string from the console
*
* @param buf output buffer
* @param len buffer size
* @return number of characters read
*/
UInt32 IConsole::ReadBuf(char * buf, UInt32 len)
{
UInt32 charsRead;
buf[0] = 0;
do
{
ReadConsole(inputHandle, buf, len, &charsRead, NULL);
}
while(!charsRead);
int done = 0;
for(UInt32 i = charsRead - 1; (i > 0) && !done; i--)
{
switch(buf[i])
{
case 0x0A:
case 0x0D:
buf[i] = 0;
break;
default:
done = 1;
break;
}
}
buf[charsRead] = 0;
return charsRead;
}