/* Fully extensible Emacs, running on Unix, intended for GNU.
- Copyright (C) 1985,86,87,93,94,95,97,98,1999 Free Software Foundation, Inc.
+ Copyright (C) 1985,86,87,93,94,95,97,98,1999,2001,02,2003
+ Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <sys/ioctl.h>
#endif
+#ifdef WINDOWSNT
+#include <fcntl.h>
+#endif
+
#include "lisp.h"
#include "commands.h"
#include "intervals.h"
#include "buffer.h"
+#include "window.h"
#include "systty.h"
#include "blockinput.h"
#include "process.h"
#include "termhooks.h"
#include "keyboard.h"
+#include "keymap.h"
#ifdef HAVE_SETLOCALE
#include <locale.h>
extern void malloc_warning P_ ((char *));
extern void set_time_zone_rule P_ ((char *));
+#ifdef HAVE_INDEX
extern char *index P_ ((const char *, int));
+#endif
/* Make these values available in GDB, which doesn't see macros. */
#ifdef DATA_SEG_BITS
EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS;
#else
-EMACS_INT gdb_data_seg_bits = 0;
+EMACS_INT gdb_data_seg_bits = 0;
#endif
EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
-/* Command line args from shell, as list of strings */
+/* Command line args from shell, as list of strings. */
Lisp_Object Vcommand_line_args;
/* The name under which Emacs was invoked, with any leading directory
/* Hook run by `kill-emacs' before it does really anything. */
Lisp_Object Vkill_emacs_hook;
+/* An empty lisp string. To avoid having to build any other. */
+Lisp_Object empty_string;
+
#ifdef SIGUSR1
-/* Hooks for signal USR1 and USR2 handing */
+/* Hooks for signal USR1 and USR2 handling. */
Lisp_Object Vsignal_USR1_hook;
#ifdef SIGUSR2
Lisp_Object Vsignal_USR2_hook;
-#endif
+#endif
#endif
/* Search path separator. */
Lisp_Object Vsystem_time_locale;
Lisp_Object Vprevious_system_time_locale;
-/* 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 */
+/* If non-zero, emacs should not attempt to use a window-specific code,
+ but instead should use the virtual terminal under which it was started. */
int inhibit_window_system;
/* If nonzero, set Emacs to run at this priority. This is also used
in child_setup and sys_suspend to make sure subshells run at normal
- priority; Those functions have their own extern declaration. */
-int emacs_priority;
+ priority; those functions have their own extern declaration. */
+EMACS_INT emacs_priority;
-/* If non-zero a filter or a sentinel is running. Tested to save the match
- data on the first attempt to change it inside asynchronous code. */
+/* If non-zero, a filter or a sentinel is running. Tested to save the match
+ data on the first attempt to change it inside asynchronous code. */
int running_asynch_code;
#ifdef BSD_PGRPS
#endif
#ifdef HAVE_X_WINDOWS
-/* If non-zero, -d was specified, meaning we're using some window system. */
+/* If non-zero, -d was specified, meaning we're using some window system. */
int display_arg;
#endif
Initialization options:\n\
\n\
--batch do not do interactive display; implies -q\n\
+--script FILE run FILE as an Emacs Lisp script.\n\
--debug-init enable Emacs Lisp debugger during init file\n\
--help display this help message and exit\n\
--multibyte, --no-unibyte run Emacs in multibyte mode\n\
--no-init-file, -q load neither ~/.emacs nor default.el\n\
--no-shared-memory, -nl do not use shared memory\n\
--no-site-file do not load site-start.el\n\
---no-windows, -nw don't communicate with X, ignoring $DISPLAY\n\
+--no-splash do not display a splash screen on startup\n\
+--no-window-system, -nw don't communicate with X, ignoring $DISPLAY\n\
--terminal, -t DEVICE use DEVICE for terminal I/O\n\
--unibyte, --no-multibyte run Emacs in unibyte mode\n\
--user, -u USER load ~USER/.emacs instead of your own\n\
Action options:\n\
\n\
FILE visit FILE using find-file\n\
-+LINENUM FILE visit FILE using find-file, then go to line LINENUM\n\
++LINE FILE visit FILE using find-file, then go to line LINE\n\
++LINE:COLUMN FILE visit FILE using find-file, then go to line LINE,\n\
+ column COLUMN\n\
--directory, -L DIR add DIR to variable load-path\n\
--eval EXPR evaluate Emacs Lisp expression EXPR\n\
--execute EXPR evaluate Emacs Lisp expression EXPR\n\
--background-color, -bg COLOR window background color\n\
--border-color, -bd COLOR main border color\n\
--border-width, -bw WIDTH width of main border\n\
+--color=MODE color mode for character terminals;\n\
+ MODE defaults to `auto', and can also\n\
+ be `never', `auto', `always',\n\
+ or a mode name like `ansi8'\n\
--cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
--display, -d DISPLAY use X server DISPLAY\n\
---font, -fn FONT default font; must be fixed-widthp\n\
+--font, -fn FONT default font; must be fixed-width\n\
--foreground-color, -fg COLOR window foreground color\n\
+--fullscreen, -fs make first frame fullscreen\n\
+--fullwidth, -fw make the first frame wide as the screen\n\
+--fullheight, -fh make the first frame high as the screen\n\
--geometry, -g GEOMETRY window geometry\n\
--iconic start Emacs in iconified state\n\
--icon-type, -i use picture of gnu for Emacs icon\n\
--mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
--name NAME title of main Emacs window\n\
--reverse-video, -r, -rv switch foreground and background\n\
---title, -T, -wn, TITLE title for Emacs windows\n\
+--title, -T, -wn TITLE title for Emacs windows\n\
--vertical-scroll-bars, -vb enable vertical scroll bars\n\
--xrm XRESOURCES set additional X resources\n\
\n\
\n\
Various environment variables and window system resources also affect\n\
Emacs' operation. See the main documentation.\n\
-\n\
-Report bugs to bug-gnu-emacs@gnu.org. First, please see the Bugs\n\
+\n"
+
+#define USAGE3 "\
+Report bugs to %s. First, please see the Bugs\n\
section of the Emacs manual or the file BUGS.\n"
\f
-/* Signal code for the fatal signal that was received */
+/* Signal code for the fatal signal that was received. */
int fatal_error_code;
-/* Nonzero if handling a fatal error already */
+/* Nonzero if handling a fatal error already. */
int fatal_error_in_progress;
+/* If non-null, call this function from fatal_error_signal before
+ committing suicide. */
+
+void (*fatal_error_signal_hook) P_ ((void));
+
+
#ifdef SIGUSR1
SIGTYPE
handle_USR1_signal (sig)
struct input_event buf;
bzero (&buf, sizeof buf);
- buf.kind = user_signal;
+ buf.kind = USER_SIGNAL_EVENT;
buf.frame_or_window = selected_frame;
kbd_buffer_store_event (&buf);
struct input_event buf;
bzero (&buf, sizeof buf);
- buf.kind = user_signal;
+ buf.kind = USER_SIGNAL_EVENT;
buf.code = 1;
buf.frame_or_window = selected_frame;
}
#endif /* SIGUSR2 */
-/* Handle bus errors, invalid instruction, etc. */
+/* Handle bus errors, invalid instruction, etc. */
SIGTYPE
fatal_error_signal (sig)
int sig;
#ifndef MSDOS
sigunblock (sigmask (fatal_error_code));
#endif
+
+ if (fatal_error_signal_hook)
+ fatal_error_signal_hook ();
+
kill (getpid (), fatal_error_code);
#endif /* not VMS */
}
/* We define abort, rather than using it from the library,
so that GDB can return from a breakpoint here.
- MSDOS has its own definition on msdos.c */
+ MSDOS has its own definition in msdos.c. */
#if ! defined (DOS_NT) && ! defined (NO_ABORT)
#endif
\f
-/* Code for dealing with Lisp access to the Unix command line */
+/* Code for dealing with Lisp access to the Unix command line. */
static void
init_cmdargs (argc, argv, skip_args)
{
register int i;
Lisp_Object name, dir, tem;
- int count = specpdl_ptr - specpdl;
+ int count = SPECPDL_INDEX ();
Lisp_Object raw_name;
initial_argv = argv;
{
Lisp_Object found;
int yes = openp (Vexec_path, Vinvocation_name,
- EXEC_SUFFIXES, &found, 1);
+ Vexec_suffixes, &found, make_number (X_OK));
if (yes == 1)
{
/* Add /: to the front of the name
}
DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
- "Return the program name that was used to run Emacs.\n\
-Any directory names are omitted.")
- ()
+ doc: /* Return the program name that was used to run Emacs.
+Any directory names are omitted. */)
+ ()
{
return Fcopy_sequence (Vinvocation_name);
}
DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
- 0, 0, 0,
- "Return the directory name in which the Emacs executable was located")
- ()
+ 0, 0, 0,
+ doc: /* Return the directory name in which the Emacs executable was located. */)
+ ()
{
return Fcopy_sequence (Vinvocation_directory);
}
{}
void __do_global_dtors ()
{}
-/* Linux has a bug in its library; avoid an error. */
-#ifndef LINUX
+/* GNU/Linux has a bug in its library; avoid an error. */
+#ifndef GNU_LINUX
char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
#endif
char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
char **valptr;
int *skipptr;
{
- char *p;
+ char *p = NULL;
int arglen;
char *arg;
static void
malloc_initialize_hook ()
{
+#ifndef USE_CRT_DLL
extern char **environ;
+#endif
if (initialized)
{
{
char **p;
- for (p = environ; *p; p++)
+ for (p = environ; p && *p; p++)
if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
{
do
#endif /* DOUG_LEA_MALLOC */
+
+#define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
+#define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org"
+
+/* This function is used to determine an address to which bug report should
+ be sent. */
+
+char *
+bug_reporting_address ()
+{
+ int count = 0;
+ Lisp_Object temp;
+ char *string;
+
+ temp = Fsymbol_value (intern ("emacs-version"));
+
+ /* When `emacs-version' is invalid, use normal address. */
+ if (!STRINGP(temp))
+ return REPORT_EMACS_BUG_ADDRESS;
+
+ string = SDATA (temp);
+
+ /* Count dots in `emacs-version'. */
+ while (*string)
+ {
+ if (*string == '.')
+ count++;
+ string++;
+ }
+
+ /* When `emacs-version' has at least three dots, it is development or
+ pretest version of Emacs. */
+ return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS;
+}
+
+
/* ARGSUSED */
int
-main (argc, argv, envp)
+main (argc, argv
+#ifdef VMS
+, envp
+#endif
+)
int argc;
char **argv;
+#ifdef VMS
char **envp;
+#endif
{
#if GC_MARK_STACK
Lisp_Object dummy;
char stack_bottom_variable;
int do_initial_setlocale;
int skip_args = 0;
+#ifndef USE_CRT_DLL
extern int errno;
- extern int sys_nerr;
+#endif
#ifdef HAVE_SETRLIMIT
struct rlimit rlim;
#endif
int no_loadup = 0;
+ char *junk = 0;
#if GC_MARK_STACK
extern Lisp_Object *stack_base;
run_time_remap (argv[0]);
#endif
+#ifdef MAC_OSX
+ if (!initialized)
+ unexec_init_emacs_zone ();
+#endif
+
sort_args (argc, argv);
argc = 0;
while (argv[argc]) argc++;
}
else
{
- printf ("GNU Emacs %s\n", XSTRING (tem)->data);
- printf ("Copyright (C) 1999 Free Software Foundation, Inc.\n");
+ printf ("GNU Emacs %s\n", SDATA (tem));
+ printf ("Copyright (C) 2002 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");
}
#endif /* NeXT */
+#ifdef MAC_OSX
+ /* Skip process serial number passed in the form -psn_x_y as
+ command-line argument. */
+ if (argc > skip_args + 1 && strncmp (argv[skip_args+1], "-psn_", 5) == 0)
+ skip_args++;
+#endif /* MAC_OSX */
+
#ifdef VMS
- /* If -map specified, map the data file in */
+ /* If -map specified, map the data file in. */
{
char *file;
if (argmatch (argv, argc, "-map", "--map-data", 3, &mapin_file, &skip_args))
#ifdef LINK_CRTL_SHARE
#ifdef SHARABLE_LIB_BUG
- /* Bletcherous shared libraries! */
+ /* Bletcherous shared libraries! */
if (!stdin)
stdin = fdopen (0, "r");
if (!stdout)
uninterrupt_malloc ();
#endif /* not SYSTEM_MALLOC */
-#ifdef MSDOS
+#if defined (MSDOS) || defined (WINDOWSNT)
/* We do all file input/output as binary files. When we need to translate
newlines, we do that manually. */
_fmode = O_BINARY;
+#endif /* MSDOS || WINDOWSNT */
+#ifdef MSDOS
#if __DJGPP__ >= 2
if (!isatty (fileno (stdin)))
setmode (fileno (stdin), O_BINARY);
inhibit_window_system = 0;
- /* Handle the -t switch, which specifies filename to use as terminal */
+ /* Handle the -t switch, which specifies filename to use as terminal. */
while (1)
{
char *term;
if (result < 0)
{
char *errstring = strerror (errno);
- fprintf (stderr, "emacs: %s: %s\n", term, errstring);
+ fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
exit (1);
}
dup (0);
if (! isatty (0))
{
- fprintf (stderr, "emacs: %s: not a tty\n", term);
+ fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
exit (1);
}
fprintf (stderr, "Using %s\n", term);
break;
}
- if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
+ /* Command line option --no-windows is deprecated and thus not mentioned
+ in the manual and usage informations. */
+ if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
+ || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
inhibit_window_system = 1;
/* Handle the -batch switch, which means don't do interactive display. */
noninteractive = 0;
if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
noninteractive = 1;
+ if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
+ {
+ noninteractive = 1; /* Set batch mode. */
+ /* Convert --script to -l, un-skip it, and sort again so that -l will be
+ handled in proper sequence. */
+ argv[skip_args - 1] = "-l";
+ skip_args -= 2;
+ sort_args (argc, argv);
+ }
- /* Handle the --help option, which gives a usage message.. */
+ /* Handle the --help option, which gives a usage message. */
if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
{
printf (USAGE1, argv[0]);
printf (USAGE2);
+ printf (USAGE3, bug_reporting_address ());
exit (0);
}
noninteractive1 = noninteractive;
-/* Perform basic initializations (not merely interning symbols) */
+/* Perform basic initializations (not merely interning symbols). */
if (!initialized)
{
init_coding_once ();
init_syntax_once (); /* Create standard syntax table. */
init_category_once (); /* Create standard category table. */
- /* Must be done before init_buffer */
+ /* Must be done before init_buffer. */
init_casetab_once ();
- init_buffer_once (); /* Create buffer table and some buffers */
- init_minibuf_once (); /* Create list of minibuffers */
- /* Must precede init_window_once */
-
+ init_buffer_once (); /* Create buffer table and some buffers. */
+ init_minibuf_once (); /* Create list of minibuffers. */
+ /* Must precede init_window_once. */
+
/* Call syms_of_xfaces before init_window_once because that
function creates Vterminal_frame. Termcap frames now use
faces, and the face implementation uses some symbols as
CANNOT_DUMP is defined. */
syms_of_keyboard ();
- init_window_once (); /* Init the window system */
+#ifdef MAC_OS8
+ /* init_window_once calls make_terminal_frame which on Mac OS
+ creates a full-fledge output_mac type frame. This does not
+ work correctly before syms_of_textprop, syms_of_macfns,
+ syms_of_ccl, syms_of_fontset, syms_of_xterm, syms_of_search,
+ syms_of_frame, mac_initialize, and init_keyboard have already
+ been called. */
+ syms_of_textprop ();
+ syms_of_macfns ();
+ syms_of_ccl ();
+ syms_of_fontset ();
+ syms_of_macterm ();
+ syms_of_macmenu ();
+ syms_of_data ();
+ syms_of_search ();
+ syms_of_frame ();
+
+ mac_initialize ();
+ init_keyboard ();
+#endif
+
+ init_window_once (); /* Init the window system. */
init_fileio_once (); /* Must precede any path manipulation. */
}
}
init_eval ();
- init_coding ();
init_data ();
#ifdef CLASH_DETECTION
- init_filelock ();;
+ init_filelock ();
#endif
init_atimer ();
running_asynch_code = 0;
/* Handle --unibyte and the EMACS_UNIBYTE envvar,
but not while dumping. */
- if (
-#ifndef CANNOT_DUMP
- ! noninteractive || initialized
-#else
- 1
-#endif
- )
+ if (1)
{
int inhibit_unibyte = 0;
/* --multibyte overrides EMACS_UNIBYTE. */
if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
- || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args))
+ || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args)
+ /* Ignore EMACS_UNIBYTE before dumping. */
+ || (!initialized && noninteractive))
inhibit_unibyte = 1;
/* --unibyte requests that we set up to do everything with single-byte
aren't now decoded; also existing buffers are now made
unibyte during startup if .emacs sets unibyte. Tested with
8-bit data in environment variables and /etc/passwd, setting
- unibyte and Latin-1 in .emacs. -- Dave Love */
+ unibyte and Latin-1 in .emacs. -- Dave Love */
if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
|| argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
|| (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
#endif /* MSDOS */
#ifdef WINDOWSNT
+ globals_of_w32 ();
/* Initialize environment from registry settings. */
init_environment (argv);
- init_ntproc (); /* must precede init_editfns */
+ init_ntproc (); /* must precede init_editfns. */
+#endif
+
+#ifdef HAVE_CARBON
+ if (initialized)
+ init_mac_osx_environment ();
#endif
/* egetenv is a pretty low-level facility, which may get called in
putenv ("LANG=C");
#endif
- init_buffer (); /* Init default directory of main buffer */
+ init_buffer (); /* Init default directory of main buffer. */
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 */
+ /* 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);
if (!initialized)
{
- /* The basic levels of Lisp must come first */
+ /* The basic levels of Lisp must come first. */
/* And data must come first of all
- for the sake of symbols like error-message */
+ for the sake of symbols like error-message. */
+#ifndef MAC_OS8
+ /* Called before init_window_once for Mac OS Classic. */
syms_of_data ();
+#endif
syms_of_alloc ();
syms_of_lread ();
syms_of_print ();
syms_of_casetab ();
syms_of_callproc ();
syms_of_category ();
+#ifndef MAC_OS8
+ /* Called before init_window_once for Mac OS Classic. */
syms_of_ccl ();
+#endif
syms_of_charset ();
syms_of_cmds ();
#ifndef NO_DIR_LIBRARY
syms_of_macros ();
syms_of_marker ();
syms_of_minibuf ();
- syms_of_mocklisp ();
syms_of_process ();
+#ifndef MAC_OS8
+ /* Called before init_window_once for Mac OS Classic. */
syms_of_search ();
syms_of_frame ();
+#endif
syms_of_syntax ();
syms_of_term ();
syms_of_undo ();
#ifdef HAVE_SOUND
syms_of_sound ();
#endif
-
+#ifndef MAC_OS8
+ /* Called before init_window_once for Mac OS Classic. */
syms_of_textprop ();
+#endif
syms_of_composite ();
#ifdef VMS
syms_of_vmsproc ();
syms_of_xterm ();
syms_of_xfns ();
syms_of_fontset ();
+#ifdef HAVE_X_SM
+ syms_of_xsmfns ();
+#endif
#ifdef HAVE_X11
syms_of_xselect ();
#endif
#endif /* HAVE_X_WINDOWS */
#ifndef HAVE_NTGUI
+#ifndef MAC_OS
+ /* Called before init_window_once for Mac OS Classic. */
syms_of_xmenu ();
#endif
+#endif
#ifdef HAVE_NTGUI
syms_of_w32term ();
syms_of_fontset ();
#endif /* HAVE_NTGUI */
+#ifdef HAVE_CARBON
+ syms_of_macterm ();
+ syms_of_macfns ();
+ syms_of_macmenu ();
+ syms_of_fontset ();
+#endif /* HAVE_CARBON */
+
#ifdef SYMS_SYSTEM
SYMS_SYSTEM;
#endif
keys_of_buffer ();
keys_of_keyboard ();
keys_of_keymap ();
- keys_of_macros ();
keys_of_minibuf ();
keys_of_window ();
- keys_of_frame ();
+ }
+ else
+ {
+ /*
+ Initialization that must be done even if the global variable
+ initialized is non zero
+ */
+#ifdef HAVE_NTGUI
+ globals_of_w32fns ();
+ globals_of_w32menu ();
+#endif /* end #ifdef HAVE_NTGUI */
}
+#ifndef MAC_OS8
+ /* Called before init_window_once for Mac OS Classic. */
+ init_keyboard (); /* This too must precede init_sys_modes. */
+#endif
+#ifdef VMS
+ init_vmsproc (); /* And this too. */
+#endif /* VMS */
if (!noninteractive)
{
#ifdef VMS
- init_vms_input ();/* init_display calls get_frame_size, that needs this */
+ init_vms_input ();/* init_display calls get_tty_size, that needs this. */
#endif /* VMS */
- init_display (); /* Determine terminal type. init_sys_modes uses results */
+ init_display (); /* Determine terminal type. Calls init_sys_modes. */
}
- init_keyboard (); /* This too must precede init_sys_modes */
-#ifdef VMS
- init_vmsproc (); /* And this too. */
-#endif /* VMS */
- init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.) */
-#ifdef HAVE_X_WINDOWS
+#if defined (HAVE_X_WINDOWS) || defined (WINDOWSNT)
init_xfns ();
#endif /* HAVE_X_WINDOWS */
init_fns ();
if (!initialized)
{
char *file;
- /* Handle -l loadup, args passed by Makefile. */
+ /* Handle -l loadup, args passed by Makefile. */
if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
Vtop_level = Fcons (intern ("load"),
Fcons (build_string (file), Qnil));
-#ifdef CANNOT_DUMP
/* Unless next switch is -nl, load "loadup.el" first thing. */
if (! no_loadup)
Vtop_level = Fcons (intern ("load"),
Fcons (build_string ("loadup.el"), Qnil));
-#endif /* CANNOT_DUMP */
}
if (initialized)
#endif
}
- /* Gerd Moellmann <gerd@acm.org> says this makes profiling work on
- FreeBSD. It might work on some other systems too.
- Give it a try and tell me if it works on your system. */
+ /* Set up for profiling. This is known to work on FreeBSD and
+ GNU/Linux. It might work on some other systems too. Give it a
+ try and tell us if it works on your system. To compile for
+ profiling use something like `make CFLAGS="-pg -g -O -DPROFILING=1'. */
#if defined (__FreeBSD__) || defined (__linux)
#ifdef PROFILING
if (initialized)
{
- extern void _mcleanup ();
+ extern void _mcleanup ();
extern char etext;
extern void safe_bcopy ();
extern void dump_opcode_frequencies ();
zone rather than looking it up every time. Since localtime() is
called to bolt the undumping time into the undumped emacs, this
results in localtime ignoring the TZ environment variable.
- This flushes the new TZ value into localtime. */
+ This flushes the new TZ value into localtime. */
tzset ();
#endif /* defined (LOCALTIME_CACHE) */
/* Enter editor command loop. This never returns. */
Frecursive_edit ();
/* NOTREACHED */
+ return 0;
}
\f
/* Sort the args so we can find the most important ones
{ "-map", "--map-data", 130, 0 },
#endif
{ "-t", "--terminal", 120, 1 },
+ { "-nw", "--no-window-system", 110, 0 },
{ "-nw", "--no-windows", 110, 0 },
{ "-batch", "--batch", 100, 0 },
+ { "-script", "--script", 100, 1 },
{ "-help", "--help", 90, 0 },
{ "-no-unibyte", "--no-unibyte", 83, 0 },
{ "-multibyte", "--multibyte", 82, 0 },
{ "-unibyte", "--unibyte", 81, 0 },
{ "-no-multibyte", "--no-multibyte", 80, 0 },
-#ifdef CANNOT_DUMP
{ "-nl", "--no-loadup", 70, 0 },
-#endif
/* -d must come last before the options handled in startup.el. */
{ "-d", "--display", 60, 1 },
{ "-display", 0, 60, 1 },
{ "-q", "--no-init-file", 50, 0 },
{ "-no-init-file", 0, 50, 0 },
{ "-no-site-file", "--no-site-file", 40, 0 },
+ { "-no-splash", "--no-splash", 40, 0 },
{ "-u", "--user", 30, 1 },
{ "-user", 0, 30, 1 },
{ "-debug-init", "--debug-init", 20, 0 },
{ "-cr", "--cursor-color", 10, 1 },
{ "-fn", "--font", 10, 1 },
{ "-font", 0, 10, 1 },
+ { "-fs", "--fullscreen", 10, 0 },
+ { "-fw", "--fullwidth", 10, 0 },
+ { "-fh", "--fullheight", 10, 0 },
{ "-g", "--geometry", 10, 1 },
{ "-geometry", 0, 10, 1 },
{ "-T", "--title", 10, 1 },
{ "-reverse", 0, 5, 0 },
{ "-hb", "--horizontal-scroll-bars", 5, 0 },
{ "-vb", "--vertical-scroll-bars", 5, 0 },
+ { "-color", "--color", 5, 0},
/* These have the same priority as ordinary file name args,
so they are not reordered with respect to those. */
{ "-L", "--directory", 0, 1 },
if (options[from] > 0)
from += options[from];
}
-
+
if (best < 0)
abort ();
bcopy (new, argv, sizeof (char *) * argc);
- free (options);
- free (new);
- free (priority);
+ xfree (options);
+ xfree (new);
+ xfree (priority);
}
\f
DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
- "Exit the Emacs job and kill it.\n\
-If ARG is an integer, return ARG as the exit program code.\n\
-If ARG is a string, stuff it as keyboard input.\n\n\
-The value of `kill-emacs-hook', if not void,\n\
-is a list of functions (of no args),\n\
-all of which are called before Emacs is actually killed.")
- (arg)
+ doc: /* Exit the Emacs job and kill it.
+If ARG is an integer, return ARG as the exit program code.
+If ARG is a string, stuff it as keyboard input.
+
+The value of `kill-emacs-hook', if not void,
+is a list of functions (of no args),
+all of which are called before Emacs is actually killed. */)
+ (arg)
Lisp_Object arg;
{
struct gcpro gcpro1;
kill it because we are exiting Emacs deliberately (not crashing).
Do it after shut_down_emacs, which does an auto-save. */
if (STRINGP (Vauto_save_list_file_name))
- unlink (XSTRING (Vauto_save_list_file_name)->data);
+ unlink (SDATA (Vauto_save_list_file_name));
exit (INTEGERP (arg) ? XINT (arg)
#ifdef VMS
/* Prevent running of hooks from now on. */
Vrun_hooks = Qnil;
- /* If we are controlling the terminal, reset terminal modes */
+ /* If we are controlling the terminal, reset terminal modes. */
#ifdef EMACS_HAVE_TTY_PGRP
{
int pgrp = EMACS_GETPGRP (0);
&& tpgrp == pgrp)
{
fflush (stdout);
- reset_sys_modes ();
+ reset_all_sys_modes ();
if (sig && sig != SIGTERM)
- fprintf (stderr, "Fatal error (%d).", sig);
+ fprintf (stderr, "Fatal error (%d)", sig);
}
}
#else
fflush (stdout);
- reset_sys_modes ();
+ reset_all_sys_modes ();
#endif
stuff_buffered_input (stuff);
#ifdef HAVE_X_WINDOWS
/* It's not safe to call intern here. Maybe we are crashing. */
if (!noninteractive && SYMBOLP (Vwindow_system)
- && XSYMBOL (Vwindow_system)->name->size == 1
- && XSYMBOL (Vwindow_system)->name->data[0] == 'x'
+ && SCHARS (SYMBOL_NAME (Vwindow_system)) == 1
+ && SREF (SYMBOL_NAME (Vwindow_system), 0) == 'x'
&& ! no_x)
Fx_close_current_connection ();
#endif /* HAVE_X_WINDOWS */
term_ntproc ();
#endif
- check_glyph_memory ();
- check_message_stack ();
+ /* Do this only if terminating normally, we want glyph matrices
+ etc. in a core dump. */
+ if (sig == 0 || sig == SIGTERM)
+ {
+ check_glyph_memory ();
+ check_message_stack ();
+ }
#ifdef MSDOS
dos_cleanup ();
#ifdef HAVE_SHM
DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
- "Dump current state of Emacs into data file FILENAME.\n\
-This function exists on systems that use HAVE_SHM.")
- (filename)
+ doc: /* Dump current state of Emacs into data file FILENAME.
+This function exists on systems that use HAVE_SHM. */)
+ (filename)
Lisp_Object filename;
{
extern char my_edata[];
Lisp_Object tem;
- CHECK_STRING (filename, 0);
+ check_pure_size ();
+ CHECK_STRING (filename);
filename = Fexpand_file_name (filename, Qnil);
tem = Vpurify_flag;
Vpurify_flag = Qnil;
fflush (stdout);
- /* Tell malloc where start of impure now is */
+ /* Tell malloc where start of impure now is. */
/* Also arrange for warnings when nearly out of space. */
#ifndef SYSTEM_MALLOC
memory_warnings (my_edata, malloc_warning);
#endif
- map_out_data (XSTRING (filename)->data);
+ map_out_data (SDATA (filename));
Vpurify_flag = tem;
#else /* not HAVE_SHM */
DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
- "Dump current state of Emacs into executable file FILENAME.\n\
-Take symbols from SYMFILE (presumably the file you executed to run Emacs).\n\
-This is used in the file `loadup.el' when building Emacs.\n\
-\n\
-You must run Emacs in batch mode in order to dump it.")
- (filename, symfile)
+ doc: /* Dump current state of Emacs into executable file FILENAME.
+Take symbols from SYMFILE (presumably the file you executed to run Emacs).
+This is used in the file `loadup.el' when building Emacs.
+
+You must run Emacs in batch mode in order to dump it. */)
+ (filename, symfile)
Lisp_Object filename, symfile;
{
extern char my_edata[];
Lisp_Object tem;
Lisp_Object symbol;
- int count = specpdl_ptr - specpdl;
+ int count = SPECPDL_INDEX ();
+
+ check_pure_size ();
if (! noninteractive)
error ("Dumping Emacs works only in batch mode");
/* Bind `command-line-processed' to nil before dumping,
so that the dumped Emacs will process its command line
and set up to work with X windows if appropriate. */
- symbol = intern ("command-line-process");
+ symbol = intern ("command-line-processed");
specbind (symbol, Qnil);
- CHECK_STRING (filename, 0);
+ CHECK_STRING (filename);
filename = Fexpand_file_name (filename, Qnil);
if (!NILP (symfile))
{
- CHECK_STRING (symfile, 0);
- if (XSTRING (symfile)->size)
+ CHECK_STRING (symfile);
+ if (SCHARS (symfile))
symfile = Fexpand_file_name (symfile, Qnil);
}
fflush (stdout);
#ifdef VMS
- mapout_data (XSTRING (filename)->data);
+ mapout_data (SDATA (filename));
#else
- /* Tell malloc where start of impure now is */
+ /* Tell malloc where start of impure now is. */
/* Also arrange for warnings when nearly out of space. */
#ifndef SYSTEM_MALLOC
#ifndef WINDOWSNT
#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 USE_MMAP_FOR_BUFFERS
+ mmap_set_vars (0);
+#endif
+ unexec (SDATA (filename),
+ !NILP (symfile) ? SDATA (symfile) : 0, my_edata, 0, 0);
+#ifdef USE_MMAP_FOR_BUFFERS
+ mmap_set_vars (1);
+#endif
#ifdef DOUG_LEA_MALLOC
free (malloc_state_ptr);
#endif
{
*plocale = desired_locale;
setlocale (category, (STRINGP (desired_locale)
- ? (char *)(XSTRING (desired_locale)->data)
+ ? (char *)(SDATA (desired_locale))
: ""));
}
}
/* Add /: to the front of the name
if it would otherwise be treated as magic. */
tem = Ffind_file_name_handler (element, Qt);
+
+ /* However, if the handler says "I'm safe",
+ don't bother adding /:. */
+ if (SYMBOLP (tem))
+ {
+ Lisp_Object prop;
+ prop = Fget (tem, intern ("safe-magic"));
+ if (! NILP (prop))
+ tem = Qnil;
+ }
+
if (! NILP (tem))
element = concat2 (build_string ("/:"), element);
defsubr (&Sinvocation_directory);
DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
- "Args passed by shell to Emacs, as a list of strings.");
+ doc: /* Args passed by shell to Emacs, as a list of strings.
+Many arguments are deleted from the list as they are processed. */);
DEFVAR_LISP ("system-type", &Vsystem_type,
- "Value is symbol indicating type of operating system you are using.");
+ doc: /* Value is symbol indicating type of operating system you are using. */);
Vsystem_type = intern (SYSTEM_TYPE);
DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
- "Value is string indicating configuration Emacs was built for.");
+ doc: /* Value is string indicating configuration Emacs was built for.
+On MS-Windows, the value reflects the OS flavor and version on which
+Emacs is running. */);
Vsystem_configuration = build_string (EMACS_CONFIGURATION);
DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
- "String containing the configuration options Emacs was built with.");
+ doc: /* String containing the configuration options Emacs was built with. */);
Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
DEFVAR_BOOL ("noninteractive", &noninteractive1,
- "Non-nil means Emacs is running without interactive terminal.");
+ doc: /* Non-nil means Emacs is running without interactive terminal. */);
DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
- "Hook to be run whenever kill-emacs is called.\n\
-Since kill-emacs may be invoked when the terminal is disconnected (or\n\
-in other similar situations), functions placed on this hook should not\n\
-expect to be able to interact with the user. To ask for confirmation,\n\
-see `kill-emacs-query-functions' instead.");
+ doc: /* Hook to be run when kill-emacs is called.
+Since `kill-emacs' may be invoked when the terminal is disconnected (or
+in other similar situations), functions placed on this hook should not
+expect to be able to interact with the user. To ask for confirmation,
+see `kill-emacs-query-functions' instead.
+
+The hook is not run in batch mode, i.e., if `noninteractive' is non-nil. */);
Vkill_emacs_hook = Qnil;
+ empty_string = build_string ("");
+ staticpro (&empty_string);
+
#ifdef SIGUSR1
DEFVAR_LISP ("signal-USR1-hook", &Vsignal_USR1_hook,
- "Hook to be run whenever emacs receives a USR1 signal");
+ doc: /* Hook to be run whenever emacs receives a USR1 signal. */);
Vsignal_USR1_hook = Qnil;
#ifdef SIGUSR2
DEFVAR_LISP ("signal-USR2-hook", &Vsignal_USR2_hook,
- "Hook to be run whenever emacs receives a USR2 signal");
+ doc: /* Hook to be run whenever emacs receives a USR2 signal. */);
Vsignal_USR2_hook = Qnil;
#endif
#endif
DEFVAR_INT ("emacs-priority", &emacs_priority,
- "Priority for Emacs to run at.\n\
-This value is effective only if set before Emacs is dumped,\n\
-and only if the Emacs executable is installed with setuid to permit\n\
-it to change priority. (Emacs sets its uid back to the real uid.)\n\
-Currently, you need to define SET_EMACS_PRIORITY in `config.h'\n\
-before you compile Emacs, to enable the code for this feature.");
+ doc: /* Priority for Emacs to run at.
+This value is effective only if set before Emacs is dumped,
+and only if the Emacs executable is installed with setuid to permit
+it to change priority. (Emacs sets its uid back to the real uid.)
+Currently, you need to define SET_EMACS_PRIORITY in `config.h'
+before you compile Emacs, to enable the code for this feature. */);
emacs_priority = 0;
DEFVAR_LISP ("path-separator", &Vpath_separator,
- "The directory separator in search paths, as a string.");
+ doc: /* The directory separator in search paths, as a string. */);
{
char c = SEPCHAR;
Vpath_separator = make_string (&c, 1);
}
DEFVAR_LISP ("invocation-name", &Vinvocation_name,
- "The program name that was used to run Emacs.\n\
-Any directory names are omitted.");
+ doc: /* The program name that was used to run Emacs.
+Any directory names are omitted. */);
DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
- "The directory in which the Emacs executable was found, to run it.\n\
-The value is nil if that directory's name is not known.");
+ doc: /* The directory in which the Emacs executable was found, to run it.
+The value is nil if that directory's name is not known. */);
DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
- "A directory within which to look for the `lib-src' and `etc' directories.\n\
-This is non-nil when we can't find those directories in their standard\n\
-installed locations, but we can find them\n\
-near where the Emacs executable was found.");
+ doc: /* A directory within which to look for the `lib-src' and `etc' directories.
+This is non-nil when we can't find those directories in their standard
+installed locations, but we can find them
+near where the Emacs executable was found. */);
Vinstallation_directory = Qnil;
DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
- "System locale for messages.");
+ doc: /* System locale for messages. */);
Vsystem_messages_locale = Qnil;
DEFVAR_LISP ("previous-system-messages-locale",
- &Vprevious_system_messages_locale,
- "Most recently used system locale for messages.");
+ &Vprevious_system_messages_locale,
+ doc: /* Most recently used system locale for messages. */);
Vprevious_system_messages_locale = Qnil;
DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
- "System locale for time.");
+ doc: /* System locale for time. */);
Vsystem_time_locale = Qnil;
DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
- "Most recently used system locale for time.");
+ doc: /* Most recently used system locale for time. */);
Vprevious_system_time_locale = Qnil;
}
+
+/* arch-tag: 7bfd356a-c720-4612-8ab6-aa4222931c2e
+ (do not change this comment) */