Fix bug#7750.
[emacs.git] / src / emacs.c
blob6a04eda9aa27323fe610318cce5a500c8413320c
1 /* Fully extensible Emacs, running on Unix, intended for GNU.
3 Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1997, 1998, 1999,
4 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
5 Free Software Foundation, Inc.
7 This file is part of GNU Emacs.
9 GNU Emacs is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 GNU Emacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
23 #include <config.h>
24 #include <signal.h>
25 #include <errno.h>
26 #include <stdio.h>
28 #include <sys/types.h>
29 #include <sys/file.h>
30 #include <setjmp.h>
32 #ifdef HAVE_UNISTD_H
33 #include <unistd.h>
34 #endif
36 #ifdef WINDOWSNT
37 #include <fcntl.h>
38 #include <windows.h> /* just for w32.h */
39 #include "w32.h"
40 #include "w32heap.h" /* for prototype of sbrk */
41 #endif
43 #ifdef NS_IMPL_GNUSTEP
44 /* At least under Debian, GSConfig is in a subdirectory. --Stef */
45 #include <GNUstepBase/GSConfig.h>
46 #endif
48 #include "lisp.h"
49 #include "commands.h"
50 #include "intervals.h"
51 #include "buffer.h"
52 #include "window.h"
54 #include "systty.h"
55 #include "blockinput.h"
56 #include "syssignal.h"
57 #include "process.h"
58 #include "frame.h"
59 #include "termhooks.h"
60 #include "keyboard.h"
61 #include "keymap.h"
63 #ifdef HAVE_GNUTLS
64 #include "gnutls.h"
65 #endif
67 #ifdef HAVE_NS
68 #include "nsterm.h"
69 #endif
71 #ifdef HAVE_SETLOCALE
72 #include <locale.h>
73 #endif
75 #ifdef HAVE_SETRLIMIT
76 #include <sys/time.h>
77 #include <sys/resource.h>
78 #endif
80 #ifdef HAVE_PERSONALITY_LINUX32
81 #include <sys/personality.h>
82 #endif
84 #ifndef O_RDWR
85 #define O_RDWR 2
86 #endif
88 #ifdef HAVE_SETPGID
89 #if !defined (USG)
90 #undef setpgrp
91 #define setpgrp setpgid
92 #endif
93 #endif
95 /* If you change the following line, remember to update
96 msdos/mainmake.v2 which gleans the Emacs version from it! */
97 static const char emacs_version[] = "24.0.50";
98 static const char emacs_copyright[] = "Copyright (C) 2011 Free Software Foundation, Inc.";
100 /* Make these values available in GDB, which doesn't see macros. */
102 #ifdef USE_LSB_TAG
103 int gdb_use_lsb EXTERNALLY_VISIBLE = 1;
104 #else
105 int gdb_use_lsb EXTERNALLY_VISIBLE = 0;
106 #endif
107 #ifndef USE_LISP_UNION_TYPE
108 int gdb_use_union EXTERNALLY_VISIBLE = 0;
109 #else
110 int gdb_use_union EXTERNALLY_VISIBLE = 1;
111 #endif
112 EMACS_INT gdb_valbits EXTERNALLY_VISIBLE = VALBITS;
113 EMACS_INT gdb_gctypebits EXTERNALLY_VISIBLE = GCTYPEBITS;
114 #if defined (DATA_SEG_BITS) && ! defined (USE_LSB_TAG)
115 EMACS_INT gdb_data_seg_bits EXTERNALLY_VISIBLE = DATA_SEG_BITS;
116 #else
117 EMACS_INT gdb_data_seg_bits EXTERNALLY_VISIBLE = 0;
118 #endif
119 EMACS_INT PVEC_FLAG EXTERNALLY_VISIBLE = PSEUDOVECTOR_FLAG;
120 EMACS_INT gdb_array_mark_flag EXTERNALLY_VISIBLE = ARRAY_MARK_FLAG;
121 /* GDB might say "No enum type named pvec_type" if we don't have at
122 least one symbol with that type, and then xbacktrace could fail. */
123 enum pvec_type gdb_pvec_type EXTERNALLY_VISIBLE = PVEC_TYPE_MASK;
125 /* Command line args from shell, as list of strings. */
126 Lisp_Object Vcommand_line_args;
128 /* The name under which Emacs was invoked, with any leading directory
129 names discarded. */
130 Lisp_Object Vinvocation_name;
132 /* The directory name from which Emacs was invoked. */
133 Lisp_Object Vinvocation_directory;
135 /* The directory name in which to find subdirs such as lisp and etc.
136 nil means get them only from PATH_LOADSEARCH. */
137 Lisp_Object Vinstallation_directory;
139 /* The values of `current-time' before and after Emacs initialization. */
140 Lisp_Object Vbefore_init_time, Vafter_init_time;
142 /* Hook run by `kill-emacs' before it does really anything. */
143 Lisp_Object Vkill_emacs_hook;
145 /* Empty lisp strings. To avoid having to build any others. */
146 Lisp_Object empty_unibyte_string, empty_multibyte_string;
148 /* Search path separator. */
149 Lisp_Object Vpath_separator;
151 /* Set nonzero after Emacs has started up the first time.
152 Prevents reinitialization of the Lisp world and keymaps
153 on subsequent starts. */
154 int initialized;
156 #ifdef DOUG_LEA_MALLOC
157 /* Preserves a pointer to the memory allocated that copies that
158 static data inside glibc's malloc. */
159 void *malloc_state_ptr;
160 /* From glibc, a routine that returns a copy of the malloc internal state. */
161 extern void *malloc_get_state (void);
162 /* From glibc, a routine that overwrites the malloc internal state. */
163 extern int malloc_set_state (void*);
164 /* Non-zero if the MALLOC_CHECK_ environment variable was set while
165 dumping. Used to work around a bug in glibc's malloc. */
166 int malloc_using_checking;
167 #endif
169 /* Variable whose value is symbol giving operating system type. */
170 Lisp_Object Vsystem_type;
172 /* Variable whose value is string giving configuration built for. */
173 Lisp_Object Vsystem_configuration;
175 /* Variable whose value is string giving configuration options,
176 for use when reporting bugs. */
177 Lisp_Object Vsystem_configuration_options;
179 Lisp_Object Qfile_name_handler_alist;
181 Lisp_Object Qrisky_local_variable;
183 /* Current and previous system locales for messages and time. */
184 Lisp_Object Vsystem_messages_locale;
185 Lisp_Object Vprevious_system_messages_locale;
186 Lisp_Object Vsystem_time_locale;
187 Lisp_Object Vprevious_system_time_locale;
189 /* Copyright and version info. The version number may be updated by
190 Lisp code. */
191 Lisp_Object Vemacs_copyright, Vemacs_version;
193 /* Alist of external libraries and files implementing them. */
194 Lisp_Object Vdynamic_library_alist;
196 /* If non-zero, emacs should not attempt to use a window-specific code,
197 but instead should use the virtual terminal under which it was started. */
198 int inhibit_window_system;
200 /* If non-zero, a filter or a sentinel is running. Tested to save the match
201 data on the first attempt to change it inside asynchronous code. */
202 int running_asynch_code;
204 #if defined(HAVE_X_WINDOWS) || defined(HAVE_NS)
205 /* If non-zero, -d was specified, meaning we're using some window system. */
206 int display_arg;
207 #endif
209 /* An address near the bottom of the stack.
210 Tells GC how to save a copy of the stack. */
211 char *stack_bottom;
213 /* The address where the heap starts (from the first sbrk (0) call). */
214 static void *my_heap_start;
216 /* The gap between BSS end and heap start as far as we can tell. */
217 static unsigned long heap_bss_diff;
219 /* If the gap between BSS end and heap start is larger than this
220 output a warning in dump-emacs. */
221 #define MAX_HEAP_BSS_DIFF (1024*1024)
223 /* Nonzero means running Emacs without interactive terminal. */
225 int noninteractive;
227 /* Value of Lisp variable `noninteractive'.
228 Normally same as C variable `noninteractive'
229 but nothing terrible happens if user sets this one. */
231 int noninteractive1;
233 /* Nonzero means Emacs was run in --quick mode. */
234 int inhibit_x_resources;
236 /* Nonzero means remove site-lisp directories from load-path. */
237 int no_site_lisp;
239 /* Name for the server started by the daemon.*/
240 static char *daemon_name;
242 /* Pipe used to send exit notification to the daemon parent at
243 startup. */
244 int daemon_pipe[2];
246 /* Save argv and argc. */
247 char **initial_argv;
248 int initial_argc;
250 static void sort_args (int argc, char **argv);
251 void syms_of_emacs (void);
253 /* MSVC needs each string be shorter than 2048 bytes, so the usage
254 strings below are split to not overflow this limit. */
255 #define USAGE1 "\
256 Usage: %s [OPTION-OR-FILENAME]...\n\
258 Run Emacs, the extensible, customizable, self-documenting real-time\n\
259 display editor. The recommended way to start Emacs for normal editing\n\
260 is with no options at all.\n\
262 Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to\n\
263 read the main documentation for these command-line arguments.\n\
265 Initialization options:\n\
267 --batch do not do interactive display; implies -q\n\
268 --chdir DIR change to directory DIR\n\
269 --daemon start a server in the background\n\
270 --debug-init enable Emacs Lisp debugger for init file\n\
271 --display, -d DISPLAY use X server DISPLAY\n\
272 --no-desktop do not load a saved desktop\n\
273 --no-init-file, -q load neither ~/.emacs nor default.el\n\
274 --no-shared-memory, -nl do not use shared memory\n\
275 --no-site-file do not load site-start.el\n\
276 --no-site-lisp, -nsl do not add site-lisp directories to load-path\n\
277 --no-splash do not display a splash screen on startup\n\
278 --no-window-system, -nw do not communicate with X, ignoring $DISPLAY\n\
279 --quick, -Q equivalent to:\n\
280 -q --no-site-file --no-site-lisp --no-splash\n\
281 --script FILE run FILE as an Emacs Lisp script\n\
282 --terminal, -t DEVICE use DEVICE for terminal I/O\n\
283 --user, -u USER load ~USER/.emacs instead of your own\n\
284 \n%s"
286 #define USAGE2 "\
287 Action options:\n\
289 FILE visit FILE using find-file\n\
290 +LINE go to line LINE in next FILE\n\
291 +LINE:COLUMN go to line LINE, column COLUMN, in next FILE\n\
292 --directory, -L DIR add DIR to variable load-path\n\
293 --eval EXPR evaluate Emacs Lisp expression EXPR\n\
294 --execute EXPR evaluate Emacs Lisp expression EXPR\n\
295 --file FILE visit FILE using find-file\n\
296 --find-file FILE visit FILE using find-file\n\
297 --funcall, -f FUNC call Emacs Lisp function FUNC with no arguments\n\
298 --insert FILE insert contents of FILE into current buffer\n\
299 --kill exit without asking for confirmation\n\
300 --load, -l FILE load Emacs Lisp FILE using the load function\n\
301 --visit FILE visit FILE using find-file\n\
304 #define USAGE3 "\
305 Display options:\n\
307 --background-color, -bg COLOR window background color\n\
308 --basic-display, -D disable many display features;\n\
309 used for debugging Emacs\n\
310 --border-color, -bd COLOR main border color\n\
311 --border-width, -bw WIDTH width of main border\n\
312 --color, --color=MODE override color mode for character terminals;\n\
313 MODE defaults to `auto', and can also\n\
314 be `never', `auto', `always',\n\
315 or a mode name like `ansi8'\n\
316 --cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
317 --font, -fn FONT default font; must be fixed-width\n\
318 --foreground-color, -fg COLOR window foreground color\n\
319 --fullheight, -fh make the first frame high as the screen\n\
320 --fullscreen, -fs make first frame fullscreen\n\
321 --fullwidth, -fw make the first frame wide as the screen\n\
322 --maximized, -mm make the first frame maximized\n\
323 --geometry, -g GEOMETRY window geometry\n\
324 --no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon\n\
325 --iconic start Emacs in iconified state\n\
326 --internal-border, -ib WIDTH width between text and main border\n\
327 --line-spacing, -lsp PIXELS additional space to put between lines\n\
328 --mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
329 --name NAME title for initial Emacs frame\n\
330 --no-blinking-cursor, -nbc disable blinking cursor\n\
331 --reverse-video, -r, -rv switch foreground and background\n\
332 --title, -T TITLE title for initial Emacs frame\n\
333 --vertical-scroll-bars, -vb enable vertical scroll bars\n\
334 --xrm XRESOURCES set additional X resources\n\
335 --parent-id XID set parent window\n\
336 --help display this help and exit\n\
337 --version output version information and exit\n\
340 #define USAGE4 "\
341 You can generally also specify long option names with a single -; for\n\
342 example, -batch as well as --batch. You can use any unambiguous\n\
343 abbreviation for a --option.\n\
345 Various environment variables and window system resources also affect\n\
346 Emacs' operation. See the main documentation.\n\
348 Report bugs to bug-gnu-emacs@gnu.org. First, please see the Bugs\n\
349 section of the Emacs manual or the file BUGS.\n"
352 /* Signal code for the fatal signal that was received. */
353 int fatal_error_code;
355 /* Nonzero if handling a fatal error already. */
356 int fatal_error_in_progress;
358 /* If non-null, call this function from fatal_error_signal before
359 committing suicide. */
361 void (*fatal_error_signal_hook) (void);
363 #ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
364 /* When compiled with GTK and running under Gnome,
365 multiple threads may be created. Keep track of our main
366 thread to make sure signals are delivered to it (see syssignal.h). */
368 pthread_t main_thread;
369 #endif
372 /* Handle bus errors, invalid instruction, etc. */
373 SIGTYPE
374 fatal_error_signal (int sig)
376 SIGNAL_THREAD_CHECK (sig);
377 fatal_error_code = sig;
378 signal (sig, SIG_DFL);
380 TOTALLY_UNBLOCK_INPUT;
382 /* If fatal error occurs in code below, avoid infinite recursion. */
383 if (! fatal_error_in_progress)
385 fatal_error_in_progress = 1;
387 if (sig == SIGTERM || sig == SIGHUP || sig == SIGINT)
388 Fkill_emacs (make_number (sig));
390 shut_down_emacs (sig, 0, Qnil);
393 /* Signal the same code; this time it will really be fatal.
394 Remember that since we're in a signal handler, the signal we're
395 going to send is probably blocked, so we have to unblock it if we
396 want to really receive it. */
397 #ifndef MSDOS
398 sigunblock (sigmask (fatal_error_code));
399 #endif
401 if (fatal_error_signal_hook)
402 fatal_error_signal_hook ();
404 kill (getpid (), fatal_error_code);
407 #ifdef SIGDANGER
409 /* Handler for SIGDANGER. */
410 SIGTYPE
411 memory_warning_signal (sig)
412 int sig;
414 signal (sig, memory_warning_signal);
415 SIGNAL_THREAD_CHECK (sig);
417 malloc_warning ("Operating system warns that virtual memory is running low.\n");
419 /* It might be unsafe to call do_auto_save now. */
420 force_auto_save_soon ();
422 #endif
424 /* We define abort, rather than using it from the library,
425 so that GDB can return from a breakpoint here.
426 MSDOS has its own definition in msdos.c. */
428 #if ! defined (DOS_NT) && ! defined (NO_ABORT)
430 void
431 abort (void)
433 kill (getpid (), SIGABRT);
434 /* This shouldn't be executed, but it prevents a warning. */
435 exit (1);
437 #endif
440 /* Code for dealing with Lisp access to the Unix command line. */
442 static void
443 init_cmdargs (int argc, char **argv, int skip_args)
445 register int i;
446 Lisp_Object name, dir, tem;
447 int count = SPECPDL_INDEX ();
448 Lisp_Object raw_name;
450 initial_argv = argv;
451 initial_argc = argc;
453 raw_name = build_string (argv[0]);
455 /* Add /: to the front of the name
456 if it would otherwise be treated as magic. */
457 tem = Ffind_file_name_handler (raw_name, Qt);
458 if (! NILP (tem))
459 raw_name = concat2 (build_string ("/:"), raw_name);
461 Vinvocation_name = Ffile_name_nondirectory (raw_name);
462 Vinvocation_directory = Ffile_name_directory (raw_name);
464 /* If we got no directory in argv[0], search PATH to find where
465 Emacs actually came from. */
466 if (NILP (Vinvocation_directory))
468 Lisp_Object found;
469 int yes = openp (Vexec_path, Vinvocation_name,
470 Vexec_suffixes, &found, make_number (X_OK));
471 if (yes == 1)
473 /* Add /: to the front of the name
474 if it would otherwise be treated as magic. */
475 tem = Ffind_file_name_handler (found, Qt);
476 if (! NILP (tem))
477 found = concat2 (build_string ("/:"), found);
478 Vinvocation_directory = Ffile_name_directory (found);
482 if (!NILP (Vinvocation_directory)
483 && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
484 /* Emacs was started with relative path, like ./emacs.
485 Make it absolute. */
486 Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
488 Vinstallation_directory = Qnil;
490 if (!NILP (Vinvocation_directory))
492 dir = Vinvocation_directory;
493 name = Fexpand_file_name (Vinvocation_name, dir);
494 while (1)
496 Lisp_Object tem, lib_src_exists;
497 Lisp_Object etc_exists, info_exists;
499 /* See if dir contains subdirs for use by Emacs.
500 Check for the ones that would exist in a build directory,
501 not including lisp and info. */
502 tem = Fexpand_file_name (build_string ("lib-src"), dir);
503 lib_src_exists = Ffile_exists_p (tem);
505 #ifdef MSDOS
506 /* MSDOS installations frequently remove lib-src, but we still
507 must set installation-directory, or else info won't find
508 its files (it uses the value of installation-directory). */
509 tem = Fexpand_file_name (build_string ("info"), dir);
510 info_exists = Ffile_exists_p (tem);
511 #else
512 info_exists = Qnil;
513 #endif
515 if (!NILP (lib_src_exists) || !NILP (info_exists))
517 tem = Fexpand_file_name (build_string ("etc"), dir);
518 etc_exists = Ffile_exists_p (tem);
519 if (!NILP (etc_exists))
521 Vinstallation_directory
522 = Ffile_name_as_directory (dir);
523 break;
527 /* See if dir's parent contains those subdirs. */
528 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
529 lib_src_exists = Ffile_exists_p (tem);
532 #ifdef MSDOS
533 /* See the MSDOS commentary above. */
534 tem = Fexpand_file_name (build_string ("../info"), dir);
535 info_exists = Ffile_exists_p (tem);
536 #else
537 info_exists = Qnil;
538 #endif
540 if (!NILP (lib_src_exists) || !NILP (info_exists))
542 tem = Fexpand_file_name (build_string ("../etc"), dir);
543 etc_exists = Ffile_exists_p (tem);
544 if (!NILP (etc_exists))
546 tem = Fexpand_file_name (build_string (".."), dir);
547 Vinstallation_directory
548 = Ffile_name_as_directory (tem);
549 break;
553 /* If the Emacs executable is actually a link,
554 next try the dir that the link points into. */
555 tem = Ffile_symlink_p (name);
556 if (!NILP (tem))
558 name = Fexpand_file_name (tem, dir);
559 dir = Ffile_name_directory (name);
561 else
562 break;
566 Vcommand_line_args = Qnil;
568 for (i = argc - 1; i >= 0; i--)
570 if (i == 0 || i > skip_args)
571 /* For the moment, we keep arguments as is in unibyte strings.
572 They are decoded in the function command-line after we know
573 locale-coding-system. */
574 Vcommand_line_args
575 = Fcons (make_unibyte_string (argv[i], strlen (argv[i])),
576 Vcommand_line_args);
579 unbind_to (count, Qnil);
582 DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
583 doc: /* Return the program name that was used to run Emacs.
584 Any directory names are omitted. */)
585 (void)
587 return Fcopy_sequence (Vinvocation_name);
590 DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
591 0, 0, 0,
592 doc: /* Return the directory name in which the Emacs executable was located. */)
593 (void)
595 return Fcopy_sequence (Vinvocation_directory);
599 #ifdef HAVE_TZSET
600 /* A valid but unlikely value for the TZ environment value.
601 It is OK (though a bit slower) if the user actually chooses this value. */
602 static char dump_tz[] = "UtC0";
603 #endif
605 #ifndef ORDINARY_LINK
606 /* We don't include crtbegin.o and crtend.o in the link,
607 so these functions and variables might be missed.
608 Provide dummy definitions to avoid error.
609 (We don't have any real constructors or destructors.) */
610 #ifdef __GNUC__
611 #ifndef GCC_CTORS_IN_LIBC
612 void __do_global_ctors (void)
614 void __do_global_ctors_aux (void)
616 void __do_global_dtors (void)
618 /* GNU/Linux has a bug in its library; avoid an error. */
619 #ifndef GNU_LINUX
620 char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
621 #endif
622 char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
623 #endif /* GCC_CTORS_IN_LIBC */
624 void __main (void)
626 #endif /* __GNUC__ */
627 #endif /* ORDINARY_LINK */
629 /* Test whether the next argument in ARGV matches SSTR or a prefix of
630 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
631 (the argument is supposed to have a value) store in *VALPTR either
632 the next argument or the portion of this one after the equal sign.
633 ARGV is read starting at position *SKIPPTR; this index is advanced
634 by the number of arguments used.
636 Too bad we can't just use getopt for all of this, but we don't have
637 enough information to do it right. */
639 static int
640 argmatch (char **argv, int argc, const char *sstr, const char *lstr, int minlen, char **valptr, int *skipptr)
642 char *p = NULL;
643 int arglen;
644 char *arg;
646 /* Don't access argv[argc]; give up in advance. */
647 if (argc <= *skipptr + 1)
648 return 0;
650 arg = argv[*skipptr+1];
651 if (arg == NULL)
652 return 0;
653 if (strcmp (arg, sstr) == 0)
655 if (valptr != NULL)
657 *valptr = argv[*skipptr+2];
658 *skipptr += 2;
660 else
661 *skipptr += 1;
662 return 1;
664 arglen = (valptr != NULL && (p = strchr (arg, '=')) != NULL
665 ? p - arg : strlen (arg));
666 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
667 return 0;
668 else if (valptr == NULL)
670 *skipptr += 1;
671 return 1;
673 else if (p != NULL)
675 *valptr = p+1;
676 *skipptr += 1;
677 return 1;
679 else if (argv[*skipptr+2] != NULL)
681 *valptr = argv[*skipptr+2];
682 *skipptr += 2;
683 return 1;
685 else
687 return 0;
691 #ifdef DOUG_LEA_MALLOC
693 /* malloc can be invoked even before main (e.g. by the dynamic
694 linker), so the dumped malloc state must be restored as early as
695 possible using this special hook. */
697 static void
698 malloc_initialize_hook (void)
700 #ifndef USE_CRT_DLL
701 extern char **environ;
702 #endif
704 if (initialized)
706 if (!malloc_using_checking)
707 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
708 ignored if the heap to be restored was constructed without
709 malloc checking. Can't use unsetenv, since that calls malloc. */
711 char **p;
713 for (p = environ; p && *p; p++)
714 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
717 *p = p[1];
718 while (*++p);
719 break;
723 malloc_set_state (malloc_state_ptr);
724 #ifndef XMALLOC_OVERRUN_CHECK
725 free (malloc_state_ptr);
726 #endif
728 else
730 if (my_heap_start == 0)
731 my_heap_start = sbrk (0);
732 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
736 void (*__malloc_initialize_hook) (void) = malloc_initialize_hook;
738 #endif /* DOUG_LEA_MALLOC */
741 /* ARGSUSED */
743 main (int argc, char **argv)
745 #if GC_MARK_STACK
746 Lisp_Object dummy;
747 #endif
748 char stack_bottom_variable;
749 int do_initial_setlocale;
750 int skip_args = 0;
751 #ifdef HAVE_SETRLIMIT
752 struct rlimit rlim;
753 #endif
754 int no_loadup = 0;
755 char *junk = 0;
756 char *dname_arg = 0;
757 #ifdef NS_IMPL_COCOA
758 char dname_arg2[80];
759 #endif
760 char *ch_to_dir;
762 #if GC_MARK_STACK
763 stack_base = &dummy;
764 #endif
766 #if defined (USE_GTK) && defined (G_SLICE_ALWAYS_MALLOC)
767 /* This is used by the Cygwin build. */
768 setenv ("G_SLICE", "always-malloc", 1);
769 #endif
771 if (!initialized)
773 extern char my_endbss[];
774 extern char *my_endbss_static;
776 if (my_heap_start == 0)
777 my_heap_start = sbrk (0);
779 heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
782 #ifdef RUN_TIME_REMAP
783 if (initialized)
784 run_time_remap (argv[0]);
785 #endif
787 /* If using unexmacosx.c (set by s/darwin.h), we must do this. */
788 #ifdef DARWIN_OS
789 if (!initialized)
790 unexec_init_emacs_zone ();
791 #endif
793 sort_args (argc, argv);
794 argc = 0;
795 while (argv[argc]) argc++;
797 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args))
799 const char *version, *copyright;
800 if (initialized)
802 Lisp_Object tem, tem2;
803 tem = Fsymbol_value (intern_c_string ("emacs-version"));
804 tem2 = Fsymbol_value (intern_c_string ("emacs-copyright"));
805 if (!STRINGP (tem))
807 fprintf (stderr, "Invalid value of `emacs-version'\n");
808 exit (1);
810 if (!STRINGP (tem2))
812 fprintf (stderr, "Invalid value of `emacs-copyright'\n");
813 exit (1);
815 else
817 version = SDATA (tem);
818 copyright = SDATA (tem2);
821 else
823 version = emacs_version;
824 copyright = emacs_copyright;
826 printf ("GNU Emacs %s\n", version);
827 printf ("%s\n", copyright);
828 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
829 printf ("You may redistribute copies of Emacs\n");
830 printf ("under the terms of the GNU General Public License.\n");
831 printf ("For more information about these matters, ");
832 printf ("see the file named COPYING.\n");
833 exit (0);
836 if (argmatch (argv, argc, "-chdir", "--chdir", 4, &ch_to_dir, &skip_args))
837 if (chdir (ch_to_dir) == -1)
839 fprintf (stderr, "%s: Can't chdir to %s: %s\n",
840 argv[0], ch_to_dir, strerror (errno));
841 exit (1);
845 #ifdef HAVE_PERSONALITY_LINUX32
846 if (!initialized
847 && (strcmp (argv[argc-1], "dump") == 0
848 || strcmp (argv[argc-1], "bootstrap") == 0)
849 && ! getenv ("EMACS_HEAP_EXEC"))
851 static char heapexec[] = "EMACS_HEAP_EXEC=true";
852 /* Set this so we only do this once. */
853 putenv(heapexec);
855 /* A flag to turn off address randomization which is introduced
856 in linux kernel shipped with fedora core 4 */
857 #define ADD_NO_RANDOMIZE 0x0040000
858 personality (PER_LINUX32 | ADD_NO_RANDOMIZE);
859 #undef ADD_NO_RANDOMIZE
861 execvp (argv[0], argv);
863 /* If the exec fails, try to dump anyway. */
864 perror ("execvp");
866 #endif /* HAVE_PERSONALITY_LINUX32 */
868 #if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
869 /* Extend the stack space available.
870 Don't do that if dumping, since some systems (e.g. DJGPP)
871 might define a smaller stack limit at that time. */
872 if (1
873 #ifndef CANNOT_DUMP
874 && (!noninteractive || initialized)
875 #endif
876 && !getrlimit (RLIMIT_STACK, &rlim))
878 long newlim;
879 extern size_t re_max_failures;
880 /* Approximate the amount regex.c needs per unit of re_max_failures. */
881 int ratio = 20 * sizeof (char *);
882 /* Then add 33% to cover the size of the smaller stacks that regex.c
883 successively allocates and discards, on its way to the maximum. */
884 ratio += ratio / 3;
885 /* Add in some extra to cover
886 what we're likely to use for other reasons. */
887 newlim = re_max_failures * ratio + 200000;
888 #ifdef __NetBSD__
889 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
890 stack allocation routine for new process that the allocation
891 fails if stack limit is not on page boundary. So, round up the
892 new limit to page boundary. */
893 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize();
894 #endif
895 if (newlim > rlim.rlim_max)
897 newlim = rlim.rlim_max;
898 /* Don't let regex.c overflow the stack we have. */
899 re_max_failures = (newlim - 200000) / ratio;
901 if (rlim.rlim_cur < newlim)
902 rlim.rlim_cur = newlim;
904 setrlimit (RLIMIT_STACK, &rlim);
906 #endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
908 /* Record (approximately) where the stack begins. */
909 stack_bottom = &stack_bottom_variable;
911 clearerr (stdin);
913 #ifndef SYSTEM_MALLOC
914 /* Arrange to get warning messages as memory fills up. */
915 memory_warnings (0, malloc_warning);
917 /* Call malloc at least once, to run the initial __malloc_hook.
918 Also call realloc and free for consistency. */
919 free (realloc (malloc (4), 4));
921 # ifndef SYNC_INPUT
922 /* Arrange to disable interrupt input inside malloc etc. */
923 uninterrupt_malloc ();
924 # endif /* not SYNC_INPUT */
925 #endif /* not SYSTEM_MALLOC */
927 #ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
928 main_thread = pthread_self ();
929 #endif /* FORWARD_SIGNAL_TO_MAIN_THREAD */
931 #if defined (MSDOS) || defined (WINDOWSNT)
932 /* We do all file input/output as binary files. When we need to translate
933 newlines, we do that manually. */
934 _fmode = O_BINARY;
935 #endif /* MSDOS || WINDOWSNT */
937 #ifdef MSDOS
938 if (!isatty (fileno (stdin)))
939 setmode (fileno (stdin), O_BINARY);
940 if (!isatty (fileno (stdout)))
942 fflush (stdout);
943 setmode (fileno (stdout), O_BINARY);
945 #endif /* MSDOS */
947 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
948 The build procedure uses this while dumping, to ensure that the
949 dumped Emacs does not have its system locale tables initialized,
950 as that might cause screwups when the dumped Emacs starts up. */
952 char *lc_all = getenv ("LC_ALL");
953 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
956 /* Set locale now, so that initial error messages are localized properly.
957 fixup_locale must wait until later, since it builds strings. */
958 if (do_initial_setlocale)
959 setlocale (LC_ALL, "");
961 inhibit_window_system = 0;
963 /* Handle the -t switch, which specifies filename to use as terminal. */
964 while (1)
966 char *term;
967 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
969 int result;
970 emacs_close (0);
971 emacs_close (1);
972 result = emacs_open (term, O_RDWR, 0);
973 if (result < 0)
975 char *errstring = strerror (errno);
976 fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
977 exit (1);
979 dup (0);
980 if (! isatty (0))
982 fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
983 exit (1);
985 fprintf (stderr, "Using %s\n", term);
986 #ifdef HAVE_WINDOW_SYSTEM
987 inhibit_window_system = 1; /* -t => -nw */
988 #endif
990 else
991 break;
994 /* Command line option --no-windows is deprecated and thus not mentioned
995 in the manual and usage informations. */
996 if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
997 || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
998 inhibit_window_system = 1;
1000 /* Handle the -batch switch, which means don't do interactive display. */
1001 noninteractive = 0;
1002 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
1004 noninteractive = 1;
1005 Vundo_outer_limit = Qnil;
1007 if (argmatch (argv, argc, "-script", "--script", 3, &junk, &skip_args))
1009 noninteractive = 1; /* Set batch mode. */
1010 /* Convert --script to -scriptload, un-skip it, and sort again
1011 so that it will be handled in proper sequence. */
1012 /* FIXME broken for --script=FILE - is that supposed to work? */
1013 argv[skip_args - 1] = "-scriptload";
1014 skip_args -= 2;
1015 sort_args (argc, argv);
1018 /* Handle the --help option, which gives a usage message. */
1019 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
1021 printf (USAGE1, argv[0], USAGE2);
1022 printf (USAGE3);
1023 printf (USAGE4);
1024 exit (0);
1027 if (argmatch (argv, argc, "-daemon", "--daemon", 5, NULL, &skip_args)
1028 || argmatch (argv, argc, "-daemon", "--daemon", 5, &dname_arg, &skip_args))
1030 #ifndef DOS_NT
1031 pid_t f;
1033 /* Start as a daemon: fork a new child process which will run the
1034 rest of the initialization code, then exit.
1036 Detaching a daemon requires the following steps:
1037 - fork
1038 - setsid
1039 - exit the parent
1040 - close the tty file-descriptors
1042 We only want to do the last 2 steps once the daemon is ready to
1043 serve requests, i.e. after loading .emacs (initialization).
1044 OTOH initialization may start subprocesses (e.g. ispell) and these
1045 should be run from the proper process (the one that will end up
1046 running as daemon) and with the proper "session id" in order for
1047 them to keep working after detaching, so fork and setsid need to be
1048 performed before initialization.
1050 We want to avoid exiting before the server socket is ready, so
1051 use a pipe for synchronization. The parent waits for the child
1052 to close its end of the pipe (using `daemon-initialized')
1053 before exiting. */
1054 if (pipe (daemon_pipe) == -1)
1056 fprintf (stderr, "Cannot pipe!\n");
1057 exit (1);
1060 #ifndef NS_IMPL_COCOA
1061 f = fork ();
1062 #else /* NS_IMPL_COCOA */
1063 /* Under Cocoa we must do fork+exec as CoreFoundation lib fails in
1064 forked process: http://developer.apple.com/ReleaseNotes/
1065 CoreFoundation/CoreFoundation.html)
1066 We mark being in the exec'd process by a daemon name argument of
1067 form "--daemon=\nFD0,FD1\nNAME" where FD are the pipe file descriptors,
1068 NAME is the original daemon name, if any. */
1069 if (!dname_arg || !strchr (dname_arg, '\n'))
1070 f = fork (); /* in orig */
1071 else
1072 f = 0; /* in exec'd */
1073 #endif /* NS_IMPL_COCOA */
1074 if (f > 0)
1076 int retval;
1077 char buf[1];
1079 /* Close unused writing end of the pipe. */
1080 close (daemon_pipe[1]);
1082 /* Just wait for the child to close its end of the pipe. */
1085 retval = read (daemon_pipe[0], &buf, 1);
1087 while (retval == -1 && errno == EINTR);
1089 if (retval < 0)
1091 fprintf (stderr, "Error reading status from child\n");
1092 exit (1);
1094 else if (retval == 0)
1096 fprintf (stderr, "Error: server did not start correctly\n");
1097 exit (1);
1100 close (daemon_pipe[0]);
1101 exit (0);
1103 if (f < 0)
1105 fprintf (stderr, "Cannot fork!\n");
1106 exit (1);
1109 #ifdef NS_IMPL_COCOA
1111 /* In orig process, forked as child, OR in exec'd. */
1112 if (!dname_arg || !strchr (dname_arg, '\n'))
1113 { /* In orig, child: now exec w/special daemon name. */
1114 char fdStr[80];
1116 if (dname_arg && strlen (dname_arg) > 70)
1118 fprintf (stderr, "daemon: child name too long\n");
1119 exit (1);
1122 sprintf (fdStr, "--daemon=\n%d,%d\n%s", daemon_pipe[0],
1123 daemon_pipe[1], dname_arg ? dname_arg : "");
1124 argv[skip_args] = fdStr;
1126 execv (argv[0], argv);
1127 fprintf (stderr, "emacs daemon: exec failed: %d\n", errno);
1128 exit (1);
1131 /* In exec'd: parse special dname into pipe and name info. */
1132 if (!dname_arg || !strchr (dname_arg, '\n')
1133 || strlen (dname_arg) < 1 || strlen (dname_arg) > 70)
1135 fprintf (stderr, "emacs daemon: daemon name absent or too long\n");
1136 exit(1);
1138 dname_arg2[0] = '\0';
1139 sscanf (dname_arg, "\n%d,%d\n%s", &(daemon_pipe[0]), &(daemon_pipe[1]),
1140 dname_arg2);
1141 dname_arg = strlen (dname_arg2) ? dname_arg2 : NULL;
1143 #endif /* NS_IMPL_COCOA */
1145 if (dname_arg)
1146 daemon_name = xstrdup (dname_arg);
1147 /* Close unused reading end of the pipe. */
1148 close (daemon_pipe[0]);
1149 /* Make sure that the used end of the pipe is closed on exec, so
1150 that it is not accessible to programs started from .emacs. */
1151 fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC);
1153 #ifdef HAVE_SETSID
1154 setsid();
1155 #endif
1156 #else /* DOS_NT */
1157 fprintf (stderr, "This platform does not support the -daemon flag.\n");
1158 exit (1);
1159 #endif /* DOS_NT */
1162 if (! noninteractive)
1164 #if defined (USG5) && defined (INTERRUPT_INPUT)
1165 setpgrp ();
1166 #endif
1167 #if defined (HAVE_GTK_AND_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
1169 extern void malloc_enable_thread (void);
1171 malloc_enable_thread ();
1173 #endif
1176 init_signals ();
1178 /* Don't catch SIGHUP if dumping. */
1179 if (1
1180 #ifndef CANNOT_DUMP
1181 && initialized
1182 #endif
1185 sigblock (sigmask (SIGHUP));
1186 /* In --batch mode, don't catch SIGHUP if already ignored.
1187 That makes nohup work. */
1188 if (! noninteractive
1189 || signal (SIGHUP, SIG_IGN) != SIG_IGN)
1190 signal (SIGHUP, fatal_error_signal);
1191 sigunblock (sigmask (SIGHUP));
1194 if (
1195 #ifndef CANNOT_DUMP
1196 ! noninteractive || initialized
1197 #else
1199 #endif
1202 /* Don't catch these signals in batch mode if dumping.
1203 On some machines, this sets static data that would make
1204 signal fail to work right when the dumped Emacs is run. */
1205 signal (SIGQUIT, fatal_error_signal);
1206 signal (SIGILL, fatal_error_signal);
1207 signal (SIGTRAP, fatal_error_signal);
1208 #ifdef SIGUSR1
1209 add_user_signal (SIGUSR1, "sigusr1");
1210 #endif
1211 #ifdef SIGUSR2
1212 add_user_signal (SIGUSR2, "sigusr2");
1213 #endif
1214 #ifdef SIGABRT
1215 signal (SIGABRT, fatal_error_signal);
1216 #endif
1217 #ifdef SIGHWE
1218 signal (SIGHWE, fatal_error_signal);
1219 #endif
1220 #ifdef SIGPRE
1221 signal (SIGPRE, fatal_error_signal);
1222 #endif
1223 #ifdef SIGORE
1224 signal (SIGORE, fatal_error_signal);
1225 #endif
1226 #ifdef SIGUME
1227 signal (SIGUME, fatal_error_signal);
1228 #endif
1229 #ifdef SIGDLK
1230 signal (SIGDLK, fatal_error_signal);
1231 #endif
1232 #ifdef SIGCPULIM
1233 signal (SIGCPULIM, fatal_error_signal);
1234 #endif
1235 #ifdef SIGIOT
1236 /* This is missing on some systems - OS/2, for example. */
1237 signal (SIGIOT, fatal_error_signal);
1238 #endif
1239 #ifdef SIGEMT
1240 signal (SIGEMT, fatal_error_signal);
1241 #endif
1242 signal (SIGFPE, fatal_error_signal);
1243 #ifdef SIGBUS
1244 signal (SIGBUS, fatal_error_signal);
1245 #endif
1246 signal (SIGSEGV, fatal_error_signal);
1247 #ifdef SIGSYS
1248 signal (SIGSYS, fatal_error_signal);
1249 #endif
1250 /* May need special treatment on MS-Windows. See
1251 http://lists.gnu.org/archive/html/emacs-devel/2010-09/msg01062.html
1252 Please update the doc of kill-emacs, kill-emacs-hook, and
1253 NEWS if you change this.
1255 if (noninteractive) signal (SIGINT, fatal_error_signal);
1256 signal (SIGTERM, fatal_error_signal);
1257 #ifdef SIGXCPU
1258 signal (SIGXCPU, fatal_error_signal);
1259 #endif
1260 #ifdef SIGXFSZ
1261 signal (SIGXFSZ, fatal_error_signal);
1262 #endif /* SIGXFSZ */
1264 #ifdef SIGDANGER
1265 /* This just means available memory is getting low. */
1266 signal (SIGDANGER, memory_warning_signal);
1267 #endif
1269 #ifdef AIX
1270 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
1271 signal (SIGXCPU, fatal_error_signal);
1272 signal (SIGIOINT, fatal_error_signal);
1273 signal (SIGGRANT, fatal_error_signal);
1274 signal (SIGRETRACT, fatal_error_signal);
1275 signal (SIGSOUND, fatal_error_signal);
1276 signal (SIGMSG, fatal_error_signal);
1277 #endif /* AIX */
1280 noninteractive1 = noninteractive;
1282 /* Perform basic initializations (not merely interning symbols). */
1284 if (!initialized)
1286 init_alloc_once ();
1287 init_obarray ();
1288 init_eval_once ();
1289 init_character_once ();
1290 init_charset_once ();
1291 init_coding_once ();
1292 init_syntax_once (); /* Create standard syntax table. */
1293 init_category_once (); /* Create standard category table. */
1294 /* Must be done before init_buffer. */
1295 init_casetab_once ();
1296 init_buffer_once (); /* Create buffer table and some buffers. */
1297 init_minibuf_once (); /* Create list of minibuffers. */
1298 /* Must precede init_window_once. */
1300 /* Call syms_of_xfaces before init_window_once because that
1301 function creates Vterminal_frame. Termcap frames now use
1302 faces, and the face implementation uses some symbols as
1303 face names. */
1304 syms_of_xfaces ();
1305 /* XXX syms_of_keyboard uses some symbols in keymap.c. It would
1306 be better to arrange things not to have this dependency. */
1307 syms_of_keymap ();
1308 /* Call syms_of_keyboard before init_window_once because
1309 keyboard sets up symbols that include some face names that
1310 the X support will want to use. This can happen when
1311 CANNOT_DUMP is defined. */
1312 syms_of_keyboard ();
1314 /* Called before syms_of_fileio, because it sets up Qerror_condition. */
1315 syms_of_data ();
1316 syms_of_fileio ();
1317 /* Before syms_of_coding to initialize Vgc_cons_threshold. */
1318 syms_of_alloc ();
1319 /* Before syms_of_coding because it initializes Qcharsetp. */
1320 syms_of_charset ();
1321 /* Before init_window_once, because it sets up the
1322 Vcoding_system_hash_table. */
1323 syms_of_coding (); /* This should be after syms_of_fileio. */
1325 init_window_once (); /* Init the window system. */
1326 #ifdef HAVE_WINDOW_SYSTEM
1327 init_fringe_once (); /* Swap bitmaps if necessary. */
1328 #endif /* HAVE_WINDOW_SYSTEM */
1331 init_alloc ();
1333 if (do_initial_setlocale)
1335 fixup_locale ();
1336 Vsystem_messages_locale = Vprevious_system_messages_locale;
1337 Vsystem_time_locale = Vprevious_system_time_locale;
1340 init_eval ();
1341 init_data ();
1342 #ifdef CLASH_DETECTION
1343 init_filelock ();
1344 #endif
1345 init_atimer ();
1346 running_asynch_code = 0;
1348 no_loadup
1349 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
1351 no_site_lisp
1352 = argmatch (argv, argc, "-nsl", "--no-site-lisp", 11, NULL, &skip_args);
1354 #ifdef HAVE_NS
1355 ns_alloc_autorelease_pool();
1356 if (!noninteractive)
1358 #ifdef NS_IMPL_COCOA
1359 if (skip_args < argc)
1361 if (!strncmp(argv[skip_args], "-psn", 4))
1363 skip_args += 1;
1364 chdir (getenv ("HOME"));
1366 else if (skip_args+1 < argc && !strncmp(argv[skip_args+1], "-psn", 4))
1368 skip_args += 2;
1369 chdir (getenv ("HOME"));
1372 #endif /* COCOA */
1374 #endif /* HAVE_NS */
1376 #ifdef HAVE_X_WINDOWS
1377 /* Stupid kludge to catch command-line display spec. We can't
1378 handle this argument entirely in window system dependent code
1379 because we don't even know which window system dependent code
1380 to run until we've recognized this argument. */
1382 char *displayname = 0;
1383 int count_before = skip_args;
1385 /* Skip any number of -d options, but only use the last one. */
1386 while (1)
1388 int count_before_this = skip_args;
1390 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1391 display_arg = 1;
1392 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1393 display_arg = 1;
1394 else
1395 break;
1397 count_before = count_before_this;
1400 /* If we have the form --display=NAME,
1401 convert it into -d name.
1402 This requires inserting a new element into argv. */
1403 if (displayname != 0 && skip_args - count_before == 1)
1405 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1406 int j;
1408 for (j = 0; j < count_before + 1; j++)
1409 new[j] = argv[j];
1410 new[count_before + 1] = "-d";
1411 new[count_before + 2] = displayname;
1412 for (j = count_before + 2; j <argc; j++)
1413 new[j + 1] = argv[j];
1414 argv = new;
1415 argc++;
1417 /* Change --display to -d, when its arg is separate. */
1418 else if (displayname != 0 && skip_args > count_before
1419 && argv[count_before + 1][1] == '-')
1420 argv[count_before + 1] = "-d";
1422 if (! no_site_lisp)
1424 if (argmatch (argv, argc, "-Q", "--quick", 3, NULL, &skip_args)
1425 || argmatch (argv, argc, "-quick", 0, 2, NULL, &skip_args))
1426 no_site_lisp = 1;
1429 /* Don't actually discard this arg. */
1430 skip_args = count_before;
1432 #else /* !HAVE_X_WINDOWS */
1433 if (! no_site_lisp)
1435 int count_before = skip_args;
1437 if (argmatch (argv, argc, "-Q", "--quick", 3, NULL, &skip_args)
1438 || argmatch (argv, argc, "-quick", 0, 2, NULL, &skip_args))
1439 no_site_lisp = 1;
1441 skip_args = count_before;
1443 #endif
1445 /* argmatch must not be used after here,
1446 except when bulding temacs
1447 because the -d argument has not been skipped in skip_args. */
1449 #ifdef MSDOS
1450 /* Call early 'cause init_environment needs it. */
1451 init_dosfns ();
1452 /* Set defaults for several environment variables. */
1453 if (initialized)
1454 init_environment (argc, argv, skip_args);
1455 else
1456 tzset ();
1457 #endif /* MSDOS */
1459 #ifdef WINDOWSNT
1460 globals_of_w32 ();
1461 /* Initialize environment from registry settings. */
1462 init_environment (argv);
1463 init_ntproc (); /* must precede init_editfns. */
1464 #endif
1466 #ifdef HAVE_NS
1467 #ifndef CANNOT_DUMP
1468 if (initialized)
1469 #endif
1470 ns_init_paths ();
1471 #endif
1473 /* Initialize and GC-protect Vinitial_environment and
1474 Vprocess_environment before set_initial_environment fills them
1475 in. */
1476 if (!initialized)
1477 syms_of_callproc ();
1478 /* egetenv is a pretty low-level facility, which may get called in
1479 many circumstances; it seems flimsy to put off initializing it
1480 until calling init_callproc. */
1481 set_initial_environment ();
1482 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
1483 if this is not done. Do it after set_global_environment so that we
1484 don't pollute Vglobal_environment. */
1485 /* Setting LANG here will defeat the startup locale processing... */
1486 #ifdef AIX
1487 putenv ("LANG=C");
1488 #endif
1490 init_buffer (); /* Init default directory of main buffer. */
1492 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
1493 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
1495 if (initialized)
1497 /* Erase any pre-dump messages in the message log, to avoid confusion. */
1498 Lisp_Object old_log_max;
1499 old_log_max = Vmessage_log_max;
1500 XSETFASTINT (Vmessage_log_max, 0);
1501 message_dolog ("", 0, 1, 0);
1502 Vmessage_log_max = old_log_max;
1505 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
1506 init_lread ();
1508 /* Intern the names of all standard functions and variables;
1509 define standard keys. */
1511 if (!initialized)
1513 /* The basic levels of Lisp must come first. Note that
1514 syms_of_data and some others have already been called. */
1515 syms_of_chartab ();
1516 syms_of_lread ();
1517 syms_of_print ();
1518 syms_of_eval ();
1519 syms_of_fns ();
1520 syms_of_floatfns ();
1522 syms_of_buffer ();
1523 syms_of_bytecode ();
1524 syms_of_callint ();
1525 syms_of_casefiddle ();
1526 syms_of_casetab ();
1527 syms_of_category ();
1528 syms_of_ccl ();
1529 syms_of_character ();
1530 syms_of_cmds ();
1531 syms_of_dired ();
1532 syms_of_display ();
1533 syms_of_doc ();
1534 syms_of_editfns ();
1535 syms_of_emacs ();
1536 syms_of_filelock ();
1537 syms_of_indent ();
1538 syms_of_insdel ();
1539 /* syms_of_keymap (); */
1540 syms_of_macros ();
1541 syms_of_marker ();
1542 syms_of_minibuf ();
1543 syms_of_process ();
1544 syms_of_search ();
1545 syms_of_frame ();
1546 syms_of_syntax ();
1547 syms_of_terminal ();
1548 syms_of_term ();
1549 syms_of_undo ();
1550 #ifdef HAVE_SOUND
1551 syms_of_sound ();
1552 #endif
1553 syms_of_textprop ();
1554 syms_of_composite ();
1555 #ifdef WINDOWSNT
1556 syms_of_ntproc ();
1557 #endif /* WINDOWSNT */
1558 syms_of_window ();
1559 syms_of_xdisp ();
1560 syms_of_font ();
1561 #ifdef HAVE_WINDOW_SYSTEM
1562 syms_of_fringe ();
1563 syms_of_image ();
1564 #endif /* HAVE_WINDOW_SYSTEM */
1565 #ifdef HAVE_X_WINDOWS
1566 syms_of_xterm ();
1567 syms_of_xfns ();
1568 syms_of_xmenu ();
1569 syms_of_fontset ();
1570 syms_of_xsettings ();
1571 #ifdef HAVE_X_SM
1572 syms_of_xsmfns ();
1573 #endif
1574 #ifdef HAVE_X11
1575 syms_of_xselect ();
1576 #endif
1577 #endif /* HAVE_X_WINDOWS */
1579 #ifdef HAVE_LIBXML2
1580 syms_of_xml ();
1581 #endif
1583 syms_of_menu ();
1585 #ifdef HAVE_NTGUI
1586 syms_of_w32term ();
1587 syms_of_w32fns ();
1588 syms_of_w32select ();
1589 syms_of_w32menu ();
1590 syms_of_fontset ();
1591 #endif /* HAVE_NTGUI */
1593 #ifdef MSDOS
1594 syms_of_xmenu ();
1595 syms_of_dosfns();
1596 syms_of_msdos();
1597 syms_of_win16select();
1598 #endif /* MSDOS */
1600 #ifdef HAVE_NS
1601 syms_of_nsterm ();
1602 syms_of_nsfns ();
1603 syms_of_nsmenu ();
1604 syms_of_nsselect ();
1605 syms_of_fontset ();
1606 #endif /* HAVE_NS */
1608 #ifdef HAVE_GNUTLS
1609 syms_of_gnutls ();
1610 #endif
1612 #ifdef HAVE_DBUS
1613 syms_of_dbusbind ();
1614 #endif /* HAVE_DBUS */
1616 #ifdef WINDOWSNT
1617 syms_of_ntterm ();
1618 #endif /* WINDOWSNT */
1620 keys_of_casefiddle ();
1621 keys_of_cmds ();
1622 keys_of_buffer ();
1623 keys_of_keyboard ();
1624 keys_of_keymap ();
1625 keys_of_window ();
1627 else
1629 /* Initialization that must be done even if the global variable
1630 initialized is non zero. */
1631 #ifdef HAVE_NTGUI
1632 globals_of_w32fns ();
1633 globals_of_w32menu ();
1634 globals_of_w32select ();
1635 #endif /* HAVE_NTGUI */
1638 init_charset ();
1640 init_editfns (); /* init_process uses Voperating_system_release. */
1641 init_process (); /* init_display uses add_keyboard_wait_descriptor. */
1642 init_keyboard (); /* This too must precede init_sys_modes. */
1643 if (!noninteractive)
1644 init_display (); /* Determine terminal type. Calls init_sys_modes. */
1645 init_fns ();
1646 init_xdisp ();
1647 #ifdef HAVE_WINDOW_SYSTEM
1648 init_fringe ();
1649 init_image ();
1650 #endif /* HAVE_WINDOW_SYSTEM */
1651 init_macros ();
1652 init_floatfns ();
1653 #ifdef HAVE_SOUND
1654 init_sound ();
1655 #endif
1656 init_window ();
1657 init_font ();
1659 if (!initialized)
1661 char *file;
1662 /* Handle -l loadup, args passed by Makefile. */
1663 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
1664 Vtop_level = Fcons (intern_c_string ("load"),
1665 Fcons (build_string (file), Qnil));
1666 /* Unless next switch is -nl, load "loadup.el" first thing. */
1667 if (! no_loadup)
1668 Vtop_level = Fcons (intern_c_string ("load"),
1669 Fcons (build_string ("loadup.el"), Qnil));
1672 if (initialized)
1674 #ifdef HAVE_TZSET
1676 /* If the execution TZ happens to be the same as the dump TZ,
1677 change it to some other value and then change it back,
1678 to force the underlying implementation to reload the TZ info.
1679 This is needed on implementations that load TZ info from files,
1680 since the TZ file contents may differ between dump and execution. */
1681 char *tz = getenv ("TZ");
1682 if (tz && !strcmp (tz, dump_tz))
1684 ++*tz;
1685 tzset ();
1686 --*tz;
1689 #endif
1692 /* Set up for profiling. This is known to work on FreeBSD,
1693 GNU/Linux and MinGW. It might work on some other systems too.
1694 Give it a try and tell us if it works on your system. To compile
1695 for profiling, use the configure option --enable-profiling. */
1696 #if defined (__FreeBSD__) || defined (GNU_LINUX) || defined(__MINGW32__)
1697 #ifdef PROFILING
1698 if (initialized)
1700 extern void _mcleanup ();
1701 #ifdef __MINGW32__
1702 extern unsigned char etext asm ("etext");
1703 #else
1704 extern char etext;
1705 #endif
1706 #ifdef HAVE___EXECUTABLE_START
1707 /* This symbol is defined by GNU ld to the start of the text
1708 segment. */
1709 extern char __executable_start[];
1710 #else
1711 extern void safe_bcopy ();
1712 #endif
1714 atexit (_mcleanup);
1715 #ifdef HAVE___EXECUTABLE_START
1716 monstartup (__executable_start, &etext);
1717 #else
1718 /* This uses safe_bcopy because that function comes first in the
1719 Emacs executable. It might be better to use something that
1720 gives the start of the text segment, but start_of_text is not
1721 defined on all systems now. */
1722 /* FIXME: Does not work on architectures with function
1723 descriptors. */
1724 monstartup (safe_bcopy, &etext);
1725 #endif
1727 else
1728 moncontrol (0);
1729 #endif
1730 #endif
1732 initialized = 1;
1734 #ifdef LOCALTIME_CACHE
1735 /* Some versions of localtime have a bug. They cache the value of the time
1736 zone rather than looking it up every time. Since localtime() is
1737 called to bolt the undumping time into the undumped emacs, this
1738 results in localtime ignoring the TZ environment variable.
1739 This flushes the new TZ value into localtime. */
1740 tzset ();
1741 #endif /* defined (LOCALTIME_CACHE) */
1743 /* Enter editor command loop. This never returns. */
1744 Frecursive_edit ();
1745 /* NOTREACHED */
1746 return 0;
1749 /* Sort the args so we can find the most important ones
1750 at the beginning of argv. */
1752 /* First, here's a table of all the standard options. */
1754 struct standard_args
1756 const char *name;
1757 const char *longname;
1758 int priority;
1759 int nargs;
1762 const struct standard_args standard_args[] =
1764 { "-version", "--version", 150, 0 },
1765 { "-chdir", "--chdir", 130, 1 },
1766 { "-t", "--terminal", 120, 1 },
1767 { "-nw", "--no-window-system", 110, 0 },
1768 { "-nw", "--no-windows", 110, 0 },
1769 { "-batch", "--batch", 100, 0 },
1770 { "-script", "--script", 100, 1 },
1771 { "-daemon", "--daemon", 99, 0 },
1772 { "-help", "--help", 90, 0 },
1773 { "-nl", "--no-loadup", 70, 0 },
1774 { "-nsl", "--no-site-lisp", 65, 0 },
1775 /* -d must come last before the options handled in startup.el. */
1776 { "-d", "--display", 60, 1 },
1777 { "-display", 0, 60, 1 },
1778 /* Now for the options handled in `command-line' (startup.el). */
1779 /* (Note that to imply -nsl, -Q is partially handled here.) */
1780 { "-Q", "--quick", 55, 0 },
1781 { "-quick", 0, 55, 0 },
1782 { "-q", "--no-init-file", 50, 0 },
1783 { "-no-init-file", 0, 50, 0 },
1784 { "-no-site-file", "--no-site-file", 40, 0 },
1785 { "-u", "--user", 30, 1 },
1786 { "-user", 0, 30, 1 },
1787 { "-debug-init", "--debug-init", 20, 0 },
1788 { "-iconic", "--iconic", 15, 0 },
1789 { "-D", "--basic-display", 12, 0},
1790 { "-basic-display", 0, 12, 0},
1791 { "-nbc", "--no-blinking-cursor", 12, 0 },
1792 /* Now for the options handled in `command-line-1' (startup.el). */
1793 { "-nbi", "--no-bitmap-icon", 10, 0 },
1794 { "-bg", "--background-color", 10, 1 },
1795 { "-background", 0, 10, 1 },
1796 { "-fg", "--foreground-color", 10, 1 },
1797 { "-foreground", 0, 10, 1 },
1798 { "-bd", "--border-color", 10, 1 },
1799 { "-bw", "--border-width", 10, 1 },
1800 { "-ib", "--internal-border", 10, 1 },
1801 { "-ms", "--mouse-color", 10, 1 },
1802 { "-cr", "--cursor-color", 10, 1 },
1803 { "-fn", "--font", 10, 1 },
1804 { "-font", 0, 10, 1 },
1805 { "-fs", "--fullscreen", 10, 0 },
1806 { "-fw", "--fullwidth", 10, 0 },
1807 { "-fh", "--fullheight", 10, 0 },
1808 { "-mm", "--maximized", 10, 0 },
1809 { "-g", "--geometry", 10, 1 },
1810 { "-geometry", 0, 10, 1 },
1811 { "-T", "--title", 10, 1 },
1812 { "-title", 0, 10, 1 },
1813 { "-name", "--name", 10, 1 },
1814 { "-xrm", "--xrm", 10, 1 },
1815 { "-parent-id", "--parent-id", 10, 1 },
1816 { "-r", "--reverse-video", 5, 0 },
1817 { "-rv", 0, 5, 0 },
1818 { "-reverse", 0, 5, 0 },
1819 { "-hb", "--horizontal-scroll-bars", 5, 0 },
1820 { "-vb", "--vertical-scroll-bars", 5, 0 },
1821 { "-color", "--color", 5, 0},
1822 { "-no-splash", "--no-splash", 3, 0 },
1823 { "-no-desktop", "--no-desktop", 3, 0 },
1824 #ifdef HAVE_NS
1825 { "-NSAutoLaunch", 0, 5, 1 },
1826 { "-NXAutoLaunch", 0, 5, 1 },
1827 { "-disable-font-backend", "--disable-font-backend", 65, 0 },
1828 { "-_NSMachLaunch", 0, 85, 1 },
1829 { "-MachLaunch", 0, 85, 1 },
1830 { "-macosx", 0, 85, 0 },
1831 { "-NSHost", 0, 85, 1 },
1832 #endif
1833 /* These have the same priority as ordinary file name args,
1834 so they are not reordered with respect to those. */
1835 { "-L", "--directory", 0, 1 },
1836 { "-directory", 0, 0, 1 },
1837 { "-l", "--load", 0, 1 },
1838 { "-load", 0, 0, 1 },
1839 /* This has no longname, because using --scriptload confuses sort_args,
1840 because then the --script long option seems to match twice; ie
1841 you can't have a long option which is a prefix of another long
1842 option. In any case, this is entirely an internal option. */
1843 { "-scriptload", NULL, 0, 1 },
1844 { "-f", "--funcall", 0, 1 },
1845 { "-funcall", 0, 0, 1 },
1846 { "-eval", "--eval", 0, 1 },
1847 { "-execute", "--execute", 0, 1 },
1848 { "-find-file", "--find-file", 0, 1 },
1849 { "-visit", "--visit", 0, 1 },
1850 { "-file", "--file", 0, 1 },
1851 { "-insert", "--insert", 0, 1 },
1852 #ifdef HAVE_NS
1853 { "-NXOpen", 0, 0, 1 },
1854 { "-NXOpenTemp", 0, 0, 1 },
1855 { "-NSOpen", 0, 0, 1 },
1856 { "-NSOpenTemp", 0, 0, 1 },
1857 { "-GSFilePath", 0, 0, 1 },
1858 #endif
1859 /* This should be processed after ordinary file name args and the like. */
1860 { "-kill", "--kill", -10, 0 },
1863 /* Reorder the elements of ARGV (assumed to have ARGC elements)
1864 so that the highest priority ones come first.
1865 Do not change the order of elements of equal priority.
1866 If an option takes an argument, keep it and its argument together.
1868 If an option that takes no argument appears more
1869 than once, eliminate all but one copy of it. */
1871 static void
1872 sort_args (int argc, char **argv)
1874 char **new = (char **) xmalloc (sizeof (char *) * argc);
1875 /* For each element of argv,
1876 the corresponding element of options is:
1877 0 for an option that takes no arguments,
1878 1 for an option that takes one argument, etc.
1879 -1 for an ordinary non-option argument. */
1880 int *options = (int *) xmalloc (sizeof (int) * argc);
1881 int *priority = (int *) xmalloc (sizeof (int) * argc);
1882 int to = 1;
1883 int incoming_used = 1;
1884 int from;
1885 int i;
1887 /* Categorize all the options,
1888 and figure out which argv elts are option arguments. */
1889 for (from = 1; from < argc; from++)
1891 options[from] = -1;
1892 priority[from] = 0;
1893 if (argv[from][0] == '-')
1895 int match, thislen;
1896 char *equals;
1898 /* If we have found "--", don't consider
1899 any more arguments as options. */
1900 if (argv[from][1] == '-' && argv[from][2] == 0)
1902 /* Leave the "--", and everything following it, at the end. */
1903 for (; from < argc; from++)
1905 priority[from] = -100;
1906 options[from] = -1;
1908 break;
1911 /* Look for a match with a known old-fashioned option. */
1912 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1913 if (!strcmp (argv[from], standard_args[i].name))
1915 options[from] = standard_args[i].nargs;
1916 priority[from] = standard_args[i].priority;
1917 if (from + standard_args[i].nargs >= argc)
1918 fatal ("Option `%s' requires an argument\n", argv[from]);
1919 from += standard_args[i].nargs;
1920 goto done;
1923 /* Look for a match with a known long option.
1924 MATCH is -1 if no match so far, -2 if two or more matches so far,
1925 >= 0 (the table index of the match) if just one match so far. */
1926 if (argv[from][1] == '-')
1928 match = -1;
1929 thislen = strlen (argv[from]);
1930 equals = strchr (argv[from], '=');
1931 if (equals != 0)
1932 thislen = equals - argv[from];
1934 for (i = 0;
1935 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1936 if (standard_args[i].longname
1937 && !strncmp (argv[from], standard_args[i].longname,
1938 thislen))
1940 if (match == -1)
1941 match = i;
1942 else
1943 match = -2;
1946 /* If we found exactly one match, use that. */
1947 if (match >= 0)
1949 options[from] = standard_args[match].nargs;
1950 priority[from] = standard_args[match].priority;
1951 /* If --OPTION=VALUE syntax is used,
1952 this option uses just one argv element. */
1953 if (equals != 0)
1954 options[from] = 0;
1955 if (from + options[from] >= argc)
1956 fatal ("Option `%s' requires an argument\n", argv[from]);
1957 from += options[from];
1959 /* FIXME When match < 0, shouldn't there be some error,
1960 or at least indication to the user that there was a
1961 problem? */
1963 done: ;
1967 /* Copy the arguments, in order of decreasing priority, to NEW. */
1968 new[0] = argv[0];
1969 while (incoming_used < argc)
1971 int best = -1;
1972 int best_priority = -9999;
1974 /* Find the highest priority remaining option.
1975 If several have equal priority, take the first of them. */
1976 for (from = 1; from < argc; from++)
1978 if (argv[from] != 0 && priority[from] > best_priority)
1980 best_priority = priority[from];
1981 best = from;
1983 /* Skip option arguments--they are tied to the options. */
1984 if (options[from] > 0)
1985 from += options[from];
1988 if (best < 0)
1989 abort ();
1991 /* Copy the highest priority remaining option, with its args, to NEW.
1992 Unless it is a duplicate of the previous one. */
1993 if (! (options[best] == 0
1994 && ! strcmp (new[to - 1], argv[best])))
1996 new[to++] = argv[best];
1997 for (i = 0; i < options[best]; i++)
1998 new[to++] = argv[best + i + 1];
2001 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
2003 /* Clear out this option in ARGV. */
2004 argv[best] = 0;
2005 for (i = 0; i < options[best]; i++)
2006 argv[best + i + 1] = 0;
2009 /* If duplicate options were deleted, fill up extra space with null ptrs. */
2010 while (to < argc)
2011 new[to++] = 0;
2013 memcpy (argv, new, sizeof (char *) * argc);
2015 xfree (options);
2016 xfree (new);
2017 xfree (priority);
2020 DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
2021 doc: /* Exit the Emacs job and kill it.
2022 If ARG is an integer, return ARG as the exit program code.
2023 If ARG is a string, stuff it as keyboard input.
2025 This function is called upon receipt of the signals SIGTERM
2026 or SIGHUP, and upon SIGINT in batch mode.
2028 The value of `kill-emacs-hook', if not void,
2029 is a list of functions (of no args),
2030 all of which are called before Emacs is actually killed. */)
2031 (Lisp_Object arg)
2033 struct gcpro gcpro1;
2035 GCPRO1 (arg);
2037 if (feof (stdin))
2038 arg = Qt;
2040 if (!NILP (Vrun_hooks))
2041 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
2043 UNGCPRO;
2045 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
2047 /* If we have an auto-save list file,
2048 kill it because we are exiting Emacs deliberately (not crashing).
2049 Do it after shut_down_emacs, which does an auto-save. */
2050 if (STRINGP (Vauto_save_list_file_name))
2051 unlink (SDATA (Vauto_save_list_file_name));
2053 exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS);
2057 /* Perform an orderly shutdown of Emacs. Autosave any modified
2058 buffers, kill any child processes, clean up the terminal modes (if
2059 we're in the foreground), and other stuff like that. Don't perform
2060 any redisplay; this may be called when Emacs is shutting down in
2061 the background, or after its X connection has died.
2063 If SIG is a signal number, print a message for it.
2065 This is called by fatal signal handlers, X protocol error handlers,
2066 and Fkill_emacs. */
2068 void
2069 shut_down_emacs (int sig, int no_x, Lisp_Object stuff)
2071 /* Prevent running of hooks from now on. */
2072 Vrun_hooks = Qnil;
2074 /* Don't update display from now on. */
2075 Vinhibit_redisplay = Qt;
2077 /* If we are controlling the terminal, reset terminal modes. */
2078 #ifndef DOS_NT
2080 int pgrp = EMACS_GETPGRP (0);
2081 int tpgrp = tcgetpgrp (0);
2082 if ((tpgrp != -1) && tpgrp == pgrp)
2084 reset_all_sys_modes ();
2085 if (sig && sig != SIGTERM)
2086 fprintf (stderr, "Fatal error (%d)", sig);
2089 #else
2090 fflush (stdout);
2091 reset_all_sys_modes ();
2092 #endif
2094 stuff_buffered_input (stuff);
2096 inhibit_sentinels = 1;
2097 kill_buffer_processes (Qnil);
2098 Fdo_auto_save (Qt, Qnil);
2100 #ifdef CLASH_DETECTION
2101 unlock_all_files ();
2102 #endif
2104 #if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
2105 #ifdef HAVE_X_WINDOWS
2106 /* It's not safe to call intern here. Maybe we are crashing. */
2107 if (!noninteractive && SYMBOLP (Vinitial_window_system)
2108 && SCHARS (SYMBOL_NAME (Vinitial_window_system)) == 1
2109 && SREF (SYMBOL_NAME (Vinitial_window_system), 0) == 'x'
2110 && ! no_x)
2111 Fx_close_current_connection ();
2112 #endif /* HAVE_X_WINDOWS */
2113 #endif
2115 #ifdef SIGIO
2116 /* There is a tendency for a SIGIO signal to arrive within exit,
2117 and cause a SIGHUP because the input descriptor is already closed. */
2118 unrequest_sigio ();
2119 signal (SIGIO, SIG_IGN);
2120 #endif
2122 #ifdef WINDOWSNT
2123 term_ntproc ();
2124 #endif
2126 /* Do this only if terminating normally, we want glyph matrices
2127 etc. in a core dump. */
2128 if (sig == 0 || sig == SIGTERM)
2130 check_glyph_memory ();
2131 check_message_stack ();
2134 #ifdef MSDOS
2135 dos_cleanup ();
2136 #endif
2138 #ifdef HAVE_NS
2139 ns_term_shutdown (sig);
2140 #endif
2145 #ifndef CANNOT_DUMP
2147 /* FIXME: maybe this should go into header file, config.h seems the
2148 only one appropriate. */
2149 extern int unexec (const char *, const char *);
2151 DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
2152 doc: /* Dump current state of Emacs into executable file FILENAME.
2153 Take symbols from SYMFILE (presumably the file you executed to run Emacs).
2154 This is used in the file `loadup.el' when building Emacs.
2156 You must run Emacs in batch mode in order to dump it. */)
2157 (Lisp_Object filename, Lisp_Object symfile)
2159 extern char my_edata[];
2160 Lisp_Object tem;
2161 Lisp_Object symbol;
2162 int count = SPECPDL_INDEX ();
2164 check_pure_size ();
2166 if (! noninteractive)
2167 error ("Dumping Emacs works only in batch mode");
2169 #ifdef GNU_LINUX
2170 if (heap_bss_diff > MAX_HEAP_BSS_DIFF)
2172 fprintf (stderr, "**************************************************\n");
2173 fprintf (stderr, "Warning: Your system has a gap between BSS and the\n");
2174 fprintf (stderr, "heap (%lu bytes). This usually means that exec-shield\n",
2175 heap_bss_diff);
2176 fprintf (stderr, "or something similar is in effect. The dump may\n");
2177 fprintf (stderr, "fail because of this. See the section about\n");
2178 fprintf (stderr, "exec-shield in etc/PROBLEMS for more information.\n");
2179 fprintf (stderr, "**************************************************\n");
2181 #endif /* GNU_LINUX */
2183 /* Bind `command-line-processed' to nil before dumping,
2184 so that the dumped Emacs will process its command line
2185 and set up to work with X windows if appropriate. */
2186 symbol = intern ("command-line-processed");
2187 specbind (symbol, Qnil);
2189 CHECK_STRING (filename);
2190 filename = Fexpand_file_name (filename, Qnil);
2191 if (!NILP (symfile))
2193 CHECK_STRING (symfile);
2194 if (SCHARS (symfile))
2195 symfile = Fexpand_file_name (symfile, Qnil);
2198 tem = Vpurify_flag;
2199 Vpurify_flag = Qnil;
2201 #ifdef HAVE_TZSET
2202 set_time_zone_rule (dump_tz);
2203 #ifndef LOCALTIME_CACHE
2204 /* Force a tz reload, since set_time_zone_rule doesn't. */
2205 tzset ();
2206 #endif
2207 #endif
2209 fflush (stdout);
2210 /* Tell malloc where start of impure now is. */
2211 /* Also arrange for warnings when nearly out of space. */
2212 #ifndef SYSTEM_MALLOC
2213 #ifndef WINDOWSNT
2214 /* On Windows, this was done before dumping, and that once suffices.
2215 Meanwhile, my_edata is not valid on Windows. */
2216 memory_warnings (my_edata, malloc_warning);
2217 #endif /* not WINDOWSNT */
2218 #if defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT
2219 /* Pthread may call malloc before main, and then we will get an endless
2220 loop, because pthread_self (see alloc.c) calls malloc the first time
2221 it is called on some systems. */
2222 reset_malloc_hooks ();
2223 #endif
2224 #endif /* not SYSTEM_MALLOC */
2225 #ifdef DOUG_LEA_MALLOC
2226 malloc_state_ptr = malloc_get_state ();
2227 #endif
2229 #ifdef USE_MMAP_FOR_BUFFERS
2230 mmap_set_vars (0);
2231 #endif
2232 unexec (SDATA (filename), !NILP (symfile) ? SDATA (symfile) : 0);
2233 #ifdef USE_MMAP_FOR_BUFFERS
2234 mmap_set_vars (1);
2235 #endif
2236 #ifdef DOUG_LEA_MALLOC
2237 free (malloc_state_ptr);
2238 #endif
2240 Vpurify_flag = tem;
2242 return unbind_to (count, Qnil);
2245 #endif /* not CANNOT_DUMP */
2247 #if HAVE_SETLOCALE
2248 /* Recover from setlocale (LC_ALL, ""). */
2249 void
2250 fixup_locale (void)
2252 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
2253 so that numbers are read and printed properly for Emacs Lisp. */
2254 setlocale (LC_NUMERIC, "C");
2257 /* Set system locale CATEGORY, with previous locale *PLOCALE, to
2258 DESIRED_LOCALE. */
2259 static void
2260 synchronize_locale (int category, Lisp_Object *plocale, Lisp_Object desired_locale)
2262 if (! EQ (*plocale, desired_locale))
2264 *plocale = desired_locale;
2265 setlocale (category, (STRINGP (desired_locale)
2266 ? (char *) SDATA (desired_locale)
2267 : ""));
2271 /* Set system time locale to match Vsystem_time_locale, if possible. */
2272 void
2273 synchronize_system_time_locale (void)
2275 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
2276 Vsystem_time_locale);
2279 /* Set system messages locale to match Vsystem_messages_locale, if
2280 possible. */
2281 void
2282 synchronize_system_messages_locale (void)
2284 #ifdef LC_MESSAGES
2285 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
2286 Vsystem_messages_locale);
2287 #endif
2289 #endif /* HAVE_SETLOCALE */
2291 #ifndef SEPCHAR
2292 #define SEPCHAR ':'
2293 #endif
2295 Lisp_Object
2296 decode_env_path (const char *evarname, const char *defalt)
2298 const char *path, *p;
2299 Lisp_Object lpath, element, tem;
2301 /* It's okay to use getenv here, because this function is only used
2302 to initialize variables when Emacs starts up, and isn't called
2303 after that. */
2304 if (evarname != 0)
2305 path = getenv (evarname);
2306 else
2307 path = 0;
2308 if (!path)
2309 path = defalt;
2310 #ifdef DOS_NT
2311 /* Ensure values from the environment use the proper directory separator. */
2312 if (path)
2314 char *path_copy = alloca (strlen (path) + 1);
2315 strcpy (path_copy, path);
2316 dostounix_filename (path_copy);
2317 path = path_copy;
2319 #endif
2320 lpath = Qnil;
2321 while (1)
2323 p = strchr (path, SEPCHAR);
2324 if (!p)
2325 p = path + strlen (path);
2326 element = (p - path ? make_string (path, p - path)
2327 : build_string ("."));
2329 /* Add /: to the front of the name
2330 if it would otherwise be treated as magic. */
2331 tem = Ffind_file_name_handler (element, Qt);
2333 /* However, if the handler says "I'm safe",
2334 don't bother adding /:. */
2335 if (SYMBOLP (tem))
2337 Lisp_Object prop;
2338 prop = Fget (tem, intern ("safe-magic"));
2339 if (! NILP (prop))
2340 tem = Qnil;
2343 if (! NILP (tem))
2344 element = concat2 (build_string ("/:"), element);
2346 lpath = Fcons (element, lpath);
2347 if (*p)
2348 path = p + 1;
2349 else
2350 break;
2352 return Fnreverse (lpath);
2355 DEFUN ("daemonp", Fdaemonp, Sdaemonp, 0, 0, 0,
2356 doc: /* Return non-nil if the current emacs process is a daemon.
2357 If the daemon was given a name argument, return that name. */)
2358 (void)
2360 if (IS_DAEMON)
2361 if (daemon_name)
2362 return build_string (daemon_name);
2363 else
2364 return Qt;
2365 else
2366 return Qnil;
2369 DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0,
2370 doc: /* Mark the Emacs daemon as being initialized.
2371 This finishes the daemonization process by doing the other half of detaching
2372 from the parent process and its tty file descriptors. */)
2373 (void)
2375 int nfd;
2377 if (!IS_DAEMON)
2378 error ("This function can only be called if emacs is run as a daemon");
2380 if (daemon_pipe[1] < 0)
2381 error ("The daemon has already been initialized");
2383 if (NILP (Vafter_init_time))
2384 error ("This function can only be called after loading the init files");
2386 /* Get rid of stdin, stdout and stderr. */
2387 nfd = open ("/dev/null", O_RDWR);
2388 dup2 (nfd, 0);
2389 dup2 (nfd, 1);
2390 dup2 (nfd, 2);
2391 close (nfd);
2393 /* Closing the pipe will notify the parent that it can exit.
2394 FIXME: In case some other process inherited the pipe, closing it here
2395 won't notify the parent because it's still open elsewhere, so we
2396 additionally send a byte, just to make sure the parent really exits.
2397 Instead, we should probably close the pipe in start-process and
2398 call-process to make sure the pipe is never inherited by
2399 subprocesses. */
2400 write (daemon_pipe[1], "\n", 1);
2401 close (daemon_pipe[1]);
2402 /* Set it to an invalid value so we know we've already run this function. */
2403 daemon_pipe[1] = -1;
2404 return Qt;
2407 void
2408 syms_of_emacs (void)
2410 Qfile_name_handler_alist = intern_c_string ("file-name-handler-alist");
2411 staticpro (&Qfile_name_handler_alist);
2412 Qrisky_local_variable = intern_c_string ("risky-local-variable");
2413 staticpro (&Qrisky_local_variable);
2415 #ifndef CANNOT_DUMP
2416 defsubr (&Sdump_emacs);
2417 #endif
2419 defsubr (&Skill_emacs);
2421 defsubr (&Sinvocation_name);
2422 defsubr (&Sinvocation_directory);
2423 defsubr (&Sdaemonp);
2424 defsubr (&Sdaemon_initialized);
2426 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
2427 doc: /* Args passed by shell to Emacs, as a list of strings.
2428 Many arguments are deleted from the list as they are processed. */);
2430 DEFVAR_LISP ("system-type", &Vsystem_type,
2431 doc: /* The value is a symbol indicating the type of operating system you are using.
2432 Special values:
2433 `gnu' compiled for a GNU Hurd system.
2434 `gnu/linux' compiled for a GNU/Linux system.
2435 `gnu/kfreebsd' compiled for a GNU system with a FreeBSD kernel.
2436 `darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
2437 `ms-dos' compiled as an MS-DOS application.
2438 `windows-nt' compiled as a native W32 application.
2439 `cygwin' compiled using the Cygwin library.
2440 Anything else (in Emacs 24.1, the possibilities are: aix, berkeley-unix,
2441 hpux, irix, usg-unix-v) indicates some sort of Unix system. */);
2442 Vsystem_type = intern_c_string (SYSTEM_TYPE);
2443 /* Above values are from SYSTEM_TYPE in src/s/*.h. */
2445 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
2446 doc: /* Value is string indicating configuration Emacs was built for.
2447 On MS-Windows, the value reflects the OS flavor and version on which
2448 Emacs is running. */);
2449 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
2451 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
2452 doc: /* String containing the configuration options Emacs was built with. */);
2453 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2455 DEFVAR_BOOL ("noninteractive", &noninteractive1,
2456 doc: /* Non-nil means Emacs is running without interactive terminal. */);
2458 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
2459 doc: /* Hook to be run when `kill-emacs' is called.
2460 Since `kill-emacs' may be invoked when the terminal is disconnected (or
2461 in other similar situations), functions placed on this hook should not
2462 expect to be able to interact with the user. To ask for confirmation,
2463 see `kill-emacs-query-functions' instead.
2465 Before Emacs 24.1, the hook was not run in batch mode, i.e., if
2466 `noninteractive' was non-nil. */);
2467 Vkill_emacs_hook = Qnil;
2469 DEFVAR_LISP ("path-separator", &Vpath_separator,
2470 doc: /* String containing the character that separates directories in
2471 search paths, such as PATH and other similar environment variables. */);
2473 char c = SEPCHAR;
2474 Vpath_separator = make_string (&c, 1);
2477 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
2478 doc: /* The program name that was used to run Emacs.
2479 Any directory names are omitted. */);
2481 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
2482 doc: /* The directory in which the Emacs executable was found, to run it.
2483 The value is nil if that directory's name is not known. */);
2485 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
2486 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
2487 This is non-nil when we can't find those directories in their standard
2488 installed locations, but we can find them near where the Emacs executable
2489 was found. */);
2490 Vinstallation_directory = Qnil;
2492 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
2493 doc: /* System locale for messages. */);
2494 Vsystem_messages_locale = Qnil;
2496 DEFVAR_LISP ("previous-system-messages-locale",
2497 &Vprevious_system_messages_locale,
2498 doc: /* Most recently used system locale for messages. */);
2499 Vprevious_system_messages_locale = Qnil;
2501 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
2502 doc: /* System locale for time. */);
2503 Vsystem_time_locale = Qnil;
2505 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
2506 doc: /* Most recently used system locale for time. */);
2507 Vprevious_system_time_locale = Qnil;
2509 DEFVAR_LISP ("before-init-time", &Vbefore_init_time,
2510 doc: /* Value of `current-time' before Emacs begins initialization. */);
2511 Vbefore_init_time = Qnil;
2513 DEFVAR_LISP ("after-init-time", &Vafter_init_time,
2514 doc: /* Value of `current-time' after loading the init files.
2515 This is nil during initialization. */);
2516 Vafter_init_time = Qnil;
2518 DEFVAR_BOOL ("inhibit-x-resources", &inhibit_x_resources,
2519 doc: /* If non-nil, X resources, Windows Registry settings, and NS defaults are not used. */);
2520 inhibit_x_resources = 0;
2522 DEFVAR_LISP ("emacs-copyright", &Vemacs_copyright,
2523 doc: /* Short copyright string for this version of Emacs. */);
2524 Vemacs_copyright = build_string (emacs_copyright);
2526 DEFVAR_LISP ("emacs-version", &Vemacs_version,
2527 doc: /* Version numbers of this version of Emacs. */);
2528 Vemacs_version = build_string (emacs_version);
2530 DEFVAR_LISP ("dynamic-library-alist", &Vdynamic_library_alist,
2531 doc: /* Alist of dynamic libraries vs external files implementing them.
2532 Each element is a list (LIBRARY FILE...), where the car is a symbol
2533 representing a supported external library, and the rest are strings giving
2534 alternate filenames for that library.
2536 Emacs tries to load the library from the files in the order they appear on
2537 the list; if none is loaded, the running session of Emacs won't have access
2538 to that library.
2540 Note that image types `pbm' and `xbm' do not need entries in this variable
2541 because they do not depend on external libraries and are always available.
2543 Also note that this is not a generic facility for accessing external
2544 libraries; only those already known by Emacs will be loaded. */);
2545 Vdynamic_library_alist = Qnil;
2546 Fput (intern_c_string ("dynamic-library-alist"), Qrisky_local_variable, Qt);
2548 /* Make sure IS_DAEMON starts up as false. */
2549 daemon_pipe[1] = 0;