Embedded console into REPL

This commit is contained in:
John Alanbrook 2022-12-19 18:16:51 +00:00
parent 0f90215b7a
commit 9bdb7ce9cb
5 changed files with 43 additions and 3 deletions

View file

@ -11,7 +11,7 @@ PTYPE != uname -m
# DBG=0,1 --- build with debugging symbols and logging # DBG=0,1 --- build with debugging symbols and logging
# ED=0,1 --- build with or without editor # ED=0,1 --- build with or without editor
NAME = yugine
ifeq ($(DBG), 1) ifeq ($(DBG), 1)
@ -65,12 +65,15 @@ ifeq ($(OS), WIN32)
LINKER_FLAGS = $(QFLAGS) -static LINKER_FLAGS = $(QFLAGS) -static
ELIBS = engine ucrt yughc portaudio glfw3 opengl32 gdi32 ws2_32 ole32 winmm setupapi m ELIBS = engine ucrt yughc portaudio glfw3 opengl32 gdi32 ws2_32 ole32 winmm setupapi m
CLIBS = CLIBS =
EXT = .exe
else else
LINKER_FLAGS = $(QFLAGS) -L/usr/local/lib LINKER_FLAGS = $(QFLAGS) -L/usr/local/lib
ELIBS = engine pthread yughc portaudio asound glfw3 c m dl ELIBS = engine pthread yughc portaudio asound glfw3 c m dl
CLIBS = CLIBS =
endif endif
NAME = yugine$(EXT)
ELIBS != $(call prefix, $(ELIBS), -l) ELIBS != $(call prefix, $(ELIBS), -l)
CLIBS != $(call prefix, $(CLIBS), -l); CLIBS != $(call prefix, $(CLIBS), -l);

View file

@ -6,6 +6,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <stdio.h>
#define logLevel 0 #define logLevel 0
@ -15,6 +16,16 @@ char *catstr[] = {"ENGINE", "SCRIPT"};
FILE *logfile = NULL; FILE *logfile = NULL;
#define CONSOLE_BUF 1024*1024/* 1MB */
char con[CONSOLE_BUF] = {'\0'};
int coni = 0;
char lastlog[ERROR_BUFFER] = {'\0'};
const char *console() {
return console;
}
void mYughLog(int category, int priority, int line, const char *file, const char *message, ...) void mYughLog(int category, int priority, int line, const char *file, const char *message, ...)
{ {
if (priority >= logLevel) { if (priority >= logLevel) {
@ -39,6 +50,10 @@ void mYughLog(int category, int priority, int line, const char *file, const char
fflush(logfile); fflush(logfile);
} }
snprintf(con+coni, CONSOLE_BUF-coni, "%s\n", buffer);
coni += strlen(buffer);
snprintf(lastlog, ERROR_BUFFER, "%s", buffer);
} }
} }

View file

@ -10,6 +10,10 @@
#define LOG_ERROR 2 #define LOG_ERROR 2
#define LOG_CRITICAL 3 #define LOG_CRITICAL 3
extern char con[];
extern int coni;
extern char lastlog[];
#define YughLog(cat, pri, msg, ...) mYughLog(cat, pri, __LINE__, __FILE__, msg, ##__VA_ARGS__) #define YughLog(cat, pri, msg, ...) mYughLog(cat, pri, __LINE__, __FILE__, msg, ##__VA_ARGS__)
#define YughInfo(msg, ...) mYughLog(0, 0, __LINE__, __FILE__, msg, ##__VA_ARGS__); #define YughInfo(msg, ...) mYughLog(0, 0, __LINE__, __FILE__, msg, ##__VA_ARGS__);
#define YughWarn(msg, ...) mYughLog(0, 1, __LINE__, __FILE__, msg, ##__VA_ARGS__); #define YughWarn(msg, ...) mYughLog(0, 1, __LINE__, __FILE__, msg, ##__VA_ARGS__);
@ -25,4 +29,6 @@ int TestSDLError(int sdlErr);
void log_setfile(char *file); void log_setfile(char *file);
void log_cat(FILE *f); void log_cat(FILE *f);
const char *console();
#endif #endif

View file

@ -40,6 +40,8 @@ struct gameproject *cur_project = NULL;
struct vec *projects = NULL; struct vec *projects = NULL;
static char setpath[MAXPATH]; static char setpath[MAXPATH];
// Menus // Menus
// TODO: Pack this into a bitfield // TODO: Pack this into a bitfield
static struct editorVars editor = {0}; static struct editorVars editor = {0};
@ -577,9 +579,13 @@ void editor_project_gui() {
*/ */
nk_layout_row_dynamic(ctx, 300, 1);
//nk_text(ctx, con, coni, NK_TEXT_ALIGN_TOP|NK_TEXT_ALIGN_LEFT);
nk_edit_string_zero_terminated(ctx, NK_EDIT_MULTILINE|NK_EDIT_READ_ONLY|NK_EDIT_GOTO_END_ON_ACTIVATE, lastlog, ERROR_BUFFER, NULL);
//nuke_label(lastlog);
static char buffer[512] = {'\0'}; static char buffer[512] = {'\0'};
nk_layout_row_dynamic(ctx, 25, 2); nk_layout_row_dynamic(ctx, 25, 2);
nk_flags active = nk_edit_string_zero_terminated(ctx, NK_EDIT_BOX | NK_EDIT_SIG_ENTER, buffer, 512-1, nk_filter_ascii); nk_flags active = nk_edit_string_zero_terminated(ctx, NK_EDIT_BOX | NK_EDIT_SIG_ENTER|NK_EDIT_AUTO_SELECT, buffer, 512-1, nk_filter_ascii);
if (active & NK_EDIT_COMMITED || nuke_btn("Submit")) { if (active & NK_EDIT_COMMITED || nuke_btn("Submit")) {
char bigbuf[1024]; char bigbuf[1024];
snprintf(bigbuf, 1024, "(loginfo %s)", buffer); snprintf(bigbuf, 1024, "(loginfo %s)", buffer);

View file

@ -31,6 +31,13 @@ void script_init() {
} }
void script_run(const char *script) { void script_run(const char *script) {
s7_pointer old_port = s7_set_current_error_port(s7, s7_open_output_string(s7));
int gc_loc = -1;
if (old_port != s7_nil(s7)) gc_loc = s7_gc_protect(s7, old_port);
s7_eval_c_string(s7, script); s7_eval_c_string(s7, script);
const char *errmsg = s7_get_output_string(s7, s7_current_error_port(s7)); const char *errmsg = s7_get_output_string(s7, s7_current_error_port(s7));
@ -38,7 +45,10 @@ void script_run(const char *script) {
if (errmsg && (*errmsg)) if (errmsg && (*errmsg))
mYughLog(1, 2, 0, "script", "Scripting error: %s", errmsg); mYughLog(1, 2, 0, "script", "Scripting error: %s", errmsg);
s7_flush_output_port(s7, s7_current_error_port(s7)); s7_close_output_port(s7, s7_current_error_port(s7));
s7_set_current_error_port(s7, old_port);
if (gc_loc != -1) s7_gc_unprotect_at(s7, gc_loc);
} }
int script_dofile(const char *file) { int script_dofile(const char *file) {