* callproc.c (strerror): Remove decl.
[bpt/emacs.git] / src / emacs.c
1 /* Fully extensible Emacs, running on Unix, intended for GNU.
2 Copyright (C) 1985,86,87,93,94,95,97,98,1999 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
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
30 #ifdef VMS
31 #include <ssdef.h>
32 #endif
33
34 #ifdef HAVE_UNISTD_H
35 #include <unistd.h>
36 #endif
37
38 #ifdef BSD_SYSTEM
39 #include <sys/ioctl.h>
40 #endif
41
42 #include "lisp.h"
43 #include "commands.h"
44 #include "intervals.h"
45 #include "buffer.h"
46
47 #include "systty.h"
48 #include "blockinput.h"
49 #include "syssignal.h"
50 #include "process.h"
51 #include "termhooks.h"
52 #include "keyboard.h"
53
54 #ifdef HAVE_SETLOCALE
55 #include <locale.h>
56 #endif
57
58 #ifdef HAVE_SETRLIMIT
59 #include <sys/time.h>
60 #include <sys/resource.h>
61 #endif
62
63 #ifndef O_RDWR
64 #define O_RDWR 2
65 #endif
66
67 extern void malloc_warning ();
68 extern void set_time_zone_rule ();
69 extern char *index ();
70
71 /* Command line args from shell, as list of strings */
72 Lisp_Object Vcommand_line_args;
73
74 /* The name under which Emacs was invoked, with any leading directory
75 names discarded. */
76 Lisp_Object Vinvocation_name;
77
78 /* The directory name from which Emacs was invoked. */
79 Lisp_Object Vinvocation_directory;
80
81 /* The directory name in which to find subdirs such as lisp and etc.
82 nil means get them only from PATH_LOADSEARCH. */
83 Lisp_Object Vinstallation_directory;
84
85 /* Hook run by `kill-emacs' before it does really anything. */
86 Lisp_Object Vkill_emacs_hook;
87
88 #ifdef SIGUSR1
89 /* Hooks for signal USR1 and USR2 handing */
90 Lisp_Object Vsignal_USR1_hook;
91 #ifdef SIGUSR2
92 Lisp_Object Vsignal_USR2_hook;
93 #endif
94 #endif
95
96 /* Search path separator. */
97 Lisp_Object Vpath_separator;
98
99 /* Set nonzero after Emacs has started up the first time.
100 Prevents reinitialization of the Lisp world and keymaps
101 on subsequent starts. */
102 int initialized;
103
104 #ifdef DOUG_LEA_MALLOC
105 /* Preserves a pointer to the memory allocated that copies that
106 static data inside glibc's malloc. */
107 void *malloc_state_ptr;
108 /* From glibc, a routine that returns a copy of the malloc internal state. */
109 extern void *malloc_get_state ();
110 /* From glibc, a routine that overwrites the malloc internal state. */
111 extern void malloc_set_state ();
112 /* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
113 dumping. Used to work around a bug in glibc's malloc. */
114 int malloc_using_checking;
115 #endif
116
117 /* Variable whose value is symbol giving operating system type. */
118 Lisp_Object Vsystem_type;
119
120 /* Variable whose value is string giving configuration built for. */
121 Lisp_Object Vsystem_configuration;
122
123 /* Variable whose value is string giving configuration options,
124 for use when reporting bugs. */
125 Lisp_Object Vsystem_configuration_options;
126
127 Lisp_Object Qfile_name_handler_alist;
128
129 /* Current and previous system locales for messages and time. */
130 Lisp_Object Vsystem_messages_locale;
131 Lisp_Object Vprevious_system_messages_locale;
132 Lisp_Object Vsystem_time_locale;
133 Lisp_Object Vprevious_system_time_locale;
134
135 /* If non-zero, emacs should not attempt to use an window-specific code,
136 but instead should use the virtual terminal under which it was started */
137 int inhibit_window_system;
138
139 /* If nonzero, set Emacs to run at this priority. This is also used
140 in child_setup and sys_suspend to make sure subshells run at normal
141 priority; Those functions have their own extern declaration. */
142 int emacs_priority;
143
144 /* If non-zero a filter or a sentinel is running. Tested to save the match
145 data on the first attempt to change it inside asynchronous code. */
146 int running_asynch_code;
147
148 #ifdef BSD_PGRPS
149 /* See sysdep.c. */
150 extern int inherited_pgroup;
151 #endif
152
153 #ifdef HAVE_X_WINDOWS
154 /* If non-zero, -d was specified, meaning we're using some window system. */
155 int display_arg;
156 #endif
157
158 /* An address near the bottom of the stack.
159 Tells GC how to save a copy of the stack. */
160 char *stack_bottom;
161
162 #ifdef HAVE_WINDOW_SYSTEM
163 extern Lisp_Object Vwindow_system;
164 #endif /* HAVE_WINDOW_SYSTEM */
165
166 extern Lisp_Object Vauto_save_list_file_name;
167
168 #ifdef USG_SHARED_LIBRARIES
169 /* If nonzero, this is the place to put the end of the writable segment
170 at startup. */
171
172 unsigned int bss_end = 0;
173 #endif
174
175 /* Nonzero means running Emacs without interactive terminal. */
176
177 int noninteractive;
178
179 /* Value of Lisp variable `noninteractive'.
180 Normally same as C variable `noninteractive'
181 but nothing terrible happens if user sets this one. */
182
183 int noninteractive1;
184
185 /* Save argv and argc. */
186 char **initial_argv;
187 int initial_argc;
188
189 static void sort_args ();
190 void syms_of_emacs ();
191 \f
192 /* Signal code for the fatal signal that was received */
193 int fatal_error_code;
194
195 /* Nonzero if handling a fatal error already */
196 int fatal_error_in_progress;
197
198 #ifdef SIGUSR1
199 SIGTYPE
200 handle_USR1_signal (sig)
201 int sig;
202 {
203 struct input_event buf;
204
205 buf.kind = user_signal;
206 buf.code = 0;
207 buf.frame_or_window = selected_frame;
208 buf.modifiers = 0;
209 buf.timestamp = 0;
210
211 kbd_buffer_store_event (&buf);
212 }
213 #endif /* SIGUSR1 */
214
215 #ifdef SIGUSR2
216 SIGTYPE
217 handle_USR2_signal (sig)
218 int sig;
219 {
220 struct input_event buf;
221
222 buf.kind = user_signal;
223 buf.code = 1;
224 buf.frame_or_window = selected_frame;
225 buf.modifiers = 0;
226 buf.timestamp = 0;
227
228 kbd_buffer_store_event (&buf);
229 }
230 #endif /* SIGUSR2 */
231
232 /* Handle bus errors, illegal instruction, etc. */
233 SIGTYPE
234 fatal_error_signal (sig)
235 int sig;
236 {
237 fatal_error_code = sig;
238 signal (sig, SIG_DFL);
239
240 TOTALLY_UNBLOCK_INPUT;
241
242 /* If fatal error occurs in code below, avoid infinite recursion. */
243 if (! fatal_error_in_progress)
244 {
245 fatal_error_in_progress = 1;
246
247 shut_down_emacs (sig, 0, Qnil);
248 }
249
250 #ifdef VMS
251 LIB$STOP (SS$_ABORT);
252 #else
253 /* Signal the same code; this time it will really be fatal.
254 Remember that since we're in a signal handler, the signal we're
255 going to send is probably blocked, so we have to unblock it if we
256 want to really receive it. */
257 #ifndef MSDOS
258 sigunblock (sigmask (fatal_error_code));
259 #endif
260 kill (getpid (), fatal_error_code);
261 #endif /* not VMS */
262 }
263
264 #ifdef SIGDANGER
265
266 /* Handler for SIGDANGER. */
267 SIGTYPE
268 memory_warning_signal (sig)
269 int sig;
270 {
271 signal (sig, memory_warning_signal);
272
273 malloc_warning ("Operating system warns that virtual memory is running low.\n");
274
275 /* It might be unsafe to call do_auto_save now. */
276 force_auto_save_soon ();
277 }
278 #endif
279
280 /* We define abort, rather than using it from the library,
281 so that GDB can return from a breakpoint here.
282 MSDOS has its own definition on msdos.c */
283
284 #if ! defined (DOS_NT) && ! defined (NO_ABORT)
285
286 #ifndef ABORT_RETURN_TYPE
287 #define ABORT_RETURN_TYPE void
288 #endif
289
290 ABORT_RETURN_TYPE
291 abort ()
292 {
293 kill (getpid (), SIGABRT);
294 /* This shouldn't be executed, but it prevents a warning. */
295 exit (1);
296 }
297 #endif
298
299 \f
300 /* Code for dealing with Lisp access to the Unix command line */
301
302 static void
303 init_cmdargs (argc, argv, skip_args)
304 int argc;
305 char **argv;
306 int skip_args;
307 {
308 register int i;
309 Lisp_Object name, dir, tem;
310 int count = specpdl_ptr - specpdl;
311 Lisp_Object raw_name;
312
313 initial_argv = argv;
314 initial_argc = argc;
315
316 raw_name = build_string (argv[0]);
317
318 /* Add /: to the front of the name
319 if it would otherwise be treated as magic. */
320 tem = Ffind_file_name_handler (raw_name, Qt);
321 if (! NILP (tem))
322 raw_name = concat2 (build_string ("/:"), raw_name);
323
324 Vinvocation_name = Ffile_name_nondirectory (raw_name);
325 Vinvocation_directory = Ffile_name_directory (raw_name);
326
327 /* If we got no directory in argv[0], search PATH to find where
328 Emacs actually came from. */
329 if (NILP (Vinvocation_directory))
330 {
331 Lisp_Object found;
332 int yes = openp (Vexec_path, Vinvocation_name,
333 EXEC_SUFFIXES, &found, 1);
334 if (yes == 1)
335 {
336 /* Add /: to the front of the name
337 if it would otherwise be treated as magic. */
338 tem = Ffind_file_name_handler (found, Qt);
339 if (! NILP (tem))
340 found = concat2 (build_string ("/:"), found);
341 Vinvocation_directory = Ffile_name_directory (found);
342 }
343 }
344
345 if (!NILP (Vinvocation_directory)
346 && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
347 /* Emacs was started with relative path, like ./emacs.
348 Make it absolute. */
349 Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
350
351 Vinstallation_directory = Qnil;
352
353 if (!NILP (Vinvocation_directory))
354 {
355 dir = Vinvocation_directory;
356 name = Fexpand_file_name (Vinvocation_name, dir);
357 while (1)
358 {
359 Lisp_Object tem, lib_src_exists;
360 Lisp_Object etc_exists, info_exists;
361
362 /* See if dir contains subdirs for use by Emacs.
363 Check for the ones that would exist in a build directory,
364 not including lisp and info. */
365 tem = Fexpand_file_name (build_string ("lib-src"), dir);
366 lib_src_exists = Ffile_exists_p (tem);
367
368 #ifdef MSDOS
369 /* MSDOS installations frequently remove lib-src, but we still
370 must set installation-directory, or else info won't find
371 its files (it uses the value of installation-directory). */
372 tem = Fexpand_file_name (build_string ("info"), dir);
373 info_exists = Ffile_exists_p (tem);
374 #else
375 info_exists = Qnil;
376 #endif
377
378 if (!NILP (lib_src_exists) || !NILP (info_exists))
379 {
380 tem = Fexpand_file_name (build_string ("etc"), dir);
381 etc_exists = Ffile_exists_p (tem);
382 if (!NILP (etc_exists))
383 {
384 Vinstallation_directory
385 = Ffile_name_as_directory (dir);
386 break;
387 }
388 }
389
390 /* See if dir's parent contains those subdirs. */
391 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
392 lib_src_exists = Ffile_exists_p (tem);
393
394
395 #ifdef MSDOS
396 /* See the MSDOS commentary above. */
397 tem = Fexpand_file_name (build_string ("../info"), dir);
398 info_exists = Ffile_exists_p (tem);
399 #else
400 info_exists = Qnil;
401 #endif
402
403 if (!NILP (lib_src_exists) || !NILP (info_exists))
404 {
405 tem = Fexpand_file_name (build_string ("../etc"), dir);
406 etc_exists = Ffile_exists_p (tem);
407 if (!NILP (etc_exists))
408 {
409 tem = Fexpand_file_name (build_string (".."), dir);
410 Vinstallation_directory
411 = Ffile_name_as_directory (tem);
412 break;
413 }
414 }
415
416 /* If the Emacs executable is actually a link,
417 next try the dir that the link points into. */
418 tem = Ffile_symlink_p (name);
419 if (!NILP (tem))
420 {
421 name = Fexpand_file_name (tem, dir);
422 dir = Ffile_name_directory (name);
423 }
424 else
425 break;
426 }
427 }
428
429 Vcommand_line_args = Qnil;
430
431 for (i = argc - 1; i >= 0; i--)
432 {
433 if (i == 0 || i > skip_args)
434 Vcommand_line_args
435 = Fcons (build_string (argv[i]), Vcommand_line_args);
436 }
437
438 unbind_to (count, Qnil);
439 }
440
441 DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
442 "Return the program name that was used to run Emacs.\n\
443 Any directory names are omitted.")
444 ()
445 {
446 return Fcopy_sequence (Vinvocation_name);
447 }
448
449 DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
450 0, 0, 0,
451 "Return the directory name in which the Emacs executable was located")
452 ()
453 {
454 return Fcopy_sequence (Vinvocation_directory);
455 }
456
457 \f
458 #ifdef VMS
459 #ifdef LINK_CRTL_SHARE
460 #ifdef SHARABLE_LIB_BUG
461 extern noshare char **environ;
462 #endif /* SHARABLE_LIB_BUG */
463 #endif /* LINK_CRTL_SHARE */
464 #endif /* VMS */
465
466 #ifdef HAVE_TZSET
467 /* A valid but unlikely value for the TZ environment value.
468 It is OK (though a bit slower) if the user actually chooses this value. */
469 static char dump_tz[] = "UtC0";
470 #endif
471
472 #ifndef ORDINARY_LINK
473 /* We don't include crtbegin.o and crtend.o in the link,
474 so these functions and variables might be missed.
475 Provide dummy definitions to avoid error.
476 (We don't have any real constructors or destructors.) */
477 #ifdef __GNUC__
478 #ifndef GCC_CTORS_IN_LIBC
479 void __do_global_ctors ()
480 {}
481 void __do_global_ctors_aux ()
482 {}
483 void __do_global_dtors ()
484 {}
485 /* Linux has a bug in its library; avoid an error. */
486 #ifndef LINUX
487 char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
488 #endif
489 char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
490 #endif /* GCC_CTORS_IN_LIBC */
491 void __main ()
492 {}
493 #endif /* __GNUC__ */
494 #endif /* ORDINARY_LINK */
495
496 /* Test whether the next argument in ARGV matches SSTR or a prefix of
497 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
498 (the argument is supposed to have a value) store in *VALPTR either
499 the next argument or the portion of this one after the equal sign.
500 ARGV is read starting at position *SKIPPTR; this index is advanced
501 by the number of arguments used.
502
503 Too bad we can't just use getopt for all of this, but we don't have
504 enough information to do it right. */
505
506 static int
507 argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
508 char **argv;
509 int argc;
510 char *sstr;
511 char *lstr;
512 int minlen;
513 char **valptr;
514 int *skipptr;
515 {
516 char *p;
517 int arglen;
518 char *arg;
519
520 /* Don't access argv[argc]; give up in advance. */
521 if (argc <= *skipptr + 1)
522 return 0;
523
524 arg = argv[*skipptr+1];
525 if (arg == NULL)
526 return 0;
527 if (strcmp (arg, sstr) == 0)
528 {
529 if (valptr != NULL)
530 {
531 *valptr = argv[*skipptr+2];
532 *skipptr += 2;
533 }
534 else
535 *skipptr += 1;
536 return 1;
537 }
538 arglen = (valptr != NULL && (p = index (arg, '=')) != NULL
539 ? p - arg : strlen (arg));
540 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
541 return 0;
542 else if (valptr == NULL)
543 {
544 *skipptr += 1;
545 return 1;
546 }
547 else if (p != NULL)
548 {
549 *valptr = p+1;
550 *skipptr += 1;
551 return 1;
552 }
553 else if (argv[*skipptr+2] != NULL)
554 {
555 *valptr = argv[*skipptr+2];
556 *skipptr += 2;
557 return 1;
558 }
559 else
560 {
561 return 0;
562 }
563 }
564
565 #ifdef DOUG_LEA_MALLOC
566
567 /* malloc can be invoked even before main (e.g. by the dynamic
568 linker), so the dumped malloc state must be restored as early as
569 possible using this special hook. */
570
571 static void
572 malloc_initialize_hook ()
573 {
574 extern char **environ;
575
576 if (initialized)
577 {
578 if (!malloc_using_checking)
579 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
580 ignored if the heap to be restored was constructed without
581 malloc checking. Can't use unsetenv, since that calls malloc. */
582 {
583 char **p;
584
585 for (p = environ; *p; p++)
586 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
587 {
588 do
589 *p = p[1];
590 while (*++p);
591 break;
592 }
593 }
594
595 malloc_set_state (malloc_state_ptr);
596 free (malloc_state_ptr);
597 }
598 else
599 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
600 }
601
602 void (*__malloc_initialize_hook) () = malloc_initialize_hook;
603
604 #endif /* DOUG_LEA_MALLOC */
605
606 /* ARGSUSED */
607 int
608 main (argc, argv, envp)
609 int argc;
610 char **argv;
611 char **envp;
612 {
613 char stack_bottom_variable;
614 int do_initial_setlocale;
615 int skip_args = 0;
616 extern int errno;
617 extern int sys_nerr;
618 #ifdef HAVE_SETRLIMIT
619 struct rlimit rlim;
620 #endif
621 int no_loadup = 0;
622
623 #ifdef LINUX_SBRK_BUG
624 __sbrk (1);
625 #endif
626
627 #ifdef RUN_TIME_REMAP
628 if (initialized)
629 run_time_remap (argv[0]);
630 #endif
631
632 sort_args (argc, argv);
633 argc = 0;
634 while (argv[argc]) argc++;
635
636 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args)
637 /* We don't know the version number unless this is a dumped Emacs.
638 So ignore --version otherwise. */
639 && initialized)
640 {
641 Lisp_Object tem;
642 tem = Fsymbol_value (intern ("emacs-version"));
643 if (!STRINGP (tem))
644 {
645 fprintf (stderr, "Invalid value of `emacs-version'\n");
646 exit (1);
647 }
648 else
649 {
650 printf ("GNU Emacs %s\n", XSTRING (tem)->data);
651 printf ("Copyright (C) 1999 Free Software Foundation, Inc.\n");
652 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
653 printf ("You may redistribute copies of Emacs\n");
654 printf ("under the terms of the GNU General Public License.\n");
655 printf ("For more information about these matters, ");
656 printf ("see the file named COPYING.\n");
657 exit (0);
658 }
659 }
660
661 /* Map in shared memory, if we are using that. */
662 #ifdef HAVE_SHM
663 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
664 {
665 map_in_data (0);
666 /* The shared memory was just restored, which clobbered this. */
667 skip_args = 1;
668 }
669 else
670 {
671 map_in_data (1);
672 /* The shared memory was just restored, which clobbered this. */
673 skip_args = 0;
674 }
675 #endif
676
677 #ifdef NeXT
678 {
679 extern int malloc_cookie;
680 /* This helps out unexnext.c. */
681 if (initialized)
682 if (malloc_jumpstart (malloc_cookie) != 0)
683 printf ("malloc jumpstart failed!\n");
684 }
685 #endif /* NeXT */
686
687 #ifdef VMS
688 /* If -map specified, map the data file in */
689 {
690 char *file;
691 if (argmatch (argv, argc, "-map", "--map-data", 3, &mapin_file, &skip_args))
692 mapin_data (file);
693 }
694
695 #ifdef LINK_CRTL_SHARE
696 #ifdef SHARABLE_LIB_BUG
697 /* Bletcherous shared libraries! */
698 if (!stdin)
699 stdin = fdopen (0, "r");
700 if (!stdout)
701 stdout = fdopen (1, "w");
702 if (!stderr)
703 stderr = fdopen (2, "w");
704 if (!environ)
705 environ = envp;
706 #endif /* SHARABLE_LIB_BUG */
707 #endif /* LINK_CRTL_SHARE */
708 #endif /* VMS */
709
710 #if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
711 /* Extend the stack space available.
712 Don't do that if dumping, since some systems (e.g. DJGPP)
713 might define a smaller stack limit at that time. */
714 if (1
715 #ifndef CANNOT_DUMP
716 && (!noninteractive || initialized)
717 #endif
718 && !getrlimit (RLIMIT_STACK, &rlim))
719 {
720 long newlim;
721 extern int re_max_failures;
722 /* Approximate the amount regex.c needs per unit of re_max_failures. */
723 int ratio = 20 * sizeof (char *);
724 /* Then add 33% to cover the size of the smaller stacks that regex.c
725 successively allocates and discards, on its way to the maximum. */
726 ratio += ratio / 3;
727 /* Add in some extra to cover
728 what we're likely to use for other reasons. */
729 newlim = re_max_failures * ratio + 200000;
730 #ifdef __NetBSD__
731 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
732 stack allocation routine for new process that the allocation
733 fails if stack limit is not on page boundary. So, round up the
734 new limit to page boundary. */
735 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize();
736 #endif
737 if (newlim > rlim.rlim_max)
738 {
739 newlim = rlim.rlim_max;
740 /* Don't let regex.c overflow the stack we have. */
741 re_max_failures = (newlim - 200000) / ratio;
742 }
743 if (rlim.rlim_cur < newlim)
744 rlim.rlim_cur = newlim;
745
746 setrlimit (RLIMIT_STACK, &rlim);
747 }
748 #endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
749
750 /* Record (approximately) where the stack begins. */
751 stack_bottom = &stack_bottom_variable;
752
753 #ifdef USG_SHARED_LIBRARIES
754 if (bss_end)
755 brk ((void *)bss_end);
756 #endif
757
758 clearerr (stdin);
759
760 #ifndef SYSTEM_MALLOC
761 /* Arrange to get warning messages as memory fills up. */
762 memory_warnings (0, malloc_warning);
763
764 /* Call malloc at least once, to run the initial __malloc_hook.
765 Also call realloc and free for consistency. */
766 free (realloc (malloc (4), 4));
767
768 /* Arrange to disable interrupt input inside malloc etc. */
769 uninterrupt_malloc ();
770 #endif /* not SYSTEM_MALLOC */
771
772 #ifdef MSDOS
773 /* We do all file input/output as binary files. When we need to translate
774 newlines, we do that manually. */
775 _fmode = O_BINARY;
776
777 #if __DJGPP__ >= 2
778 if (!isatty (fileno (stdin)))
779 setmode (fileno (stdin), O_BINARY);
780 if (!isatty (fileno (stdout)))
781 {
782 fflush (stdout);
783 setmode (fileno (stdout), O_BINARY);
784 }
785 #else /* not __DJGPP__ >= 2 */
786 (stdin)->_flag &= ~_IOTEXT;
787 (stdout)->_flag &= ~_IOTEXT;
788 (stderr)->_flag &= ~_IOTEXT;
789 #endif /* not __DJGPP__ >= 2 */
790 #endif /* MSDOS */
791
792 #ifdef SET_EMACS_PRIORITY
793 if (emacs_priority)
794 nice (emacs_priority);
795 setuid (getuid ());
796 #endif /* SET_EMACS_PRIORITY */
797
798 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
799 The build procedure uses this while dumping, to ensure that the
800 dumped Emacs does not have its system locale tables initialized,
801 as that might cause screwups when the dumped Emacs starts up. */
802 {
803 char *lc_all = getenv ("LC_ALL");
804 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
805 }
806
807 /* Set locale now, so that initial error messages are localized properly.
808 fixup_locale must wait until later, since it builds strings. */
809 if (do_initial_setlocale)
810 setlocale (LC_ALL, "");
811
812 #ifdef EXTRA_INITIALIZE
813 EXTRA_INITIALIZE;
814 #endif
815
816 inhibit_window_system = 0;
817
818 /* Handle the -t switch, which specifies filename to use as terminal */
819 while (1)
820 {
821 char *term;
822 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
823 {
824 int result;
825 emacs_close (0);
826 emacs_close (1);
827 result = emacs_open (term, O_RDWR, 0);
828 if (result < 0)
829 {
830 char *errstring = strerror (errno);
831 fprintf (stderr, "emacs: %s: %s\n", term, errstring);
832 exit (1);
833 }
834 dup (0);
835 if (! isatty (0))
836 {
837 fprintf (stderr, "emacs: %s: not a tty\n", term);
838 exit (1);
839 }
840 fprintf (stderr, "Using %s\n", term);
841 #ifdef HAVE_WINDOW_SYSTEM
842 inhibit_window_system = 1; /* -t => -nw */
843 #endif
844 }
845 else
846 break;
847 }
848
849 if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
850 inhibit_window_system = 1;
851
852 /* Handle the -batch switch, which means don't do interactive display. */
853 noninteractive = 0;
854 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
855 noninteractive = 1;
856
857 /* Handle the --help option, which gives a usage message.. */
858 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
859 {
860 printf ("\
861 Usage: %s [--batch] [-t term] [--terminal term]\n\
862 [-d display] [--display display] [-nw] [--no-windows]\n\
863 [-q] [--no-init-file] [-u user] [--user user] [--debug-init]\n\
864 [--unibyte] [--multibyte] [--version] [--no-site-file]\n\
865 [-f func] [--funcall func] [-l file] [--load file] [--eval expr]\n\
866 [--execute expr] [--visit file] [--file file] [--insert file]\n\
867 [+linenum] file-to-visit [--kill]\n\
868 Report bugs to bug-gnu-emacs@gnu.org. First, please see\n\
869 the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
870 exit (0);
871 }
872
873 if (! noninteractive)
874 {
875 #ifdef BSD_PGRPS
876 if (initialized)
877 {
878 inherited_pgroup = EMACS_GETPGRP (0);
879 setpgrp (0, getpid ());
880 }
881 #else
882 #if defined (USG5) && defined (INTERRUPT_INPUT)
883 setpgrp ();
884 #endif
885 #endif
886 }
887
888 init_signals ();
889
890 /* Don't catch SIGHUP if dumping. */
891 if (1
892 #ifndef CANNOT_DUMP
893 && initialized
894 #endif
895 )
896 {
897 sigblock (sigmask (SIGHUP));
898 /* In --batch mode, don't catch SIGHUP if already ignored.
899 That makes nohup work. */
900 if (! noninteractive
901 || signal (SIGHUP, SIG_IGN) != SIG_IGN)
902 signal (SIGHUP, fatal_error_signal);
903 sigunblock (sigmask (SIGHUP));
904 }
905
906 if (
907 #ifndef CANNOT_DUMP
908 ! noninteractive || initialized
909 #else
910 1
911 #endif
912 )
913 {
914 /* Don't catch these signals in batch mode if dumping.
915 On some machines, this sets static data that would make
916 signal fail to work right when the dumped Emacs is run. */
917 signal (SIGQUIT, fatal_error_signal);
918 signal (SIGILL, fatal_error_signal);
919 signal (SIGTRAP, fatal_error_signal);
920 #ifdef SIGUSR1
921 signal (SIGUSR1, handle_USR1_signal);
922 #ifdef SIGUSR2
923 signal (SIGUSR2, handle_USR2_signal);
924 #endif
925 #endif
926 #ifdef SIGABRT
927 signal (SIGABRT, fatal_error_signal);
928 #endif
929 #ifdef SIGHWE
930 signal (SIGHWE, fatal_error_signal);
931 #endif
932 #ifdef SIGPRE
933 signal (SIGPRE, fatal_error_signal);
934 #endif
935 #ifdef SIGORE
936 signal (SIGORE, fatal_error_signal);
937 #endif
938 #ifdef SIGUME
939 signal (SIGUME, fatal_error_signal);
940 #endif
941 #ifdef SIGDLK
942 signal (SIGDLK, fatal_error_signal);
943 #endif
944 #ifdef SIGCPULIM
945 signal (SIGCPULIM, fatal_error_signal);
946 #endif
947 #ifdef SIGIOT
948 /* This is missing on some systems - OS/2, for example. */
949 signal (SIGIOT, fatal_error_signal);
950 #endif
951 #ifdef SIGEMT
952 signal (SIGEMT, fatal_error_signal);
953 #endif
954 signal (SIGFPE, fatal_error_signal);
955 #ifdef SIGBUS
956 signal (SIGBUS, fatal_error_signal);
957 #endif
958 signal (SIGSEGV, fatal_error_signal);
959 #ifdef SIGSYS
960 signal (SIGSYS, fatal_error_signal);
961 #endif
962 signal (SIGTERM, fatal_error_signal);
963 #ifdef SIGXCPU
964 signal (SIGXCPU, fatal_error_signal);
965 #endif
966 #ifdef SIGXFSZ
967 signal (SIGXFSZ, fatal_error_signal);
968 #endif /* SIGXFSZ */
969
970 #ifdef SIGDANGER
971 /* This just means available memory is getting low. */
972 signal (SIGDANGER, memory_warning_signal);
973 #endif
974
975 #ifdef AIX
976 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
977 signal (SIGXCPU, fatal_error_signal);
978 #ifndef _I386
979 signal (SIGIOINT, fatal_error_signal);
980 #endif
981 signal (SIGGRANT, fatal_error_signal);
982 signal (SIGRETRACT, fatal_error_signal);
983 signal (SIGSOUND, fatal_error_signal);
984 signal (SIGMSG, fatal_error_signal);
985 #endif /* AIX */
986 }
987
988 noninteractive1 = noninteractive;
989
990 /* Perform basic initializations (not merely interning symbols) */
991
992 if (!initialized)
993 {
994 init_alloc_once ();
995 init_obarray ();
996 init_eval_once ();
997 init_charset_once ();
998 init_coding_once ();
999 init_syntax_once (); /* Create standard syntax table. */
1000 init_category_once (); /* Create standard category table. */
1001 /* Must be done before init_buffer */
1002 init_casetab_once ();
1003 init_buffer_once (); /* Create buffer table and some buffers */
1004 init_minibuf_once (); /* Create list of minibuffers */
1005 /* Must precede init_window_once */
1006
1007 /* Call syms_of_xfaces before init_window_once because that
1008 function creates Vterminal_frame. Termcap frames now use
1009 faces, and the face implementation uses some symbols as
1010 face names. */
1011 #ifndef HAVE_NTGUI
1012 syms_of_xfaces ();
1013 #endif
1014
1015 init_window_once (); /* Init the window system */
1016 init_fileio_once (); /* Must precede any path manipulation. */
1017 }
1018
1019 init_alloc ();
1020
1021 if (do_initial_setlocale)
1022 {
1023 fixup_locale ();
1024 Vsystem_messages_locale = Vprevious_system_messages_locale;
1025 Vsystem_time_locale = Vprevious_system_time_locale;
1026 }
1027
1028 init_eval ();
1029 init_coding ();
1030 init_data ();
1031 #ifdef CLASH_DETECTION
1032 init_filelock ();;
1033 #endif
1034 running_asynch_code = 0;
1035
1036 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
1037 but not while dumping. */
1038 if (
1039 #ifndef CANNOT_DUMP
1040 ! noninteractive || initialized
1041 #else
1042 1
1043 #endif
1044 )
1045 {
1046 int inhibit_unibyte = 0;
1047
1048 /* --multibyte overrides EMACS_UNIBYTE. */
1049 if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
1050 || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args))
1051 inhibit_unibyte = 1;
1052
1053 /* --unibyte requests that we set up to do everything with single-byte
1054 buffers and strings. We need to handle this before calling
1055 init_lread, init_editfns and other places that generate Lisp strings
1056 from text in the environment. */
1057 /* Actually this shouldn't be needed as of 20.4 in a generally
1058 unibyte environment. As handa says, environment values
1059 aren't now decoded; also existing buffers are now made
1060 unibyte during startup if .emacs sets unibyte. Tested with
1061 8-bit data in environment variables and /etc/passwd, setting
1062 unibyte and Latin-1 in .emacs. -- Dave Love */
1063 if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
1064 || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
1065 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
1066 {
1067 Lisp_Object old_log_max;
1068 Lisp_Object symbol, tail;
1069
1070 symbol = intern ("default-enable-multibyte-characters");
1071 Fset (symbol, Qnil);
1072
1073 if (initialized)
1074 {
1075 /* Erase pre-dump messages in *Messages* now so no abort. */
1076 old_log_max = Vmessage_log_max;
1077 XSETFASTINT (Vmessage_log_max, 0);
1078 message_dolog ("", 0, 1, 0);
1079 Vmessage_log_max = old_log_max;
1080 }
1081
1082 for (tail = Vbuffer_alist; CONSP (tail);
1083 tail = XCDR (tail))
1084 {
1085 Lisp_Object buffer;
1086
1087 buffer = Fcdr (XCAR (tail));
1088 /* Verify that all buffers are empty now, as they
1089 ought to be. */
1090 if (BUF_Z (XBUFFER (buffer)) > BUF_BEG (XBUFFER (buffer)))
1091 abort ();
1092 /* It is safe to do this crudely in an empty buffer. */
1093 XBUFFER (buffer)->enable_multibyte_characters = Qnil;
1094 }
1095 }
1096 }
1097
1098 no_loadup
1099 = !argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
1100
1101
1102 #ifdef HAVE_X_WINDOWS
1103 /* Stupid kludge to catch command-line display spec. We can't
1104 handle this argument entirely in window system dependent code
1105 because we don't even know which window system dependent code
1106 to run until we've recognized this argument. */
1107 {
1108 char *displayname = 0;
1109 int count_before = skip_args;
1110
1111 /* Skip any number of -d options, but only use the last one. */
1112 while (1)
1113 {
1114 int count_before_this = skip_args;
1115
1116 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
1117 display_arg = 1;
1118 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
1119 display_arg = 1;
1120 else
1121 break;
1122
1123 count_before = count_before_this;
1124 }
1125
1126 /* If we have the form --display=NAME,
1127 convert it into -d name.
1128 This requires inserting a new element into argv. */
1129 if (displayname != 0 && skip_args - count_before == 1)
1130 {
1131 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1132 int j;
1133
1134 for (j = 0; j < count_before + 1; j++)
1135 new[j] = argv[j];
1136 new[count_before + 1] = "-d";
1137 new[count_before + 2] = displayname;
1138 for (j = count_before + 2; j <argc; j++)
1139 new[j + 1] = argv[j];
1140 argv = new;
1141 argc++;
1142 }
1143 /* Change --display to -d, when its arg is separate. */
1144 else if (displayname != 0 && skip_args > count_before
1145 && argv[count_before + 1][1] == '-')
1146 argv[count_before + 1] = "-d";
1147
1148 /* Don't actually discard this arg. */
1149 skip_args = count_before;
1150 }
1151 #endif
1152
1153 /* argmatch must not be used after here,
1154 except when bulding temacs
1155 because the -d argument has not been skipped in skip_args. */
1156
1157 #ifdef MSDOS
1158 /* Call early 'cause init_environment needs it. */
1159 init_dosfns ();
1160 /* Set defaults for several environment variables. */
1161 if (initialized)
1162 init_environment (argc, argv, skip_args);
1163 else
1164 tzset ();
1165 #endif /* MSDOS */
1166
1167 #ifdef WINDOWSNT
1168 /* Initialize environment from registry settings. */
1169 init_environment (argv);
1170 init_ntproc (); /* must precede init_editfns */
1171 #endif
1172
1173 /* egetenv is a pretty low-level facility, which may get called in
1174 many circumstances; it seems flimsy to put off initializing it
1175 until calling init_callproc. */
1176 set_process_environment ();
1177 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
1178 if this is not done. Do it after set_process_environment so that we
1179 don't pollute Vprocess_environment. */
1180 #ifdef AIX
1181 putenv ("LANG=C");
1182 #endif
1183
1184 init_buffer (); /* Init default directory of main buffer */
1185
1186 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
1187 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
1188
1189 if (initialized)
1190 {
1191 /* Erase any pre-dump messages in the message log, to avoid confusion */
1192 Lisp_Object old_log_max;
1193 old_log_max = Vmessage_log_max;
1194 XSETFASTINT (Vmessage_log_max, 0);
1195 message_dolog ("", 0, 1, 0);
1196 Vmessage_log_max = old_log_max;
1197 }
1198
1199 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
1200 init_lread ();
1201
1202 /* Intern the names of all standard functions and variables;
1203 define standard keys. */
1204
1205 if (!initialized)
1206 {
1207 /* The basic levels of Lisp must come first */
1208 /* And data must come first of all
1209 for the sake of symbols like error-message */
1210 syms_of_data ();
1211 syms_of_alloc ();
1212 syms_of_lread ();
1213 syms_of_print ();
1214 syms_of_eval ();
1215 syms_of_fns ();
1216 syms_of_floatfns ();
1217
1218 syms_of_abbrev ();
1219 syms_of_buffer ();
1220 syms_of_bytecode ();
1221 syms_of_callint ();
1222 syms_of_casefiddle ();
1223 syms_of_casetab ();
1224 syms_of_callproc ();
1225 syms_of_category ();
1226 syms_of_ccl ();
1227 syms_of_charset ();
1228 syms_of_cmds ();
1229 #ifndef NO_DIR_LIBRARY
1230 syms_of_dired ();
1231 #endif /* not NO_DIR_LIBRARY */
1232 syms_of_display ();
1233 syms_of_doc ();
1234 syms_of_editfns ();
1235 syms_of_emacs ();
1236 syms_of_fileio ();
1237 syms_of_coding (); /* This should be after syms_of_fileio. */
1238 #ifdef CLASH_DETECTION
1239 syms_of_filelock ();
1240 #endif /* CLASH_DETECTION */
1241 syms_of_indent ();
1242 syms_of_insdel ();
1243 syms_of_keyboard ();
1244 syms_of_keymap ();
1245 syms_of_macros ();
1246 syms_of_marker ();
1247 syms_of_minibuf ();
1248 syms_of_mocklisp ();
1249 syms_of_process ();
1250 syms_of_search ();
1251 syms_of_frame ();
1252 syms_of_syntax ();
1253 syms_of_term ();
1254 syms_of_undo ();
1255 #ifdef HAVE_SOUND
1256 syms_of_sound ();
1257 #endif
1258
1259 syms_of_textprop ();
1260 #ifdef VMS
1261 syms_of_vmsproc ();
1262 #endif /* VMS */
1263 #ifdef WINDOWSNT
1264 syms_of_ntproc ();
1265 #endif /* WINDOWSNT */
1266 syms_of_window ();
1267 syms_of_xdisp ();
1268 #ifdef HAVE_X_WINDOWS
1269 syms_of_xterm ();
1270 syms_of_xfns ();
1271 syms_of_fontset ();
1272 #ifdef HAVE_X11
1273 syms_of_xselect ();
1274 #endif
1275 #endif /* HAVE_X_WINDOWS */
1276
1277 #ifndef HAVE_NTGUI
1278 syms_of_xmenu ();
1279 #endif
1280
1281 #ifdef HAVE_NTGUI
1282 syms_of_w32term ();
1283 syms_of_w32fns ();
1284 syms_of_w32faces ();
1285 syms_of_w32select ();
1286 syms_of_w32menu ();
1287 syms_of_fontset ();
1288 #endif /* HAVE_NTGUI */
1289
1290 #ifdef SYMS_SYSTEM
1291 SYMS_SYSTEM;
1292 #endif
1293
1294 #ifdef SYMS_MACHINE
1295 SYMS_MACHINE;
1296 #endif
1297
1298 keys_of_casefiddle ();
1299 keys_of_cmds ();
1300 keys_of_buffer ();
1301 keys_of_keyboard ();
1302 keys_of_keymap ();
1303 keys_of_macros ();
1304 keys_of_minibuf ();
1305 keys_of_window ();
1306 keys_of_frame ();
1307 }
1308
1309 if (!noninteractive)
1310 {
1311 #ifdef VMS
1312 init_vms_input ();/* init_display calls get_frame_size, that needs this */
1313 #endif /* VMS */
1314 init_display (); /* Determine terminal type. init_sys_modes uses results */
1315 }
1316 init_keyboard (); /* This too must precede init_sys_modes */
1317 #ifdef VMS
1318 init_vmsproc (); /* And this too. */
1319 #endif /* VMS */
1320 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.) */
1321 #ifdef HAVE_X_WINDOWS
1322 init_xfns ();
1323 #endif /* HAVE_X_WINDOWS */
1324 init_fns ();
1325 init_xdisp ();
1326 init_macros ();
1327 init_editfns ();
1328 #ifdef LISP_FLOAT_TYPE
1329 init_floatfns ();
1330 #endif
1331 #ifdef VMS
1332 init_vmsfns ();
1333 #endif /* VMS */
1334 init_process ();
1335 #ifdef HAVE_SOUND
1336 init_sound ();
1337 #endif
1338
1339 if (!initialized)
1340 {
1341 char *file;
1342 /* Handle -l loadup, args passed by Makefile. */
1343 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
1344 Vtop_level = Fcons (intern ("load"),
1345 Fcons (build_string (file), Qnil));
1346 #ifdef CANNOT_DUMP
1347 /* Unless next switch is -nl, load "loadup.el" first thing. */
1348 if (! no_loadup)
1349 Vtop_level = Fcons (intern ("load"),
1350 Fcons (build_string ("loadup.el"), Qnil));
1351 #endif /* CANNOT_DUMP */
1352 }
1353
1354 if (initialized)
1355 {
1356 #ifdef HAVE_TZSET
1357 {
1358 /* If the execution TZ happens to be the same as the dump TZ,
1359 change it to some other value and then change it back,
1360 to force the underlying implementation to reload the TZ info.
1361 This is needed on implementations that load TZ info from files,
1362 since the TZ file contents may differ between dump and execution. */
1363 char *tz = getenv ("TZ");
1364 if (tz && !strcmp (tz, dump_tz))
1365 {
1366 ++*tz;
1367 tzset ();
1368 --*tz;
1369 }
1370 }
1371 #endif
1372 }
1373
1374 /* Gerd Moellmann <gerd@acm.org> says this makes profiling work on
1375 FreeBSD. It might work on some other systems too.
1376 Give it a try and tell me if it works on your system. */
1377 #if defined (__FreeBSD__) || defined (__linux)
1378 #ifdef PROFILING
1379 if (initialized)
1380 {
1381 extern void _mcleanup ();
1382 extern char etext;
1383 extern void safe_bcopy ();
1384 extern void dump_opcode_frequencies ();
1385
1386 atexit (_mcleanup);
1387 // atexit (dump_opcode_frequencies);
1388 /* This uses safe_bcopy because that function comes first in the
1389 Emacs executable. It might be better to use something that
1390 gives the start of the text segment, but start_of_text is not
1391 defined on all systems now. */
1392 monstartup (safe_bcopy, &etext);
1393 }
1394 else
1395 moncontrol (0);
1396 #endif
1397 #endif
1398
1399 initialized = 1;
1400
1401 #ifdef LOCALTIME_CACHE
1402 /* Some versions of localtime have a bug. They cache the value of the time
1403 zone rather than looking it up every time. Since localtime() is
1404 called to bolt the undumping time into the undumped emacs, this
1405 results in localtime ignoring the TZ environment variable.
1406 This flushes the new TZ value into localtime. */
1407 tzset ();
1408 #endif /* defined (LOCALTIME_CACHE) */
1409
1410 /* Enter editor command loop. This never returns. */
1411 Frecursive_edit ();
1412 /* NOTREACHED */
1413 }
1414 \f
1415 /* Sort the args so we can find the most important ones
1416 at the beginning of argv. */
1417
1418 /* First, here's a table of all the standard options. */
1419
1420 struct standard_args
1421 {
1422 char *name;
1423 char *longname;
1424 int priority;
1425 int nargs;
1426 };
1427
1428 struct standard_args standard_args[] =
1429 {
1430 { "-version", "--version", 150, 0 },
1431 #ifdef HAVE_SHM
1432 { "-nl", "--no-shared-memory", 140, 0 },
1433 #endif
1434 #ifdef VMS
1435 { "-map", "--map-data", 130, 0 },
1436 #endif
1437 { "-t", "--terminal", 120, 1 },
1438 { "-nw", "--no-windows", 110, 0 },
1439 { "-batch", "--batch", 100, 0 },
1440 { "-help", "--help", 90, 0 },
1441 { "-no-unibyte", "--no-unibyte", 83, 0 },
1442 { "-multibyte", "--multibyte", 82, 0 },
1443 { "-unibyte", "--unibyte", 81, 0 },
1444 { "-no-multibyte", "--no-multibyte", 80, 0 },
1445 #ifdef CANNOT_DUMP
1446 { "-nl", "--no-loadup", 70, 0 },
1447 #endif
1448 /* -d must come last before the options handled in startup.el. */
1449 { "-d", "--display", 60, 1 },
1450 { "-display", 0, 60, 1 },
1451 /* Now for the options handled in startup.el. */
1452 { "-q", "--no-init-file", 50, 0 },
1453 { "-no-init-file", 0, 50, 0 },
1454 { "-no-site-file", "--no-site-file", 40, 0 },
1455 { "-u", "--user", 30, 1 },
1456 { "-user", 0, 30, 1 },
1457 { "-debug-init", "--debug-init", 20, 0 },
1458 { "-i", "--icon-type", 15, 0 },
1459 { "-itype", 0, 15, 0 },
1460 { "-iconic", "--iconic", 15, 0 },
1461 { "-bg", "--background-color", 10, 1 },
1462 { "-background", 0, 10, 1 },
1463 { "-fg", "--foreground-color", 10, 1 },
1464 { "-foreground", 0, 10, 1 },
1465 { "-bd", "--border-color", 10, 1 },
1466 { "-bw", "--border-width", 10, 1 },
1467 { "-ib", "--internal-border", 10, 1 },
1468 { "-ms", "--mouse-color", 10, 1 },
1469 { "-cr", "--cursor-color", 10, 1 },
1470 { "-fn", "--font", 10, 1 },
1471 { "-font", 0, 10, 1 },
1472 { "-g", "--geometry", 10, 1 },
1473 { "-geometry", 0, 10, 1 },
1474 { "-T", "--title", 10, 1 },
1475 { "-title", 0, 10, 1 },
1476 { "-name", "--name", 10, 1 },
1477 { "-xrm", "--xrm", 10, 1 },
1478 { "-r", "--reverse-video", 5, 0 },
1479 { "-rv", 0, 5, 0 },
1480 { "-reverse", 0, 5, 0 },
1481 { "-hb", "--horizontal-scroll-bars", 5, 0 },
1482 { "-vb", "--vertical-scroll-bars", 5, 0 },
1483 /* These have the same priority as ordinary file name args,
1484 so they are not reordered with respect to those. */
1485 { "-L", "--directory", 0, 1 },
1486 { "-directory", 0, 0, 1 },
1487 { "-l", "--load", 0, 1 },
1488 { "-load", 0, 0, 1 },
1489 { "-f", "--funcall", 0, 1 },
1490 { "-funcall", 0, 0, 1 },
1491 { "-eval", "--eval", 0, 1 },
1492 { "-execute", "--execute", 0, 1 },
1493 { "-find-file", "--find-file", 0, 1 },
1494 { "-visit", "--visit", 0, 1 },
1495 { "-file", "--file", 0, 1 },
1496 { "-insert", "--insert", 0, 1 },
1497 /* This should be processed after ordinary file name args and the like. */
1498 { "-kill", "--kill", -10, 0 },
1499 };
1500
1501 /* Reorder the elements of ARGV (assumed to have ARGC elements)
1502 so that the highest priority ones come first.
1503 Do not change the order of elements of equal priority.
1504 If an option takes an argument, keep it and its argument together.
1505
1506 If an option that takes no argument appears more
1507 than once, eliminate all but one copy of it. */
1508
1509 static void
1510 sort_args (argc, argv)
1511 int argc;
1512 char **argv;
1513 {
1514 char **new = (char **) xmalloc (sizeof (char *) * argc);
1515 /* For each element of argv,
1516 the corresponding element of options is:
1517 0 for an option that takes no arguments,
1518 1 for an option that takes one argument, etc.
1519 -1 for an ordinary non-option argument. */
1520 int *options = (int *) xmalloc (sizeof (int) * argc);
1521 int *priority = (int *) xmalloc (sizeof (int) * argc);
1522 int to = 1;
1523 int incoming_used = 1;
1524 int from;
1525 int i;
1526
1527 /* Categorize all the options,
1528 and figure out which argv elts are option arguments. */
1529 for (from = 1; from < argc; from++)
1530 {
1531 options[from] = -1;
1532 priority[from] = 0;
1533 if (argv[from][0] == '-')
1534 {
1535 int match, thislen;
1536 char *equals;
1537
1538 /* If we have found "--", don't consider
1539 any more arguments as options. */
1540 if (argv[from][1] == '-' && argv[from][2] == 0)
1541 {
1542 /* Leave the "--", and everything following it, at the end. */
1543 for (; from < argc; from++)
1544 {
1545 priority[from] = -100;
1546 options[from] = -1;
1547 }
1548 break;
1549 }
1550
1551 /* Look for a match with a known old-fashioned option. */
1552 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1553 if (!strcmp (argv[from], standard_args[i].name))
1554 {
1555 options[from] = standard_args[i].nargs;
1556 priority[from] = standard_args[i].priority;
1557 if (from + standard_args[i].nargs >= argc)
1558 fatal ("Option `%s' requires an argument\n", argv[from]);
1559 from += standard_args[i].nargs;
1560 goto done;
1561 }
1562
1563 /* Look for a match with a known long option.
1564 MATCH is -1 if no match so far, -2 if two or more matches so far,
1565 >= 0 (the table index of the match) if just one match so far. */
1566 if (argv[from][1] == '-')
1567 {
1568 match = -1;
1569 thislen = strlen (argv[from]);
1570 equals = index (argv[from], '=');
1571 if (equals != 0)
1572 thislen = equals - argv[from];
1573
1574 for (i = 0;
1575 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
1576 if (standard_args[i].longname
1577 && !strncmp (argv[from], standard_args[i].longname,
1578 thislen))
1579 {
1580 if (match == -1)
1581 match = i;
1582 else
1583 match = -2;
1584 }
1585
1586 /* If we found exactly one match, use that. */
1587 if (match >= 0)
1588 {
1589 options[from] = standard_args[match].nargs;
1590 priority[from] = standard_args[match].priority;
1591 /* If --OPTION=VALUE syntax is used,
1592 this option uses just one argv element. */
1593 if (equals != 0)
1594 options[from] = 0;
1595 if (from + options[from] >= argc)
1596 fatal ("Option `%s' requires an argument\n", argv[from]);
1597 from += options[from];
1598 }
1599 }
1600 done: ;
1601 }
1602 }
1603
1604 /* Copy the arguments, in order of decreasing priority, to NEW. */
1605 new[0] = argv[0];
1606 while (incoming_used < argc)
1607 {
1608 int best = -1;
1609 int best_priority = -9999;
1610
1611 /* Find the highest priority remaining option.
1612 If several have equal priority, take the first of them. */
1613 for (from = 1; from < argc; from++)
1614 {
1615 if (argv[from] != 0 && priority[from] > best_priority)
1616 {
1617 best_priority = priority[from];
1618 best = from;
1619 }
1620 /* Skip option arguments--they are tied to the options. */
1621 if (options[from] > 0)
1622 from += options[from];
1623 }
1624
1625 if (best < 0)
1626 abort ();
1627
1628 /* Copy the highest priority remaining option, with its args, to NEW.
1629 Unless it is a duplicate of the previous one. */
1630 if (! (options[best] == 0
1631 && ! strcmp (new[to - 1], argv[best])))
1632 {
1633 new[to++] = argv[best];
1634 for (i = 0; i < options[best]; i++)
1635 new[to++] = argv[best + i + 1];
1636 }
1637
1638 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
1639
1640 /* Clear out this option in ARGV. */
1641 argv[best] = 0;
1642 for (i = 0; i < options[best]; i++)
1643 argv[best + i + 1] = 0;
1644 }
1645
1646 /* If duplicate options were deleted, fill up extra space with null ptrs. */
1647 while (to < argc)
1648 new[to++] = 0;
1649
1650 bcopy (new, argv, sizeof (char *) * argc);
1651
1652 free (options);
1653 free (new);
1654 free (priority);
1655 }
1656 \f
1657 DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
1658 "Exit the Emacs job and kill it.\n\
1659 If ARG is an integer, return ARG as the exit program code.\n\
1660 If ARG is a string, stuff it as keyboard input.\n\n\
1661 The value of `kill-emacs-hook', if not void,\n\
1662 is a list of functions (of no args),\n\
1663 all of which are called before Emacs is actually killed.")
1664 (arg)
1665 Lisp_Object arg;
1666 {
1667 struct gcpro gcpro1;
1668
1669 GCPRO1 (arg);
1670
1671 if (feof (stdin))
1672 arg = Qt;
1673
1674 if (!NILP (Vrun_hooks) && !noninteractive)
1675 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
1676
1677 UNGCPRO;
1678
1679 /* Is it really necessary to do this deassign
1680 when we are going to exit anyway? */
1681 /* #ifdef VMS
1682 stop_vms_input ();
1683 #endif */
1684
1685 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
1686
1687 /* If we have an auto-save list file,
1688 kill it because we are exiting Emacs deliberately (not crashing).
1689 Do it after shut_down_emacs, which does an auto-save. */
1690 if (STRINGP (Vauto_save_list_file_name))
1691 unlink (XSTRING (Vauto_save_list_file_name)->data);
1692
1693 exit (INTEGERP (arg) ? XINT (arg)
1694 #ifdef VMS
1695 : 1
1696 #else
1697 : 0
1698 #endif
1699 );
1700 /* NOTREACHED */
1701 }
1702
1703
1704 /* Perform an orderly shutdown of Emacs. Autosave any modified
1705 buffers, kill any child processes, clean up the terminal modes (if
1706 we're in the foreground), and other stuff like that. Don't perform
1707 any redisplay; this may be called when Emacs is shutting down in
1708 the background, or after its X connection has died.
1709
1710 If SIG is a signal number, print a message for it.
1711
1712 This is called by fatal signal handlers, X protocol error handlers,
1713 and Fkill_emacs. */
1714
1715 void
1716 shut_down_emacs (sig, no_x, stuff)
1717 int sig, no_x;
1718 Lisp_Object stuff;
1719 {
1720 /* Prevent running of hooks from now on. */
1721 Vrun_hooks = Qnil;
1722
1723 /* If we are controlling the terminal, reset terminal modes */
1724 #ifdef EMACS_HAVE_TTY_PGRP
1725 {
1726 int pgrp = EMACS_GETPGRP (0);
1727
1728 int tpgrp;
1729 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
1730 && tpgrp == pgrp)
1731 {
1732 fflush (stdout);
1733 reset_sys_modes ();
1734 if (sig && sig != SIGTERM)
1735 fprintf (stderr, "Fatal error (%d).", sig);
1736 }
1737 }
1738 #else
1739 fflush (stdout);
1740 reset_sys_modes ();
1741 #endif
1742
1743 stuff_buffered_input (stuff);
1744
1745 kill_buffer_processes (Qnil);
1746 Fdo_auto_save (Qt, Qnil);
1747
1748 #ifdef CLASH_DETECTION
1749 unlock_all_files ();
1750 #endif
1751
1752 #ifdef VMS
1753 kill_vms_processes ();
1754 #endif
1755
1756 #if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
1757 #ifdef HAVE_X_WINDOWS
1758 /* It's not safe to call intern here. Maybe we are crashing. */
1759 if (!noninteractive && SYMBOLP (Vwindow_system)
1760 && XSYMBOL (Vwindow_system)->name->size == 1
1761 && XSYMBOL (Vwindow_system)->name->data[0] == 'x'
1762 && ! no_x)
1763 Fx_close_current_connection ();
1764 #endif /* HAVE_X_WINDOWS */
1765 #endif
1766
1767 #ifdef SIGIO
1768 /* There is a tendency for a SIGIO signal to arrive within exit,
1769 and cause a SIGHUP because the input descriptor is already closed. */
1770 unrequest_sigio ();
1771 signal (SIGIO, SIG_IGN);
1772 #endif
1773
1774 #ifdef WINDOWSNT
1775 term_ntproc ();
1776 #endif
1777
1778 check_glyph_memory ();
1779 check_message_stack ();
1780
1781 #ifdef MSDOS
1782 dos_cleanup ();
1783 #endif
1784 }
1785
1786
1787 \f
1788 #ifndef CANNOT_DUMP
1789
1790 #ifdef HAVE_SHM
1791
1792 DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
1793 "Dump current state of Emacs into data file FILENAME.\n\
1794 This function exists on systems that use HAVE_SHM.")
1795 (filename)
1796 Lisp_Object filename;
1797 {
1798 extern char my_edata[];
1799 Lisp_Object tem;
1800
1801 CHECK_STRING (filename, 0);
1802 filename = Fexpand_file_name (filename, Qnil);
1803
1804 tem = Vpurify_flag;
1805 Vpurify_flag = Qnil;
1806
1807 fflush (stdout);
1808 /* Tell malloc where start of impure now is */
1809 /* Also arrange for warnings when nearly out of space. */
1810 #ifndef SYSTEM_MALLOC
1811 memory_warnings (my_edata, malloc_warning);
1812 #endif
1813 map_out_data (XSTRING (filename)->data);
1814
1815 Vpurify_flag = tem;
1816
1817 return Qnil;
1818 }
1819
1820 #else /* not HAVE_SHM */
1821
1822 DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
1823 "Dump current state of Emacs into executable file FILENAME.\n\
1824 Take symbols from SYMFILE (presumably the file you executed to run Emacs).\n\
1825 This is used in the file `loadup.el' when building Emacs.\n\
1826 \n\
1827 You must run Emacs in batch mode in order to dump it.")
1828 (filename, symfile)
1829 Lisp_Object filename, symfile;
1830 {
1831 extern char my_edata[];
1832 Lisp_Object tem;
1833 Lisp_Object symbol;
1834 int count = specpdl_ptr - specpdl;
1835
1836 if (! noninteractive)
1837 error ("Dumping Emacs works only in batch mode");
1838
1839 /* Bind `command-line-processed' to nil before dumping,
1840 so that the dumped Emacs will process its command line
1841 and set up to work with X windows if appropriate. */
1842 symbol = intern ("command-line-process");
1843 specbind (symbol, Qnil);
1844
1845 CHECK_STRING (filename, 0);
1846 filename = Fexpand_file_name (filename, Qnil);
1847 if (!NILP (symfile))
1848 {
1849 CHECK_STRING (symfile, 0);
1850 if (XSTRING (symfile)->size)
1851 symfile = Fexpand_file_name (symfile, Qnil);
1852 }
1853
1854 tem = Vpurify_flag;
1855 Vpurify_flag = Qnil;
1856
1857 #ifdef HAVE_TZSET
1858 set_time_zone_rule (dump_tz);
1859 #ifndef LOCALTIME_CACHE
1860 /* Force a tz reload, since set_time_zone_rule doesn't. */
1861 tzset ();
1862 #endif
1863 #endif
1864
1865 fflush (stdout);
1866 #ifdef VMS
1867 mapout_data (XSTRING (filename)->data);
1868 #else
1869 /* Tell malloc where start of impure now is */
1870 /* Also arrange for warnings when nearly out of space. */
1871 #ifndef SYSTEM_MALLOC
1872 #ifndef WINDOWSNT
1873 /* On Windows, this was done before dumping, and that once suffices.
1874 Meanwhile, my_edata is not valid on Windows. */
1875 memory_warnings (my_edata, malloc_warning);
1876 #endif /* not WINDOWSNT */
1877 #endif
1878 #ifdef DOUG_LEA_MALLOC
1879 malloc_state_ptr = malloc_get_state ();
1880 #endif
1881 unexec (XSTRING (filename)->data,
1882 !NILP (symfile) ? XSTRING (symfile)->data : 0, my_edata, 0, 0);
1883 #ifdef DOUG_LEA_MALLOC
1884 free (malloc_state_ptr);
1885 #endif
1886 #endif /* not VMS */
1887
1888 Vpurify_flag = tem;
1889
1890 return unbind_to (count, Qnil);
1891 }
1892
1893 #endif /* not HAVE_SHM */
1894
1895 #endif /* not CANNOT_DUMP */
1896 \f
1897 #if HAVE_SETLOCALE
1898 /* Recover from setlocale (LC_ALL, ""). */
1899 void
1900 fixup_locale ()
1901 {
1902 char *l;
1903
1904 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
1905 so that numbers are read and printed properly for Emacs Lisp. */
1906 setlocale (LC_NUMERIC, "C");
1907
1908 #ifdef LC_MESSAGES
1909 l = setlocale (LC_MESSAGES, (char *) 0);
1910 Vprevious_system_messages_locale = l ? build_string (l) : Qnil;
1911 #endif
1912 l = setlocale (LC_TIME, (char *) 0);
1913 Vprevious_system_time_locale = l ? build_string (l) : Qnil;
1914 }
1915
1916 static void
1917 synchronize_locale (category, plocale, desired_locale)
1918 int category;
1919 Lisp_Object *plocale;
1920 Lisp_Object desired_locale;
1921 {
1922 if (STRINGP (desired_locale)
1923 && (NILP (*plocale) || NILP (Fstring_equal (*plocale, desired_locale)))
1924 && setlocale (category, XSTRING (desired_locale)->data))
1925 *plocale = desired_locale;
1926 }
1927
1928 /* Set system time locale to match Vsystem_time_locale, if possible. */
1929 void
1930 synchronize_system_time_locale ()
1931 {
1932 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
1933 Vsystem_time_locale);
1934 }
1935
1936 /* Set system messages locale to match Vsystem_messages_locale, if
1937 possible. */
1938 void
1939 synchronize_system_messages_locale ()
1940 {
1941 #ifdef LC_MESSAGES
1942 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
1943 Vsystem_messages_locale);
1944 #endif
1945 }
1946 #endif /* HAVE_SETLOCALE */
1947 \f
1948 #ifndef SEPCHAR
1949 #define SEPCHAR ':'
1950 #endif
1951
1952 Lisp_Object
1953 decode_env_path (evarname, defalt)
1954 char *evarname, *defalt;
1955 {
1956 register char *path, *p;
1957 Lisp_Object lpath, element, tem;
1958
1959 /* It's okay to use getenv here, because this function is only used
1960 to initialize variables when Emacs starts up, and isn't called
1961 after that. */
1962 if (evarname != 0)
1963 path = (char *) getenv (evarname);
1964 else
1965 path = 0;
1966 if (!path)
1967 path = defalt;
1968 #ifdef DOS_NT
1969 /* Ensure values from the environment use the proper directory separator. */
1970 if (path)
1971 {
1972 p = alloca (strlen (path) + 1);
1973 strcpy (p, path);
1974 path = p;
1975
1976 if ('/' == DIRECTORY_SEP)
1977 dostounix_filename (path);
1978 else
1979 unixtodos_filename (path);
1980 }
1981 #endif
1982 lpath = Qnil;
1983 while (1)
1984 {
1985 p = index (path, SEPCHAR);
1986 if (!p) p = path + strlen (path);
1987 element = (p - path ? make_string (path, p - path)
1988 : build_string ("."));
1989
1990 /* Add /: to the front of the name
1991 if it would otherwise be treated as magic. */
1992 tem = Ffind_file_name_handler (element, Qt);
1993 if (! NILP (tem))
1994 element = concat2 (build_string ("/:"), element);
1995
1996 lpath = Fcons (element, lpath);
1997 if (*p)
1998 path = p + 1;
1999 else
2000 break;
2001 }
2002 return Fnreverse (lpath);
2003 }
2004
2005 void
2006 syms_of_emacs ()
2007 {
2008 Qfile_name_handler_alist = intern ("file-name-handler-alist");
2009 staticpro (&Qfile_name_handler_alist);
2010
2011 #ifndef CANNOT_DUMP
2012 #ifdef HAVE_SHM
2013 defsubr (&Sdump_emacs_data);
2014 #else
2015 defsubr (&Sdump_emacs);
2016 #endif
2017 #endif
2018
2019 defsubr (&Skill_emacs);
2020
2021 defsubr (&Sinvocation_name);
2022 defsubr (&Sinvocation_directory);
2023
2024 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
2025 "Args passed by shell to Emacs, as a list of strings.");
2026
2027 DEFVAR_LISP ("system-type", &Vsystem_type,
2028 "Value is symbol indicating type of operating system you are using.");
2029 Vsystem_type = intern (SYSTEM_TYPE);
2030
2031 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
2032 "Value is string indicating configuration Emacs was built for.");
2033 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
2034
2035 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
2036 "String containing the configuration options Emacs was built with.");
2037 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2038
2039 DEFVAR_BOOL ("noninteractive", &noninteractive1,
2040 "Non-nil means Emacs is running without interactive terminal.");
2041
2042 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
2043 "Hook to be run whenever kill-emacs is called.\n\
2044 Since kill-emacs may be invoked when the terminal is disconnected (or\n\
2045 in other similar situations), functions placed on this hook should not\n\
2046 expect to be able to interact with the user. To ask for confirmation,\n\
2047 see `kill-emacs-query-functions' instead.");
2048 Vkill_emacs_hook = Qnil;
2049
2050 #ifdef SIGUSR1
2051 DEFVAR_LISP ("signal-USR1-hook", &Vsignal_USR1_hook,
2052 "Hook to be run whenever emacs receives a USR1 signal");
2053 Vsignal_USR1_hook = Qnil;
2054 #ifdef SIGUSR2
2055 DEFVAR_LISP ("signal-USR2-hook", &Vsignal_USR2_hook,
2056 "Hook to be run whenever emacs receives a USR2 signal");
2057 Vsignal_USR2_hook = Qnil;
2058 #endif
2059 #endif
2060
2061
2062 DEFVAR_INT ("emacs-priority", &emacs_priority,
2063 "Priority for Emacs to run at.\n\
2064 This value is effective only if set before Emacs is dumped,\n\
2065 and only if the Emacs executable is installed with setuid to permit\n\
2066 it to change priority. (Emacs sets its uid back to the real uid.)\n\
2067 Currently, you need to define SET_EMACS_PRIORITY in `config.h'\n\
2068 before you compile Emacs, to enable the code for this feature.");
2069 emacs_priority = 0;
2070
2071 DEFVAR_LISP ("path-separator", &Vpath_separator,
2072 "The directory separator in search paths, as a string.");
2073 {
2074 char c = SEPCHAR;
2075 Vpath_separator = make_string (&c, 1);
2076 }
2077
2078 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
2079 "The program name that was used to run Emacs.\n\
2080 Any directory names are omitted.");
2081
2082 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
2083 "The directory in which the Emacs executable was found, to run it.\n\
2084 The value is nil if that directory's name is not known.");
2085
2086 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
2087 "A directory within which to look for the `lib-src' and `etc' directories.\n\
2088 This is non-nil when we can't find those directories in their standard\n\
2089 installed locations, but we can find them\n\
2090 near where the Emacs executable was found.");
2091 Vinstallation_directory = Qnil;
2092
2093 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
2094 "System locale for messages.");
2095 Vsystem_messages_locale = Qnil;
2096
2097 DEFVAR_LISP ("previous-system-messages-locale",
2098 &Vprevious_system_messages_locale,
2099 "Most recently used system locale for messages.");
2100 Vprevious_system_messages_locale = Qnil;
2101
2102 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
2103 "System locale for time.");
2104 Vsystem_time_locale = Qnil;
2105
2106 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
2107 "Most recently used system locale for time.");
2108 Vprevious_system_time_locale = Qnil;
2109 }