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