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