1 /* XEmacs -- Fully extensible Emacs, running on Unix and other platforms.
2 Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994
3 Free Software Foundation, Inc.
4 Copyright (C) 1995 Sun Microsystems, Inc.
5 Copyright (C) 2000, 2002 Ben Wing.
7 This file is part of XEmacs.
9 XEmacs is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with XEmacs; see the file COPYING. If not, write to
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
24 /* Synched up with: Mule 2.0, FSF 19.28. */
26 /* Capsule summary of the various releases of Lucid Emacs/XEmacs and
27 FSF/GNU Emacs. Provided here for use in cross-referencing version
28 releases and dates in comments, esp. in the authorship comments at
29 the beginning of each file. More information about history can be
30 found in the beginning of the Internals Manual and in the About page.
33 -- A time line for Lucid Emacs/XEmacs is
35 version 19.0 shipped with Energize 1.0, April 1992.
36 version 19.1 released June 4, 1992.
37 version 19.2 released June 19, 1992.
38 version 19.3 released September 9, 1992.
39 version 19.4 released January 21, 1993.
40 version 19.5 was a repackaging of 19.4 with a few bug fixes and
41 shipped with Energize 2.0. Never released to the net.
42 version 19.6 released April 9, 1993.
43 version 19.7 was a repackaging of 19.6 with a few bug fixes and
44 shipped with Energize 2.1. Never released to the net.
45 version 19.8 released September 6, 1993.
46 version 19.9 released January 12, 1994.
47 version 19.10 released May 27, 1994.
48 version 19.11 (first XEmacs) released September 13, 1994.
49 version 19.12 released June 23, 1995.
50 version 19.13 released September 1, 1995.
51 version 19.14 released June 23, 1996.
52 version 20.0 released February 9, 1997.
53 version 19.15 released March 28, 1997.
54 version 20.1 (not released to the net) April 15, 1997.
55 version 20.2 released May 16, 1997.
56 version 19.16 released October 31, 1997.
57 version 20.3 (the first stable version of XEmacs 20.x) released
59 version 20.4 released February 28, 1998.
62 -- A time line for GNU Emacs version 19 is
64 version 19.7 (beta) (first beta release) released ??????; prob. late May 1993.
65 version 19.8 (beta) released May 27, 1993.
66 version 19.9 (beta) released May 27, 1993.
67 version 19.10 (beta) released May 30, 1993.
68 version 19.11 (beta) released June 1, 1993.
69 version 19.12 (beta) released June 2, 1993.
70 version 19.13 (beta) released June 8, 1993.
71 version 19.14 (beta) released June 17, 1993.
72 version 19.15 (beta) released June 19, 1993.
73 version 19.16 (beta) released July 6, 1993.
74 version 19.17 (beta) released late July, 1993.
75 version 19.18 (beta) released August 9, 1993.
76 version 19.19 (beta) released August 15, 1993.
77 version 19.20 (beta) released November 17, 1993.
78 version 19.21 (beta) released November 17, 1993.
79 version 19.22 (beta) released November 28, 1993.
80 version 19.23 (beta) released May 17, 1994.
81 version 19.24 (beta) released May 16, 1994.
82 version 19.25 (beta) released June 3, 1994.
83 version 19.26 (beta) released September 11, 1994.
84 version 19.27 (beta) released September 14, 1994.
85 version 19.28 (first ``official'' release) released November 1, 1994.
86 version 19.29 released June 21, 1995.
87 version 19.30 released November 24, 1995.
88 version 19.31 released May 25, 1996.
89 version 19.32 released July 31, 1996.
90 version 19.33 released August 11, 1996.
91 version 19.34 released August 21, 1996.
92 version 19.34b released September 6, 1996.
95 -- A time line for GNU Emacs version 20 is
97 version 20.1 released September 17, 1997.
98 version 20.2 released September 20, 1997.
99 version 20.3 released August 19, 1998.
102 -- A time line for GNU Emacs version 18 and older is
104 GNU Emacs version 15 (15.34) was released sometime in 1984 or 1985 and
105 shared some code with a version of Emacs written by James Gosling (the
106 same James Gosling who later created the Java language).
107 GNU Emacs version 16 (first released version was 16.56) was released on
108 July 15, 1985. All Gosling code was removed due to potential copyright
109 problems with the code.
110 version 16.57: released on September 16, 1985.
111 versions 16.58, 16.59: released on September 17, 1985.
112 version 16.60: released on September 19, 1985. These later version 16's
113 incorporated patches from the net, esp. for getting Emacs to work under
115 version 17.36 (first official v17 release) released on December 20, 1985.
116 Included a TeX-able user manual. First official unpatched version that
117 worked on vanilla System V machines.
118 version 17.43 (second official v17 release) released on January 25, 1986.
119 version 17.45 released on January 30, 1986.
120 version 17.46 released on February 4, 1986.
121 version 17.48 released on February 10, 1986.
122 version 17.49 released on February 12, 1986.
123 version 17.55 released on March 18, 1986.
124 version 17.57 released on March 27, 1986.
125 version 17.58 released on April 4, 1986.
126 version 17.61 released on April 12, 1986.
127 version 17.63 released on May 7, 1986.
128 version 17.64 released on May 12, 1986.
129 version 18.24 (a beta version) released on October 2, 1986.
130 version 18.30 (a beta version) released on November 15, 1986.
131 version 18.31 (a beta version) released on November 23, 1986.
132 version 18.32 (a beta version) released on December 7, 1986.
133 version 18.33 (a beta version) released on December 12, 1986.
134 version 18.35 (a beta version) released on January 5, 1987.
135 version 18.36 (a beta version) released on January 21, 1987.
136 January 27, 1987: The Great Usenet Renaming. net.emacs is now comp.emacs.
137 version 18.37 (a beta version) released on February 12, 1987.
138 version 18.38 (a beta version) released on March 3, 1987.
139 version 18.39 (a beta version) released on March 14, 1987.
140 version 18.40 (a beta version) released on March 18, 1987.
141 version 18.41 (the first ``official'' release) released on March 22, 1987.
142 version 18.45 released on June 2, 1987.
143 version 18.46 released on June 9, 1987.
144 version 18.47 released on June 18, 1987.
145 version 18.48 released on September 3, 1987.
146 version 18.49 released on September 18, 1987.
147 version 18.50 released on February 13, 1988.
148 version 18.51 released on May 7, 1988.
149 version 18.52 released on September 1, 1988.
150 version 18.53 released on February 24, 1989.
151 version 18.54 released on April 26, 1989.
152 version 18.55 released on August 23, 1989. This is the earliest version
153 that is still available by FTP.
154 version 18.56 released on January 17, 1991.
155 version 18.57 released late January, 1991.
156 version 18.58 released ?????.
157 version 18.59 released October 31, 1992.
161 /* Note: It is necessary to specify <config.h> and not "config.h" in
162 order for the --srcdir type of compilation to work properly.
163 Otherwise the config.h from the srcdir, rather than the one from
164 the build dir, will be used. */
169 #include "backtrace.h" /* run-emacs-from-temacs needs this */
171 #include "commands.h"
174 #include "redisplay.h"
178 #include "syssignal.h" /* Always include before systty.h */
192 #include <quantify.h>
199 #if defined (HAVE_LOCALE_H) && \
200 (defined (I18N2) || defined (I18N3) || defined (I18N4))
208 #if defined (WIN32_NATIVE)
215 #if defined (HEAP_IN_DATA) && !defined(PDUMP)
216 void report_sheap_usage (int die_if_pure_storage_exceeded);
219 #if !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
220 extern void *(*__malloc_hook)(size_t);
221 extern void *(*__realloc_hook)(void *, size_t);
222 extern void (*__free_hook)(void *);
223 #endif /* not SYSTEM_MALLOC && not DOUG_LEA_MALLOC */
225 /* Command line args from shell, as list of strings */
226 Lisp_Object Vcommand_line_args;
228 /* Set nonzero after XEmacs has started up the first time.
229 Prevents reinitialization of the Lisp world and keymaps
230 on subsequent starts. */
233 #ifdef DOUG_LEA_MALLOC
235 /* Preserves a pointer to the memory allocated that copies that
236 static data inside glibc's malloc. */
237 static void *malloc_state_ptr;
238 #endif /* DOUG_LEA_MALLOC */
241 void r_alloc_reinit (void);
245 void console_type_create_select_gtk(void);
248 /* Variable whose value is symbol giving operating system type. */
249 Lisp_Object Vsystem_type;
251 /* Variable whose value is string giving configuration built for. */
252 Lisp_Object Vsystem_configuration;
254 /* Variable whose value is string containing the configuration options
255 XEmacs was built with. */
256 Lisp_Object Vsystem_configuration_options;
258 /* Version numbers and strings */
259 Lisp_Object Vemacs_major_version;
260 Lisp_Object Vemacs_minor_version;
261 Lisp_Object Vemacs_patch_level;
262 Lisp_Object Vemacs_beta_version;
263 Lisp_Object Vxemacs_codename;
265 Lisp_Object Vinfodock_major_version;
266 Lisp_Object Vinfodock_minor_version;
267 Lisp_Object Vinfodock_build_version;
270 /* The path under which XEmacs was invoked. */
271 Lisp_Object Vinvocation_path;
273 /* The name under which XEmacs was invoked, with any leading directory
275 Lisp_Object Vinvocation_name;
277 /* The directory name from which XEmacs was invoked. */
278 Lisp_Object Vinvocation_directory;
281 /* The directory name in which to find subdirs such as lisp and etc.
282 nil means get them only from PATH_LOADSEARCH. */
283 Lisp_Object Vinstallation_directory;
286 Lisp_Object Vemacs_program_name, Vemacs_program_version;
287 Lisp_Object Vexec_path;
288 Lisp_Object Vexec_directory, Vconfigure_exec_directory;
289 Lisp_Object Vlisp_directory, Vconfigure_lisp_directory;
290 Lisp_Object Vmule_lisp_directory, Vconfigure_mule_lisp_directory;
291 Lisp_Object Vmodule_directory, Vconfigure_module_directory;
292 Lisp_Object Vsite_module_directory, Vconfigure_site_module_directory;
293 Lisp_Object Vconfigure_package_path;
294 Lisp_Object Vdata_directory, Vconfigure_data_directory;
295 Lisp_Object Vdoc_directory, Vconfigure_doc_directory;
296 Lisp_Object Vconfigure_lock_directory;
297 Lisp_Object Vdata_directory_list;
298 Lisp_Object Vconfigure_info_directory;
299 Lisp_Object Vsite_directory, Vconfigure_site_directory;
300 Lisp_Object Vconfigure_info_path;
301 Lisp_Object Vinternal_error_checking;
302 Lisp_Object Vmail_lock_methods, Vconfigure_mail_lock_method;
303 Lisp_Object Vpath_separator;
305 /* The default base directory XEmacs is installed under. */
306 Lisp_Object Vconfigure_exec_prefix_directory, Vconfigure_prefix_directory;
308 /* If nonzero, set XEmacs to run at this priority. This is also used
309 in child_setup and sys_suspend to make sure subshells run at normal
311 Fixnum emacs_priority;
313 /* Some FSF junk with running_asynch_code, to preserve the match
314 data. Not necessary because we don't call process filters
315 asynchronously (i.e. from within QUIT). */
316 /* #### Delete this when merging the rest of my code */
317 int running_asynch_code;
319 /* If non-zero, a window-system was specified on the command line. */
322 /* Type of display specified. We cannot use a Lisp symbol here because
323 Lisp symbols may not initialized at the time that we set this
325 const char *display_use;
327 /* If non-zero, then the early error handler will only print the error
329 int suppress_early_error_handler_backtrace;
331 /* An address near the bottom of the stack.
332 Tells GC how to save a copy of the stack. */
335 #ifdef USG_SHARED_LIBRARIES
336 /* If nonzero, this is the place to put the end of the writable segment
339 uintptr_t bss_end = 0;
342 /* Number of bytes of writable memory we can expect to be able to get */
343 unsigned int lim_data;
347 Some LISP-visible command-line options are set by XEmacs _before_ the
348 data is dumped in building a --pdump XEmacs, but used _after_ it is
349 restored in normal operation. Thus the dump-time values overwrite the
350 values XEmacs is getting at runtime. Such variables must be saved
351 before loading the dumpfile, and restored afterward.
353 Therefore these variables may not be initialized in vars_of_emacs().
355 The save/restore is done immediately before and after pdump_load() in
356 main_1(). See that function for the current list of protected variables.
358 Note that saving/restoring is only necessary for a few variables that are
359 o command line arguments effective at runtime (as opposed to dump-time),
360 o parsed before pdump_load, and
361 o exported to Lisp via a DEFVAR.
364 /* Nonzero means running XEmacs without interactive terminal. */
368 /* Value of Lisp variable `noninteractive'.
369 Normally same as C variable `noninteractive'
370 but nothing terrible happens if user sets this one.
372 Shadowed from the pdumper by `noninteractive'. */
376 /* Nonzero means don't perform site-lisp searches at startup */
377 int inhibit_site_lisp;
379 /* Nonzero means don't perform site-modules searches at startup */
380 int inhibit_site_modules;
382 /* Nonzero means don't respect early packages at startup */
383 int inhibit_early_packages;
385 /* Nonzero means don't load package autoloads at startup */
386 int inhibit_autoloads;
388 /* Nonzero means don't load the dump file (ignored if not PDUMP) */
392 /* Nonzero means print debug information about path searching */
395 /* Save argv and argc. */
396 static Extbyte **initial_argv; /* #### currently unused */
397 static int initial_argc; /* #### currently unused */
399 static void sort_args (int argc, char **argv);
401 Lisp_Object Qkill_emacs_hook;
402 Lisp_Object Qsave_buffers_kill_emacs;
404 extern Lisp_Object Vlisp_EXEC_SUFFIXES;
408 /* Ben's capsule summary about expected and unexpected exits from XEmacs.
410 Expected exits occur when the user directs XEmacs to exit, for example
411 by pressing the close button on the only frame in XEmacs, or by typing
412 C-x C-c. This runs `save-buffers-kill-emacs', which saves any necessary
413 buffers, and then exits using the primitive `kill-emacs'.
415 However, unexpected exits occur in a few different ways:
417 -- a memory access violation or other hardware-generated exception
418 occurs. This is the worst possible problem to deal with, because
419 the fault can occur while XEmacs is in any state whatsoever, even
420 quite unstable ones. As a result, we need to be *extremely* careful
422 -- we are using one X display (or if we've used more, we've closed the
423 others already), and some hardware or other problem happens and
424 suddenly we've lost our connection to the display. In this situation,
425 things are not so dire as in the last one; our code itself isn't
426 trashed, so we can continue execution as normal, after having set
427 things up so that we can exit at the appropriate time. Our exit
428 still needs to be of the emergency nature; we have no displays, so
429 any attempts to use them will fail. We simply want to auto-save
430 (the single most important thing to do during shut-down), do minimal
431 cleanup of stuff that has an independent existence outside of XEmacs,
434 Currently, both unexpected exit scenarios described above set
435 preparing_for_armageddon to indicate that nonessential and possibly
436 dangerous things should not be done, specifically:
438 -- no garbage collection.
440 -- no messages of any sort from autosaving.
441 -- autosaving tries harder, ignoring certain failures.
442 -- existing frames are not deleted.
444 (Also, all places that set preparing_for_armageddon also
445 set dont_check_for_quit. This happens separately because it's
446 also necessary to set other variables to make absolutely sure
447 no quitting happens.)
449 In the first scenario above (the access violation), we also set
450 fatal_error_in_progress. This causes more things to not happen:
452 -- assertion failures do not abort.
453 -- printing code does not do code conversion or gettext when
454 printing to stdout/stderr.
457 /* Nonzero if handling a fatal error already. */
458 int fatal_error_in_progress;
460 /* Non-nil means we're going down, so we better not run any hooks
461 or do other non-essential stuff. */
462 int preparing_for_armageddon;
464 /* Nonzero means we're in an unstable situation and need to skip
465 i18n conversions and such during printing. */
466 int inhibit_non_essential_printing_operations;
468 static JMP_BUF run_temacs_catch;
470 static int run_temacs_argc;
471 static char **run_temacs_argv;
472 static char *run_temacs_args;
473 static EMACS_INT run_temacs_argv_size;
474 static EMACS_INT run_temacs_args_size;
476 static void shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save);
478 /* ------------------------------- */
479 /* low-level debugging functions */
480 /* ------------------------------- */
482 #if defined (WIN32_NATIVE) && defined (DEBUG_XEMACS)
483 #define debugging_breakpoint() DebugBreak ()
485 #define debugging_breakpoint()
491 debugging_breakpoint ();
494 #if defined (WIN32_NATIVE) || defined (CYGWIN)
496 /* Return whether all bytes in the specified memory block can be read. */
498 debug_can_access_memory (void *ptr, Bytecount len)
500 return !IsBadReadPtr (ptr, len);
503 #else /* !(defined (WIN32_NATIVE) || defined (CYGWIN)) */
505 /* #### There must be a better way!!!! */
507 static JMP_BUF memory_error_jump;
510 debug_memory_error (int signum)
512 EMACS_REESTABLISH_SIGNAL (signum, debug_memory_error);
513 EMACS_UNBLOCK_SIGNAL (signum);
514 LONGJMP (memory_error_jump, 1);
517 /* Return whether all bytes in the specified memory block can be read. */
519 debug_can_access_memory (void *ptr, Bytecount len)
521 /* Use volatile to protect variables from being clobbered by longjmp. */
522 SIGTYPE (*volatile old_sigbus) (int);
523 SIGTYPE (*volatile old_sigsegv) (int);
524 volatile int old_errno = errno;
525 volatile int retval = 1;
527 if (!SETJMP (memory_error_jump))
530 (SIGTYPE (*) (int)) signal (SIGBUS, debug_memory_error);
532 (SIGTYPE (*) (int)) signal (SIGSEGV, debug_memory_error);
535 /* If we can, try to avoid problems with super-optimizing compilers
536 that might decide that memcmp (ptr, ptr, len) can be optimized
537 away since its result is always 1. */
538 memcmp (ptr, (char *) ptr + 1, len - 1);
540 memcmp (ptr, ptr, len);
544 signal (SIGBUS, old_sigbus);
545 signal (SIGSEGV, old_sigsegv);
551 #endif /* defined (WIN32_NATIVE) || defined (CYGWIN) */
555 DEFUN ("force-debugging-signal", Fforce_debugging_signal, 0, 1, 0, /*
556 Cause XEmacs to enter the debugger.
557 On some systems, there may be no way to do this gracefully; if so,
558 nothing happens unless ABORT is non-nil, in which case XEmacs will
559 abort() -- a sure-fire way to immediately get back to the debugger,
560 but also a sure-fire way to kill XEmacs (and dump core on Unix
565 debugging_breakpoint ();
571 #endif /* DEBUG_XEMACS */
574 ensure_no_quitting_from_now_on (void)
576 /* make sure no quitting from now on!! */
577 dont_check_for_quit = 1;
582 /* Handle bus errors, illegal instruction, etc. */
584 fatal_error_signal (int sig)
586 fatal_error_in_progress++;
587 inhibit_non_essential_printing_operations = 1;
588 preparing_for_armageddon = 1;
590 ensure_no_quitting_from_now_on ();
592 /* Unblock the signal so that if the same signal gets sent in the
593 code below, we avoid a deadlock. */
594 EMACS_UNBLOCK_SIGNAL (sig);
596 /* Only try auto-saving first time through. If we crash in auto-saving,
597 don't do it again. */
598 if (fatal_error_in_progress == 1)
600 Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
601 /* Do this so that the variable has the same value of 2 regardless of
602 whether we made it through auto-saving correctly. */
603 fatal_error_in_progress++;
605 else if (fatal_error_in_progress == 2)
606 stderr_out ("WARNING: Unable to auto-save your files properly.\n"
607 "Some or all may in fact have been auto-saved.\n"
610 /* Now, reset our signal handler, so the next time, we just die.
611 Don't do this before auto-saving. */
612 signal (sig, SIG_DFL);
614 /* Keep in mind that there's more than one signal that we can crash
616 /* If fatal error occurs in code below, avoid infinite recursion. */
617 if (fatal_error_in_progress <= 2)
619 shut_down_emacs (sig, Qnil, 1);
620 stderr_out ("\nLisp backtrace follows:\n\n");
621 Fbacktrace (Qexternal_debugging_output, Qt);
622 # if 0 /* This is evil, rarely useful, and causes grief in some cases. */
623 /* Check for Sun-style stack printing via /proc */
625 const char *pstack = "/usr/proc/bin/pstack";
626 if (access (pstack, X_OK) == 0)
629 stderr_out ("\nC backtrace follows:\n"
630 "(A real debugger may provide better information)\n\n");
631 sprintf (buf, "%s %d >&2", pstack, (int)getpid());
637 /* Signal the same code; this time it will really be fatal. */
638 kill (getpid (), sig);
645 mswindows_handle_hardware_exceptions (DWORD code)
647 if (code != STATUS_ACCESS_VIOLATION && code != STATUS_ILLEGAL_INSTRUCTION
648 && code != STATUS_PRIVILEGED_INSTRUCTION
649 && code != STATUS_DATATYPE_MISALIGNMENT)
650 return EXCEPTION_CONTINUE_SEARCH;
652 /* I don't know if this filter is still wrapped in the outer __try, but
653 it doesn't hurt to have another one. --ben
654 And it lets us control more exactly what we really want to do in such
658 fatal_error_in_progress++;
659 inhibit_non_essential_printing_operations = 1;
660 preparing_for_armageddon = 1;
662 ensure_no_quitting_from_now_on ();
664 /* Only try auto-saving first time through. If we crash in auto-saving,
665 don't do it again. */
666 if (fatal_error_in_progress == 1)
668 Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
669 /* Do this so that the variable has the same value of 2 regardless of
670 whether we made it through auto-saving correctly. */
671 fatal_error_in_progress++;
673 else if (fatal_error_in_progress == 2)
674 stderr_out ("WARNING: Unable to auto-save your files properly.\n"
675 "Some or all may in fact have been auto-saved.\n"
678 /* If fatal error occurs in code below, avoid infinite recursion. */
679 if (fatal_error_in_progress <= 2)
681 shut_down_emacs (-1, Qnil, 1);
682 stderr_out ("\nLisp backtrace follows:\n\n");
683 Fbacktrace (Qexternal_debugging_output, Qt);
686 /* VC++ documentation says that
687 GetExceptionCode() cannot be called inside the filter itself. */
689 /* __except (mswindows_handle_hardware_exceptions (GetExceptionCode ())) {}
691 The line above is original. Unfortunately, when an error is tripped
692 inside of the handler (e.g. during Fbacktrace()), and the handler for
693 the handler is invoked, it correctly notices that something is amiss
694 and it should just return -- but it returns EXCEPTION_CONTINUE_SEARCH,
695 which causes the debugger to be invoked debugging the handler code in
696 this function -- and WITH THE STACK UNWOUND so that you see main()
697 calling mswindows_handle_hardware_exceptions(), calling Fbacktrace(),
698 and a crash a couple of frames in -- AND NO SIGN OF THE ORIGINAL CRASH!
700 There's some real weirdness going on in the stack handling -- unlike
701 in Unix, where further crashes just keep adding to the stack, it seems
702 that under the structured-exception-handling, the stack can actually
703 bounce back and forth between the full stack at the location of the
704 exception and the unwound stack at the place where the __try clause was
705 established. I don't completely understand it. What I do know is that
706 returning EXCEPTION_EXECUTE_HANDLER on nested crash has the effect of
707 aborting execution of the handler and going back to the outer filter
708 function, which returns EXCEPTION_CONTINUE_SEARCH and everything is
709 hunky-dorey -- your debugger sees a crash at the right location with
712 I'm leaving in the trickier Unix-like code in the handler; someone who
713 understands better than me how the stack works in these handlers could
714 fix it up more. As it is, it works pretty well, so I'm not likely to
718 __except (EXCEPTION_EXECUTE_HANDLER) {}
721 /* pretend we didn't handle this, so that the debugger is invoked and/or
722 the normal GPF box appears. */
723 return EXCEPTION_CONTINUE_SEARCH;
726 #endif /* _MSC_VER */
732 /* Handler for SIGDANGER. */
734 memory_warning_signal (int sig)
736 /* #### bad bad bad; this function shouldn't do anything except
737 set a flag, or weird corruption could happen. */
738 signal (sig, memory_warning_signal);
741 (GETTEXT ("Operating system warns that virtual memory is running low.\n"));
743 /* It might be unsafe to call do_auto_save now. */
744 force_auto_save_soon ();
746 #endif /* SIGDANGER */
748 /* Code for dealing with Lisp access to the Unix command line */
751 make_arg_list_1 (int argc, Extbyte **argv, int skip_args)
753 Lisp_Object result = Qnil;
756 for (i = argc - 1; i >= 0; i--)
758 if (i == 0 || i > skip_args)
763 /* Do not trust to what crt0 has stuffed into argv[0] */
764 char full_exe_path[MAX_PATH];
765 Lisp_Object fullpath;
767 GetModuleFileName (NULL, full_exe_path, MAX_PATH);
768 fullpath = build_ext_string (full_exe_path, Qmswindows_tstr);
769 result = Fcons (fullpath, result);
770 #if defined(HAVE_SHLIB)
772 Extbyte *fullpathext;
774 LISP_STRING_TO_EXTERNAL (fullpath, fullpathext,
775 Qdll_filename_encoding);
776 (void) dll_init (fullpathext);
782 result = Fcons (build_ext_string (argv[i],
783 Qcommand_argument_encoding),
791 make_arg_list (int argc, Extbyte **argv)
793 return make_arg_list_1 (argc, argv, 0);
796 /* Calling functions are also responsible for calling free_argc_argv
797 when they are done with the generated list. */
799 make_argc_argv (Lisp_Object argv_list, int *argc, Extbyte ***argv)
802 int n = XINT (Flength (argv_list));
804 *argv = (Extbyte**) xmalloc ((n+1) * sizeof (Extbyte*));
806 for (i = 0, next = argv_list; i < n; i++, next = XCDR (next))
809 CHECK_STRING (XCAR (next));
811 LISP_STRING_TO_EXTERNAL (XCAR (next), temp, Qcommand_argument_encoding);
812 (*argv) [i] = xstrdup (temp);
819 free_argc_argv (Extbyte **argv)
832 init_cmdargs (int argc, Extbyte **argv, int skip_args)
837 Vcommand_line_args = make_arg_list_1 (argc, argv, skip_args);
840 DEFUN ("invocation-name", Finvocation_name, 0, 0, 0, /*
841 Return the program name that was used to run XEmacs.
842 Any directory names are omitted.
846 return Fcopy_sequence (Vinvocation_name);
849 DEFUN ("invocation-directory", Finvocation_directory, 0, 0, 0, /*
850 Return the directory name in which the Emacs executable was located.
854 return Fcopy_sequence (Vinvocation_directory);
859 /* #### - don't know why I18N4 on SunOS/JLE
860 can't deal with this. It's a potential
861 bug that needs to be looked at. */
862 # undef RUN_TIME_REMAP
865 /* Test whether the next argument in ARGV matches SSTR or a prefix of
866 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
867 (the argument is supposed to have a value) store in *VALPTR either
868 the next argument or the portion of this one after the equal sign.
869 ARGV is read starting at position *SKIPPTR; this index is advanced
870 by the number of arguments used.
872 Too bad we can't just use getopt for all of this, but we don't have
873 enough information to do it right. */
876 argmatch (char **argv, int argc, char *sstr, char *lstr,
877 int minlen, char **valptr, int *skipptr)
883 /* Don't access argv[argc]; give up in advance. */
884 if (argc <= *skipptr + 1)
887 arg = argv[*skipptr+1];
890 if (strcmp (arg, sstr) == 0)
894 *valptr = argv[*skipptr+2];
901 arglen = (valptr != NULL && (p = strchr (arg, '=')) != NULL
902 ? p - arg : (int) strlen (arg));
903 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
905 else if (valptr == NULL)
916 else if (argv[*skipptr+2] != NULL)
918 *valptr = argv[*skipptr+2];
928 /* Make stack traces always identify version + configuration */
929 #define main_1 STACK_TRACE_EYE_CATCHER
931 /* This function is not static, so that the compiler is less likely to
932 inline it, which would make it not show up in stack traces.
934 The restart argument is a flag that indicates that main_1 is now
935 being called for the second time in this invocation of xemacs; this can
936 only happen in an xemacs that is not loaded with dumped data (temacs
937 with the conventional dumper or xemacs -nd with the pdumper). See
938 Frun_emacs_from_temacs().
940 restart interacts with initialized as follows (per Olivier Galibert):
944 initialized==0 => temacs
945 initialized!=0 && restart!=0 => run-temacs
946 initialized!=0 && restart==0 => xemacs/post pdump_load()
948 DECLARE_DOESNT_RETURN (main_1 (int, char **, char **, int));
950 main_1 (int argc, char **argv, char **envp, int restart)
952 char stack_bottom_variable;
955 int inhibit_window_system;
957 extern int malloc_cookie;
960 #if (!defined (SYSTEM_MALLOC) && !defined (HAVE_LIBMCHECK) \
961 && !defined (DOUG_LEA_MALLOC))
962 /* Make sure that any libraries we link against haven't installed a
963 hook for a gmalloc of a potentially incompatible version. */
964 /* If we're using libmcheck, the hooks have already been initialized, */
965 /* don't touch them. -slb */
966 __malloc_hook = NULL;
967 __realloc_hook = NULL;
969 #endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */
972 inhibit_non_essential_printing_operations = 1;
976 * NeXT secret magic, ripped from Emacs-for-NS by Carl Edman
977 * <cedman@princeton.edu>. Note that even Carl doesn't know what this
978 * does; it was provided by NeXT, and it presumable makes NS's mallocator
979 * work with dumping. But malloc_jumpstart() and malloc_freezedry() in
980 * unexnext.c are both completely undocumented, even in NS header files!
981 * But hey, it solves all NS related memory problems, so who's
983 if (initialized && malloc_jumpstart (malloc_cookie) != 0)
984 stderr_out ("malloc jumpstart failed!\n");
988 #if defined (GNU_MALLOC) && \
989 defined (ERROR_CHECK_MALLOC) && \
990 !defined (HAVE_LIBMCHECK)
992 #if defined(LOSING_GCC_DESTRUCTOR_FREE_BUG)
993 /* Prior to XEmacs 21, this was `#if 0'ed out. */
994 /* I'm enabling this because it is the only reliable way I've found to */
995 /* prevent a very annoying problem where GCC will attempt to free(3) */
996 /* memory at exit() and cause a coredump. */
1000 sort_args (argc, argv);
1002 #if defined (WIN32_NATIVE) || defined (_SCO_DS)
1006 /* Record (approximately) where the stack begins. */
1007 stack_bottom = &stack_bottom_variable;
1009 #ifdef USG_SHARED_LIBRARIES
1011 brk ((void *) bss_end);
1016 #if defined (HAVE_MMAP) && defined (REL_ALLOC)
1017 /* ralloc can only be used if using the GNU memory allocator. */
1019 #elif defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1026 SOCKSinit (argv[0]);
1027 #endif /* HAVE_SOCKS */
1029 #ifndef SYSTEM_MALLOC
1031 /* Arrange to get warning messages as memory fills up. */
1032 memory_warnings (0, malloc_warning);
1033 #endif /* not SYSTEM_MALLOC */
1035 #ifdef SET_EMACS_PRIORITY
1036 if (emacs_priority != 0)
1037 nice (-emacs_priority);
1039 #endif /* SET_EMACS_PRIORITY */
1041 #ifdef EXTRA_INITIALIZE
1045 #ifdef HAVE_WINDOW_SYSTEM
1046 inhibit_window_system = 0;
1048 inhibit_window_system = 1;
1051 /* Handle the -sd/--show-dump-id switch, which means show the hex dump_id and quit */
1052 if (argmatch (argv, argc, "-sd", "--show-dump-id", 9, NULL, &skip_args))
1055 printf ("%08x\n", dump_id);
1057 printf ("Portable dumper not configured; -sd just forces exit.\n");
1062 /* Handle the -t switch, which specifies filename to use as terminal */
1065 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
1069 if (open (term, O_RDWR | OPEN_BINARY, 2) < 0)
1070 fatal ("%s: %s", term, strerror (errno));
1073 fatal ("%s: not a tty", term);
1076 stderr_out ("Using %s", ttyname (0));
1078 stderr_out ("Using %s", term);
1079 inhibit_window_system = 1; /* -t => -nw */
1083 /* Handle the --no-dump-file/-nd switch, which means don't load the dump file (ignored when not using pdump) */
1084 if (argmatch (argv, argc, "-nd", "--no-dump-file", 7, NULL, &skip_args))
1089 /* Handle -nw switch */
1090 if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
1091 inhibit_window_system = 1;
1093 /* Handle the -batch switch, which means don't do interactive display. */
1094 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
1096 #if 0 /* I don't think this is correct. */
1097 inhibit_autoloads = 1;
1102 if (argmatch (argv, argc, "-debug-paths", "--debug-paths",
1103 11, NULL, &skip_args))
1106 /* Partially handle -no-autoloads, -no-early-packages and -vanilla. Packages */
1107 /* are searched prior to the rest of the command line being parsed in */
1109 if (argmatch (argv, argc, "-no-early-packages", "--no-early-packages",
1110 6, NULL, &skip_args))
1112 inhibit_early_packages = 1;
1116 if (argmatch (argv, argc, "-no-site-modules", "--no-site-modules",
1117 9, NULL, &skip_args))
1119 inhibit_site_modules = 1;
1123 inhibit_site_modules = 1;
1125 if (argmatch (argv, argc, "-vanilla", "--vanilla",
1126 7, NULL, &skip_args))
1128 inhibit_early_packages = 1;
1132 if (argmatch (argv, argc, "-no-autoloads", "--no-autoloads",
1133 7, NULL, &skip_args))
1135 /* Inhibit everything */
1136 inhibit_autoloads = 1;
1140 if (argmatch (argv, argc, "-debug-paths", "--debug-paths",
1141 6, NULL, &skip_args))
1148 /* Partially handle the -version and -help switches: they imply -batch,
1149 but are not removed from the list. */
1150 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
1151 noninteractive = 1, skip_args--;
1153 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args) ||
1154 argmatch (argv, argc, "-V", 0, 2, NULL, &skip_args))
1155 noninteractive = 1, skip_args--;
1157 /* Now, figure out which type of console is our first console. */
1162 display_use = "stream";
1164 display_use = "tty";
1167 if (inhibit_window_system)
1168 fatal ("Sorry, this XEmacs was not compiled with TTY support");
1171 #ifdef HAVE_WINDOW_SYSTEM
1172 /* Stupid kludge to catch command-line display spec. We can't
1173 handle this argument entirely in window-system-dependent code
1174 because we don't even know which window-system-dependent code
1175 to run until we've recognized this argument. */
1176 if (!inhibit_window_system && !noninteractive)
1178 #ifdef HAVE_X_WINDOWS
1180 int count_before = skip_args;
1182 if (argmatch (argv, argc, "-d", "--display", 3, &dpy, &skip_args) ||
1183 argmatch (argv, argc, "-display", 0, 3, &dpy, &skip_args))
1188 /* If we have the form --display=NAME,
1189 convert it into -d name.
1190 This requires inserting a new element into argv. */
1191 if (dpy != 0 && skip_args - count_before == 1)
1193 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1196 for (j = 0; j < count_before + 1; j++)
1198 new[count_before + 1] = "-d";
1199 new[count_before + 2] = dpy;
1200 for (j = count_before + 2; j <argc; j++)
1201 new[j + 1] = argv[j];
1205 /* Change --display to -d, when its arg is separate. */
1206 else if (dpy != 0 && skip_args > count_before
1207 && argv[count_before + 1][1] == '-')
1208 argv[count_before + 1] = "-d";
1210 /* Don't actually discard this arg. */
1211 skip_args = count_before;
1213 /* If there is a non-empty environment var DISPLAY, set
1214 `display_use', but not `display_arg', which is only to be set
1215 if the display was specified on the command line. */
1216 if ((dpy = getenv ("DISPLAY")) && dpy[0])
1219 #endif /* HAVE_X_WINDOWS */
1222 char *dpy = getenv ("DISPLAY");
1224 display_use = "gtk";
1227 #ifdef HAVE_MS_WINDOWS
1228 if (strcmp(display_use, "x") != 0)
1229 display_use = "mswindows";
1230 #endif /* HAVE_MS_WINDOWS */
1232 #endif /* HAVE_WINDOW_SYSTEM */
1234 noninteractive1 = noninteractive;
1236 /****** Now initialize everything *******/
1238 /* First, do really basic environment initialization -- catching signals
1239 and the like. These functions have no dependence on any part of
1240 the Lisp engine and need to be done both at dump time and at run time. */
1242 init_signals_very_early ();
1243 init_data_very_early (); /* Catch math errors. */
1244 #ifdef LISP_FLOAT_TYPE
1245 init_floatfns_very_early (); /* Catch floating-point math errors. */
1247 init_process_times_very_early (); /* Initialize our process timers.
1248 As early as possible, of course,
1249 so we can be fairly accurate. */
1250 init_intl_very_early (); /* set up the locale and domain for gettext and
1252 #ifdef HAVE_MS_WINDOWS
1253 init_mswindows_very_early (); /* Some things - like dde need to be
1254 initialized early so that the
1255 client doesn't give up waiting. */
1258 /* Now initialize the Lisp engine and the like. Done only during
1259 dumping. No dependence on anything that may be in the user's
1260 environment when the dumped XEmacs is run.
1262 We try to do things in an order that minimizes the non-obvious
1263 dependencies between functions. */
1265 /* purify_flag 1 is correct even if CANNOT_DUMP.
1266 * loadup.el will set to nil at end. */
1272 else if (nodumpfile) {
1277 /* Keep command options from getting stomped.
1279 Some LISP-visible options are changed by XEmacs _after_ the data is
1280 dumped in building a --pdump XEmacs, but _before_ it is restored in
1281 normal operation. Thus the restored values overwrite the values
1282 XEmacs is getting at run-time. Such variables must be saved here,
1283 and restored after loading the dumped data.
1285 Boy, this is ugly, but how else to do it?
1288 /* noninteractive1 is saved in noninteractive, which isn't LISP-visible */
1289 int inhibit_early_packages_save = inhibit_early_packages;
1290 int inhibit_autoloads_save = inhibit_autoloads;
1291 int debug_paths_save = debug_paths;
1292 /* #### Give inhibit-site-lisp a command switch? If so, uncomment: */
1293 /* int inhibit_site_lisp_save = inhibit_site_lisp; */
1294 int inhibit_site_modules_save = inhibit_site_modules;
1296 initialized = pdump_load (argv[0]);
1298 /* Now unstomp everything */
1299 noninteractive1 = noninteractive;
1300 inhibit_early_packages = inhibit_early_packages_save;
1301 inhibit_autoloads = inhibit_autoloads_save;
1302 debug_paths = debug_paths_save;
1303 /* #### Give inhibit-site-lisp a command switch? If so, uncomment: */
1304 /* inhibit_site_lisp = inhibit_site_lisp_save; */
1305 inhibit_site_modules = inhibit_site_modules_save;
1308 run_temacs_argc = -1;
1319 /* Initialize things so that new Lisp objects
1320 can be created and objects can be staticpro'd.
1321 Must be basically the very first thing done
1322 because pretty much all of the initialization
1323 routines below create new objects. */
1324 init_alloc_once_early ();
1326 /* Initialize Qnil, Qt, Qunbound, and the
1327 obarray. After this, symbols can be
1328 interned. This depends on init_alloc_once_early(). */
1329 init_symbols_once_early ();
1331 /* Declare the basic symbols pertaining to errors,
1332 So that DEFERROR*() can be called. */
1333 init_errors_once_early ();
1335 /* Make sure that opaque pointers can be created. */
1336 init_opaque_once_early ();
1338 /* Now declare all the symbols and define all the Lisp primitives.
1340 The *only* thing that the syms_of_*() functions are allowed to do
1341 is call one of the following:
1343 INIT_LRECORD_IMPLEMENTATION()
1344 defsymbol(), DEFSYMBOL(), or DEFSYMBOL_MULTIWORD_PREDICATE()
1345 defsubr() (i.e. DEFSUBR)
1346 deferror(), DEFERROR(), or DEFERROR_STANDARD()
1347 defkeyword() or DEFKEYWORD()
1349 Order does not matter in these functions.
1355 syms_of_bytecode ();
1357 syms_of_callproc ();
1358 syms_of_casefiddle ();
1368 #endif /* DEBUG_XEMACS */
1379 #ifdef HAVE_X_WINDOWS
1380 syms_of_event_Xt ();
1383 syms_of_event_gtk ();
1385 #ifdef HAVE_DRAGNDROP
1386 syms_of_dragdrop ();
1388 syms_of_event_stream ();
1393 #ifdef CLASH_DETECTION
1394 syms_of_filelock ();
1395 #endif /* CLASH_DETECTION */
1396 syms_of_floatfns ();
1398 syms_of_font_lock ();
1402 syms_of_glyphs_eimage ();
1403 syms_of_glyphs_widget ();
1413 #ifdef HAVE_DATABASE
1414 syms_of_database ();
1416 #ifdef HAVE_MENUBARS
1425 #if !defined (NO_SUBPROCESSES)
1427 #ifdef HAVE_WIN32_PROCESSES
1428 syms_of_process_nt ();
1432 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1434 #endif /* HAVE_MMAP && REL_ALLOC */
1435 syms_of_rangetab ();
1436 syms_of_redisplay ();
1441 syms_of_specifier ();
1444 #ifdef HAVE_SCROLLBARS
1445 syms_of_scrollbar ();
1447 #ifdef HAVE_TOOLBARS
1455 syms_of_console_tty ();
1456 syms_of_device_tty ();
1457 syms_of_objects_tty ();
1461 syms_of_device_gtk ();
1462 syms_of_frame_gtk ();
1463 syms_of_glyphs_gtk ();
1464 syms_of_objects_gtk ();
1466 syms_of_select_gtk ();
1468 syms_of_dialog_gtk ();
1470 #ifdef HAVE_MENUBARS
1471 syms_of_menubar_gtk ();
1473 syms_of_select_gtk ();
1475 #if defined (HAVE_MENUBARS) || defined(HAVE_SCROLLBARS) || defined(HAVE_DIALOGS) || defined(HAVE_TOOLBARS)
1478 #endif /* HAVE_GTK */
1480 #ifdef HAVE_X_WINDOWS
1481 #ifdef HAVE_BALLOON_HELP
1482 syms_of_balloon_x ();
1484 syms_of_device_x ();
1486 syms_of_dialog_x ();
1489 syms_of_glyphs_x ();
1490 syms_of_objects_x ();
1491 #ifdef HAVE_MENUBARS
1492 syms_of_menubar_x ();
1494 syms_of_select_x ();
1495 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1500 syms_of_input_method_xlib ();
1502 #endif /* HAVE_XIM */
1503 #endif /* HAVE_X_WINDOWS */
1505 #ifdef HAVE_MS_WINDOWS
1506 syms_of_console_mswindows ();
1507 syms_of_device_mswindows ();
1508 syms_of_dialog_mswindows ();
1509 syms_of_frame_mswindows ();
1510 syms_of_objects_mswindows ();
1511 syms_of_select_mswindows ();
1512 syms_of_glyphs_mswindows ();
1513 syms_of_gui_mswindows ();
1514 #ifdef HAVE_MENUBARS
1515 syms_of_menubar_mswindows ();
1517 #ifdef HAVE_SCROLLBARS
1518 syms_of_scrollbar_mswindows ();
1520 #endif /* HAVE_MS_WINDOWS */
1521 #ifdef HAVE_MSW_C_DIRED
1522 syms_of_dired_mswindows ();
1527 #if defined (WIN32_NATIVE) || defined (CYGWIN)
1533 syms_of_mule_ccl ();
1534 syms_of_mule_charset ();
1537 syms_of_file_coding ();
1541 syms_of_mule_wnn ();
1544 syms_of_mule_canna ();
1545 #endif /* HAVE_CANNA */
1557 #if defined (GNU_MALLOC) && \
1558 defined (ERROR_CHECK_MALLOC) && \
1559 !defined (HAVE_LIBMCHECK)
1561 /* Prior to XEmacs 21, this was `#if 0'ed out. -slb */
1562 #if defined (LOSING_GCC_DESTRUCTOR_FREE_BUG)
1563 syms_of_free_hook ();
1567 syms_of_tooltalk ();
1579 syms_of_gpmevent ();
1582 #ifdef HAVE_POSTGRESQL
1583 syms_of_postgresql ();
1586 /* Now create the subtypes for the types that have them.
1587 We do this before the vars_*() because more symbols
1588 may get initialized here. */
1590 /* Now initialize the console types and associated symbols.
1591 Other than the first function below, the functions may
1592 make exactly the following function/macro calls:
1594 INITIALIZE_CONSOLE_TYPE()
1595 CONSOLE_HAS_METHOD()
1597 For any given console type, the former macro must be called
1598 before the any calls to the latter macro. */
1600 console_type_create ();
1602 console_type_create_stream ();
1605 console_type_create_tty ();
1606 console_type_create_device_tty ();
1607 console_type_create_frame_tty ();
1608 console_type_create_objects_tty ();
1609 console_type_create_redisplay_tty ();
1613 console_type_create_gtk ();
1614 console_type_create_select_gtk ();
1615 console_type_create_device_gtk ();
1616 console_type_create_frame_gtk ();
1617 console_type_create_objects_gtk ();
1618 console_type_create_glyphs_gtk ();
1619 console_type_create_redisplay_gtk ();
1620 #ifdef HAVE_MENUBARS
1621 console_type_create_menubar_gtk ();
1623 #ifdef HAVE_SCROLLBARS
1624 console_type_create_scrollbar_gtk ();
1626 #ifdef HAVE_TOOLBARS
1627 console_type_create_toolbar_gtk ();
1630 console_type_create_dialog_gtk ();
1632 #endif /* HAVE_GTK */
1634 #ifdef HAVE_X_WINDOWS
1635 console_type_create_x ();
1636 console_type_create_device_x ();
1637 console_type_create_frame_x ();
1638 console_type_create_glyphs_x ();
1639 console_type_create_select_x ();
1640 #ifdef HAVE_MENUBARS
1641 console_type_create_menubar_x ();
1643 console_type_create_objects_x ();
1644 console_type_create_redisplay_x ();
1645 #ifdef HAVE_SCROLLBARS
1646 console_type_create_scrollbar_x ();
1648 #ifdef HAVE_TOOLBARS
1649 console_type_create_toolbar_x ();
1652 console_type_create_dialog_x ();
1654 #endif /* HAVE_X_WINDOWS */
1656 #ifdef HAVE_MS_WINDOWS
1657 console_type_create_mswindows ();
1658 console_type_create_device_mswindows ();
1659 console_type_create_frame_mswindows ();
1660 console_type_create_objects_mswindows ();
1661 console_type_create_redisplay_mswindows ();
1662 console_type_create_glyphs_mswindows ();
1663 console_type_create_select_mswindows ();
1664 # ifdef HAVE_SCROLLBARS
1665 console_type_create_scrollbar_mswindows ();
1667 #ifdef HAVE_MENUBARS
1668 console_type_create_menubar_mswindows ();
1670 #ifdef HAVE_TOOLBARS
1671 console_type_create_toolbar_mswindows ();
1674 console_type_create_dialog_mswindows ();
1678 /* Now initialize the specifier types and associated symbols.
1679 Other than the first function below, the functions may
1680 make exactly the following function/macro calls:
1682 INITIALIZE_SPECIFIER_TYPE()
1683 SPECIFIER_HAS_METHOD()
1685 For any given specifier type, the former macro must be called
1686 before the any calls to the latter macro. */
1688 specifier_type_create ();
1690 specifier_type_create_image ();
1691 specifier_type_create_gutter ();
1692 specifier_type_create_objects ();
1693 #ifdef HAVE_TOOLBARS
1694 specifier_type_create_toolbar ();
1697 /* Now initialize the structure types and associated symbols.
1698 Other than the first function below, the functions may
1699 make exactly the following function/macro calls:
1701 define_structure_type()
1702 define_structure_type_keyword()
1706 structure_type_create ();
1708 structure_type_create_chartab ();
1709 structure_type_create_faces ();
1710 structure_type_create_rangetab ();
1711 structure_type_create_hash_table ();
1713 /* Now initialize the image instantiator formats and associated symbols.
1714 Other than the first function below, the functions may
1715 make exactly the following function/macro calls:
1717 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT()
1718 IIFORMAT_HAS_METHOD()
1719 IIFORMAT_VALID_KEYWORD()
1721 For any given image instantiator format, the first macro must be
1722 called before the any calls to the other macros. */
1724 image_instantiator_format_create ();
1725 image_instantiator_format_create_glyphs_eimage ();
1726 image_instantiator_format_create_glyphs_widget ();
1728 image_instantiator_format_create_glyphs_tty ();
1730 #ifdef HAVE_X_WINDOWS
1731 image_instantiator_format_create_glyphs_x ();
1732 #endif /* HAVE_X_WINDOWS */
1733 #ifdef HAVE_MS_WINDOWS
1734 image_instantiator_format_create_glyphs_mswindows ();
1735 #endif /* HAVE_MSWINDOWS_WINDOWS */
1737 image_instantiator_format_create_glyphs_gtk ();
1740 /* Now initialize the lstream types and associated symbols.
1741 Other than the first function below, the functions may
1742 make exactly the following function/macro calls:
1744 LSTREAM_HAS_METHOD()
1748 lstream_type_create ();
1750 lstream_type_create_file_coding ();
1752 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
1753 lstream_type_create_mswindows_selectable ();
1756 /* Initialize processes implementation.
1757 The functions may make exactly the following function/macro calls:
1759 PROCESS_HAS_METHOD()
1761 #ifdef HAVE_UNIX_PROCESSES
1762 process_type_create_unix ();
1764 #ifdef HAVE_WIN32_PROCESSES
1765 process_type_create_nt ();
1768 /* Now initialize most variables.
1770 These functions may do exactly the following:
1783 defsymbol(), if it's absolutely necessary and you're sure that
1784 the symbol isn't referenced anywhere else in the initialization
1786 Fset() on a symbol that is unbound
1787 assigning a symbol or constant value to a variable
1788 using a global variable that has been initialized
1789 earlier on in the same function
1791 Any of the object-creating functions in alloc.c: e.g.
1804 perhaps a few others.
1806 NB: Initialization or assignment should not be done here to certain
1807 variables settable from the command line. See the comment above
1808 the call to pdump_load() in main_1(). This caveat should only
1809 apply to vars_of_emacs().
1812 /* Now allow Fprovide() statements to be made. */
1813 init_provide_once ();
1815 /* Do that before any specifier creation (esp. vars_of_glyphs()) */
1816 vars_of_specifier ();
1821 vars_of_bytecode ();
1823 vars_of_callproc ();
1833 vars_of_console_stream ();
1840 #ifdef HAVE_DRAGNDROP
1841 vars_of_dragdrop ();
1848 #ifdef HAVE_X_WINDOWS
1849 vars_of_event_Xt ();
1851 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
1852 vars_of_event_tty ();
1854 #ifdef HAVE_MS_WINDOWS
1855 vars_of_event_mswindows ();
1857 vars_of_event_stream ();
1863 #ifdef CLASH_DETECTION
1864 vars_of_filelock ();
1866 vars_of_floatfns ();
1867 vars_of_font_lock ();
1870 vars_of_glyphs_eimage ();
1871 vars_of_glyphs_widget ();
1879 vars_of_input_method_motif ();
1880 #else /* XIM_XLIB */
1881 vars_of_input_method_xlib ();
1883 #endif /* HAVE_XIM */
1889 #ifdef HAVE_DATABASE
1890 vars_of_database ();
1892 #ifdef HAVE_MENUBARS
1906 #ifndef NO_SUBPROCESSES
1908 #ifdef HAVE_UNIX_PROCESSES
1909 vars_of_process_unix ();
1911 #ifdef HAVE_WIN32_PROCESSES
1912 vars_of_process_nt ();
1917 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1919 #endif /* HAVE_MMAP && REL_ALLOC */
1920 vars_of_redisplay ();
1921 #ifdef HAVE_SCROLLBARS
1922 vars_of_scrollbar ();
1929 #ifdef HAVE_TOOLBARS
1936 vars_of_console_tty ();
1937 vars_of_frame_tty ();
1938 vars_of_objects_tty ();
1942 vars_of_device_gtk ();
1944 vars_of_dialog_gtk ();
1946 vars_of_event_gtk ();
1947 vars_of_frame_gtk ();
1948 vars_of_glyphs_gtk ();
1950 #ifdef HAVE_MENUBARS
1951 vars_of_menubar_gtk ();
1953 vars_of_objects_gtk ();
1954 vars_of_select_gtk ();
1955 #ifdef HAVE_SCROLLBARS
1956 vars_of_scrollbar_gtk ();
1958 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1961 #endif /* HAVE_GTK */
1963 #ifdef HAVE_X_WINDOWS
1964 #ifdef HAVE_BALLOON_HELP
1965 vars_of_balloon_x ();
1967 vars_of_device_x ();
1969 vars_of_dialog_x ();
1972 vars_of_glyphs_x ();
1973 #ifdef HAVE_MENUBARS
1974 vars_of_menubar_x ();
1976 vars_of_objects_x ();
1977 vars_of_select_x ();
1978 #ifdef HAVE_SCROLLBARS
1979 vars_of_scrollbar_x ();
1981 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1984 #endif /* HAVE_X_WINDOWS */
1987 #ifdef HAVE_MS_WINDOWS
1988 vars_of_device_mswindows ();
1989 vars_of_console_mswindows ();
1990 vars_of_frame_mswindows ();
1991 vars_of_objects_mswindows ();
1992 vars_of_select_mswindows ();
1993 vars_of_glyphs_mswindows ();
1994 #ifdef HAVE_SCROLLBARS
1995 vars_of_scrollbar_mswindows ();
1997 #ifdef HAVE_MENUBARS
1998 vars_of_menubar_mswindows ();
2000 #ifdef HAVE_MSW_C_DIRED
2001 vars_of_dired_mswindows ();
2004 vars_of_dialog_mswindows ();
2006 #endif /* HAVE_MS_WINDOWS */
2010 vars_of_mule_ccl ();
2011 vars_of_mule_charset ();
2014 vars_of_file_coding ();
2018 vars_of_mule_wnn ();
2021 vars_of_mule_canna ();
2022 #endif /* HAVE_CANNA */
2026 vars_of_tooltalk ();
2037 #ifdef HAVE_POSTGRESQL
2038 vars_of_postgresql();
2042 vars_of_gpmevent ();
2045 /* Now initialize any specifier variables. We do this later
2046 because it has some dependence on the vars initialized
2049 These functions should *only* initialize specifier variables,
2050 and may make use of the following functions/macros in addition
2051 to the ones listed above:
2055 set_specifier_fallback()
2056 set_specifier_caching()
2059 specifier_vars_of_glyphs ();
2060 specifier_vars_of_glyphs_widget ();
2061 specifier_vars_of_gutter ();
2062 #ifdef HAVE_MENUBARS
2063 specifier_vars_of_menubar ();
2065 specifier_vars_of_redisplay ();
2066 #ifdef HAVE_SCROLLBARS
2067 specifier_vars_of_scrollbar ();
2069 #ifdef HAVE_TOOLBARS
2070 specifier_vars_of_toolbar ();
2072 specifier_vars_of_window ();
2074 /* Now comes all the rest of the variables that couldn't
2075 be handled above. There may be dependencies on variables
2076 initialized above, and dependencies between one complex_vars_()
2077 function and another. */
2079 /* Calls Fmake_range_table(). */
2080 complex_vars_of_regex ();
2081 /* Calls Fmake_range_table(). */
2082 complex_vars_of_search ();
2084 /* Calls make_lisp_hash_table(). */
2085 complex_vars_of_extents ();
2087 /* Depends on hash tables and specifiers. */
2088 complex_vars_of_faces ();
2091 /* These two depend on hash tables and various variables declared
2092 earlier. The second may also depend on the first. */
2093 complex_vars_of_mule_charset ();
2096 complex_vars_of_file_coding ();
2099 /* This calls allocate_glyph(), which creates specifiers
2100 and also relies on a variable (Vthe_nothing_vector) initialized
2101 above. It also calls make_ext_string(), which under Mule
2102 could require that the charsets be initialized. */
2103 complex_vars_of_glyphs ();
2105 /* These rely on the glyphs just created in the previous function,
2106 and call Fadd_spec_to_specifier(), which relies on various
2107 variables initialized above. */
2109 complex_vars_of_glyphs_gtk ();
2111 #ifdef HAVE_X_WINDOWS
2112 complex_vars_of_glyphs_x ();
2114 #ifdef HAVE_MS_WINDOWS
2115 complex_vars_of_glyphs_mswindows ();
2118 /* This calls Fmake_glyph_internal(). */
2119 complex_vars_of_alloc ();
2121 /* This calls Fmake_glyph_internal(). */
2122 #ifdef HAVE_MENUBARS
2123 complex_vars_of_menubar ();
2126 /* This calls Fmake_glyph_internal(). */
2127 #ifdef HAVE_SCROLLBARS
2128 complex_vars_of_scrollbar ();
2131 /* This calls allocate_glyph(). */
2132 complex_vars_of_frame ();
2134 /* This calls Fcopy_category_table() under Mule, which calls who
2136 complex_vars_of_chartab ();
2138 /* This calls set_string_char(), which (under Mule) depends on the
2139 charsets being initialized. */
2140 complex_vars_of_casetab ();
2142 /* This calls Fcopy_syntax_table(), which relies on char tables. */
2143 complex_vars_of_syntax ();
2145 /* This initializes buffer-local variables, sets things up so
2146 that buffers can be created, and creates a couple of basic
2147 buffers. This depends on Vstandard_syntax_table and
2148 Vstandard_category_table (initialized in the previous
2149 functions), as well as a whole horde of variables that may
2150 have been initialized above. */
2151 complex_vars_of_buffer ();
2153 /* This initializes console-local variables. */
2154 complex_vars_of_console ();
2156 /* This creates a couple more buffers, and depends on the
2157 previous function. */
2158 complex_vars_of_minibuf ();
2160 /* These two might call Ffile_name_as_directory(), which
2161 might depend on all sorts of things; I'm not sure. */
2162 complex_vars_of_emacs ();
2164 /* This creates a couple of basic keymaps and depends on Lisp
2165 hash tables and Ffset() (both of which depend on some variables
2166 initialized in the vars_of_*() section) and possibly other
2168 complex_vars_of_keymap ();
2170 /* Calls make_lisp_hash_table() and creates a keymap */
2171 complex_vars_of_event_stream ();
2173 #ifdef ERROR_CHECK_GC
2175 extern int always_gc;
2176 if (always_gc) /* purification debugging hack */
2177 garbage_collect_1 ();
2181 } else if (!restart) { /* after successful pdump_load() */
2182 reinit_alloc_once_early ();
2183 reinit_symbols_once_early ();
2184 reinit_opaque_once_early ();
2186 reinit_console_type_create_stream ();
2188 reinit_console_type_create_tty ();
2190 #ifdef HAVE_X_WINDOWS
2191 reinit_console_type_create_x ();
2192 reinit_console_type_create_device_x ();
2194 #ifdef HAVE_MS_WINDOWS
2195 reinit_console_type_create_mswindows ();
2198 reinit_console_type_create_gtk ();
2201 reinit_specifier_type_create ();
2202 reinit_specifier_type_create_image ();
2203 reinit_specifier_type_create_gutter ();
2204 reinit_specifier_type_create_objects ();
2205 #ifdef HAVE_TOOLBARS
2206 reinit_specifier_type_create_toolbar ();
2209 structure_type_create ();
2211 structure_type_create_chartab ();
2212 structure_type_create_faces ();
2213 structure_type_create_rangetab ();
2214 structure_type_create_hash_table ();
2216 lstream_type_create ();
2218 lstream_type_create_file_coding ();
2220 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
2221 lstream_type_create_mswindows_selectable ();
2223 #ifdef HAVE_UNIX_PROCESSES
2224 process_type_create_unix ();
2226 #ifdef HAVE_WIN32_PROCESSES
2227 process_type_create_nt ();
2230 reinit_vars_of_buffer ();
2231 reinit_vars_of_console ();
2233 reinit_vars_of_debug ();
2235 reinit_vars_of_device ();
2236 reinit_vars_of_eval ();
2237 #ifdef HAVE_X_WINDOWS
2238 reinit_vars_of_event_Xt ();
2241 reinit_vars_of_event_gtk ();
2243 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
2244 reinit_vars_of_event_tty ();
2246 #ifdef HAVE_MS_WINDOWS
2247 reinit_vars_of_event_mswindows ();
2249 reinit_vars_of_event_stream ();
2250 reinit_vars_of_events ();
2251 reinit_vars_of_extents ();
2252 reinit_vars_of_fileio ();
2253 reinit_vars_of_font_lock ();
2254 reinit_vars_of_glyphs ();
2255 reinit_vars_of_glyphs_widget ();
2256 reinit_vars_of_insdel ();
2257 reinit_vars_of_lread ();
2258 reinit_vars_of_lstream ();
2259 reinit_vars_of_minibuf ();
2261 reinit_vars_of_module ();
2263 reinit_vars_of_objects ();
2264 reinit_vars_of_print ();
2265 reinit_vars_of_search ();
2266 reinit_vars_of_undo ();
2267 reinit_vars_of_window ();
2269 #ifdef HAVE_MS_WINDOWS
2270 reinit_vars_of_frame_mswindows ();
2274 reinit_vars_of_menubar_gtk ();
2277 #ifdef HAVE_X_WINDOWS
2278 reinit_vars_of_device_x ();
2279 #ifdef HAVE_SCROLLBARS
2280 reinit_vars_of_scrollbar_x ();
2282 #ifdef HAVE_MENUBARS
2283 reinit_vars_of_menubar_x ();
2285 reinit_vars_of_select_x ();
2286 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
2287 reinit_vars_of_gui_x ();
2289 #endif /* HAVE_X_WINDOWS */
2291 #if defined(MULE) && defined(HAVE_WNN)
2292 reinit_vars_of_mule_wnn ();
2295 reinit_complex_vars_of_buffer ();
2296 reinit_complex_vars_of_console ();
2297 reinit_complex_vars_of_minibuf ();
2302 /* CONGRATULATIONS!!! We have successfully initialized the Lisp
2307 /* Stuff that should not be done at dump time, including stuff that
2308 needs to be reset at run time. Order below should not matter.
2310 Many initializations taken from the environment should go here. */
2314 reinit_mule_category ();
2316 #ifdef HAVE_POSTGRESQL
2317 init_postgresql_from_environment();
2321 /* Now do further initialization/setup of stuff that is not needed by the
2322 syms_of_() routines. This involves stuff that only is enabled in
2323 an interactive run (redisplay, user input, etc.) and stuff that is
2324 not needed until we start loading Lisp code (the reader). A lot
2325 of this stuff involves querying the current environment and needs
2326 to be done both at dump time and at run time. */
2328 init_initial_directory(); /* get the directory to use for the
2329 "*scratch*" buffer, etc. */
2333 * For Win32, call init_environment() now, so that environment/registry
2334 * variables will be properly entered into Vprocess_environment.
2339 init_callproc (); /* Set up the process environment (so that egetenv
2340 works), the basic directory variables
2341 (exec-directory and so on), and stuff
2342 related to subprocesses. This should be
2343 first because many of the functions below
2344 call egetenv() to get environment variables. */
2345 init_lread (); /* Set up the Lisp reader. */
2346 init_cmdargs (argc, (Extbyte **) argv,
2347 skip_args); /* Create list Vcommand_line_args */
2348 init_buffer (); /* Set default directory of *scratch* buffer */
2354 init_redisplay (); /* Determine terminal type.
2355 init_sys_modes uses results */
2357 init_event_stream (); /* Set up so we can get user input. */
2358 init_macros (); /* set up so we can run macros. */
2359 init_editfns (); /* Determine the name of the user we're running as */
2360 init_xemacs_process (); /* set up for calling subprocesses */
2362 init_sunpro (); /* Set up Sunpro usage tracking */
2364 #if defined (WIN32_NATIVE) || defined (CYGWIN)
2367 #if defined (HAVE_NATIVE_SOUND) && defined (hp9000s800)
2373 init_console_stream (restart); /* Create the first console */
2375 /* try to get the actual pathname of the exec file we are running */
2378 Vinvocation_name = Fcar (Vcommand_line_args);
2379 if (XSTRING_DATA(Vinvocation_name)[0] == '-')
2381 /* XEmacs as a login shell, oh goody! */
2382 Vinvocation_name = build_string(getenv("SHELL"));
2384 Vinvocation_directory = Vinvocation_name;
2386 if (!NILP (Ffile_name_directory (Vinvocation_name)))
2388 /* invocation-name includes a directory component -- presumably it
2389 is relative to cwd, not $PATH */
2390 Vinvocation_directory = Fexpand_file_name (Vinvocation_name,
2392 Vinvocation_path = Qnil;
2396 Vinvocation_path = decode_env_path ("PATH", NULL);
2397 locate_file (Vinvocation_path, Vinvocation_name,
2398 Vlisp_EXEC_SUFFIXES,
2399 &Vinvocation_directory, X_OK);
2402 if (NILP (Vinvocation_directory))
2403 Vinvocation_directory = Vinvocation_name;
2405 Vinvocation_name = Ffile_name_nondirectory (Vinvocation_directory);
2406 Vinvocation_directory = Ffile_name_directory (Vinvocation_directory);
2409 #if defined(HAVE_SHLIB) && !defined(WIN32_NATIVE)
2410 /* This is Unix only. MS Windows NT has a library call that does
2411 The Right Thing on that system. Rumor has it, this must be
2412 called for GNU dld in temacs and xemacs. */
2414 char *buf = (char *)alloca (XSTRING_LENGTH (Vinvocation_directory)
2415 + XSTRING_LENGTH (Vinvocation_name)
2417 sprintf (buf, "%s/%s", XSTRING_DATA (Vinvocation_directory),
2418 XSTRING_DATA (Vinvocation_name));
2420 /* All we can do is cry if an error happens, so ignore it. */
2421 (void) dll_init (buf);
2425 #if defined (LOCALTIME_CACHE) && defined (HAVE_TZSET)
2426 /* sun's localtime() has a bug. it caches the value of the time
2427 zone rather than looking it up every time. Since localtime() is
2428 called to bolt the undumping time into the undumped emacs, this
2429 results in localtime() ignoring the TZ environment variable.
2430 This flushes the new TZ value into localtime(). */
2432 #endif /* LOCALTIME_CACHE and TZSET */
2437 /* Handle -l loadup-and-dump, args passed by Makefile. */
2438 if (argc > 2 + skip_args && !strcmp (argv[1 + skip_args], "-l"))
2439 load_me = build_string (argv[2 + skip_args]);
2440 #if 0 /* CANNOT_DUMP - this can never be right in XEmacs --andyp */
2441 /* Unless next switch is -nl, load "loadup.el" first thing. */
2442 if (!(argc > 1 + skip_args && !strcmp (argv[1 + skip_args], "-nl")))
2443 load_me = build_string ("loadup.el");
2444 #endif /* CANNOT_DUMP */
2449 quantify_start_recording_data ();
2450 #endif /* QUANTIFY */
2453 inhibit_non_essential_printing_operations = 0;
2455 /* This never returns. */
2456 initial_command_loop (load_me);
2461 /* Sort the args so we can find the most important ones
2462 at the beginning of argv. */
2464 /* First, here's a table of all the standard options. */
2466 struct standard_args
2469 const char *longname;
2474 static const struct standard_args standard_args[] =
2476 /* Handled by main_1 above: */
2477 { "-sd", "--show-dump-id", 105, 0 },
2478 { "-t", "--terminal", 100, 1 },
2479 { "-nd", "--no-dump-file", 95, 0 },
2480 { "-nw", "--no-windows", 90, 0 },
2481 { "-batch", "--batch", 85, 0 },
2482 { "-debug-paths", "--debug-paths", 82, 0 },
2483 { "-help", "--help", 80, 0 },
2484 { "-version", "--version", 75, 0 },
2486 { "-d", "--display", 80, 1 },
2487 { "-display", 0, 80, 1 },
2488 { "-NXHost", 0, 79, 0 },
2489 { "-MachLaunch", 0, 79, 0},
2491 /* Handled by command-line-early in startup.el: */
2492 { "-q", "--no-init-file", 50, 0 },
2493 { "-unmapped", 0, 50, 0 },
2494 { "-no-init-file", 0, 50, 0 },
2495 { "-vanilla", "--vanilla", 50, 0 },
2496 { "-no-autoloads", "--no-autoloads", 50, 0 },
2497 { "-no-site-file", "--no-site-file", 40, 0 },
2498 { "-no-early-packages", "--no-early-packages", 35, 0 },
2499 { "-u", "--user", 30, 1 },
2500 { "-user", 0, 30, 1 },
2501 { "-debug-init", "--debug-init", 20, 0 },
2502 { "-debug-paths", "--debug-paths", 20, 0 },
2505 { "-i", "--icon-type", 15, 0 },
2506 { "-itype", 0, 15, 0 },
2507 { "-iconic", "--iconic", 15, 0 },
2508 { "-bg", "--background-color", 10, 1 },
2509 { "-background", 0, 10, 1 },
2510 { "-fg", "--foreground-color", 10, 1 },
2511 { "-foreground", 0, 10, 1 },
2512 { "-bd", "--border-color", 10, 1 },
2513 { "-bw", "--border-width", 10, 1 },
2514 { "-ib", "--internal-border", 10, 1 },
2515 { "-ms", "--mouse-color", 10, 1 },
2516 { "-cr", "--cursor-color", 10, 1 },
2517 { "-fn", "--font", 10, 1 },
2518 { "-font", 0, 10, 1 },
2519 { "-g", "--geometry", 10, 1 },
2520 { "-geometry", 0, 10, 1 },
2521 { "-T", "--title", 10, 1 },
2522 { "-title", 0, 10, 1 },
2523 { "-name", "--name", 10, 1 },
2524 { "-xrm", "--xrm", 10, 1 },
2525 { "-r", "--reverse-video", 5, 0 },
2527 { "-reverse", 0, 5, 0 },
2528 { "-hb", "--horizontal-scroll-bars", 5, 0 },
2529 { "-vb", "--vertical-scroll-bars", 5, 0 },
2531 /* These have the same priority as ordinary file name args,
2532 so they are not reordered with respect to those. */
2533 { "-L", "--directory", 0, 1 },
2534 { "-directory", 0, 0, 1 },
2535 { "-l", "--load", 0, 1 },
2536 { "-load", 0, 0, 1 },
2537 { "-f", "--funcall", 0, 1 },
2538 { "-funcall", 0, 0, 1 },
2539 { "-eval", "--eval", 0, 1 },
2540 { "-insert", "--insert", 0, 1 },
2541 /* This should be processed after ordinary file name args and the like. */
2542 { "-kill", "--kill", -10, 0 },
2545 /* Reorder the elements of ARGV (assumed to have ARGC elements)
2546 so that the highest priority ones come first.
2547 Do not change the order of elements of equal priority.
2548 If an option takes an argument, keep it and its argument together. */
2551 sort_args (int argc, char **argv)
2553 char **new_argv = xnew_array (char *, argc);
2554 /* For each element of argv,
2555 the corresponding element of options is:
2556 0 for an option that takes no arguments,
2557 1 for an option that takes one argument, etc.
2558 -1 for an ordinary non-option argument. */
2559 int *options = xnew_array (int, argc);
2560 int *priority = xnew_array (int, argc);
2564 int end_of_options_p = 0;
2566 /* Categorize all the options,
2567 and figure out which argv elts are option arguments. */
2568 for (from = 1; from < argc; from++)
2572 /* Pseudo options "--" and "run-temacs" indicate end of options */
2573 if (!strcmp (argv[from], "--") ||
2574 !strcmp (argv[from], "run-temacs"))
2575 end_of_options_p = 1;
2576 if (!end_of_options_p && argv[from][0] == '-')
2581 /* Look for a match with a known old-fashioned option. */
2582 for (i = 0; i < countof (standard_args); i++)
2583 if (!strcmp (argv[from], standard_args[i].name))
2585 options[from] = standard_args[i].nargs;
2586 priority[from] = standard_args[i].priority;
2587 if (from + standard_args[i].nargs >= argc)
2588 fatal ("Option `%s' requires an argument\n", argv[from]);
2589 from += standard_args[i].nargs;
2593 /* Look for a match with a known long option.
2594 MATCH is -1 if no match so far, -2 if two or more matches so far,
2595 >= 0 (the table index of the match) if just one match so far. */
2596 if (argv[from][1] == '-')
2599 thislen = strlen (argv[from]);
2600 equals = strchr (argv[from], '=');
2602 thislen = equals - argv[from];
2604 for (i = 0; i < countof (standard_args); i++)
2605 if (standard_args[i].longname
2606 && !strncmp (argv[from], standard_args[i].longname,
2615 /* If we found exactly one match, use that. */
2618 options[from] = standard_args[match].nargs;
2619 priority[from] = standard_args[match].priority;
2620 /* If --OPTION=VALUE syntax is used,
2621 this option uses just one argv element. */
2624 if (from + options[from] >= argc)
2625 fatal ("Option `%s' requires an argument\n", argv[from]);
2626 from += options[from];
2633 /* Copy the arguments, in order of decreasing priority, to NEW_ARGV. */
2634 new_argv[0] = argv[0];
2638 int best_priority = -9999;
2640 /* Find the highest priority remaining option.
2641 If several have equal priority, take the first of them. */
2642 for (from = 1; from < argc; from++)
2644 if (argv[from] != 0 && priority[from] > best_priority)
2646 best_priority = priority[from];
2649 /* Skip option arguments--they are tied to the options. */
2650 if (options[from] > 0)
2651 from += options[from];
2657 /* Copy the highest priority remaining option, with its args, to NEW_ARGV. */
2658 new_argv[to++] = argv[best];
2659 for (i = 0; i < options[best]; i++)
2660 new_argv[to++] = argv[best + i + 1];
2662 /* Clear out this option in ARGV. */
2664 for (i = 0; i < options[best]; i++)
2665 argv[best + i + 1] = 0;
2668 memcpy (argv, new_argv, sizeof (char *) * argc);
2674 DEFUN ("running-temacs-p", Frunning_temacs_p, 0, 0, 0, /*
2675 True if running temacs. This means we are in the dumping stage.
2676 This is false during normal execution of the `xemacs' program, and
2677 becomes false once `run-emacs-from-temacs' is run.
2681 return run_temacs_argc >= 0 ? Qt : Qnil;
2684 DEFUN ("run-emacs-from-temacs", Frun_emacs_from_temacs, 0, MANY, 0, /*
2685 Do not call this. It will reinitialize your XEmacs. You'll be sorry.
2687 /* If this function is called from startup.el, it will be possible to run
2688 temacs as an editor using 'temacs -batch -l loadup.el run-temacs', instead
2689 of having to dump an emacs and then run that (when debugging emacs itself,
2690 this can be much faster)). [Actually, the speed difference isn't that
2691 much as long as your filesystem is local, and you don't end up with
2692 a dumped version in case you want to rerun it. This function is most
2693 useful when used as part of the `make all-elc' command. --ben]
2694 This will "restart" emacs with the specified command-line arguments.
2696 Martin thinks this function is most useful when using debugging
2697 tools like Purify or tcov that get confused by XEmacs' dumping. */
2698 (int nargs, Lisp_Object *args))
2701 const Extbyte *wampum;
2704 Lisp_Object orig_invoc_name = Fcar (Vcommand_line_args);
2705 const Extbyte **wampum_all = alloca_array (const Extbyte *, nargs);
2706 int *wampum_all_len = alloca_array (int, nargs);
2708 assert (!gc_in_progress);
2710 if (run_temacs_argc < 0)
2711 error ("I've lost my temacs-hood.");
2713 /* Need to convert the orig_invoc_name and all of the arguments
2714 to external format. */
2716 TO_EXTERNAL_FORMAT (LISP_STRING, orig_invoc_name,
2717 ALLOCA, (wampum, namesize),
2721 for (ac = 0, total_len = namesize; ac < nargs; ac++)
2723 CHECK_STRING (args[ac]);
2724 TO_EXTERNAL_FORMAT (LISP_STRING, args[ac],
2725 ALLOCA, (wampum_all[ac], wampum_all_len[ac]),
2727 wampum_all_len[ac]++;
2728 total_len += wampum_all_len[ac];
2730 DO_REALLOC (run_temacs_args, run_temacs_args_size, total_len, char);
2731 DO_REALLOC (run_temacs_argv, run_temacs_argv_size, nargs+2, char *);
2733 memcpy (run_temacs_args, wampum, namesize);
2734 run_temacs_argv [0] = run_temacs_args;
2735 for (ac = 0; ac < nargs; ac++)
2737 memcpy (run_temacs_args + namesize,
2738 wampum_all[ac], wampum_all_len[ac]);
2739 run_temacs_argv [ac + 1] = run_temacs_args + namesize;
2740 namesize += wampum_all_len[ac];
2742 run_temacs_argv [nargs + 1] = 0;
2743 catchlist = NULL; /* Important! Otherwise free_cons() calls in
2744 condition_case_unwind() may lead to GC death. */
2745 unbind_to (0, Qnil); /* this closes loadup.el */
2747 run_temacs_argc = nargs + 1;
2748 #if defined (HEAP_IN_DATA) && !defined(PDUMP)
2749 report_sheap_usage (0);
2751 LONGJMP (run_temacs_catch, 1);
2752 return Qnil; /* not reached; warning suppression */
2757 main (int argc, char **argv, char **envp)
2761 /* Under VC++, access violations and the like are not sent through
2762 the standard signal() mechanism. Rather, they need to be handled
2763 using the Microsoft "structured exception handling" mechanism,
2764 which vaguely resembles the C++ mechanisms. */
2769 int volatile vol_argc = argc;
2770 char ** volatile vol_argv = argv;
2771 char ** volatile vol_envp = envp;
2772 /* This is hairy. We need to compute where the XEmacs binary was invoked
2773 from because temacs initialization requires it to find the lisp
2774 directories. The code that recomputes the path is guarded by the
2775 restarted flag. There are three possible paths I've found so far
2778 temacs -- When running temacs for basic build stuff, the first main_1
2779 will be the only one invoked. It must compute the path else there
2780 will be a very ugly bomb in startup.el (can't find obvious location
2781 for doc-directory data-directory, etc.).
2783 temacs w/ run-temacs on the command line -- This is run to bytecompile
2784 all the out of date dumped lisp. It will execute both of the main_1
2785 calls and the second one must not touch the first computation because
2786 argc/argv are hosed the second time through.
2788 xemacs -- Only the second main_1 is executed. The invocation path must
2789 computed but this only matters when running in place or when running
2792 As a bonus for straightening this out, XEmacs can now be run in place
2793 as a login shell. This never used to work.
2795 As another bonus, we can now guarantee that
2796 (concat invocation-directory invocation-name) contains the filename
2797 of the XEmacs binary we are running. This can now be used in a
2798 definite test for out of date dumped files. -slb */
2801 quantify_stop_recording_data ();
2802 quantify_clear_data ();
2803 #endif /* QUANTIFY */
2805 inhibit_non_essential_printing_operations = 1;
2806 suppress_early_error_handler_backtrace = 0;
2807 lim_data = 0; /* force reinitialization of this variable */
2809 /* Lisp_Object must fit in a word; check VALBITS and GCTYPEBITS */
2810 assert (sizeof (Lisp_Object) == sizeof (void *));
2812 #ifdef LINUX_SBRK_BUG
2818 #ifdef DOUG_LEA_MALLOC
2819 if (mallopt (M_MMAP_MAX, 0) != 1)
2822 run_temacs_argc = 0;
2823 if (! SETJMP (run_temacs_catch))
2825 main_1 (vol_argc, vol_argv, vol_envp, 0);
2827 /* run-emacs-from-temacs called */
2829 vol_argc = run_temacs_argc;
2830 vol_argv = run_temacs_argv;
2832 /* This makes absolutely no sense to anyone involved. There are
2833 several people using this stuff. We've compared versions on
2834 everything we can think of. We can find no difference.
2835 However, on both my systems environ is a plain old global
2836 variable initialized to zero. _environ is the one that
2837 contains pointers to the actual environment.
2839 Since we can't figure out the difference (and we're hours
2840 away from a release), this takes a very cowardly approach and
2841 is bracketed with both a system specific preprocessor test
2842 and a runtime "do you have this problem" test
2844 06/20/96 robertl@dgii.com */
2846 extern char **_environ;
2847 if ((unsigned) environ == 0)
2850 #endif /* _SCO_DS */
2853 #if defined (RUN_TIME_REMAP) && ! defined (PDUMP)
2855 /* obviously no-one uses this because where it was before initialized was
2857 run_time_remap (argv[0]);
2860 #ifdef DOUG_LEA_MALLOC
2861 if (initialized && (malloc_state_ptr != NULL))
2863 int rc = malloc_set_state (malloc_state_ptr);
2866 stderr_out ("malloc_set_state failed, rc = %d\n", rc);
2870 free (malloc_state_ptr);
2872 /* mmap works in glibc-2.1, glibc-2.0 (Non-Mule only) and Linux libc5 */
2873 #if (defined(__GLIBC__) && __GLIBC_MINOR__ >= 1) || \
2874 defined(_NO_MALLOC_WARNING_) || \
2875 (defined(__GLIBC__) && __GLIBC_MINOR__ < 1 && !defined(MULE)) || \
2876 defined(DEBUG_DOUG_LEA_MALLOC)
2877 if(mallopt (M_MMAP_MAX, 0) != 1)
2884 #endif /* DOUG_LEA_MALLOC */
2886 run_temacs_argc = -1;
2888 main_1 (vol_argc, vol_argv, vol_envp, restarted);
2892 /* VC++ documentation says that
2893 GetExceptionCode() cannot be called inside the filter itself. */
2894 __except (mswindows_handle_hardware_exceptions (GetExceptionCode ())) {}
2897 return 0; /* unreached */
2901 /* Dumping apparently isn't supported by versions of GCC >= 2.8. */
2902 /* The following needs conditionalization on whether either XEmacs or */
2903 /* various system shared libraries have been built and linked with */
2904 /* GCC >= 2.8. -slb */
2905 #if defined(GNU_MALLOC)
2907 voodoo_free_hook (void *mem)
2909 /* Disable all calls to free() when XEmacs is exiting and it doesn't */
2912 #ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
2913 (__typeof__ (__free_hook))
2917 #endif /* GNU_MALLOC */
2919 DEFUN ("kill-emacs", Fkill_emacs, 0, 1, "P", /*
2920 Exit the XEmacs job and kill it. Ask for confirmation, without argument.
2921 If ARG is an integer, return ARG as the exit program code.
2922 If ARG is a string, stuff it as keyboard input.
2924 The value of `kill-emacs-hook', if not void,
2925 is a list of functions (of no args),
2926 all of which are called before XEmacs is actually killed.
2930 /* This function can GC */
2931 struct gcpro gcpro1;
2938 if (!preparing_for_armageddon && !noninteractive)
2939 run_hook (Qkill_emacs_hook);
2941 ensure_no_quitting_from_now_on ();
2943 if (!preparing_for_armageddon)
2945 Lisp_Object concons, nextcons;
2947 /* Normally, go ahead and delete all the consoles now.
2948 Some unmentionably lame window systems (MS Wwwww...... eek,
2949 I can't even say it) don't properly clean up after themselves,
2950 and even for those that do, it might be cleaner this way.
2951 If we're going down, however, we don't do this (might
2952 be too dangerous), and if we get a crash somewhere within
2953 this loop, we'll still autosave and won't try this again. */
2955 LIST_LOOP_DELETING (concons, nextcons, Vconsole_list)
2957 /* There is very little point in deleting the stream console.
2958 It uses stdio, which should flush any buffered output and
2959 something can only go wrong. -slb */
2960 /* I changed my mind. There's a stupid hack in close to add
2961 a trailing newline. */
2962 /*if (!CONSOLE_STREAM_P (XCONSOLE (XCAR (concons))))*/
2963 delete_console_internal (XCONSOLE (XCAR (concons)), 1, 1, 0);
2969 #ifdef HAVE_MS_WINDOWS
2970 /* If we displayed a message on the console, then we must allow the
2971 user to see this message. This may be unnecessary, but can't
2972 hurt, and we can't necessarily check arg; e.g. xemacs --help
2973 kills with argument 0.
2975 Don't do this in batch mode, it makes no sense and is more
2976 annoying than useful. --andyp */
2977 if (mswindows_message_outputted && !noninteractive)
2978 Fmswindows_message_box (build_string ("Messages outputted. XEmacs is exiting."),
2982 shut_down_emacs (0, STRINGP (arg) ? arg : Qnil, 0);
2984 #if defined(GNU_MALLOC)
2986 #ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
2987 (__typeof__ (__free_hook))
2992 exit (INTP (arg) ? XINT (arg) : 0);
2994 return Qnil; /* I'm sick of the compiler warning */
2997 /* Perform an orderly shutdown of XEmacs. Autosave any modified
2998 buffers, kill any child processes, clean up the terminal modes (if
2999 we're in the foreground), and other stuff like that. Don't perform
3000 any redisplay; this may be called when XEmacs is shutting down in
3001 the background, or after its X connection has died.
3003 If SIG is a signal number, print a message for it.
3005 This is called by fatal signal handlers and Fkill_emacs. It used to
3006 be called by X protocol error handlers, but instead they now call
3009 shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save)
3011 /* This function can GC */
3012 /* Prevent running of hooks and other non-essential stuff
3014 preparing_for_armageddon = 1;
3016 ensure_no_quitting_from_now_on ();
3019 quantify_stop_recording_data ();
3020 #endif /* QUANTIFY */
3022 /* This is absolutely the most important thing to do, so make sure
3023 we do it now, before anything else. We might have crashed and
3024 be in a weird inconsistent state, and potentially anything could
3025 set off another protection fault and cause us to bail out
3027 /* Steve writes the following:
3029 [[I'm not removing the code entirely, yet. We have run up against
3030 a spate of problems in diagnosing crashes due to crashes within
3031 crashes. It has very definitely been determined that code called
3032 during auto-saving cannot work if XEmacs crashed inside of GC.
3033 We already auto-save on an itimer so there cannot be too much
3034 unsaved stuff around, and if we get better crash reports we might
3035 be able to get more problems fixed so I'm disabling this. -slb]]
3037 and DISABLES AUTO-SAVING ENTIRELY during crashes! Way way bad idea.
3039 Instead let's just be more intelligent about avoiding crashing
3040 when possible, esp. nested crashes.
3043 Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
3046 reset_all_consoles ();
3047 if (sig && sig != SIGTERM)
3050 stderr_out ("\nFatal error.\n\n");
3052 stderr_out ("\nFatal error (%d).\n\n", sig);
3054 ("Your files have been auto-saved.\n"
3055 "Use `M-x recover-session' to recover them.\n"
3057 "Your version of XEmacs was distributed with a PROBLEMS file that may describe\n"
3058 "your crash, and with luck a workaround. Please check it first, but do report\n"
3059 "the crash anyway. "
3061 "\n\nPlease report this bug by selecting `Report-Bug' in the InfoDock menu.\n"
3062 "*BE SURE* to include the XEmacs configuration from M-x describe-installation,\n"
3063 "or the file Installation in the top directory of the build tree.\n"
3065 "Please report this bug by invoking M-x report-emacs-bug,\n"
3066 "or by selecting `Send Bug Report' from the Help menu. If necessary, send\n"
3067 "ordinary email to `crashes@xemacs.org'. *MAKE SURE* to include the XEmacs\n"
3068 "configuration from M-x describe-installation, or equivalently the file\n"
3069 "Installation in the top of the build tree.\n"
3073 "*Please* try *hard* to obtain a C stack backtrace; without it, we are unlikely\n"
3074 "to be able to analyze the problem. Locate the core file produced as a result\n"
3075 "of this crash (often called `core' or `core.<process-id>', and located in\n"
3076 "the directory in which you started XEmacs or your home directory), and type\n"
3086 /* Now try to determine the actual path to the executable,
3087 to try to make the backtrace-determination process as foolproof
3089 if (STRINGP (Vinvocation_name))
3090 name = (char *) XSTRING_DATA (Vinvocation_name);
3093 if (STRINGP (Vinvocation_directory))
3094 dir = (char *) XSTRING_DATA (Vinvocation_directory);
3095 if (!dir || dir[0] != '/')
3096 stderr_out ("`which %s`", name);
3097 else if (dir[strlen (dir) - 1] != '/')
3098 stderr_out ("%s/%s", dir, name);
3100 stderr_out ("%s%s", dir, name);
3105 "then type `where' at the debugger prompt. No GDB on your system? You may\n"
3106 "have DBX, or XDB, or SDB. (Ask your system administrator if you need help.)\n"
3107 "If no core file was produced, enable them (often with `ulimit -c unlimited'\n"
3108 "in case of future recurrance of the crash.\n");
3109 #endif /* _MSC_VER */
3112 stuff_buffered_input (stuff);
3114 kill_buffer_processes (Qnil);
3116 #ifdef CLASH_DETECTION
3117 unlock_all_files ();
3121 tt_session_quit (tt_default_session ());
3123 /* The following crashes when built on X11R5 and run on X11R6 */
3126 #endif /* TOOLTALK */
3133 #if !defined(PDUMP) || !defined(SYSTEM_MALLOC)
3134 extern char my_edata[];
3137 extern void disable_free_hook (void);
3139 DEFUN ("dump-emacs", Fdump_emacs, 2, 2, 0, /*
3140 Dump current state of XEmacs into executable file FILENAME.
3141 Take symbols from SYMFILE (presumably the file you executed to run XEmacs).
3142 This is used in the file `loadup.el' when building XEmacs.
3144 Remember to set `command-line-processed' to nil before dumping
3145 if you want the dumped XEmacs to process its command line
3146 and announce itself normally when it is run.
3148 (filename, symfile))
3150 /* This function can GC */
3151 struct gcpro gcpro1, gcpro2;
3154 GCPRO2 (filename, symfile);
3156 #ifdef FREE_CHECKING
3157 Freally_free (Qnil);
3159 /* When we're dumping, we can't use the debugging free() */
3160 disable_free_hook ();
3163 CHECK_STRING (filename);
3164 filename = Fexpand_file_name (filename, Qnil);
3165 if (!NILP (symfile))
3167 CHECK_STRING (symfile);
3168 if (XSTRING_LENGTH (symfile) > 0)
3169 symfile = Fexpand_file_name (symfile, Qnil);
3174 opurify = purify_flag;
3177 #if defined (HEAP_IN_DATA) && !defined(PDUMP)
3178 report_sheap_usage (1);
3186 disksave_object_finalization ();
3187 release_breathing_space ();
3189 /* Tell malloc where start of impure now is */
3190 /* Also arrange for warnings when nearly out of space. */
3191 #ifndef SYSTEM_MALLOC
3192 memory_warnings (my_edata, malloc_warning);
3201 LISP_STRING_TO_EXTERNAL (filename, filename_ext, Qfile_name);
3203 if (STRINGP (symfile))
3204 LISP_STRING_TO_EXTERNAL (symfile, symfile_ext, Qfile_name);
3208 garbage_collect_1 ();
3214 #ifdef DOUG_LEA_MALLOC
3215 malloc_state_ptr = malloc_get_state ();
3217 /* here we break our rule that the filename conversion should
3218 be performed at the actual time that the system call is made.
3219 It's a whole lot easier to do the conversion here than to
3220 modify all the unexec routines to ensure that filename
3221 conversion is applied everywhere. Don't worry about memory
3222 leakage because this call only happens once. */
3223 unexec (filename_ext, symfile_ext, (uintptr_t) my_edata, 0, 0);
3224 #ifdef DOUG_LEA_MALLOC
3225 free (malloc_state_ptr);
3227 #endif /* not PDUMP */
3230 purify_flag = opurify;
3235 #endif /* not CANNOT_DUMP */
3238 /* Split STRING into a list of substrings. The substrings are the
3239 parts of original STRING separated by SEPCHAR. */
3241 split_string_by_emchar_1 (const Bufbyte *string, Bytecount size,
3244 Lisp_Object result = Qnil;
3245 const Bufbyte *end = string + size;
3249 const Bufbyte *p = string;
3252 if (charptr_emchar (p) == sepchar)
3256 result = Fcons (make_string (string, p - string), result);
3260 INC_CHARPTR (string); /* skip sepchar */
3265 return Fnreverse (result);
3268 /* The same as the above, except PATH is an external C string (it is
3269 converted using Qfile_name), and sepchar is hardcoded to SEPCHAR
3270 (':' or whatever). */
3272 decode_path (const char *path)
3279 TO_INTERNAL_FORMAT (C_STRING, path, ALLOCA, (newpath, newlen), Qfile_name);
3281 /* #### Does this make sense? It certainly does for
3282 decode_env_path(), but it looks dubious here. Does any code
3283 depend on decode_path("") returning nil instead of an empty
3288 return split_string_by_emchar_1 (newpath, newlen, SEPCHAR);
3292 decode_env_path (const char *evarname, const char *default_)
3294 const char *path = 0;
3296 path = egetenv (evarname);
3299 return decode_path (path);
3302 /* Ben thinks this function should not exist or be exported to Lisp.
3303 We use it to define split-path-string in subr.el (not!). */
3305 DEFUN ("split-string-by-char", Fsplit_string_by_char, 2, 2, 0, /*
3306 Split STRING into a list of substrings originally separated by SEPCHAR.
3310 CHECK_STRING (string);
3311 CHECK_CHAR (sepchar);
3312 return split_string_by_emchar_1 (XSTRING_DATA (string),
3313 XSTRING_LENGTH (string),
3317 /* #### This was supposed to be in subr.el, but is used VERY early in
3318 the bootstrap process, so it goes here. Damn. */
3320 DEFUN ("split-path", Fsplit_path, 1, 1, 0, /*
3321 Explode a search path into a list of strings.
3322 The path components are separated with the characters specified
3323 with `path-separator'.
3327 CHECK_STRING (path);
3329 while (!STRINGP (Vpath_separator)
3330 || (XSTRING_CHAR_LENGTH (Vpath_separator) != 1))
3331 Vpath_separator = signal_simple_continuable_error
3332 ("`path-separator' should be set to a single-character string",
3335 return (split_string_by_emchar_1
3336 (XSTRING_DATA (path), XSTRING_LENGTH (path),
3337 charptr_emchar (XSTRING_DATA (Vpath_separator))));
3340 DEFUN ("noninteractive", Fnoninteractive, 0, 0, 0, /*
3341 Non-nil return value means XEmacs is running without interactive terminal.
3345 return noninteractive ? Qt : Qnil;
3348 /* This flag is useful to define if you're under a debugger; this way, you
3349 can put a breakpoint of assert_failed() and debug multiple problems
3350 in one session without having to recompile. */
3351 /* #define ASSERTIONS_DONT_ABORT */
3353 #ifdef USE_ASSERTIONS
3354 /* This highly dubious kludge ... shut up Jamie, I'm tired of your slagging. */
3356 static int in_assert_failed;
3357 static const char *assert_failed_file;
3358 static int assert_failed_line;
3359 static const char *assert_failed_expr;
3365 #undef abort /* avoid infinite #define loop... */
3367 #if defined (WIN32_NATIVE) && defined (DEBUG_XEMACS)
3368 #define enter_debugger() DebugBreak ()
3370 #define enter_debugger()
3374 assert_failed (const char *file, int line, const char *expr)
3376 /* If we're already crashing, let's not crash again. This might be
3377 critical to getting auto-saving working properly. */
3378 if (fatal_error_in_progress)
3381 /* We are extremely paranoid so we sensibly deal with recursive
3382 assertion failures. */
3384 inhibit_non_essential_printing_operations = 1;
3386 if (in_assert_failed >= 4)
3388 else if (in_assert_failed == 3)
3393 else if (in_assert_failed == 2)
3395 /* Not stderr_out(), which does additional things and may trigger
3396 a recursive assertion failure. fprintf was undeffed above, in
3397 case it was encapsulated. */
3399 "Fatal error: recursive assertion failure, "
3400 "file %s, line %d, %s\n",
3403 "Original assertion failure: file %s, line %d, %s\n",
3404 assert_failed_file, assert_failed_line, assert_failed_expr);
3408 assert_failed_file = file;
3409 assert_failed_line = line;
3410 assert_failed_expr = expr;
3414 "Fatal error: assertion failed, file %s, line %d, %s\n",
3417 stderr_out ("Fatal error: assertion failed, file %s, line %d, %s\n",
3422 #if !defined (ASSERTIONS_DONT_ABORT)
3425 inhibit_non_essential_printing_operations = 0;
3426 in_assert_failed = 0;
3428 #endif /* USE_ASSERTIONS */
3431 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
3433 Start recording Quantify data.
3437 quantify_start_recording_data ();
3441 DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
3443 Stop recording Quantify data.
3447 quantify_stop_recording_data ();
3451 DEFUN ("quantify-clear-data", Fquantify_clear_data, 0, 0, "", /*
3452 Clear all Quantify data.
3456 quantify_clear_data ();
3459 #endif /* QUANTIFY */
3462 syms_of_emacs (void)
3465 DEFSUBR (Fdump_emacs);
3466 #endif /* !CANNOT_DUMP */
3468 DEFSUBR (Frun_emacs_from_temacs);
3469 DEFSUBR (Frunning_temacs_p);
3470 DEFSUBR (Finvocation_name);
3471 DEFSUBR (Finvocation_directory);
3472 DEFSUBR (Fkill_emacs);
3473 DEFSUBR (Fnoninteractive);
3476 DEFSUBR (Fforce_debugging_signal);
3480 DEFSUBR (Fquantify_start_recording_data);
3481 DEFSUBR (Fquantify_stop_recording_data);
3482 DEFSUBR (Fquantify_clear_data);
3483 #endif /* QUANTIFY */
3485 DEFSUBR (Fsplit_string_by_char);
3486 DEFSUBR (Fsplit_path); /* #### */
3488 defsymbol (&Qkill_emacs_hook, "kill-emacs-hook");
3489 defsymbol (&Qsave_buffers_kill_emacs, "save-buffers-kill-emacs");
3493 vars_of_emacs (void)
3495 DEFVAR_BOOL ("suppress-early-error-handler-backtrace",
3496 &suppress_early_error_handler_backtrace /*
3497 Non-nil means early error handler shouldn't print a backtrace.
3500 DEFVAR_LISP ("command-line-args", &Vcommand_line_args /*
3501 Args passed by shell to XEmacs, as a list of strings.
3504 DEFVAR_LISP ("invocation-name", &Vinvocation_name /*
3505 The program name that was used to run XEmacs.
3506 Any directory names are omitted.
3509 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory /*
3510 The directory in which the XEmacs executable was found, to run it.
3511 The value is simply the program name if that directory's name is not known.
3514 DEFVAR_LISP ("invocation-path", &Vinvocation_path /*
3515 The path in which the XEmacs executable was found, to run it.
3516 The value is simply the value of environment variable PATH on startup
3517 if XEmacs was found there.
3521 xxDEFVAR_LISP ("installation-directory", &Vinstallation_directory,
3522 "A directory within which to look for the `lib-src' and `etc' directories.\n"
3523 "This is non-nil when we can't find those directories in their standard\n"
3524 "installed locations, but we can find them\n"
3525 "near where the XEmacs executable was found.");
3528 DEFVAR_LISP ("system-type", &Vsystem_type /*
3529 Symbol indicating type of operating system you are using.
3531 Vsystem_type = intern (SYSTEM_TYPE);
3532 Fprovide (intern(SYSTEM_TYPE));
3534 #ifndef EMACS_CONFIGURATION
3535 # define EMACS_CONFIGURATION "UNKNOWN"
3537 DEFVAR_LISP ("system-configuration", &Vsystem_configuration /*
3538 String naming the configuration XEmacs was built for.
3540 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
3542 #ifndef EMACS_CONFIG_OPTIONS
3543 # define EMACS_CONFIG_OPTIONS "UNKNOWN"
3545 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options /*
3546 String containing the configuration options XEmacs was built with.
3548 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
3550 DEFVAR_LISP ("emacs-major-version", &Vemacs_major_version /*
3551 Major version number of this version of Emacs, as an integer.
3552 Warning: this variable did not exist in Emacs versions earlier than:
3556 Vemacs_major_version = make_int (EMACS_MAJOR_VERSION);
3558 DEFVAR_LISP ("emacs-minor-version", &Vemacs_minor_version /*
3559 Minor version number of this version of Emacs, as an integer.
3560 Warning: this variable did not exist in Emacs versions earlier than:
3564 Vemacs_minor_version = make_int (EMACS_MINOR_VERSION);
3566 DEFVAR_LISP ("emacs-patch-level", &Vemacs_patch_level /*
3567 The patch level of this version of Emacs, as an integer.
3568 The value is non-nil if this version of XEmacs is part of a series of
3569 stable XEmacsen, but has bug fixes applied.
3570 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
3573 #ifdef EMACS_PATCH_LEVEL
3574 Vemacs_patch_level = make_int (EMACS_PATCH_LEVEL);
3576 Vemacs_patch_level = Qnil;
3579 DEFVAR_LISP ("emacs-beta-version", &Vemacs_beta_version /*
3580 Beta number of this version of Emacs, as an integer.
3581 The value is nil if this is an officially released version of XEmacs.
3582 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
3585 #ifdef EMACS_BETA_VERSION
3586 Vemacs_beta_version = make_int (EMACS_BETA_VERSION);
3588 Vemacs_beta_version = Qnil;
3592 DEFVAR_LISP ("infodock-major-version", &Vinfodock_major_version /*
3593 Major version number of this InfoDock release.
3595 Vinfodock_major_version = make_int (INFODOCK_MAJOR_VERSION);
3597 DEFVAR_LISP ("infodock-minor-version", &Vinfodock_minor_version /*
3598 Minor version number of this InfoDock release.
3600 Vinfodock_minor_version = make_int (INFODOCK_MINOR_VERSION);
3602 DEFVAR_LISP ("infodock-build-version", &Vinfodock_build_version /*
3603 Build version of this InfoDock release.
3605 Vinfodock_build_version = make_int (INFODOCK_BUILD_VERSION);
3608 DEFVAR_LISP ("xemacs-codename", &Vxemacs_codename /*
3609 Codename of this version of Emacs (a string).
3611 #ifndef XEMACS_CODENAME
3612 #define XEMACS_CODENAME "Noname"
3614 Vxemacs_codename = build_string (XEMACS_CODENAME);
3616 /* Lisp variables which contain command line flags.
3618 The portable dumper stomps on these; they must be saved and restored
3619 if they are processed before the call to pdump_load() in main_1().
3621 DEFVAR_BOOL ("noninteractive", &noninteractive1 /*
3622 Non-nil means XEmacs is running without interactive terminal.
3625 DEFVAR_BOOL ("inhibit-early-packages", &inhibit_early_packages /*
3626 Set to non-nil when the early packages should not be respected at startup.
3629 DEFVAR_BOOL ("inhibit-autoloads", &inhibit_autoloads /*
3630 Set to non-nil when autoloads should not be loaded at startup.
3633 DEFVAR_BOOL ("debug-paths", &debug_paths /*
3634 Set to non-nil when debug information about paths should be printed.
3637 DEFVAR_BOOL ("inhibit-site-lisp", &inhibit_site_lisp /*
3638 Set to non-nil when the site-lisp should not be searched at startup.
3640 #ifdef INHIBIT_SITE_LISP
3641 inhibit_site_lisp = 1;
3644 DEFVAR_BOOL ("inhibit-site-modules", &inhibit_site_modules /*
3645 Set to non-nil when site-modules should not be searched at startup.
3647 #ifdef INHIBIT_SITE_MODULES
3648 inhibit_site_modules = 1;
3651 DEFVAR_INT ("emacs-priority", &emacs_priority /*
3652 Priority for XEmacs to run at.
3653 This value is effective only if set before XEmacs is dumped,
3654 and only if the XEmacs executable is installed with setuid to permit
3655 it to change priority. (XEmacs sets its uid back to the real uid.)
3656 Currently, you need to define SET_EMACS_PRIORITY in `config.h'
3657 before you compile XEmacs, to enable the code for this feature.
3661 DEFVAR_CONST_LISP ("internal-error-checking", &Vinternal_error_checking /*
3662 Internal error checking built-in into this instance of XEmacs.
3663 This is a list of symbols, initialized at build-time. Legal symbols
3666 extents - check extents prior to each extent change;
3667 typecheck - check types strictly, aborting in case of error;
3668 malloc - check operation of malloc;
3669 gc - check garbage collection;
3670 bufpos - check buffer positions.
3672 quick-build - user has requested the "quick-build" configure option.
3674 Vinternal_error_checking = Qnil;
3675 #ifdef ERROR_CHECK_EXTENTS
3676 Vinternal_error_checking = Fcons (intern ("extents"),
3677 Vinternal_error_checking);
3679 #ifdef ERROR_CHECK_TYPECHECK
3680 Vinternal_error_checking = Fcons (intern ("typecheck"),
3681 Vinternal_error_checking);
3683 #ifdef ERROR_CHECK_MALLOC
3684 Vinternal_error_checking = Fcons (intern ("malloc"),
3685 Vinternal_error_checking);
3687 #ifdef ERROR_CHECK_GC
3688 Vinternal_error_checking = Fcons (intern ("gc"),
3689 Vinternal_error_checking);
3691 #ifdef ERROR_CHECK_BUFPOS
3692 Vinternal_error_checking = Fcons (intern ("bufpos"),
3693 Vinternal_error_checking);
3696 Vinternal_error_checking = Fcons (intern ("quick-build"),
3697 Vinternal_error_checking);
3700 DEFVAR_CONST_LISP ("mail-lock-methods", &Vmail_lock_methods /*
3701 Mail spool locking methods supported by this instance of XEmacs.
3702 This is a list of symbols. Each of the symbols is one of the
3703 following: dot, lockf, flock, locking, mmdf.
3706 Vmail_lock_methods = Qnil;
3707 Vmail_lock_methods = Fcons (intern ("dot"), Vmail_lock_methods);
3709 Vmail_lock_methods = Fcons (intern ("lockf"), Vmail_lock_methods);
3712 Vmail_lock_methods = Fcons (intern ("flock"), Vmail_lock_methods);
3715 Vmail_lock_methods = Fcons (intern ("mmdf"), Vmail_lock_methods);
3718 Vmail_lock_methods = Fcons (intern ("locking"), Vmail_lock_methods);
3722 DEFVAR_CONST_LISP ("configure-mail-lock-method", &Vconfigure_mail_lock_method /*
3723 Mail spool locking method suggested by configure. This is one
3724 of the symbols in MAIL-LOCK-METHODS.
3727 #if defined(MAIL_LOCK_FLOCK) && defined(HAVE_FLOCK)
3728 Vconfigure_mail_lock_method = intern("flock");
3729 #elif defined(MAIL_LOCK_LOCKF) && defined(HAVE_LOCKF)
3730 Vconfigure_mail_lock_method = intern("lockf");
3731 #elif defined(MAIL_LOCK_MMDF) && defined(HAVE_MMDF)
3732 Vconfigure_mail_lock_method = intern("mmdf");
3733 #elif defined(MAIL_LOCK_LOCKING) && defined(HAVE_LOCKING)
3734 Vconfigure_mail_lock_method = intern("locking");
3736 Vconfigure_mail_lock_method = intern("dot");
3740 DEFVAR_LISP ("path-separator", &Vpath_separator /*
3741 The directory separator in search paths, as a string.
3745 Vpath_separator = make_string ((Bufbyte *)&c, 1);
3750 complex_vars_of_emacs (void)
3752 /* This is all related to path searching. */
3754 DEFVAR_LISP ("emacs-program-name", &Vemacs_program_name /*
3755 *Name of the Emacs variant.
3756 For example, this may be \"xemacs\" or \"infodock\".
3757 This is mainly meant for use in path searching.
3759 Vemacs_program_name = build_string ((char *) PATH_PROGNAME);
3761 DEFVAR_LISP ("emacs-program-version", &Vemacs_program_version /*
3762 *Version of the Emacs variant.
3763 This typically has the form NN.NN-bNN.
3764 This is mainly meant for use in path searching.
3766 Vemacs_program_version = build_string ((char *) PATH_VERSION);
3768 DEFVAR_LISP ("exec-path", &Vexec_path /*
3769 *List of directories to search programs to run in subprocesses.
3770 Each element is a string (directory name) or nil (try default directory).
3774 DEFVAR_LISP ("exec-directory", &Vexec_directory /*
3775 *Directory of architecture-dependent files that come with XEmacs,
3776 especially executable programs intended for XEmacs to invoke.
3778 Vexec_directory = Qnil;
3780 DEFVAR_LISP ("configure-exec-directory", &Vconfigure_exec_directory /*
3781 For internal use by the build procedure only.
3782 configure's idea of what `exec-directory' will be.
3785 Vconfigure_exec_directory = Ffile_name_as_directory
3786 (build_string ((char *) PATH_EXEC));
3788 Vconfigure_exec_directory = Qnil;
3791 DEFVAR_LISP ("lisp-directory", &Vlisp_directory /*
3792 *Directory of core Lisp files that come with XEmacs.
3794 Vlisp_directory = Qnil;
3796 DEFVAR_LISP ("configure-lisp-directory", &Vconfigure_lisp_directory /*
3797 For internal use by the build procedure only.
3798 configure's idea of what `lisp-directory' will be.
3800 #ifdef PATH_LOADSEARCH
3801 Vconfigure_lisp_directory = Ffile_name_as_directory
3802 (build_string ((char *) PATH_LOADSEARCH));
3804 Vconfigure_lisp_directory = Qnil;
3807 DEFVAR_LISP ("mule-lisp-directory", &Vmule_lisp_directory /*
3808 *Directory of Mule Lisp files that come with XEmacs.
3810 Vmule_lisp_directory = Qnil;
3812 DEFVAR_LISP ("configure-mule-lisp-directory", &Vconfigure_mule_lisp_directory /*
3813 For internal use by the build procedure only.
3814 configure's idea of what `mule-lisp-directory' will be.
3816 #ifdef PATH_MULELOADSEARCH
3817 Vconfigure_mule_lisp_directory = Ffile_name_as_directory
3818 (build_string ((char *) PATH_MULELOADSEARCH));
3820 Vconfigure_mule_lisp_directory = Qnil;
3823 DEFVAR_LISP ("module-directory", &Vmodule_directory /*
3824 *Directory of core dynamic modules that come with XEmacs.
3826 Vmodule_directory = Qnil;
3828 DEFVAR_LISP ("configure-module-directory", &Vconfigure_module_directory /*
3829 For internal use by the build procedure only.
3830 configure's idea of what `module-directory' will be.
3832 #ifdef PATH_MODULESEARCH
3833 Vconfigure_module_directory = Ffile_name_as_directory
3834 (build_string ((char *) PATH_MODULESEARCH));
3836 Vconfigure_module_directory = Qnil;
3839 DEFVAR_LISP ("configure-package-path", &Vconfigure_package_path /*
3840 For internal use by the build procedure only.
3841 configure's idea of what the package path will be.
3843 #ifdef PATH_PACKAGEPATH
3844 Vconfigure_package_path = decode_path (PATH_PACKAGEPATH);
3846 Vconfigure_package_path = Qnil;
3849 DEFVAR_LISP ("data-directory", &Vdata_directory /*
3850 *Directory of architecture-independent files that come with XEmacs,
3851 intended for XEmacs to use.
3852 Use of this variable in new code is almost never correct. See the
3853 functions `locate-data-file' and `locate-data-directory' and the variable
3854 `data-directory-list'.
3856 Vdata_directory = Qnil;
3858 DEFVAR_LISP ("configure-data-directory", &Vconfigure_data_directory /*
3859 For internal use by the build procedure only.
3860 configure's idea of what `data-directory' will be.
3863 Vconfigure_data_directory = Ffile_name_as_directory
3864 (build_string ((char *) PATH_DATA));
3866 Vconfigure_data_directory = Qnil;
3869 DEFVAR_LISP ("data-directory-list", &Vdata_directory_list /*
3870 *List of directories of architecture-independent files that come with XEmacs
3871 or were installed as packages, and are intended for XEmacs to use.
3873 Vdata_directory_list = Qnil;
3875 DEFVAR_LISP ("site-directory", &Vsite_directory /*
3876 *Directory of site-specific Lisp files that come with XEmacs.
3878 Vsite_directory = Qnil;
3880 DEFVAR_LISP ("configure-site-directory", &Vconfigure_site_directory /*
3881 For internal use by the build procedure only.
3882 configure's idea of what `site-directory' will be.
3885 Vconfigure_site_directory = Ffile_name_as_directory
3886 (build_string ((char *) PATH_SITE));
3888 Vconfigure_site_directory = Qnil;
3891 DEFVAR_LISP ("site-module-directory", &Vsite_module_directory /*
3892 *Directory of site-specific loadable modules that come with XEmacs.
3894 Vsite_module_directory = Qnil;
3896 DEFVAR_LISP ("configure-site-module-directory", &Vconfigure_site_module_directory /*
3897 For internal use by the build procedure only.
3898 configure's idea of what `site-directory' will be.
3900 #ifdef PATH_SITE_MODULES
3901 Vconfigure_site_module_directory = Ffile_name_as_directory
3902 (build_string ((char *) PATH_SITE_MODULES));
3904 Vconfigure_site_module_directory = Qnil;
3907 DEFVAR_LISP ("doc-directory", &Vdoc_directory /*
3908 *Directory containing the DOC file that comes with XEmacs.
3909 This is usually the same as `exec-directory'.
3911 Vdoc_directory = Qnil;
3913 DEFVAR_LISP ("configure-doc-directory", &Vconfigure_doc_directory /*
3914 For internal use by the build procedure only.
3915 configure's idea of what `doc-directory' will be.
3918 Vconfigure_doc_directory = Ffile_name_as_directory
3919 (build_string ((char *) PATH_DOC));
3921 Vconfigure_doc_directory = Qnil;
3924 DEFVAR_LISP ("configure-exec-prefix-directory", &Vconfigure_exec_prefix_directory /*
3925 For internal use by the build procedure only.
3926 configure's idea of what `exec-prefix-directory' will be.
3928 #ifdef PATH_EXEC_PREFIX
3929 Vconfigure_exec_prefix_directory = Ffile_name_as_directory
3930 (build_string ((char *) PATH_EXEC_PREFIX));
3932 Vconfigure_exec_prefix_directory = Qnil;
3935 DEFVAR_LISP ("configure-prefix-directory", &Vconfigure_prefix_directory /*
3936 For internal use by the build procedure only.
3937 configure's idea of what `prefix-directory' will be.
3940 Vconfigure_prefix_directory = Ffile_name_as_directory
3941 (build_string ((char *) PATH_PREFIX));
3943 Vconfigure_prefix_directory = Qnil;
3946 DEFVAR_LISP ("configure-info-directory", &Vconfigure_info_directory /*
3947 For internal use by the build procedure only.
3948 This is the name of the directory in which the build procedure installed
3949 Emacs's info files; the default value for Info-default-directory-list
3953 Vconfigure_info_directory =
3954 Ffile_name_as_directory (build_string (PATH_INFO));
3956 Vconfigure_info_directory = Qnil;
3959 DEFVAR_LISP ("configure-info-path", &Vconfigure_info_path /*
3960 The configured initial path for info documentation.
3962 #ifdef PATH_INFOPATH
3963 Vconfigure_info_path = decode_path (PATH_INFOPATH);
3965 Vconfigure_info_path = Qnil;
3969 #if defined(__sgi) && !defined(PDUMP)
3970 /* This is so tremendously ugly I'd puke. But then, it works.
3971 * The target is to override the static constructor from the
3972 * libiflPNG.so library which is masquerading as libz, and
3973 * cores on us when re-started from the dumped executable.
3974 * This will have to go for 21.1 -- OG.
3976 void __sti__iflPNGFile_c___ (void);
3978 __sti__iflPNGFile_c___ (void)