#include <sys/types.h>
#include <sys/file.h>
#include <unistd.h>
+#include <libguile.h>
#include <close-stream.h>
#include "composite.h"
#include "dispextern.h"
#include "syntax.h"
+#include "sysselect.h"
#include "systime.h"
#ifdef HAVE_GNUTLS
#include <sys/personality.h>
#endif
+Lisp_Object symbol_module;
+Lisp_Object function_module;
+Lisp_Object plist_module;
+
static const char emacs_version[] = PACKAGE_VERSION;
static const char emacs_copyright[] = COPYRIGHT;
static const char emacs_bugreport[] = PACKAGE_BUGREPORT;
/* From glibc, a routine that returns a copy of the malloc internal state. */
extern void *malloc_get_state (void);
/* From glibc, a routine that overwrites the malloc internal state. */
-extern int malloc_set_state (void*);
+extern int malloc_set_state (void *);
/* True if the MALLOC_CHECK_ environment variable was set while
dumping. Used to work around a bug in glibc's malloc. */
static bool malloc_using_checking;
bool display_arg;
#endif
-/* An address near the bottom of the stack.
- Tells GC how to save a copy of the stack. */
-char *stack_bottom;
-
#if defined (DOUG_LEA_MALLOC) || defined (GNU_LINUX)
/* The address where the heap starts (from the first sbrk (0) call). */
static void *my_heap_start;
static void sort_args (int argc, char **argv);
static void syms_of_emacs (void);
-/* C89 needs each string be at most 509 characters, so the usage
+/* C99 needs each string to be at most 4095 characters, and the usage
strings below are split to not overflow this limit. */
static char const *const usage_message[] =
{ "\
{
register int i;
Lisp_Object name, dir, handler;
- ptrdiff_t count = SPECPDL_INDEX ();
+ dynwind_begin ();
Lisp_Object raw_name;
initial_argv = argv;
= Fcons (build_unibyte_string (argv[i]), Vcommand_line_args);
}
- unbind_to (count, Qnil);
+ dynwind_end ();
}
DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
}
malloc_set_state (malloc_state_ptr);
-#ifndef XMALLOC_OVERRUN_CHECK
free (malloc_state_ptr);
-#endif
}
else
{
_exit (EXIT_FAILURE);
}
-/* ARGSUSED */
+static int main2 (void *, int, char **);
+
int
main (int argc, char **argv)
{
-#if GC_MARK_STACK
- Lisp_Object dummy;
-#endif
- char stack_bottom_variable;
+ /* Override Guile's libgc configuration. */
+ xputenv ("GC_ALL_INTERIOR_POINTERS=1");
+ scm_boot_guile (argc, argv, main2, NULL);
+}
+
+/* ARGSUSED */
+static int
+main2 (void *ignore, int argc, char **argv)
+{
bool do_initial_setlocale;
bool dumping;
int skip_args = 0;
/* If we use --chdir, this records the original directory. */
char *original_pwd = 0;
-#if GC_MARK_STACK
- stack_base = &dummy;
-#endif
-
#ifdef G_SLICE_ALWAYS_MALLOC
/* This is used by the Cygwin build. It's not needed starting with
cygwin-1.7.24, but it doesn't do any harm. */
}
#endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
- /* Record (approximately) where the stack begins. */
- stack_bottom = &stack_bottom_variable;
-
clearerr (stdin);
#ifndef SYSTEM_MALLOC
{
int i;
printf ("Usage: %s [OPTION-OR-FILENAME]...\n", argv[0]);
- for (i = 0; i < sizeof usage_message / sizeof *usage_message; i++)
+ for (i = 0; i < ARRAYELTS (usage_message); i++)
fputs (usage_message[i], stdout);
exit (0);
}
if (!initialized)
{
+ symbol_module = scm_call (scm_c_public_ref ("guile", "define-module*"),
+ scm_list_1 (scm_from_utf8_symbol ("elisp-symbols")),
+ scm_from_locale_keyword ("pure"),
+ SCM_BOOL_T,
+ SCM_UNDEFINED);
+ function_module = scm_call (scm_c_public_ref ("guile", "define-module*"),
+ scm_list_1 (scm_from_utf8_symbol ("elisp-functions")),
+ scm_from_locale_keyword ("pure"),
+ SCM_BOOL_T,
+ SCM_UNDEFINED);
+ plist_module = scm_call (scm_c_public_ref ("guile", "define-module*"),
+ scm_list_1 (scm_from_utf8_symbol ("elisp-plists")),
+ scm_from_locale_keyword ("pure"),
+ SCM_BOOL_T,
+ SCM_UNDEFINED);
+
init_alloc_once ();
+ init_guile ();
+ init_fns_once ();
init_obarray ();
init_eval_once ();
init_charset_once ();
xputenv ("LANG=C");
#endif
- init_buffer (); /* Init default directory of main buffer. */
+ /* Init buffer storage and default directory of main buffer. */
+ init_buffer (initialized);
init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
0 for an option that takes no arguments,
1 for an option that takes one argument, etc.
-1 for an ordinary non-option argument. */
- int *options = xnmalloc (argc, sizeof *options);
- int *priority = xnmalloc (argc, sizeof *priority);
+ int *options = xnmalloc_atomic (argc, sizeof *options);
+ int *priority = xnmalloc_atomic (argc, sizeof *priority);
int to = 1;
int incoming_used = 1;
int from;
}
/* Look for a match with a known old-fashioned option. */
- for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
+ for (i = 0; i < ARRAYELTS (standard_args); i++)
if (!strcmp (argv[from], standard_args[i].name))
{
options[from] = standard_args[i].nargs;
match = -1;
- for (i = 0;
- i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
+ for (i = 0; i < ARRAYELTS (standard_args); i++)
if (standard_args[i].longname
&& !strncmp (argv[from], standard_args[i].longname,
thislen))
{
Lisp_Object tem;
Lisp_Object symbol;
- ptrdiff_t count = SPECPDL_INDEX ();
+ dynwind_begin ();
check_pure_size ();
malloc_state_ptr = malloc_get_state ();
#endif
-#ifdef USE_MMAP_FOR_BUFFERS
- mmap_set_vars (0);
-#endif
unexec (SSDATA (filename), !NILP (symfile) ? SSDATA (symfile) : 0);
-#ifdef USE_MMAP_FOR_BUFFERS
- mmap_set_vars (1);
-#endif
+
#ifdef DOUG_LEA_MALLOC
free (malloc_state_ptr);
#endif
Vpurify_flag = tem;
- return unbind_to (count, Qnil);
+ dynwind_end ();
+ return Qnil;
}
#endif /* not CANNOT_DUMP */
void
syms_of_emacs (void)
{
+#include "emacs.x"
+
DEFSYM (Qfile_name_handler_alist, "file-name-handler-alist");
DEFSYM (Qrisky_local_variable, "risky-local-variable");
DEFSYM (Qkill_emacs, "kill-emacs");
DEFSYM (Qkill_emacs_hook, "kill-emacs-hook");
-#ifndef CANNOT_DUMP
- defsubr (&Sdump_emacs);
-#endif
-
- defsubr (&Skill_emacs);
-
- defsubr (&Sinvocation_name);
- defsubr (&Sinvocation_directory);
- defsubr (&Sdaemonp);
- defsubr (&Sdaemon_initialized);
-
DEFVAR_LISP ("command-line-args", Vcommand_line_args,
doc: /* Args passed by shell to Emacs, as a list of strings.
Many arguments are deleted from the list as they are processed. */);