mirror of
https://github.com/digarok/gsplus.git
synced 2024-11-24 06:34:02 +00:00
move readline code to separate file.
This commit is contained in:
parent
964293a3b8
commit
66fbd7f677
@ -48,7 +48,7 @@ option(WITH_HOST_FST "Enable host fst support" ON)
|
||||
option(TOGGLE_STATUS "Enable F10 Toggle Status support (win32/x11)" OFF)
|
||||
option(WITH_RAWNET "Enable Uthernet emulation" OFF)
|
||||
option(WITH_ATBRIDGE "Enable AT Bridge" OFF)
|
||||
|
||||
set(READLINE "NONE" CACHE STRING "Readline library (NONE, READLINE, LIBEDIT")
|
||||
|
||||
set(generated_headers 8inst_c.h 16inst_c.h 8inst_s.h 16inst_s.h size_c.h size_s.h 8size_s.h 16size_s.h)
|
||||
add_custom_command(
|
||||
@ -142,6 +142,8 @@ SET_SOURCE_FILES_PROPERTIES(
|
||||
MACOSX_PACKAGE_LOCATION Resources
|
||||
)
|
||||
|
||||
|
||||
|
||||
if(APPLE)
|
||||
add_custom_command(TARGET GSplus POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
@ -152,6 +154,16 @@ if(APPLE)
|
||||
endif()
|
||||
# SET_SOURCE_FILES_PROPERTIES(vmnet_helper PROPERTIES MACOSX_PACKAGE_LOCATION MacOS)
|
||||
|
||||
add_library(x_readline readline.c)
|
||||
if(READLINE MATCHES "READLINE")
|
||||
target_compile_definitions(x_readline PRIVATE USE_READLINE)
|
||||
target_link_libraries(x_readline PUBLIC history readline)
|
||||
elseif(READLINE MATCHES "LIBEDIT")
|
||||
target_compile_definitions(x_readline PRIVATE USE_LIBEDIT)
|
||||
target_link_libraries(x_readline PUBLIC edit)
|
||||
endif()
|
||||
|
||||
target_link_libraries(GSplus x_readline)
|
||||
|
||||
if (WITH_RAWNET)
|
||||
target_link_libraries(GSplus rawnet)
|
||||
|
@ -16,7 +16,7 @@
|
||||
#include "disasm.h"
|
||||
|
||||
|
||||
|
||||
extern char *x_readline(const char *prompt);
|
||||
|
||||
extern int g_fullscreen;
|
||||
extern int g_config_control_panel;
|
||||
@ -865,31 +865,13 @@ command:
|
||||
*/
|
||||
}
|
||||
|
||||
char *readline(const char *prompt) {
|
||||
static char buffer[1024];
|
||||
fputs(prompt, stdout);
|
||||
fflush(stdout);
|
||||
enum {
|
||||
MODE_NORMAL,
|
||||
MODE_ASSEMBER
|
||||
};
|
||||
|
||||
for(;;) {
|
||||
int ok = read(STDIN_FILENO, buffer, sizeof(buffer)-1);
|
||||
if (ok < 0) {
|
||||
if (ok == EINTR) continue;
|
||||
return NULL;
|
||||
}
|
||||
if (ok == 0) return NULL;
|
||||
while (ok) {
|
||||
char c = buffer[ok-1];
|
||||
if (c == ' ' || c == '\r' || c == '\n') {
|
||||
--ok;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
buffer[ok] = 0;
|
||||
static int g_debugger_mode = MODE_NORMAL;
|
||||
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
|
||||
int debug_shell(int code) {
|
||||
int c;
|
||||
@ -923,7 +905,7 @@ int debug_shell(int code) {
|
||||
do_list(engine.kpc, &psr, 1);
|
||||
|
||||
for(;;) {
|
||||
cp = readline("> ");
|
||||
cp = x_readline("> ");
|
||||
if (!cp) return 0;
|
||||
if (!*cp) continue;
|
||||
c = parse_command(cp);
|
||||
|
164
src/readline.c
Normal file
164
src/readline.c
Normal file
@ -0,0 +1,164 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(USE_LIBEDIT)
|
||||
|
||||
#include <histedit.h>
|
||||
|
||||
|
||||
/* BSD libedit support */
|
||||
EditLine *el = NULL;
|
||||
History *hist = NULL;
|
||||
HistEvent ev;
|
||||
|
||||
static const char *el_prompt = NULL;
|
||||
static char *prompt_fn(EditLine *el) {
|
||||
return el_prompt ? (char *)el_prompt : "";
|
||||
}
|
||||
|
||||
char *x_readline(const char *prompt) {
|
||||
static char buffer[1024];
|
||||
int ok = 0;
|
||||
const char *cp;
|
||||
|
||||
if (!el) {
|
||||
hist = history_init();
|
||||
history(hist, &ev, H_SETSIZE, 50);
|
||||
history(hist, &ev, H_SETUNIQUE, 1);
|
||||
|
||||
el = el_init("GS+", stdin, stdout, stderr);
|
||||
el_set(el, EL_EDITOR, "emacs");
|
||||
el_set(el, EL_BIND, "-e", NULL, NULL, NULL);
|
||||
el_set(el, EL_HIST, history, hist);
|
||||
el_set(el, EL_PROMPT, prompt_fn);
|
||||
el_set(el, EL_SIGNAL, 1);
|
||||
el_source(el, NULL);
|
||||
}
|
||||
|
||||
el_prompt = prompt;
|
||||
cp = el_gets(el, &ok);
|
||||
el_prompt = NULL;
|
||||
if (ok <= 0) return NULL;
|
||||
if (ok > sizeof(buffer) - 1) return "";
|
||||
|
||||
|
||||
memcpy(buffer, cp, ok);
|
||||
while (ok) {
|
||||
unsigned c = buffer[ok-1];
|
||||
if (c == ' ' || c == '\r' || c == '\n') {
|
||||
--ok;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
buffer[ok] = 0;
|
||||
|
||||
if (*buffer)
|
||||
history(hist, &ev, H_ENTER, buffer);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void x_readline_end(void) {
|
||||
if (el) {
|
||||
el_end(el);
|
||||
el = NULL;
|
||||
}
|
||||
if (hist) {
|
||||
history_end(hist);
|
||||
hist = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#elif defined(USE_READLINE)
|
||||
/* GNU Readline support */
|
||||
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
|
||||
static int readline_init = 0;
|
||||
/* suppress tab completion, which defaults to filenames */
|
||||
static char **rl_acf(const char* text, int start, int end) {
|
||||
return NULL;
|
||||
}
|
||||
char *x_readline(const char *prompt) {
|
||||
static char buffer[1024];
|
||||
|
||||
char *cp;
|
||||
int ok;
|
||||
|
||||
if (!readline_init) {
|
||||
rl_readline_name = "GS+";
|
||||
rl_attempted_completion_function = rl_acf;
|
||||
|
||||
using_history();
|
||||
stifle_history(50);
|
||||
|
||||
readline_init = 1;
|
||||
}
|
||||
|
||||
char *cp = readline(prompt);
|
||||
if (!cp) return NULL;
|
||||
ok = strlen(cp);
|
||||
if (ok > sizeof(buffer1) - 1) {
|
||||
free(cp);
|
||||
return "";
|
||||
}
|
||||
memcpy(buffer, cp, ok);
|
||||
while (ok) {
|
||||
unsigned c = buffer[ok-1];
|
||||
if (c == ' ' || c == '\r' || c == '\n') {
|
||||
--ok;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
buffer[ok] = 0;
|
||||
free(cp);
|
||||
|
||||
/* append to history, but only if unique from prev. entry */
|
||||
if (*buffer) {
|
||||
HIST_ENTRY *h = history_get(history_length-1);
|
||||
if (h == NULL || strcmp(buffer, h->line))
|
||||
add_history(buffer);
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void x_readline_end(void) {
|
||||
}
|
||||
#else
|
||||
|
||||
char *x_readline(const char *prompt) {
|
||||
static char buffer[1024];
|
||||
fputs(prompt, stdout);
|
||||
fflush(stdout);
|
||||
|
||||
for(;;) {
|
||||
int ok = read(STDIN_FILENO, buffer, sizeof(buffer)-1);
|
||||
if (ok < 0) {
|
||||
if (ok == EINTR) continue;
|
||||
return NULL;
|
||||
}
|
||||
if (ok == 0) return NULL;
|
||||
while (ok) {
|
||||
unsigned c = buffer[ok-1];
|
||||
if (c == ' ' || c == '\r' || c == '\n') {
|
||||
--ok;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
buffer[ok] = 0;
|
||||
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
|
||||
void x_readline_end(void) {
|
||||
|
||||
}
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user