#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>

#ifdef __cplusplus
#include <iostream>
#include <fstream>
using namespace std;
#endif


// maximum mumber of lines the output console should have
#define MAX_CONSOLE_LINES   500


void redirectIOToConsole()
{
    int hConHandle;
    intptr_t stdHandle;
    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    FILE* fp;

    // allocate a console for this app
    AllocConsole();

    // set the screen buffer to be big enough to let us scroll text
    GetConsoleScreenBufferInfo( GetStdHandle(STD_OUTPUT_HANDLE), &coninfo );

    coninfo.dwSize.Y = MAX_CONSOLE_LINES;
    SetConsoleScreenBufferSize( GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize );

    // redirect unbuffered STDOUT to the console
    stdHandle = (intptr_t) GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(stdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );

    // redirect unbuffered STDIN to the console
    stdHandle = (intptr_t) GetStdHandle(STD_INPUT_HANDLE);
    hConHandle = _open_osfhandle(stdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "r" );
    *stdin = *fp;
    setvbuf( stdin, NULL, _IONBF, 0 );

    // redirect unbuffered STDERR to the console
    stdHandle = (intptr_t) GetStdHandle(STD_ERROR_HANDLE);
    hConHandle = _open_osfhandle(stdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "w" );
    *stderr = *fp;
    setvbuf( stderr, NULL, _IONBF, 0 );

#ifdef __cplusplus
    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
    // point to console as well
    ios::sync_with_stdio();
#endif
}


/*EOF*/
