Remove trailing whitespace
[bpt/guile.git] / libguile / init.c
CommitLineData
e2c2a699 1/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2002, 2003, 2004, 2006, 2009, 2010 Free Software Foundation, Inc.
0f2d19dd 2 *
73be1d9e 3 * This library is free software; you can redistribute it and/or
53befeb7
NJ
4 * modify it under the terms of the GNU Lesser General Public License
5 * as published by the Free Software Foundation; either version 3 of
6 * the License, or (at your option) any later version.
0f2d19dd 7 *
53befeb7
NJ
8 * This library is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
73be1d9e
MV
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
0f2d19dd 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
53befeb7
NJ
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 * 02110-1301 USA
73be1d9e 17 */
1bbd0b84 18
1bbd0b84 19
0f2d19dd 20\f
bdca1083
JB
21/* Include the headers for just about everything.
22 We call all their initialization functions. */
0f2d19dd 23
dbb605f5 24#ifdef HAVE_CONFIG_H
6f0250f7
RB
25# include <config.h>
26#endif
27
0f2d19dd 28#include <stdio.h>
0a48b624
MV
29#include <sys/stat.h>
30#include <fcntl.h>
05be5e7c 31#include <gmp.h>
0a48b624 32
a0599745 33#include "libguile/_scm.h"
0f2d19dd 34
20e6290e 35/* Everybody has an init function. */
a0599745
MD
36#include "libguile/alist.h"
37#include "libguile/arbiters.h"
38#include "libguile/async.h"
39#include "libguile/backtrace.h"
cf396142 40#include "libguile/bitvectors.h"
a0599745 41#include "libguile/boolean.h"
cfb4702f 42#include "libguile/bytevectors.h"
a0599745 43#include "libguile/chars.h"
b9c100d0 44#include "libguile/control.h"
a0599745 45#include "libguile/continuations.h"
a0599745 46#include "libguile/debug.h"
6b815f1a 47#ifdef GUILE_DEBUG_MALLOC
a0599745 48#include "libguile/debug-malloc.h"
6b815f1a 49#endif
388bebbc 50#include "libguile/deprecation.h"
a0599745
MD
51#include "libguile/dynl.h"
52#include "libguile/dynwind.h"
53#include "libguile/eq.h"
54#include "libguile/error.h"
55#include "libguile/eval.h"
56#include "libguile/evalext.h"
dc3e203e 57#include "libguile/expand.h"
a0599745
MD
58#include "libguile/feature.h"
59#include "libguile/filesys.h"
60#include "libguile/fluids.h"
61#include "libguile/fports.h"
a6029b97 62#include "libguile/frames.h"
a0599745
MD
63#include "libguile/gc.h"
64#include "libguile/gdbint.h"
1030b450 65#include "libguile/generalized-arrays.h"
f332e957 66#include "libguile/generalized-vectors.h"
508ded1c 67#include "libguile/goops.h"
a0599745
MD
68#include "libguile/gsubr.h"
69#include "libguile/hash.h"
70#include "libguile/hashtab.h"
2b9c8690 71#include "libguile/hooks.h"
b89c4943 72#include "libguile/gettext.h"
756e8a3a 73#include "libguile/i18n.h"
a6029b97 74#include "libguile/instructions.h"
a0599745 75#include "libguile/iselect.h"
a0599745
MD
76#include "libguile/ioext.h"
77#include "libguile/keywords.h"
a0599745
MD
78#include "libguile/list.h"
79#include "libguile/load.h"
80#include "libguile/macros.h"
81#include "libguile/mallocs.h"
b7742c6b 82#include "libguile/memoize.h"
a0599745
MD
83#include "libguile/modules.h"
84#include "libguile/net_db.h"
85#include "libguile/numbers.h"
a6029b97 86#include "libguile/objcodes.h"
a0599745
MD
87#include "libguile/objprop.h"
88#include "libguile/options.h"
89#include "libguile/pairs.h"
90#include "libguile/ports.h"
91#include "libguile/posix.h"
f255378e 92#ifdef HAVE_REGCOMP
a0599745 93#include "libguile/regex-posix.h"
f255378e 94#endif
a0599745
MD
95#include "libguile/print.h"
96#include "libguile/procprop.h"
97#include "libguile/procs.h"
a6029b97 98#include "libguile/programs.h"
7b893819 99#include "libguile/promises.h"
b4255788 100#include "libguile/properties.h"
5d1b3b2d 101#include "libguile/array-map.h"
a0599745 102#include "libguile/random.h"
fd937ecb 103#include "libguile/rdelim.h"
a0599745 104#include "libguile/read.h"
b0e5fd8c 105#include "libguile/rw.h"
a0599745
MD
106#include "libguile/scmsigs.h"
107#include "libguile/script.h"
108#include "libguile/simpos.h"
109#include "libguile/smob.h"
110#include "libguile/socket.h"
111#include "libguile/sort.h"
112#include "libguile/srcprop.h"
113#include "libguile/stackchk.h"
114#include "libguile/stacks.h"
115#include "libguile/stime.h"
116#include "libguile/strings.h"
ad45f6b3
MV
117#include "libguile/srfi-13.h"
118#include "libguile/srfi-14.h"
a0599745
MD
119#include "libguile/strorder.h"
120#include "libguile/strports.h"
121#include "libguile/struct.h"
122#include "libguile/symbols.h"
a0599745 123#include "libguile/throw.h"
2fa901a5 124#include "libguile/arrays.h"
0f458a37 125#include "libguile/trees.h"
ce212434 126#include "libguile/values.h"
a0599745
MD
127#include "libguile/variable.h"
128#include "libguile/vectors.h"
129#include "libguile/version.h"
a6029b97 130#include "libguile/vm.h"
a0599745
MD
131#include "libguile/vports.h"
132#include "libguile/weaks.h"
133#include "libguile/guardians.h"
1be6b49c 134#include "libguile/extensions.h"
476b894c 135#include "libguile/uniform.h"
358ebb0b 136#include "libguile/srfi-4.h"
8672c728 137#include "libguile/discouraged.h"
9b31f1c1 138#include "libguile/deprecated.h"
20e6290e 139
a0599745 140#include "libguile/init.h"
22fc179a 141#include "libguile/private-options.h"
a8be22fe 142
95b88819
GH
143#ifdef HAVE_STRING_H
144#include <string.h>
145#endif
146#ifdef HAVE_UNISTD_H
147#include <unistd.h>
148#endif
0f2d19dd 149\f
0f2d19dd
JB
150
151
0f2d19dd
JB
152#if 0
153static char remsg[] = "remove\n#define ", addmsg[] = "add\n#define ";
154
1cc91f1b 155
0f2d19dd 156static void
34d19ef6 157fixconfig (char *s1, char *s2, int s)
0f2d19dd
JB
158{
159 fputs (s1, stderr);
160 fputs (s2, stderr);
161 fputs ("\nin ", stderr);
162 fputs (s ? "setjump" : "scmfig", stderr);
163 fputs (".h and recompile scm\n", stderr);
164 exit (1);
165}
166
167
0f2d19dd 168static void
1bbd0b84 169check_config (void)
0f2d19dd 170{
1be6b49c 171 size_t j;
0f2d19dd
JB
172
173 j = HEAP_SEG_SIZE;
174 if (HEAP_SEG_SIZE != j)
175 fixconfig ("reduce", "size of HEAP_SEG_SIZE", 0);
176
90a61c31 177#if SCM_STACK_GROWS_UP
0f2d19dd
JB
178 if (((SCM_STACKITEM *) & j - stack_start_ptr) < 0)
179 fixconfig (remsg, "SCM_STACK_GROWS_UP", 1);
180#else
181 if ((stack_start_ptr - (SCM_STACKITEM *) & j) < 0)
182 fixconfig (addmsg, "SCM_STACK_GROWS_UP", 1);
183#endif
184}
185#endif
186
187
188\f
1cdaaafb
JB
189/* initializing standard and current I/O ports */
190
19b27fa2
GH
191typedef struct
192{
193 int fdes;
194 char *mode;
195 char *name;
196} stream_body_data;
197
198/* proc to be called in scope of exception handler stream_handler. */
ee149d03 199static SCM
19b27fa2 200stream_body (void *data)
ee149d03 201{
19b27fa2
GH
202 stream_body_data *body_data = (stream_body_data *) data;
203 SCM port = scm_fdes_to_port (body_data->fdes, body_data->mode,
cc95e00a 204 scm_from_locale_string (body_data->name));
0a48b624 205
19b27fa2
GH
206 SCM_REVEALED (port) = 1;
207 return port;
208}
209
210/* exception handler for stream_body. */
211static SCM
e81d98ec
DH
212stream_handler (void *data SCM_UNUSED,
213 SCM tag SCM_UNUSED,
214 SCM throw_args SCM_UNUSED)
19b27fa2
GH
215{
216 return SCM_BOOL_F;
217}
218
219/* Convert a file descriptor to a port, using scm_fdes_to_port.
220 - NAME is a C string, not a Guile string
221 - set the revealed count for FILE's file descriptor to 1, so
222 that fdes won't be closed when the port object is GC'd.
223 - catch exceptions: allow Guile to be able to start up even
70df8af6
GH
224 if it has been handed bogus stdin/stdout/stderr. replace the
225 bad ports with void ports. */
19b27fa2
GH
226static SCM
227scm_standard_stream_to_port (int fdes, char *mode, char *name)
228{
229 SCM port;
230 stream_body_data body_data;
231
232 body_data.fdes = fdes;
233 body_data.mode = mode;
234 body_data.name = name;
235 port = scm_internal_catch (SCM_BOOL_T, stream_body, &body_data,
236 stream_handler, NULL);
7888309b 237 if (scm_is_false (port))
70df8af6 238 port = scm_void_port (mode);
19b27fa2 239 return port;
ee149d03
JB
240}
241
242/* Create standard ports from stdin, stdout, and stderr. */
1cdaaafb
JB
243static void
244scm_init_standard_ports ()
245{
94754080
JB
246 /* From the SCSH manual:
247
248 It can be useful to turn I/O buffering off in some cases, for
249 example when an I/O stream is to be shared by multiple
250 subprocesses. For this reason, scsh allocates an unbuffered port
251 for file descriptor 0 at start-up time.
252
253 Because shells frequently share stdin with subprocesses, if the
254 shell does buffered reads, it might ``steal'' input intended for
255 a subprocess. For this reason, all shells, including sh, csh,
256 and scsh, read stdin unbuffered. Applications that can tolerate
257 buffered input on stdin can reset \ex{(current-input-port)} to
258 block buffering for higher performance. */
ee149d03 259
9de87eea
MV
260 scm_set_current_input_port
261 (scm_standard_stream_to_port (0,
262 isatty (0) ? "r0" : "r",
263 "standard input"));
264 scm_set_current_output_port
265 (scm_standard_stream_to_port (1,
266 isatty (1) ? "w0" : "w",
267 "standard output"));
268 scm_set_current_error_port
269 (scm_standard_stream_to_port (2,
270 isatty (2) ? "w0" : "w",
271 "standard error"));
1cdaaafb
JB
272}
273
274
275\f
bdca1083
JB
276/* Loading the startup Scheme files. */
277
278/* The boot code "ice-9/boot-9" is only loaded by scm_boot_guile when
279 this is false. The unexec code uses this, to keep ice_9 from being
280 loaded into dumped guile executables. */
281int scm_ice_9_already_loaded = 0;
282
283void
284scm_load_startup_files ()
285{
286 /* We want a path only containing directories from GUILE_LOAD_PATH,
287 SCM_SITE_DIR and SCM_LIBRARY_DIR when searching for the site init
288 file, so we do this before loading Ice-9. */
cc95e00a
MV
289 SCM init_path =
290 scm_sys_search_load_path (scm_from_locale_string ("init.scm"));
bdca1083
JB
291
292 /* Load Ice-9. */
293 if (!scm_ice_9_already_loaded)
b505860d 294 {
0fb81f95 295 scm_c_primitive_load_path ("ice-9/boot-9");
bdca1083 296
b505860d 297 /* Load the init.scm file. */
7888309b 298 if (scm_is_true (init_path))
b505860d 299 scm_primitive_load (init_path);
b505860d 300 }
bdca1083
JB
301}
302
bdca1083
JB
303\f
304/* The main init code. */
305
0f2d19dd
JB
306#ifdef _UNICOS
307typedef int setjmp_type;
308#else
309typedef long setjmp_type;
310#endif
311
816a6f06
JB
312/* All the data needed to invoke the main function. */
313struct main_func_closure
314{
315 /* the function to call */
1bbd0b84 316 void (*main_func)(void *closure, int argc, char **argv);
816a6f06
JB
317 void *closure; /* dummy data to pass it */
318 int argc;
319 char **argv; /* the argument list it should receive */
320};
321
9de87eea 322static void *invoke_main_func(void *body_data);
1cdaaafb
JB
323
324
325/* Fire up the Guile Scheme interpreter.
326
327 Call MAIN_FUNC, passing it CLOSURE, ARGC, and ARGV. MAIN_FUNC
328 should do all the work of the program (initializing other packages,
329 reading user input, etc.) before returning. When MAIN_FUNC
330 returns, call exit (0); this function never returns. If you want
331 some other exit value, MAIN_FUNC may call exit itself.
0f2d19dd 332
1cdaaafb
JB
333 scm_boot_guile arranges for program-arguments to return the strings
334 given by ARGC and ARGV. If MAIN_FUNC modifies ARGC/ARGV, should
335 call scm_set_program_arguments with the final list, so Scheme code
336 will know which arguments have been processed.
c275ddc7 337
816a6f06
JB
338 scm_boot_guile establishes a catch-all catch handler which prints
339 an error message and exits the process. This means that Guile
340 exits in a coherent way when system errors occur and the user isn't
341 prepared to handle it. If the user doesn't like this behavior,
342 they can establish their own universal catcher to shadow this one.
343
1cdaaafb
JB
344 Why must the caller do all the real work from MAIN_FUNC? The
345 garbage collector assumes that all local variables of type SCM will
346 be above scm_boot_guile's stack frame on the stack. If you try to
347 manipulate SCM values after this function returns, it's the luck of
348 the draw whether the GC will be able to find the objects you
349 allocate. So, scm_boot_guile function exits, rather than
350 returning, to discourage people from making that mistake. */
351
352
353void
6e8d25a6 354scm_boot_guile (int argc, char ** argv, void (*main_func) (), void *closure)
c275ddc7 355{
657e7929 356 void *res;
816a6f06 357 struct main_func_closure c;
c275ddc7 358
816a6f06
JB
359 c.main_func = main_func;
360 c.closure = closure;
361 c.argc = argc;
362 c.argv = argv;
363
657e7929
MV
364 res = scm_with_guile (invoke_main_func, &c);
365
366 /* If the caller doesn't want this, they should exit from main_func
367 themselves.
368 */
369 if (res == NULL)
370 exit (EXIT_FAILURE);
371 else
372 exit (0);
c275ddc7
JB
373}
374
9de87eea
MV
375static void *
376invoke_main_func (void *body_data)
7ad3a978 377{
9de87eea
MV
378 struct main_func_closure *closure = (struct main_func_closure *) body_data;
379
380 scm_set_program_arguments (closure->argc, closure->argv, 0);
381 (*closure->main_func) (closure->closure, closure->argc, closure->argv);
382
383 scm_restore_signals ();
384
385 /* This tick gives any pending
386 * asyncs a chance to run. This must be done after
387 * the call to scm_restore_signals.
388 */
389 SCM_ASYNC_TICK;
390
657e7929
MV
391 /* Indicate success by returning non-NULL.
392 */
393 return (void *)1;
7ad3a978 394}
1cdaaafb 395
9de87eea 396scm_i_pthread_mutex_t scm_i_init_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER;
bf1b9494
MD
397int scm_initialized_p = 0;
398
9de87eea
MV
399static void *
400really_cleanup_for_exit (void *unused)
401{
402 scm_flush_all_ports ();
403 return NULL;
404}
405
76da80e7 406static void
9de87eea
MV
407cleanup_for_exit ()
408{
b87e6d04
HWN
409 if (scm_i_pthread_mutex_trylock (&scm_i_init_mutex) == 0)
410 scm_i_pthread_mutex_unlock (&scm_i_init_mutex);
411 else
412 {
413 fprintf (stderr, "Cannot exit gracefully when init is in progress; aborting.\n");
414 abort ();
415 }
416
9de87eea
MV
417 /* This function might be called in non-guile mode, so we need to
418 enter it temporarily.
419 */
420 scm_with_guile (really_cleanup_for_exit, NULL);
421}
422
423void
424scm_i_init_guile (SCM_STACKITEM *base)
0f2d19dd 425{
7ad3a978
MV
426 if (scm_initialized_p)
427 return;
0f2d19dd 428
7ad3a978
MV
429 if (base == NULL)
430 {
431 fprintf (stderr, "cannot determine stack base!\n");
432 abort ();
433 }
0f2d19dd 434
4ef36fb8
RB
435 if (sizeof (mpz_t) > (3 * sizeof (scm_t_bits)))
436 {
437 fprintf (stderr,
438 "GMP's mpz_t must fit into a double_cell,"
439 "but doesn't seem to here.\n");
440 }
441
c35738c1 442 scm_storage_prehistory ();
562cd1b8
AW
443 scm_threads_prehistory (base); /* requires storage_prehistory */
444 scm_weaks_prehistory (); /* requires storage_prehistory */
6b815f1a 445#ifdef GUILE_DEBUG_MALLOC
7ad3a978 446 scm_debug_malloc_prehistory ();
6b815f1a 447#endif
562cd1b8
AW
448 scm_symbols_prehistory (); /* requires weaks_prehistory */
449 scm_modules_prehistory ();
ce65df9f 450 scm_init_array_handle ();
f3056b42 451 scm_bootstrap_bytevectors (); /* Requires array-handle */
2be89ca1
AW
452 scm_bootstrap_instructions ();
453 scm_bootstrap_objcodes ();
454 scm_bootstrap_programs ();
455 scm_bootstrap_vm ();
ab4779ff 456 scm_register_foreign ();
2be89ca1 457
f3056b42 458 scm_init_strings (); /* Requires array-handle */
ce65df9f 459 scm_init_struct (); /* Requires strings */
4afe4ab4 460 scm_smob_prehistory ();
562cd1b8 461 scm_init_variable ();
8f79d4ed 462 scm_init_continuations (); /* requires smob_prehistory */
de42a0ee 463 scm_init_root (); /* requires continuations */
8f79d4ed 464 scm_init_threads (); /* requires smob_prehistory */
7ad3a978 465 scm_init_gsubr ();
3d7f708f 466 scm_init_thread_procs (); /* requires gsubrs */
85db4a2c 467 scm_init_procprop ();
7ad3a978 468 scm_init_alist ();
8f79d4ed
AW
469 scm_init_arbiters (); /* requires smob_prehistory */
470 scm_init_async (); /* requires smob_prehistory */
7ad3a978
MV
471 scm_init_boolean ();
472 scm_init_chars ();
6b815f1a 473#ifdef GUILE_DEBUG_MALLOC
7ad3a978 474 scm_init_debug_malloc ();
6b815f1a 475#endif
8f79d4ed 476 scm_init_dynwind (); /* requires smob_prehistory */
7ad3a978
MV
477 scm_init_eq ();
478 scm_init_error ();
9de87eea 479 scm_init_fluids ();
3ccee391 480 scm_init_control (); /* requires fluids */
562cd1b8
AW
481 scm_init_feature ();
482 scm_init_backtrace ();
7ad3a978 483 scm_init_fports ();
a98bddfd 484 scm_init_strports ();
b87e6d04 485 scm_init_ports ();
7ad3a978
MV
486 scm_init_hash ();
487 scm_init_hashtab ();
562cd1b8 488 scm_init_deprecation ();
7ad3a978 489 scm_init_objprop ();
8f79d4ed 490 scm_init_promises (); /* requires smob_prehistory */
7ad3a978 491 scm_init_properties ();
56e55ac7 492 scm_init_hooks (); /* Requires smob_prehistory */
562cd1b8 493 scm_init_gc (); /* Requires hooks */
8f79d4ed
AW
494 scm_init_gc_protect_object (); /* requires threads_prehistory */
495 scm_init_gdbint (); /* Requires strports, gc_protect_object */
b89c4943 496 scm_init_gettext ();
7ad3a978 497 scm_init_ioext ();
8f79d4ed 498 scm_init_keywords (); /* Requires smob_prehistory */
7ad3a978 499 scm_init_list ();
8f79d4ed
AW
500 scm_init_macros (); /* Requires smob_prehistory */
501 scm_init_mallocs (); /* Requires smob_prehistory */
502 scm_init_modules (); /* Requires smob_prehistory */
7ad3a978
MV
503 scm_init_numbers ();
504 scm_init_options ();
505 scm_init_pairs ();
52cfc69b 506#ifdef HAVE_POSIX
8f79d4ed 507 scm_init_filesys (); /* Requires smob_prehistory */
7ad3a978 508 scm_init_posix ();
52cfc69b 509#endif
f255378e 510#ifdef HAVE_REGCOMP
8f79d4ed 511 scm_init_regex_posix (); /* Requires smob_prehistory */
f255378e 512#endif
7ad3a978 513 scm_init_procs ();
7ad3a978 514 scm_init_scmsigs ();
52cfc69b 515#ifdef HAVE_NETWORKING
7ad3a978
MV
516 scm_init_net_db ();
517 scm_init_socket ();
52cfc69b 518#endif
7ad3a978 519 scm_init_sort ();
8f79d4ed 520 scm_init_srcprop (); /* requires smob_prehistory */
7ad3a978 521 scm_init_stackchk ();
f45eccff 522
f3056b42
AW
523 scm_init_generalized_arrays ();
524 scm_init_generalized_vectors ();
525 scm_init_vectors (); /* Requires array-handle, */
f45eccff 526 scm_init_uniform ();
f3056b42
AW
527 scm_init_bitvectors (); /* Requires smob_prehistory, array-handle */
528 scm_init_srfi_4 (); /* Requires smob_prehistory, array-handle */
ce65df9f 529 scm_init_arrays (); /* Requires smob_prehistory, array-handle */
f45eccff
AW
530 scm_init_array_map ();
531
8f79d4ed 532 scm_init_frames (); /* Requires smob_prehistory */
aa3f6951 533 scm_init_stacks (); /* Requires strings, struct, frames */
7ad3a978 534 scm_init_symbols ();
ce212434 535 scm_init_values (); /* Requires struct */
7c33806a 536 scm_init_load (); /* Requires strings */
8f79d4ed 537 scm_init_print (); /* Requires strings, struct, smob */
7ad3a978
MV
538 scm_init_read ();
539 scm_init_stime ();
7ad3a978 540 scm_init_strorder ();
ad45f6b3 541 scm_init_srfi_13 ();
8f79d4ed
AW
542 scm_init_srfi_14 (); /* Requires smob_prehistory */
543 scm_init_throw (); /* Requires smob_prehistory */
0f458a37 544 scm_init_trees ();
7ad3a978
MV
545 scm_init_version ();
546 scm_init_weaks ();
8f79d4ed 547 scm_init_guardians (); /* requires smob_prehistory */
7ad3a978 548 scm_init_vports ();
5f161164 549 scm_init_standard_ports (); /* Requires fports */
dc3e203e 550 scm_init_expand (); /* Requires structs */
8f79d4ed
AW
551 scm_init_memoize (); /* Requires smob_prehistory */
552 scm_init_eval (); /* Requires smob_prehistory */
5f161164
AW
553 scm_init_load_path ();
554 scm_init_eval_in_scheme ();
7ad3a978 555 scm_init_evalext ();
7ad3a978 556 scm_init_debug (); /* Requires macro smobs */
8f79d4ed 557 scm_init_random (); /* Requires smob_prehistory */
7ad3a978 558 scm_init_simpos ();
8f79d4ed 559 scm_init_dynamic_linking (); /* Requires smob_prehistory */
756e8a3a 560 scm_bootstrap_i18n ();
7ad3a978 561 scm_init_script ();
508ded1c 562
e2d085f3 563 scm_init_goops ();
9b31f1c1 564
8672c728
MV
565#if SCM_ENABLE_DISCOURAGED == 1
566 scm_i_init_discouraged ();
567#endif
568
9b31f1c1
MV
569#if SCM_ENABLE_DEPRECATED == 1
570 scm_i_init_deprecated ();
571#endif
572
9de87eea
MV
573 scm_init_threads_default_dynamic_state ();
574
7ad3a978 575 scm_initialized_p = 1;
0f2d19dd 576
1cdaaafb
JB
577#ifdef STACK_CHECKING
578 scm_stack_checking_enabled_p = SCM_STACK_CHECKING_P;
579#endif
0f2d19dd 580
fd937ecb 581 scm_init_rdelim ();
b0e5fd8c 582 scm_init_rw ();
08045107 583 scm_init_extensions ();
e2d085f3 584
9de87eea 585 atexit (cleanup_for_exit);
e2d085f3 586 scm_load_startup_files ();
6128f34c 587 scm_init_load_should_autocompile ();
7ad3a978
MV
588}
589
89e00824
ML
590/*
591 Local Variables:
592 c-file-style: "gnu"
593 End:
594*/