From 208ce325d26d4393bd69e7d491891a25c4f5461a Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Sat, 24 Jan 2015 01:54:52 +0100 Subject: [PATCH hurd 05/11] bootshell: add facility to load embedded scripts * bootshell/scheme.c (scheme_load_mem): New function. --- bootshell/scheme-private.h | 3 +++ bootshell/scheme.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/bootshell/scheme-private.h b/bootshell/scheme-private.h index 3395328..bb4ebd6 100644 --- a/bootshell/scheme-private.h +++ b/bootshell/scheme-private.h @@ -36,6 +36,9 @@ typedef struct port { char *start; char *past_the_end; char *curr; +#if SHOW_ERROR_LINE + const char *name; +#endif } string; } rep; } port; diff --git a/bootshell/scheme.c b/bootshell/scheme.c index 99f9106..bdeb004 100644 --- a/bootshell/scheme.c +++ b/bootshell/scheme.c @@ -2312,6 +2312,18 @@ static pointer _Error_1(scheme *sc, const char *s, pointer a) { snprintf(sbuf, STRBUFFSIZE, "(%s : %i) %s", fname, ln, s); str = (const char*)sbuf; + } else if (sc->load_stack[sc->file_i].kind & port_string) { + const char *start = sc->load_stack[sc->file_i].rep.string.start; + const char *curr = sc->load_stack[sc->file_i].rep.string.curr; + const char *name = sc->load_stack[sc->file_i].rep.string.name; + + /* should never happen */ + if (!name) name = ""; + + /* we started from 0 */ + snprintf(sbuf, STRBUFFSIZE, "(%s offset %i) %s", name, curr-start, s); + + str = (const char*)sbuf; } #endif @@ -5049,3 +5061,31 @@ Local variables: c-file-style: "k&r" End: */ + +/* Like scheme_load_string, but does not rely on a terminating zero. */ +void +scheme_load_mem (scheme *sc, const char *cmd_start, const char *cmd_end, + const char *name) +{ + dump_stack_reset(sc); + sc->envir = sc->global_env; + sc->file_i=0; + sc->load_stack[0].kind=port_input|port_string; + /* This func respects const */ + sc->load_stack[0].rep.string.start=(char*) cmd_start; + sc->load_stack[0].rep.string.past_the_end=(char*) cmd_end; + sc->load_stack[0].rep.string.curr=(char*) cmd_start; +#if SHOW_ERROR_LINE + sc->load_stack[0].rep.string.name = name; +#endif + sc->loadport=mk_port(sc,sc->load_stack); + sc->retcode=0; + sc->interactive_repl=0; + sc->inport=sc->loadport; + sc->args = mk_integer(sc,sc->file_i); + Eval_Cycle(sc, OP_T0LVL); + typeflag(sc->loadport)=T_ATOM; + if(sc->retcode==0) { + sc->retcode=sc->nesting!=0; + } +} -- 2.1.4