#include <ssdef.h>
#endif
-#ifdef BSD
+#ifdef BSD_SYSTEM
#include <sys/ioctl.h>
#endif
#include "syssignal.h"
#include "process.h"
+#ifdef HAVE_SETRLIMIT
+#include <sys/time.h>
+#include <sys/resource.h>
+#endif
+
#ifndef O_RDWR
#define O_RDWR 2
#endif
on subsequent starts. */
int initialized;
+#ifdef DOUG_LEA_MALLOC
+/* Preserves a pointer to the memory allocated that copies that
+ static data inside glibc's malloc. */
+void *malloc_state_ptr;
+/* From glibc, a routine that returns a copy of the malloc internal state. */
+extern void *malloc_get_state ();
+/* From glibc, a routine that overwrites the malloc internal state. */
+extern void malloc_set_state ();
+#endif
+
/* Variable whose value is symbol giving operating system type. */
Lisp_Object Vsystem_type;
for use when reporting bugs. */
Lisp_Object Vsystem_configuration_options;
+Lisp_Object Qfile_name_handler_alist;
+
/* If non-zero, emacs should not attempt to use an window-specific code,
but instead should use the virtual terminal under which it was started */
int inhibit_window_system;
int skip_args;
{
register int i;
- Lisp_Object name, dir;
+ Lisp_Object name, dir, tem;
+ int count = specpdl_ptr - specpdl;
+ Lisp_Object raw_name;
initial_argv = argv;
initial_argc = argc;
- Vinvocation_name = Ffile_name_nondirectory (build_string (argv[0]));
- Vinvocation_directory = Ffile_name_directory (build_string (argv[0]));
+ raw_name = build_string (argv[0]);
+
+ /* Add /: to the front of the name
+ if it would otherwise be treated as magic. */
+ tem = Ffind_file_name_handler (raw_name, Qt);
+ if (! NILP (tem))
+ raw_name = concat2 (build_string ("/:"), raw_name);
+
+ Vinvocation_name = Ffile_name_nondirectory (raw_name);
+ Vinvocation_directory = Ffile_name_directory (raw_name);
+
/* If we got no directory in argv[0], search PATH to find where
Emacs actually came from. */
if (NILP (Vinvocation_directory))
int yes = openp (Vexec_path, Vinvocation_name,
EXEC_SUFFIXES, &found, 1);
if (yes == 1)
- Vinvocation_directory = Ffile_name_directory (found);
+ {
+ /* Add /: to the front of the name
+ if it would otherwise be treated as magic. */
+ tem = Ffind_file_name_handler (found, Qt);
+ if (! NILP (tem))
+ found = concat2 (build_string ("/:"), found);
+ Vinvocation_directory = Ffile_name_directory (found);
+ }
}
if (!NILP (Vinvocation_directory)
&& NILP (Ffile_name_absolute_p (Vinvocation_directory)))
- /* Emacs was started with relative path, like ./emacs */
+ /* Emacs was started with relative path, like ./emacs.
+ Make it absolute. */
Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
Vinstallation_directory = Qnil;
not including lisp and info. */
tem = Fexpand_file_name (build_string ("lib-src"), dir);
lib_src_exists = Ffile_exists_p (tem);
- if (!NILP (lib_src_exists))
+
+#ifdef MSDOS
+ /* MSDOS installations frequently remove lib-src, but we still
+ must set installation-directory, or else info won't find
+ its files (it uses the value of installation-directory). */
+ tem = Fexpand_file_name (build_string ("info"), dir);
+ info_exists = Ffile_exists_p (tem);
+#else
+ info_exists = Qnil;
+#endif
+
+ if (!NILP (lib_src_exists) || !NILP (info_exists))
{
tem = Fexpand_file_name (build_string ("etc"), dir);
etc_exists = Ffile_exists_p (tem);
/* See if dir's parent contains those subdirs. */
tem = Fexpand_file_name (build_string ("../lib-src"), dir);
lib_src_exists = Ffile_exists_p (tem);
- if (!NILP (lib_src_exists))
+
+
+#ifdef MSDOS
+ /* See the MSDOS commentary above. */
+ tem = Fexpand_file_name (build_string ("../info"), dir);
+ info_exists = Ffile_exists_p (tem);
+#else
+ info_exists = Qnil;
+#endif
+
+ if (!NILP (lib_src_exists) || !NILP (info_exists))
{
tem = Fexpand_file_name (build_string ("../etc"), dir);
etc_exists = Ffile_exists_p (tem);
Vcommand_line_args
= Fcons (build_string (argv[i]), Vcommand_line_args);
}
+
+ unbind_to (count, Qnil);
}
DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
int skip_args = 0;
extern int errno;
extern sys_nerr;
+#ifdef HAVE_SETRLIMIT
+ struct rlimit rlim;
+#endif
#ifdef LINUX_SBRK_BUG
__sbrk (1);
#endif
+#ifdef DOUG_LEA_MALLOC
+ if (initialized)
+ {
+ malloc_set_state (malloc_state_ptr);
+ free (malloc_state_ptr);
+ }
+#endif
+
sort_args (argc, argv);
if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args))
}
else
{
- printf ("%s\n", XSTRING (tem)->data);
+ printf ("GNU Emacs %s\n", XSTRING (tem)->data);
+ printf ("Copyright (C) 1996 Free Software Foundation, Inc.\n");
+ printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
+ printf ("You may redistribute copies of Emacs\n");
+ printf ("under the terms of the GNU General Public License.\n");
+ printf ("For more information about these matters, ");
+ printf ("see the files named COPYING.\n");
exit (0);
}
}
#endif /* LINK_CRTL_SHARE */
#endif /* VMS */
+#ifdef HAVE_SETRLIMIT
+ /* Extend the stack space available. */
+ if (!getrlimit (RLIMIT_STACK, &rlim))
+ {
+ long newlim;
+ /* Approximate the amount regex.c needs, plus some more. */
+ newlim = 800000 * sizeof (char *);
+ if (newlim > rlim.rlim_max)
+ newlim = rlim.rlim_max;
+ if (rlim.rlim_cur < newlim)
+ rlim.rlim_cur = newlim;
+
+ setrlimit (RLIMIT_STACK, &rlim);
+ }
+#endif
+
/* Record (approximately) where the stack begins. */
stack_bottom = &stack_bottom_variable;
[-q] [--no-init-file] [-u user] [--user user] [--debug-init]\n\
[--version] [--no-site-file]\n\
[-f func] [--funcall func] [-l file] [--load file] [--insert file]\n\
- [+linenum] file-to-visit [--kill]\n", argv[0]);
+ [+linenum] file-to-visit [--kill]\n\
+Report bugs to bug-gnu-emacs@prep.ai.mit.edu. First, please see\n\
+the Bugs section of the Emacs manual or the file BUGS.", argv[0]);
exit (0);
}
#endif
)
{
- sigblockx (SIGHUP);
+ sigblock (sigmask (SIGHUP));
/* In --batch mode, don't catch SIGHUP if already ignored.
That makes nohup work. */
if (! noninteractive
|| signal (SIGHUP, SIG_IGN) != SIG_IGN)
signal (SIGHUP, fatal_error_signal);
- sigunblockx (SIGHUP);
+ sigunblock (sigmask (SIGHUP));
}
if (
init_alloc_once ();
init_obarray ();
init_eval_once ();
+ init_charset_once ();
+ init_coding_once ();
init_syntax_once (); /* Create standard syntax table. */
+ init_category_once (); /* Create standard category table. */
/* Must be done before init_buffer */
init_casetab_once ();
init_buffer_once (); /* Create buffer table and some buffers */
#ifdef WINDOWSNT
/* Initialize environment from registry settings. */
init_environment ();
+ init_ntproc (); /* must precede init_editfns */
#endif
/* egetenv is a pretty low-level facility, which may get called in
init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
+
+ if (initialized)
+ {
+ /* Erase any pre-dump messages in the message log, to avoid confusion */
+ Lisp_Object old_log_max;
+ old_log_max = Vmessage_log_max;
+ XSETFASTINT (Vmessage_log_max, 0);
+ message_dolog ("", 0, 1);
+ Vmessage_log_max = old_log_max;
+ }
+
init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
init_lread ();
syms_of_casefiddle ();
syms_of_casetab ();
syms_of_callproc ();
+ syms_of_category ();
+ syms_of_ccl ();
+ syms_of_charset ();
syms_of_cmds ();
#ifndef NO_DIR_LIBRARY
syms_of_dired ();
syms_of_editfns ();
syms_of_emacs ();
syms_of_fileio ();
+ syms_of_coding (); /* This should be after syms_of_fileio. */
#ifdef CLASH_DETECTION
syms_of_filelock ();
#endif /* CLASH_DETECTION */
syms_of_indent ();
+ syms_of_insdel ();
syms_of_keyboard ();
syms_of_keymap ();
syms_of_macros ();
#ifdef VMS
syms_of_vmsproc ();
#endif /* VMS */
+#ifdef WINDOWSNT
+ syms_of_ntproc ();
+#endif /* WINDOWSNT */
syms_of_window ();
syms_of_xdisp ();
#ifdef HAVE_X_WINDOWS
syms_of_xterm ();
syms_of_xfns ();
syms_of_xfaces ();
+ syms_of_fontset ();
#ifdef HAVE_X11
syms_of_xselect ();
#endif
#endif
#ifdef HAVE_NTGUI
- syms_of_win32term ();
- syms_of_win32fns ();
- syms_of_win32faces ();
- syms_of_win32select ();
- syms_of_win32menu ();
+ syms_of_w32term ();
+ syms_of_w32fns ();
+ syms_of_w32faces ();
+ syms_of_w32select ();
+ syms_of_w32menu ();
#endif /* HAVE_NTGUI */
#ifdef SYMS_SYSTEM
if (initialized)
{
- /* Erase any pre-dump messages in the message log, to avoid confusion */
- Lisp_Object old_log_max;
- old_log_max = Vmessage_log_max;
- XSETFASTINT (Vmessage_log_max, 0);
- message_dolog ("", 0, 1);
- Vmessage_log_max = old_log_max;
-
#ifdef HAVE_TZSET
{
/* If the execution TZ happens to be the same as the dump TZ,
{ "-T", "--title", 10, 1 },
{ "-title", 0, 10, 1 },
{ "-name", "--name", 10, 1 },
- { "-rn", 0, 10, 1 },
{ "-xrm", "--xrm", 10, 1 },
{ "-r", "--reverse-video", 5, 0 },
{ "-rv", 0, 5, 0 },
{ "-f", "--funcall", 0, 1 },
{ "-funcall", 0, 0, 1 },
{ "-eval", "--eval", 0, 1 },
+ { "-find-file", "--find-file", 0, 1 },
+ { "-visit", "--visit", 0, 1 },
{ "-insert", "--insert", 0, 1 },
/* This should be processed after ordinary file name args and the like. */
{ "-kill", "--kill", -10, 0 },
int to = 1;
int from;
int i;
+ int end_of_options = argc;
/* Categorize all the options,
and figure out which argv elts are option arguments. */
int match, thislen;
char *equals;
+ /* If we have found "--", don't consider
+ any more arguments as options. */
+ if (argv[from][1] == '-')
+ {
+ /* Leave the "--", and everything following it, at the end. */
+ for (; from < argc; from++)
+ {
+ priority[from] = -100;
+ options[from] = -1;
+ }
+ break;
+ }
+
/* Look for a match with a known old-fashioned option. */
for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
if (!strcmp (argv[from], standard_args[i].name))
}
bcopy (new, argv, sizeof (char *) * argc);
+
+ free (options);
+ free (new);
+ free (priority);
}
\f
DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
unrequest_sigio ();
signal (SIGIO, SIG_IGN);
#endif
+
+#ifdef WINDOWSNT
+ term_ntproc ();
+#endif
}
Meanwhile, my_edata is not valid on Windows. */
memory_warnings (my_edata, malloc_warning);
#endif /* not WINDOWSNT */
+#endif
+#ifdef DOUG_LEA_MALLOC
+ malloc_state_ptr = malloc_get_state ();
#endif
unexec (XSTRING (filename)->data,
!NILP (symfile) ? XSTRING (symfile)->data : 0, my_edata, 0, 0);
+#ifdef DOUG_LEA_MALLOC
+ free (malloc_state_ptr);
+#endif
#endif /* not VMS */
Vpurify_flag = tem;
char *evarname, *defalt;
{
register char *path, *p;
-
- Lisp_Object lpath;
+ Lisp_Object lpath, element, tem;
/* It's okay to use getenv here, because this function is only used
to initialize variables when Emacs starts up, and isn't called
{
p = index (path, SEPCHAR);
if (!p) p = path + strlen (path);
- lpath = Fcons (p - path ? make_string (path, p - path)
- : build_string ("."),
- lpath);
+ element = (p - path ? make_string (path, p - path)
+ : build_string ("."));
+
+ /* Add /: to the front of the name
+ if it would otherwise be treated as magic. */
+ tem = Ffind_file_name_handler (element, Qt);
+ if (! NILP (tem))
+ element = concat2 (build_string ("/:"), element);
+
+ lpath = Fcons (element, lpath);
if (*p)
path = p + 1;
else
syms_of_emacs ()
{
+ Qfile_name_handler_alist = intern ("file-name-handler-alist");
+ staticpro (&Qfile_name_handler_alist);
+
#ifndef CANNOT_DUMP
#ifdef HAVE_SHM
defsubr (&Sdump_emacs_data);