mirror of
https://github.com/digarok/gsplus.git
synced 2024-06-01 08:41:36 +00:00
win32 console debugger
may need a little work, still.
This commit is contained in:
parent
2a82de3d54
commit
30da497087
|
@ -1634,6 +1634,8 @@ int debug_shell(int code) {
|
||||||
fputs("\n", stdout);
|
fputs("\n", stdout);
|
||||||
if (++control_d_count < 2)
|
if (++control_d_count < 2)
|
||||||
continue;
|
continue;
|
||||||
|
fputs("quit\n", stdout);
|
||||||
|
fflush(stdout);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
control_d_count = 0;
|
control_d_count = 0;
|
||||||
|
@ -1663,19 +1665,33 @@ int debug_shell(int code) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_sig_intr(int sig) {
|
static void do_sig_intr(int sig) {
|
||||||
/* todo -- raise() if halt already pending */
|
|
||||||
if (halt_sim & 4) {
|
if (halt_sim & 4) {
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
set_halt(4);
|
set_halt(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
static BOOL WINAPI ctrl_handler(DWORD dwCtrlType) {
|
||||||
|
/* handled via a new thread */
|
||||||
|
if (dwCtrlType == CTRL_C_EVENT || dwCtrlType == CTRL_BREAK_EVENT) {
|
||||||
|
do_sig_intr(SIGINT);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* also called by do_step */
|
/* also called by do_step */
|
||||||
void do_go() {
|
void do_go() {
|
||||||
int ret;
|
int ret;
|
||||||
int ok;
|
int ok;
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifdef _WIN32
|
||||||
|
//SetConsoleCtrlHandler(ctrl_handler, 1);
|
||||||
|
#else
|
||||||
/* if -g flag, start with debug shell ... */
|
/* if -g flag, start with debug shell ... */
|
||||||
if (isatty(STDIN_FILENO)) {
|
if (isatty(STDIN_FILENO)) {
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
|
|
@ -144,9 +144,31 @@ char *x_readline(const char *prompt) {
|
||||||
static char buffer[1024];
|
static char buffer[1024];
|
||||||
DWORD count = 0;
|
DWORD count = 0;
|
||||||
BOOL ok;
|
BOOL ok;
|
||||||
HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
|
|
||||||
|
|
||||||
|
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (h == INVALID_HANDLE_VALUE) {
|
||||||
|
//* cygwin? * /
|
||||||
|
fputs("GetStdHandle\n", stderr);
|
||||||
|
fflush(stderr);
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
char *cp;
|
||||||
|
fputs(prompt, stdout);
|
||||||
|
fflush(stdout);
|
||||||
|
return fgets(buffer, sizeof(buffer), stdin);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if (!readline_init) {
|
if (!readline_init) {
|
||||||
|
|
||||||
|
//struct stat st;
|
||||||
|
|
||||||
|
|
||||||
CONSOLE_HISTORY_INFO chi;
|
CONSOLE_HISTORY_INFO chi;
|
||||||
DWORD mode;
|
DWORD mode;
|
||||||
|
|
||||||
|
@ -155,17 +177,48 @@ char *x_readline(const char *prompt) {
|
||||||
chi.HistoryBufferSize = HISTORY_SIZE;
|
chi.HistoryBufferSize = HISTORY_SIZE;
|
||||||
chi.NumberOfHistoryBuffers = 1; /* ???? */
|
chi.NumberOfHistoryBuffers = 1; /* ???? */
|
||||||
chi.dwFlags = HISTORY_NO_DUP_FLAG;
|
chi.dwFlags = HISTORY_NO_DUP_FLAG;
|
||||||
SetConsoleHistoryInfo(&chi);
|
ok = SetConsoleHistoryInfo(&chi);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
fprintf(stderr, "SetConsoleHistoryInfo: %lx\n", GetLastError());
|
||||||
|
fflush(stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
mode = ENABLE_ECHO_INPUT | ENABLE_EXTENDED_FLAGS | ENABLE_INSERT_MODE | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_QUICK_EDIT_MODE;
|
mode = ENABLE_ECHO_INPUT | ENABLE_EXTENDED_FLAGS | ENABLE_INSERT_MODE | ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_QUICK_EDIT_MODE;
|
||||||
SetConsoleMode(h, mode);
|
ok = SetConsoleMode(hIn, mode);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
fprintf(stderr, "SetConsoleMode: %lx (h = %p)\n", GetLastError(), hIn);
|
||||||
|
fflush(stderr);
|
||||||
|
}
|
||||||
|
|
||||||
readline_init = 1;
|
readline_init = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ok = ReadConsole(h, buffer, sizeof(buffer), &count, NULL);
|
fflush(stderr);
|
||||||
if (!ok) return NULL;
|
fflush(stdout);
|
||||||
|
|
||||||
|
ok = WriteConsole(hOut, prompt, strlen(prompt), NULL, NULL);
|
||||||
|
if (!ok) {
|
||||||
|
/* msys/cygwin? */
|
||||||
|
|
||||||
|
fprintf(stderr, "WriteConsole: %lx (h = %p)\n", GetLastError(), hOut);
|
||||||
|
fflush(stderr);
|
||||||
|
fputs(prompt, stdout);
|
||||||
|
fflush(stdout);
|
||||||
|
char *cp = fgets(buffer, sizeof(buffer), stdin);
|
||||||
|
if (!cp) return NULL;
|
||||||
|
cleanup_buffer(buffer, strlen(buffer));
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
ok = ReadConsole(hIn, buffer, sizeof(buffer), &count, NULL);
|
||||||
|
if (!ok) {
|
||||||
|
fprintf(stderr, "Error: %lx (h = %p)\n", GetLastError(), hIn);
|
||||||
|
fprintf(stderr, "Type: %08x\n", GetFileType(hIn));
|
||||||
|
fflush(stderr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
cleanup_buffer(buffer, count);
|
cleanup_buffer(buffer, count);
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,11 @@
|
||||||
#include "defc.h"
|
#include "defc.h"
|
||||||
#include "protos_windriver.h"
|
#include "protos_windriver.h"
|
||||||
|
|
||||||
|
#include <io.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
extern void gsportinit(HWND _hwnd);
|
extern void gsportinit(HWND _hwnd);
|
||||||
extern void gsportshut();
|
extern void gsportshut();
|
||||||
|
@ -104,9 +109,149 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
|
||||||
return main(0,0);
|
return main(0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
|
||||||
|
int g_win32_cygwin;
|
||||||
|
void win_init_console(void) {
|
||||||
|
/*
|
||||||
|
powershell/cmd
|
||||||
|
fd 0/1/2 closed
|
||||||
|
GetStdHandle return 0
|
||||||
|
stdin = -2, stdout = -2, stderr = -2
|
||||||
|
|
||||||
|
msys/cygwin
|
||||||
|
fd 0/1/2 open
|
||||||
|
GetStdHandle return value (type = 3/pipe)
|
||||||
|
stdin = 0, stdout = 1, stderr = 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
//struct stat st;
|
||||||
|
//int ok;
|
||||||
|
int fd;
|
||||||
|
HANDLE h;
|
||||||
|
DWORD mode;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
FILE *dbg = fopen("debug.txt", "a+");
|
||||||
|
h = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
fprintf(dbg, "STD_INPUT_HANDLE: %p\n", h);
|
||||||
|
fprintf(dbg, "GetFileType: %08x\n", GetFileType(h));
|
||||||
|
fprintf(dbg, "%d %d %d\n", stdin->_file, stdout->_file, stderr->_file);
|
||||||
|
fclose(dbg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_win32_cygwin = 0;
|
||||||
|
|
||||||
|
setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
|
||||||
|
setvbuf(stderr, NULL, _IOLBF, BUFSIZ);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (fstat(0, &st) == 0) {
|
||||||
|
g_win32_cygwin = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SetStdHandle(STD_INPUT_HANDLE, 0);
|
||||||
|
SetStdHandle(STD_OUTPUT_HANDLE, 0);
|
||||||
|
SetStdHandle(STD_ERROR_HANDLE, 0);
|
||||||
|
#if 0
|
||||||
|
stdin->_file = 0;
|
||||||
|
stdout->_file = 1;
|
||||||
|
stderr->_file = 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
AllocConsole();
|
||||||
|
SetConsoleTitle("GS+");
|
||||||
|
|
||||||
|
|
||||||
|
h = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
if (h != INVALID_HANDLE_VALUE) {
|
||||||
|
|
||||||
|
mode = 0;
|
||||||
|
GetConsoleMode(h, &mode);
|
||||||
|
mode |= ENABLE_VIRTUAL_TERMINAL_INPUT;
|
||||||
|
SetConsoleMode(h, mode);
|
||||||
|
|
||||||
|
fd = _open_osfhandle((intptr_t)h, _O_TEXT);
|
||||||
|
#if DUPE
|
||||||
|
if (fd >= 0 && fd != 0) {
|
||||||
|
_dup2(fd, 0);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
stdin->_file = fd;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
h = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
if (h != INVALID_HANDLE_VALUE) {
|
||||||
|
|
||||||
|
mode = 0;
|
||||||
|
GetConsoleMode(h, &mode);
|
||||||
|
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
|
||||||
|
SetConsoleMode(h, mode);
|
||||||
|
|
||||||
|
//SetConsoleTextAttribute(h, BACKGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
|
||||||
|
|
||||||
|
|
||||||
|
fd = _open_osfhandle((intptr_t)h, _O_TEXT);
|
||||||
|
#if DUPE
|
||||||
|
if (fd >= 0 && fd != 1) {
|
||||||
|
_dup2(fd, 1);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
stdout->_file = fd;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
h = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
|
if (h != INVALID_HANDLE_VALUE) {
|
||||||
|
|
||||||
|
mode = 0;
|
||||||
|
GetConsoleMode(h, &mode);
|
||||||
|
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
|
||||||
|
SetConsoleMode(h, mode);
|
||||||
|
|
||||||
|
|
||||||
|
fd = _open_osfhandle((intptr_t)h, _O_TEXT);
|
||||||
|
#if DUPE
|
||||||
|
if (fd >= 0 && fd != 2) {
|
||||||
|
_dup2(fd, 2);
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
stdout->_file = fd;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
dbg = fopen("debug.txt", "a+");
|
||||||
|
h = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
|
fprintf(dbg, "STD_INPUT_HANDLE: %p\n", h);
|
||||||
|
fprintf(dbg, "GetFileType: %08x\n", GetFileType(h));
|
||||||
|
fprintf(dbg, "%d %d %d\n", stdin->_file, stdout->_file, stderr->_file);
|
||||||
|
fclose(dbg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void exit_sleep(void) {
|
||||||
|
/* todo -- "press return to continue" */
|
||||||
|
if (!g_win32_cygwin)
|
||||||
|
sleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
// Hide the console initially to reduce window flashing. We'll show the console later if needed.
|
// Hide the console initially to reduce window flashing. We'll show the console later if needed.
|
||||||
x_show_console(0);
|
|
||||||
|
//atexit(exit_sleep);
|
||||||
|
win_init_console();
|
||||||
|
|
||||||
|
//x_show_console(0);
|
||||||
|
|
||||||
|
|
||||||
// Register the window class.
|
// Register the window class.
|
||||||
WNDCLASS wndclass;
|
WNDCLASS wndclass;
|
||||||
|
@ -144,13 +289,14 @@ int main(int argc, char **argv) {
|
||||||
printf("...rect is: %ld, %ld, %ld, %ld\n", rect.left, rect.top,
|
printf("...rect is: %ld, %ld, %ld, %ld\n", rect.left, rect.top,
|
||||||
rect.right, rect.bottom);
|
rect.right, rect.bottom);
|
||||||
|
|
||||||
|
#if 0
|
||||||
// Enable non-blocking, character-at-a-time console I/O.
|
// Enable non-blocking, character-at-a-time console I/O.
|
||||||
// win_nonblock_read_stdin() expects this behavior.
|
// win_nonblock_read_stdin() expects this behavior.
|
||||||
DWORD mode;
|
DWORD mode;
|
||||||
GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &mode);
|
GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &mode);
|
||||||
mode &= ~ENABLE_LINE_INPUT;
|
mode &= ~ENABLE_LINE_INPUT;
|
||||||
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode);
|
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode);
|
||||||
|
#endif
|
||||||
|
|
||||||
hook = SetWindowsHookEx(WH_KEYBOARD_LL, win_ll_keyboard, NULL, 0);
|
hook = SetWindowsHookEx(WH_KEYBOARD_LL, win_ll_keyboard, NULL, 0);
|
||||||
|
|
||||||
|
@ -160,6 +306,7 @@ int main(int argc, char **argv) {
|
||||||
UnhookWindowsHookEx(hook);
|
UnhookWindowsHookEx(hook);
|
||||||
UnregisterClass(wndclass.lpszClassName,GetModuleHandle(NULL));
|
UnregisterClass(wndclass.lpszClassName,GetModuleHandle(NULL));
|
||||||
|
|
||||||
|
|
||||||
gsportshut();
|
gsportshut();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -484,8 +484,8 @@ void x_get_kimage(Kimage *kimage_ptr) {
|
||||||
kimage_ptr->dev_handle = NULL;
|
kimage_ptr->dev_handle = NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
printf("kim: %p, dev:%p data: %p, size: %08x\n", kimage_ptr,
|
//printf("kim: %p, dev:%p data: %p, size: %08x\n", kimage_ptr,
|
||||||
kimage_ptr->dev_handle, kimage_ptr->data_ptr, size);
|
// kimage_ptr->dev_handle, kimage_ptr->data_ptr, size);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user