forked from freezy/vpinball
/
slintf.cpp
156 lines (110 loc) · 2.74 KB
/
slintf.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "StdAfx.h"
#ifdef SLINTF
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <io.h>
#include <FCNTL.H>
static int sbConsole;
void slintf_init()
{
sbConsole = 0;
}
const int MAX_CONSOLE_LINES = 5000;
void RedirectIoToConsole()
{
int hConHandle;
long lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE* fp = NULL;
// allocate a console for this app
AllocConsole();
// http://softwareforums.intel.com/ids/board/message?board.id=15&message.id=2971&page=1&view=by_threading
// would like to see messages without mousing around each time I run
{
char name[256];
HWND win;
GetConsoleTitle( name, 255 );
win = FindWindow( NULL, name );
SetWindowPos( win, HWND_TOP, 0, 640, 640, 480, SWP_NOSIZE );
ShowWindow( win, SW_SHOWNORMAL );
}
// 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
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 );
// redirect unbuffered STDIN to the console
lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "r" );
*stdin = *fp;
setvbuf( stdin, NULL, _IONBF, 0 );
// redirect unbuffered STDERR to the console
lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" );
*stderr = *fp;
setvbuf( stderr, NULL, _IONBF, 0 );
// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
// point to console as well
// ios::sync_with_stdio();
}
void slintf_popup_console()
{
if( !sbConsole )
{
sbConsole = 1;
RedirectIoToConsole();
}
}
void slintf_close_console()
{
if( sbConsole )
{
FreeConsole();
sbConsole = 0;
}
}
int file_exists( const char *filename )
{
FILE *file;
if( fopen_s(&file, filename, "r" ) ) return 0;
else
{
fclose( file );
return 1;
}
}
#endif
void slintf( const char *str, ... )
{
#ifdef SLINTF
static int initted;
static int noconsole;
if( !sbConsole ) return;
if( noconsole ) return;
if( !initted )
{
initted = 1;
if( file_exists( ".vp_noconsole" ) )
{
noconsole = 1;
return;
}
}
#define MAX_SCREEN_BUFFER_SIZE 8192
char buffer[MAX_SCREEN_BUFFER_SIZE];
if( !str || !str[0] ) return;
va_list ap;
va_start(ap,str);
/*const int len =*/ vsprintf_s( buffer, sizeof(buffer), str, ap );
slintf_popup_console();
fputs( buffer, stdout );
#endif
}