Commit | Line | Data |
---|---|---|
e81d98ec DH |
1 | /* Copyright (C) 1995,1996,1997,2000,2001 Free Software Foundation, Inc. |
2 | * | |
73be1d9e MV |
3 | * This library is free software; you can redistribute it and/or |
4 | * modify it under the terms of the GNU Lesser General Public | |
5 | * License as published by the Free Software Foundation; either | |
6 | * version 2.1 of the License, or (at your option) any later version. | |
ee2a8b9b | 7 | * |
73be1d9e MV |
8 | * This library is distributed in the hope that it will be useful, |
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
11 | * Lesser General Public License for more details. | |
ee2a8b9b | 12 | * |
73be1d9e MV |
13 | * You should have received a copy of the GNU Lesser General Public |
14 | * License along with this library; if not, write to the Free Software | |
15 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
16 | */ | |
ee2a8b9b JB |
17 | \f |
18 | ||
19 | /* Guile high level (gh_) interface, initialization-related stuff */ | |
20 | ||
21 | #include <stdio.h> | |
22 | ||
a0599745 | 23 | #include "libguile/gh.h" |
ee2a8b9b JB |
24 | |
25 | typedef void (*main_prog_t) (int argc, char **argv); | |
26 | typedef void (*repl_prog_t) (int argc, char **argv); | |
27 | ||
28 | /* This function takes care of all real GH initialization. Since it's | |
29 | called by scm_boot_guile, it can safely work with heap objects, or | |
30 | call functions that do so. */ | |
31 | static void | |
32 | gh_launch_pad (void *closure, int argc, char **argv) | |
33 | { | |
34 | main_prog_t c_main_prog = (main_prog_t) closure; | |
35 | ||
ee2a8b9b JB |
36 | c_main_prog (argc, argv); |
37 | exit (0); | |
38 | } | |
39 | ||
ee2a8b9b JB |
40 | /* starts up the Scheme interpreter, and stays in it. c_main_prog() |
41 | is the address of the user's main program, since gh_enter() never | |
42 | returns. */ | |
43 | void | |
44 | gh_enter (int argc, char *argv[], main_prog_t c_main_prog) | |
45 | { | |
524dfbcc | 46 | scm_boot_guile (argc, argv, gh_launch_pad, (void *) c_main_prog); |
ee2a8b9b JB |
47 | /* never returns */ |
48 | } | |
49 | ||
50 | /* offer a REPL to the C programmer; for now I just invoke the ice-9 | |
51 | REPL that is written in Scheme */ | |
52 | void | |
ef5d3ae1 | 53 | gh_repl (int argc, char *argv[]) |
ee2a8b9b | 54 | { |
ef5d3ae1 MG |
55 | /* gh_eval_str ("(top-repl)"); */ |
56 | scm_shell (argc, argv); | |
ee2a8b9b JB |
57 | } |
58 | ||
59 | /* libguile programmers need exception handling mechanisms; here is | |
60 | the recommended way of doing it with the gh_ interface */ | |
61 | ||
62 | /* gh_catch() -- set up an exception handler for a particular type of | |
63 | error (or any thrown error if tag is SCM_BOOL_T); see | |
64 | ../libguile/throw.c for the comments explaining scm_internal_catch */ | |
65 | SCM | |
92c2555f MV |
66 | gh_catch (SCM tag, scm_t_catch_body body, void *body_data, |
67 | scm_t_catch_handler handler, void *handler_data) | |
ee2a8b9b JB |
68 | { |
69 | return scm_internal_catch (tag, body, body_data, handler, handler_data); | |
70 | } | |
71 | ||
72 | SCM | |
e81d98ec | 73 | gh_standard_handler (void *data SCM_UNUSED, SCM tag, SCM throw_args SCM_UNUSED) |
ee2a8b9b JB |
74 | { |
75 | fprintf (stderr, "\nJust got an error; tag is\n "); | |
76 | scm_display (tag, scm_current_output_port ()); | |
77 | scm_newline (scm_current_output_port ()); | |
78 | scm_newline (scm_current_output_port ()); | |
79 | ||
80 | return SCM_BOOL_F; | |
81 | } | |
89e00824 ML |
82 | |
83 | /* | |
84 | Local Variables: | |
85 | c-file-style: "gnu" | |
86 | End: | |
87 | */ |