summaryrefslogtreecommitdiff
path: root/debian/patches/bootshell0005-bootshell-add-facility-to-load-embedded-scripts.patch
blob: 32bf83548e3b81ffa4b8a5ca24103d912b0d258c (plain)
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
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 = "<unknown>";
+
+       /* 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