1 /* SXEmacs -- 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.
6 Copyright (C) 2004, 2015 Steve Youngs.
8 This file is part of SXEmacs
10 SXEmacs is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 3 of the License, or
13 (at your option) any later version.
15 SXEmacs is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 /* Synched up with: Mule 2.0, FSF 19.28. */
26 /* Capsule summary of the various releases of Lucid Emacs/SXEmacs 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.
32 -- A time line for Lucid Emacs/XEmacs is
34 version 19.0 shipped with Energize 1.0, April 1992.
35 version 19.1 released June 4, 1992.
36 version 19.2 released June 19, 1992.
37 version 19.3 released September 9, 1992.
38 version 19.4 released January 21, 1993.
39 version 19.5 was a repackaging of 19.4 with a few bug fixes and
40 shipped with Energize 2.0. Never released to the net.
41 version 19.6 released April 9, 1993.
42 version 19.7 was a repackaging of 19.6 with a few bug fixes and
43 shipped with Energize 2.1. Never released to the net.
44 version 19.8 released September 6, 1993.
45 version 19.9 released January 12, 1994.
46 version 19.10 released May 27, 1994.
47 version 19.11 (first XEmacs) released September 13, 1994.
48 version 19.12 released June 23, 1995.
49 version 19.13 released September 1, 1995.
50 version 19.14 released June 23, 1996.
51 version 20.0 released February 9, 1997.
52 version 19.15 released March 28, 1997.
53 version 20.1 (not released to the net) April 15, 1997.
54 version 20.2 released May 16, 1997.
55 version 19.16 released October 31, 1997.
56 version 20.3 (the first stable version of XEmacs 20.x) released
58 version 20.4 released February 28, 1998.
60 -- A time line for GNU Emacs version 19 is
62 version 19.7 (beta) (first beta release) released May 22, 1993.
63 version 19.8 (beta) released May 27, 1993.
64 version 19.9 (beta) released May 27, 1993.
65 version 19.10 (beta) released May 30, 1993.
66 version 19.11 (beta) released June 1, 1993.
67 version 19.12 (beta) released June 2, 1993.
68 version 19.13 (beta) released June 8, 1993.
69 version 19.14 (beta) released June 17, 1993.
70 version 19.15 (beta) released June 19, 1993.
71 version 19.16 (beta) released July 6, 1993.
72 version 19.17 (beta) released late July, 1993.
73 version 19.18 (beta) released August 9, 1993.
74 version 19.19 (beta) released August 15, 1993.
75 version 19.20 (beta) released November 17, 1993.
76 version 19.21 (beta) released November 17, 1993.
77 version 19.22 (beta) released November 28, 1993.
78 version 19.23 (beta) released May 17, 1994.
79 version 19.24 (beta) released May 16, 1994.
80 version 19.25 (beta) released June 3, 1994.
81 version 19.26 (beta) released September 11, 1994.
82 version 19.27 (beta) released September 14, 1994.
83 version 19.28 (first ``official'' release) released November 1, 1994.
84 version 19.29 released June 21, 1995.
85 version 19.30 released November 24, 1995.
86 version 19.31 released May 25, 1996.
87 version 19.32 released July 31, 1996.
88 version 19.33 released August 11, 1996.
89 version 19.34 released August 21, 1996.
90 version 19.34b released September 6, 1996.
92 -- A time line for GNU Emacs version 20 is
94 version 20.1 released September 17, 1997.
95 version 20.2 released September 20, 1997.
96 version 20.3 released August 19, 1998.
98 -- A time line for GNU Emacs version 18 and older is
100 GNU Emacs version 13 (the first public release) was released on
102 GNU Emacs version 15 (15.34) was released on May 7, 1985 and
103 shared some code with a version of Emacs written by James Gosling (the
104 same James Gosling who later created the Java language).
105 GNU Emacs version 16 (first released version was 16.56) was released on
106 July 15, 1985. All Gosling code was removed due to potential copyright
107 problems with the code.
108 version 16.57: released on September 16, 1985.
109 versions 16.58, 16.59: released on September 17, 1985.
110 version 16.60: released on September 19, 1985. These later version 16's
111 incorporated patches from the net, esp. for getting Emacs to work under
113 version 17.36 (first official v17 release) released on December 20, 1985.
114 Included a TeX-able user manual. First official unpatched version that
115 worked on vanilla System V machines.
116 version 17.43 (second official v17 release) released on January 25, 1986.
117 version 17.45 released on January 30, 1986.
118 version 17.46 released on February 4, 1986.
119 version 17.48 released on February 10, 1986.
120 version 17.49 released on February 12, 1986.
121 version 17.55 released on March 18, 1986.
122 version 17.57 released on March 27, 1986.
123 version 17.58 released on April 4, 1986.
124 version 17.61 released on April 12, 1986.
125 version 17.63 released on May 7, 1986.
126 version 17.64 released on May 12, 1986.
127 version 18.24 (a beta version) released on October 2, 1986.
128 version 18.30 (a beta version) released on November 15, 1986.
129 version 18.31 (a beta version) released on November 23, 1986.
130 version 18.32 (a beta version) released on December 7, 1986.
131 version 18.33 (a beta version) released on December 12, 1986.
132 version 18.35 (a beta version) released on January 5, 1987.
133 version 18.36 (a beta version) released on January 21, 1987.
134 January 27, 1987: The Great Usenet Renaming. net.emacs is now comp.emacs.
135 version 18.37 (a beta version) released on February 12, 1987.
136 version 18.38 (a beta version) released on March 3, 1987.
137 version 18.39 (a beta version) released on March 14, 1987.
138 version 18.40 (a beta version) released on March 18, 1987.
139 version 18.41 (the first ``official'' release) released on March 22, 1987.
140 version 18.45 released on June 2, 1987.
141 version 18.46 released on June 9, 1987.
142 version 18.47 released on June 18, 1987.
143 version 18.48 released on September 3, 1987.
144 version 18.49 released on September 18, 1987.
145 version 18.50 released on February 13, 1988.
146 version 18.51 released on May 7, 1988.
147 version 18.52 released on September 1, 1988.
148 version 18.53 released on February 24, 1989.
149 version 18.54 released on April 26, 1989.
150 version 18.55 released on August 23, 1989. This is the earliest version
151 that is still available by FTP.
152 version 18.56 released on January 17, 1991.
153 version 18.57 released late January, 1991.
154 version 18.58 released ?????.
155 version 18.59 released October 31, 1992.
159 /* Note: It is necessary to specify <config.h> and not "config.h" in
160 order for the --srcdir type of compilation to work properly.
161 Otherwise the config.h from the srcdir, rather than the one from
162 the build dir, will be used. */
167 #include "backtrace.h" /* run-emacs-from-temacs needs this */
169 #include "commands.h"
170 #include "ui/console.h"
172 #include "ui/redisplay.h"
173 #include "ui/frame.h"
176 #include "syssignal.h" /* Always include before systty.h */
177 #include "ui/TTY/systty.h"
181 #if defined WITH_EMODULES && defined HAVE_EMODULES
182 # include "emodules-ng.h"
194 #include <quantify.h>
197 #if defined WITH_EMODULES && defined HAVE_EMODULES && 0
201 #if defined (HAVE_LOCALE_H) && \
202 (defined (I18N2) || defined (I18N3) || defined (I18N4))
207 #include <sxe-paths.h>
209 /* for stack exploitation */
210 #if defined HAVE_SYS_RESOURCE_H
211 # include <sys/resource.h>
214 /* for the reinit funs */
215 #include "skiplist.h"
219 #if defined HAVE_BDWGC && defined EF_USE_BDWGC
220 # if defined HAVE_GC_GC_H
222 # elif defined HAVE_GC_H
225 /* declare the 3 funs we need */
226 extern void *GC_init(void);
228 # error Go back to your planet!
230 #endif /* HAVE_BDWGC */
232 #if !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
233 extern void *(*__malloc_hook) (size_t);
234 extern void *(*__realloc_hook) (void *, size_t);
235 extern void (*__free_hook) (void *);
236 #endif /* not SYSTEM_MALLOC && not DOUG_LEA_MALLOC */
238 /* Command line args from shell, as list of strings */
239 Lisp_Object Vcommand_line_args;
241 /* Set nonzero after SXEmacs has started up the first time.
242 Prevents reinitialization of the Lisp world and keymaps
243 on subsequent starts. */
246 #ifdef DOUG_LEA_MALLOC
248 /* Preserves a pointer to the memory allocated that copies that
249 static data inside glibc's malloc. */
250 static void *malloc_state_ptr;
251 #endif /* DOUG_LEA_MALLOC */
254 void r_alloc_reinit(void);
257 /* Variable whose value is symbol giving operating system type. */
258 Lisp_Object Vsystem_type;
260 /* Variable whose value is string giving configuration built for. */
261 Lisp_Object Vsystem_configuration;
263 /* Variable whose value is string containing the configuration options
264 SXEmacs was built with. */
265 Lisp_Object Vsystem_configuration_options;
267 /* Version numbers and strings */
268 Lisp_Object Vemacs_major_version;
269 Lisp_Object Vemacs_minor_version;
270 Lisp_Object Vemacs_patch_level;
271 Lisp_Object Vemacs_beta_version;
272 Lisp_Object Vsxemacs_git_version;
273 Lisp_Object Vsxemacs_codename;
275 Lisp_Object Vinfodock_major_version;
276 Lisp_Object Vinfodock_minor_version;
277 Lisp_Object Vinfodock_build_version;
280 /* The path under which SXEmacs was invoked. */
281 Lisp_Object Vinvocation_path;
283 /* The name under which SXEmacs was invoked, with any leading directory
285 Lisp_Object Vinvocation_name;
287 /* The directory name from which SXEmacs was invoked. */
288 Lisp_Object Vinvocation_directory;
291 /* The directory name in which to find subdirs such as lisp and etc.
292 nil means get them only from PATH_LOADSEARCH. */
293 Lisp_Object Vinstallation_directory;
296 Lisp_Object Vemacs_program_name, Vemacs_program_version;
297 Lisp_Object Vexec_path;
298 Lisp_Object Vexec_directory, Vconfigure_exec_directory;
299 Lisp_Object Vlisp_directory, Vconfigure_lisp_directory;
300 Lisp_Object Vmule_lisp_directory, Vconfigure_mule_lisp_directory;
301 Lisp_Object Vmodule_directory, Vconfigure_module_directory;
302 Lisp_Object Vsite_module_directory, Vconfigure_site_module_directory;
303 Lisp_Object Vconfigure_package_path;
304 Lisp_Object Vdata_directory, Vconfigure_data_directory;
305 Lisp_Object Vdoc_directory, Vconfigure_doc_directory;
306 Lisp_Object Vconfigure_lock_directory;
307 Lisp_Object Vdata_directory_list;
308 Lisp_Object Vconfigure_info_directory;
309 Lisp_Object Vconfigure_info_path;
310 Lisp_Object Vinternal_error_checking;
311 Lisp_Object Vmail_lock_methods, Vconfigure_mail_lock_method;
312 Lisp_Object Vpath_separator, Vuser_packages_topdir;
314 /* The default base directory SXEmacs is installed under. */
315 Lisp_Object Vconfigure_exec_prefix_directory, Vconfigure_prefix_directory;
317 /* If nonzero, set SXEmacs to run at this priority. This is also used
318 in child_setup and sys_suspend to make sure subshells run at normal
320 Fixnum emacs_priority;
322 /* Some FSF junk with running_asynch_code, to preserve the match
323 data. Not necessary because we don't call process filters
324 asynchronously (i.e. from within QUIT). */
325 /* #### Delete this when merging the rest of my code */
326 int running_asynch_code;
328 /* If non-zero, a window-system was specified on the command line. */
331 /* Type of display specified. We cannot use a Lisp symbol here because
332 Lisp symbols may not initialized at the time that we set this
334 const char *display_use;
336 /* Directory specified on the command line for user packages
337 (early-packages). We cannot use a Lisp symbol here because Lisp
338 symbols may not be initialised at the time that we set this. */
339 const char *user_pkgd;
342 /* If non-zero, then the early error handler will only print the error
344 int suppress_early_error_handler_backtrace;
346 /* An address near the bottom of the stack.
347 Tells GC how to save a copy of the stack. */
349 /* the stack size as imposed by the system */
350 size_t sys_stk_sz = 0;
352 #ifdef USG_SHARED_LIBRARIES
353 /* If nonzero, this is the place to put the end of the writable segment
356 uintptr_t bss_end = 0;
359 /* Number of bytes of writable memory we can expect to be able to get */
360 #ifdef _RLIM_T_DECLARED
363 unsigned long lim_data;
368 Some LISP-visible command-line options are set by SXEmacs _before_ the
369 data is dumped in building a --pdump SXEmacs, but used _after_ it is
370 restored in normal operation. Thus the dump-time values overwrite the
371 values SXEmacs is getting at runtime. Such variables must be saved
372 before loading the dumpfile, and restored afterward.
374 Therefore these variables may not be initialized in vars_of_emacs().
376 The save/restore is done immediately before and after pdump_load() in
377 main_1(). See that function for the current list of protected variables.
379 Note that saving/restoring is only necessary for a few variables that are
380 o command line arguments effective at runtime (as opposed to dump-time),
381 o parsed before pdump_load, and
382 o exported to Lisp via a DEFVAR.
385 /* Nonzero means running SXEmacs without interactive terminal. */
389 /* Value of Lisp variable `noninteractive'.
390 Normally same as C variable `noninteractive'
391 but nothing terrible happens if user sets this one.
393 Shadowed from the pdumper by `noninteractive'. */
397 /* Nonzero means don't perform site-modules searches at startup */
398 int inhibit_site_modules;
400 /* Nonzero means don't respect early packages at startup */
401 int inhibit_early_packages;
403 /* Nonzero means we warn about early packages shadowing late packages at startup */
404 int warn_early_package_shadows;
406 /* Nonzero means don't load package autoloads at startup */
407 int inhibit_autoloads;
409 /* Nonzero means don't load the dump file (ignored if not PDUMP) */
412 /* Nonzero means we assume all ttys are 8 color ANSI terminals */
413 int assume_colorterm;
415 /* Nonzero means print debug information about path searching */
418 /* Save argv and argc. */
419 static Extbyte **initial_argv; /* #### currently unused */
420 static int initial_argc; /* #### currently unused */
422 static void sort_args(int argc, char **argv);
424 Lisp_Object Qkill_emacs_hook;
425 Lisp_Object Qsave_buffers_kill_emacs;
427 extern Lisp_Object Vlisp_EXEC_SUFFIXES;
429 /* Ben's capsule summary about expected and unexpected exits from SXEmacs.
431 Expected exits occur when the user directs SXEmacs to exit, for example
432 by pressing the close button on the only frame in SXEmacs, or by typing
433 C-x C-c. This runs `save-buffers-kill-emacs', which saves any necessary
434 buffers, and then exits using the primitive `kill-emacs'.
436 However, unexpected exits occur in a few different ways:
438 -- a memory access violation or other hardware-generated exception
439 occurs. This is the worst possible problem to deal with, because
440 the fault can occur while SXEmacs is in any state whatsoever, even
441 quite unstable ones. As a result, we need to be *extremely* careful
443 -- we are using one X display (or if we've used more, we've closed the
444 others already), and some hardware or other problem happens and
445 suddenly we've lost our connection to the display. In this situation,
446 things are not so dire as in the last one; our code itself isn't
447 trashed, so we can continue execution as normal, after having set
448 things up so that we can exit at the appropriate time. Our exit
449 still needs to be of the emergency nature; we have no displays, so
450 any attempts to use them will fail. We simply want to auto-save
451 (the single most important thing to do during shut-down), do minimal
452 cleanup of stuff that has an independent existence outside of SXEmacs,
455 Currently, both unexpected exit scenarios described above set
456 preparing_for_armageddon to indicate that nonessential and possibly
457 dangerous things should not be done, specifically:
459 -- no garbage collection.
461 -- no messages of any sort from autosaving.
462 -- autosaving tries harder, ignoring certain failures.
463 -- existing frames are not deleted.
465 (Also, all places that set preparing_for_armageddon also
466 set dont_check_for_quit. This happens separately because it's
467 also necessary to set other variables to make absolutely sure
468 no quitting happens.)
470 In the first scenario above (the access violation), we also set
471 fatal_error_in_progress. This causes more things to not happen:
473 -- assertion failures do not abort.
474 -- printing code does not do code conversion or gettext when
475 printing to stdout/stderr.
478 /* Nonzero if handling a fatal error already. */
479 int fatal_error_in_progress;
481 /* Non-nil means we're going down, so we better not run any hooks
482 or do other non-essential stuff. */
483 int preparing_for_armageddon;
485 /* Nonzero means we're in an unstable situation and need to skip
486 i18n conversions and such during printing. */
487 int inhibit_non_essential_printing_operations;
489 static JMP_BUF run_temacs_catch;
491 static int run_temacs_argc;
492 static char **run_temacs_argv;
493 static char *run_temacs_args;
494 static EMACS_INT run_temacs_argv_size;
495 static EMACS_INT run_temacs_args_size;
497 static void shut_down_emacs(int sig, Lisp_Object stuff, int no_auto_save);
499 /* ------------------------------- */
500 /* low-level debugging functions */
501 /* ------------------------------- */
503 #define debugging_breakpoint()
508 debugging_breakpoint();
511 /* #### There must be a better way!!!! */
513 static JMP_BUF memory_error_jump;
517 debug_memory_error(int signum)
519 EMACS_REESTABLISH_SIGNAL(signum, debug_memory_error);
520 EMACS_UNBLOCK_SIGNAL(signum);
521 LONGJMP(memory_error_jump, 1);
525 static char dummy_char;
527 /* Return whether all bytes in the specified memory block can be read. */
529 debug_can_access_memory(void *ptr, Bytecount len)
531 /* Use volatile to protect variables from being clobbered by longjmp. */
532 SIGTYPE(*volatile old_sigbus) (int);
533 SIGTYPE(*volatile old_sigsegv) (int);
534 volatile int old_errno = errno;
535 volatile int retval = 1;
537 if (!SETJMP(memory_error_jump)) {
540 (SIGTYPE(*)(int))signal(SIGBUS, debug_memory_error);
542 (SIGTYPE(*)(int))signal(SIGSEGV, debug_memory_error);
545 * Examine memory pool at PTR, trying to cheat
546 * compiler's optimisations.
549 dummy_char = ((char*)ptr)[len];
554 signal(SIGBUS, old_sigbus);
555 signal(SIGSEGV, old_sigsegv);
563 DEFUN("force-debugging-signal", Fforce_debugging_signal, 0, 1, 0, /*
564 Cause SXEmacs to enter the debugger.
565 On some systems, there may be no way to do this gracefully; if so,
566 nothing happens unless ABORT is non-nil, in which case SXEmacs will
567 abort() -- a sure-fire way to immediately get back to the debugger,
568 but also a sure-fire way to kill SXEmacs (and dump core on Unix
573 debugging_breakpoint();
579 #endif /* DEBUG_SXEMACS */
582 ensure_no_quitting_from_now_on(void)
584 /* make sure no quitting from now on!! */
585 dont_check_for_quit = 1;
591 /* Handle bus errors, illegal instruction, etc. */
593 fatal_error_signal(int sig)
595 fatal_error_in_progress++;
596 inhibit_non_essential_printing_operations = 1;
597 preparing_for_armageddon = 1;
599 ensure_no_quitting_from_now_on();
601 /* Unblock the signal so that if the same signal gets sent in the
602 code below, we avoid a deadlock. */
603 EMACS_UNBLOCK_SIGNAL(sig);
605 /* Only try auto-saving first time through. If we crash in auto-saving,
606 don't do it again. */
607 if (fatal_error_in_progress == 1) {
608 Fdo_auto_save(Qt, Qnil); /* do this before anything hazardous */
609 /* Do this so that the variable has the same value of 2 regardless of
610 whether we made it through auto-saving correctly. */
611 fatal_error_in_progress++;
612 } else if (fatal_error_in_progress == 2)
613 stderr_out("WARNING: Unable to auto-save your files properly.\n"
614 "Some or all may in fact have been auto-saved.\n"
617 /* Now, reset our signal handler, so the next time, we just die.
618 Don't do this before auto-saving. */
619 signal(sig, SIG_DFL);
621 /* Keep in mind that there's more than one signal that we can crash
623 /* If fatal error occurs in code below, avoid infinite recursion. */
624 if (fatal_error_in_progress <= 2) {
625 shut_down_emacs(sig, Qnil, 1);
626 stderr_out("\nLisp backtrace follows:\n\n");
627 Fbacktrace(Qexternal_debugging_output, Qt);
628 # if 0 /* This is evil, rarely useful, and causes grief in some cases. */
629 /* Check for Sun-style stack printing via /proc */
631 const char *pstack = "/usr/proc/bin/pstack";
632 if (access(pstack, X_OK) == 0) {
634 int sz = snprintf(buf, sizeof(buf), "%s %d >&2", pstack,
636 stderr_out("\nC backtrace follows:\n"
637 "(A real debugger may provide better information)\n\n");
638 if ( sz >= 0 && sz < sizeof(buf)) {
641 stderr_out("\nStacktrace utility execution error code: %d\n", sz);
643 stderr_out("\nCould not build command line for stacktrace utility.\n");
649 /* Signal the same code; this time it will really be fatal. */
658 /* Handler for SIGDANGER. */
660 memory_warning_signal(int sig)
662 /* #### bad bad bad; this function shouldn't do anything except
663 set a flag, or weird corruption could happen. */
664 signal(sig, memory_warning_signal);
668 ("Operating system warns that virtual memory is running low.\n"));
670 /* It might be unsafe to call do_auto_save now. */
671 force_auto_save_soon();
673 #endif /* SIGDANGER */
675 /* Code for dealing with Lisp access to the Unix command line */
678 make_arg_list_1(int argc, Extbyte ** argv, int skip_args)
680 Lisp_Object result = Qnil;
683 for (i = argc - 1; i >= 0; i--) {
684 if (i != 0 && i <= skip_args)
687 result = Fcons(build_ext_string(argv[i], Qcommand_argument_encoding), result);
693 make_arg_list(int argc, Extbyte ** argv)
695 return make_arg_list_1(argc, argv, 0);
698 /* Calling functions are also responsible for calling free_argc_argv
699 when they are done with the generated list. */
701 make_argc_argv(Lisp_Object argv_list, int *argc, Extbyte *** argv)
704 int n = XINT(Flength(argv_list));
706 *argv = (Extbyte **) malloc((n + 1) * sizeof(Extbyte *));
708 for (i = 0, next = argv_list; i < n; i++, next = XCDR(next)) {
710 CHECK_STRING(XCAR(next));
712 LISP_STRING_TO_EXTERNAL(XCAR(next), temp,
713 Qcommand_argument_encoding);
714 (*argv)[i] = strdup(temp);
720 void free_argc_argv(Extbyte ** argv)
731 static void init_cmdargs(int argc, Extbyte ** argv, int skip_args)
736 Vcommand_line_args = make_arg_list_1(argc, argv, skip_args);
739 DEFUN("invocation-name", Finvocation_name, 0, 0, 0, /*
740 Return the program name that was used to run SXEmacs.
741 Any directory names are omitted.
745 return Fcopy_sequence(Vinvocation_name);
748 DEFUN("invocation-directory", Finvocation_directory, 0, 0, 0, /*
749 Return the directory name in which the Emacs executable was located.
753 return Fcopy_sequence(Vinvocation_directory);
757 /* #### - don't know why I18N4 on SunOS/JLE
758 can't deal with this. It's a potential
759 bug that needs to be looked at. */
760 # undef RUN_TIME_REMAP
763 /* Test whether the next argument in ARGV matches SSTR or a prefix of
764 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
765 (the argument is supposed to have a value) store in *VALPTR either
766 the next argument or the portion of this one after the equal sign.
767 ARGV is read starting at position *SKIPPTR; this index is advanced
768 by the number of arguments used.
770 Too bad we can't just use getopt for all of this, but we don't have
771 enough information to do it right. */
774 argmatch(char **argv, int argc, char *sstr, char *lstr,
775 int minlen, char **valptr, int *skipptr)
781 /* Don't access argv[argc]; give up in advance. */
782 if (argc <= *skipptr + 1)
785 arg = argv[*skipptr + 1];
788 if (strcmp(arg, sstr) == 0) {
789 if (valptr != NULL) {
790 *valptr = argv[*skipptr + 2];
796 arglen = (valptr != NULL && (p = strchr(arg, '=')) != NULL
797 ? p - arg : (int)strlen(arg));
798 if (lstr == 0 || arglen < minlen || strncmp(arg, lstr, arglen) != 0)
800 else if (valptr == NULL) {
803 } else if (p != NULL) {
807 } else if (argv[*skipptr + 2] != NULL) {
808 *valptr = argv[*skipptr + 2];
817 make_docfile(int c, char **v)
819 #define make_docfile_prog "make-docfile\0"
820 #define make_docfile_opt "--make-docfile"
821 /* C99 we need you */
822 size_t edlen = XSTRING_LENGTH(Vexec_directory);
823 char mdocfile[edlen+countof(make_docfile_prog)];
824 char **newargv = xnew_array_and_zero(char*, c), **p;
827 /* set up the program call */
829 (char*)XSTRING_DATA(Vexec_directory),
831 xstrncpy(mdocfile+edlen,
832 make_docfile_prog, sizeof(mdocfile)-edlen);
834 /* find the --make-docfile option */
835 for (p = v; *p; p++) {
836 if (strncmp(*p, make_docfile_opt,
837 countof(make_docfile_opt)) == 0) {
843 /* fill the new argv array */
844 newargv[0] = make_docfile_prog;
845 for (char **o = p, **n = &newargv[1]; *o;) {
848 ret = execv(mdocfile, newargv);
859 /* we need some checks whether this is supported! */
860 __asm__ __volatile__ (
861 "movl %%esp, %[stkptr]\n\t"
862 : [stkptr] "=m" (sp));
871 /* return the stack size limit */
872 #if defined HAVE_GETRLIMIT64
873 struct rlimit64 rlim;
874 (void)getrlimit64(RLIMIT_STACK, &rlim);
875 #elif defined HAVE_GETRLIMIT
877 (void)getrlimit(RLIMIT_STACK, &rlim);
879 /* bollocks, maybe just a small one? 64k? */
880 struct {size_t rlim_cur;} rlim = {65536};
882 return rlim.rlim_cur;
886 /* Make stack traces always identify version + configuration */
887 #define main_1 STACK_TRACE_EYE_CATCHER
889 /* This function is not static, so that the compiler is less likely to
890 inline it, which would make it not show up in stack traces.
892 The restart argument is a flag that indicates that main_1 is now
893 being called for the second time in this invocation of sxemacs; this can
894 only happen in an sxemacs that is not loaded with dumped data (temacs
895 with the conventional dumper or sxemacs -nd with the pdumper). See
896 Frun_emacs_from_temacs().
898 restart interacts with initialized as follows (per Olivier Galibert):
902 initialized==0 => temacs
903 initialized!=0 && restart!=0 => run-temacs
904 initialized!=0 && restart==0 => sxemacs/post pdump_load()
906 DECLARE_DOESNT_RETURN(main_1(int, char **, char **, int));
907 DOESNT_RETURN main_1(int argc, char **argv, char **envp, int restart)
909 char stack_bottom_variable;
912 int inhibit_window_system;
914 extern int malloc_cookie;
917 #if (!defined (SYSTEM_MALLOC) && !defined (HAVE_LIBMCHECK) \
918 && !defined (DOUG_LEA_MALLOC))
919 /* Make sure that any libraries we link against haven't installed a
920 hook for a gmalloc of a potentially incompatible version. */
921 /* If we're using libmcheck, the hooks have already been initialized, */
922 /* don't touch them. -slb */
923 __malloc_hook = NULL;
924 __realloc_hook = NULL;
926 #endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */
929 inhibit_non_essential_printing_operations = 1;
933 * NeXT secret magic, ripped from Emacs-for-NS by Carl Edman
934 * <cedman@princeton.edu>. Note that even Carl doesn't know what this
935 * does; it was provided by NeXT, and it presumable makes NS's mallocator
936 * work with dumping. But malloc_jumpstart() and malloc_freezedry() in
937 * unexnext.c are both completely undocumented, even in NS header files!
938 * But hey, it solves all NS related memory problems, so who's
940 if (initialized && malloc_jumpstart(malloc_cookie) != 0)
941 stderr_out("malloc jumpstart failed!\n");
945 #if defined (GNU_MALLOC) && \
946 defined (ERROR_CHECK_MALLOC) && \
947 !defined (HAVE_LIBMCHECK)
949 #if defined(LOSING_GCC_DESTRUCTOR_FREE_BUG)
950 /* Prior to SXEmacs 21, this was `#if 0'ed out. */
951 /* I'm enabling this because it is the only reliable way I've found to */
952 /* prevent a very annoying problem where GCC will attempt to free(3) */
953 /* memory at exit() and cause a coredump. */
959 sort_args(argc, argv);
965 /* Record (approximately) where the stack begins. */
966 stack_bottom = &stack_bottom_variable;
967 /* and determine the system's stack limit */
968 sys_stk_sz = __sys_stk_sz();
970 #ifdef USG_SHARED_LIBRARIES
972 brk((void *)bss_end);
977 #if defined (HAVE_MMAP) && defined (REL_ALLOC)
978 /* ralloc can only be used if using the GNU memory allocator. */
980 #elif defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
988 #endif /* HAVE_SOCKS */
990 #if !defined SYSTEM_MALLOC && !(defined HAVE_BDWGC && defined EF_USE_BDWGC)
992 /* Arrange to get warning messages as memory fills up. */
993 memory_warnings(0, malloc_warning);
994 #endif /* not SYSTEM_MALLOC */
996 #ifdef SET_EMACS_PRIORITY
997 if (emacs_priority != 0)
998 nice(-emacs_priority);
1000 #endif /* SET_EMACS_PRIORITY */
1002 #ifdef EXTRA_INITIALIZE
1006 #ifdef HAVE_WINDOW_SYSTEM
1007 inhibit_window_system = 0;
1009 inhibit_window_system = 1;
1012 /* Handle the --make-docfile argument */
1013 if (argmatch(argv, argc,
1014 "--make-docfile", 0, 9, NULL, &skip_args)) {
1016 /* we need load the dump file as the exec-directory is in
1018 if (UNLIKELY(!pdump_load(argv[0]))) {
1022 exit(make_docfile(argc, argv));
1025 /* Handle the -sd/--show-dump-id switch, which means show the hex
1027 if (argmatch(argv, argc, "-show-dump-id", "--show-dump-id", 9,
1029 || argmatch(argv, argc, "-sd", 0, 3, NULL, &skip_args)) {
1031 printf("%08x\n", dump_id);
1034 ("Portable dumper not configured; -sd just forces exit.\n");
1039 /* Handle the -t switch, which specifies filename to use as terminal */
1043 (argv, argc, "-terminal", "--terminal", 4, &term, &skip_args)
1044 || argmatch(argv, argc, "-t", 0, 2, &term, &skip_args)) {
1047 stderr_out("Opening for terminal usage %s (current: %s)\n", term, ttyname(0));
1049 stderr_out("Opening for terminal usage %s\n", term, ttyname(0));
1052 tdesc = raw_open(term, O_RDWR | OPEN_BINARY, 2);
1054 fatal("%s: %s", term, strerror(errno));
1055 /* Request dup into fd 0 */
1056 if ( dup2(tdesc,0) < 0 )
1057 fatal("%s: %s", term, strerror(errno));
1058 stderr_out("Dup(0) ok\n");
1059 /* Requesr dup into fd 1 */
1060 if ( dup2(tdesc,1) < 0 )
1061 fatal("%s: %s", term, strerror(errno));
1066 tdesc = raw_open(term, O_RDWR | OPEN_BINARY, 2);
1068 fatal("%s: %s", term, strerror(errno));
1072 fatal("dup failed %s: %s", term, strerror(errno));
1078 fatal("%s: not a tty", term);
1082 stderr_out("Using tty %s\n", ttyname(0));
1084 stderr_out("Using %tty s\n", term);
1086 inhibit_window_system = 1; /* -t => -nw
1091 /* Handle the --no-dump-file/-nd switch, which means don't
1092 * load the dump file (ignored when not using pdump) */
1093 if (argmatch(argv, argc, "-no-dump-file", "--no-dump-file", 7,
1095 || argmatch(argv, argc, "-nd", 0, 3, NULL, &skip_args)) {
1099 if (argmatch(argv, argc, "-color-terminal", "--color-terminal", 5,
1101 || argmatch(argv, argc, "-ct", 0, 3, NULL, &skip_args)) {
1102 assume_colorterm = 1;
1105 /* Handle -nw switch */
1106 if (argmatch(argv, argc, "-no-windows", "--no-windows", 6, NULL,
1108 || argmatch(argv, argc, "-nw", 0, 3, NULL, &skip_args)) {
1109 inhibit_window_system = 1;
1112 /* Handle the -batch switch, which means don't do interactive display */
1113 if (argmatch(argv, argc, "-batch", "--batch", 5, NULL, &skip_args)) {
1114 #if 0 /* I don't think this is correct. */
1115 inhibit_autoloads = 1;
1120 if (argmatch(argv, argc, "-debug-paths", "--debug-paths",
1121 11, NULL, &skip_args))
1124 /* Handle -user-pkgs-directory */
1126 if (argmatch(argv, argc, "-user-pkgs-directory", "--user-pkgs-directory",
1127 11, &pkgd, &skip_args)) {
1132 /* Partially handle -no-autoloads, -no-early-packages and -vanilla.
1134 /* are searched prior to the rest of the command line being parsed in */
1136 if (argmatch(argv, argc, "-no-early-packages", "--no-early-packages",
1137 6, NULL, &skip_args)) {
1138 inhibit_early_packages = 1;
1141 #if defined WITH_EMODULES && defined HAVE_EMODULES
1142 if (argmatch(argv, argc, "-no-site-modules", "--no-site-modules",
1143 9, NULL, &skip_args)) {
1144 inhibit_site_modules = 1;
1148 inhibit_site_modules = 1;
1150 if (argmatch(argv, argc, "-vanilla", "--vanilla", 7, NULL, &skip_args)) {
1151 inhibit_early_packages = 1;
1155 if (argmatch(argv, argc, "-no-autoloads", "--no-autoloads",
1156 7, NULL, &skip_args)) {
1157 /* Inhibit everything */
1158 inhibit_autoloads = 1;
1162 if (argmatch(argv, argc, "-debug-paths", "--debug-paths",
1163 6, NULL, &skip_args)) {
1168 /* Partially handle the -version and -help switches: they imply -batch,
1169 but are not removed from the list. */
1170 if (argmatch(argv, argc, "-help", "--help", 3, NULL, &skip_args)
1171 || argmatch(argv, argc, "-h", 0, 2, NULL, &skip_args))
1172 noninteractive = 1, skip_args--;
1174 if (argmatch(argv, argc, "-version", "--version", 3, NULL, &skip_args)
1175 || argmatch(argv, argc, "-V", 0, 2, NULL, &skip_args))
1176 noninteractive = 1, skip_args--;
1178 /* Now, figure out which type of console is our first console. */
1183 display_use = "stream";
1185 display_use = "tty";
1188 if (inhibit_window_system && !noninteractive)
1189 fatal("Sorry, this SXEmacs was not compiled with TTY support");
1192 #ifdef HAVE_WINDOW_SYSTEM
1193 /* Stupid kludge to catch command-line display spec. We can't
1194 handle this argument entirely in window-system-dependent code
1195 because we don't even know which window-system-dependent code
1196 to run until we've recognized this argument. */
1197 if (!inhibit_window_system && !noninteractive) {
1198 #ifdef HAVE_X_WINDOWS
1200 int count_before = skip_args;
1202 if (argmatch(argv, argc, "-d", "--display", 3, &dpy, &skip_args)
1203 || argmatch(argv, argc, "-display", 0, 3, &dpy,
1208 /* If we have the form --display=NAME,
1209 convert it into -d name.
1210 This requires inserting a new element into argv. */
1211 if (dpy != 0 && skip_args - count_before == 1) {
1213 (char **)xmalloc(sizeof(char *) * (argc + 2));
1216 for (j = 0; j < count_before + 1; j++)
1218 new[count_before + 1] = "-d";
1219 new[count_before + 2] = dpy;
1220 for (j = count_before + 2; j < argc; j++)
1221 new[j + 1] = argv[j];
1225 /* Change --display to -d, when its arg is separate. */
1226 else if (dpy != 0 && skip_args > count_before
1227 && argv[count_before + 1][1] == '-')
1228 argv[count_before + 1] = "-d";
1230 /* Don't actually discard this arg. */
1231 skip_args = count_before;
1233 /* If there is a non-empty environment var DISPLAY, set
1234 `display_use', but not `display_arg', which is only to be set
1235 if the display was specified on the command line. */
1236 if ((dpy = getenv("DISPLAY")) && dpy[0])
1239 #endif /* HAVE_X_WINDOWS */
1241 #endif /* HAVE_WINDOW_SYSTEM */
1243 noninteractive1 = noninteractive;
1245 /****** Now initialize everything *******/
1247 /* First, do really basic environment initialization -- catching signals
1248 and the like. These functions have no dependence on any part of
1249 the Lisp engine and need to be done both at dump time and at run time. */
1251 init_signals_very_early();
1252 init_data_very_early(); /* Catch math errors. */
1254 init_floatfns_very_early(); /* Catch floating-point math errors. */
1256 init_process_times_very_early(); /* Initialize our process timers.
1257 As early as possible, of course,
1258 so we can be fairly accurate. */
1259 init_intl_very_early(); /* set up the locale and domain for gettext and
1262 /* Now initialize the Lisp engine and the like. Done only during
1263 dumping. No dependence on anything that may be in the user's
1264 environment when the dumped SXEmacs is run.
1266 We try to do things in an order that minimizes the non-obvious
1267 dependencies between functions. */
1269 /* purify_flag 1 is correct even if CANNOT_DUMP.
1270 * loadup.el will set to nil at end. */
1276 } else if (nodumpfile) {
1281 /* Keep command options from getting stomped.
1283 Some LISP-visible options are changed by SXEmacs _after_ the data is
1284 dumped in building a --pdump SXEmacs, but _before_ it is restored in
1285 normal operation. Thus the restored values overwrite the values
1286 SXEmacs is getting at run-time. Such variables must be saved here,
1287 and restored after loading the dumped data.
1289 Boy, this is ugly, but how else to do it?
1292 /* noninteractive1 is saved in noninteractive, which isn't
1294 int inhibit_early_packages_save = inhibit_early_packages;
1295 int inhibit_autoloads_save = inhibit_autoloads;
1296 int debug_paths_save = debug_paths;
1297 int inhibit_site_modules_save = inhibit_site_modules;
1299 initialized = pdump_load(argv[0]);
1301 /* Now unstomp everything */
1302 noninteractive1 = noninteractive;
1303 inhibit_early_packages = inhibit_early_packages_save;
1304 inhibit_autoloads = inhibit_autoloads_save;
1305 debug_paths = debug_paths_save;
1306 inhibit_site_modules = inhibit_site_modules_save;
1309 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.
1358 syms_of_casefiddle();
1365 #ifdef DEBUG_SXEMACS
1368 #endif /* DEBUG_SXEMACS */
1379 #ifdef HAVE_X_WINDOWS
1382 #ifdef HAVE_DRAGNDROP
1385 #ifdef EF_USE_ASYNEQ
1386 syms_of_event_queue();
1388 syms_of_worker_asyneq();
1390 syms_of_event_stream();
1395 #ifdef CLASH_DETECTION
1397 #endif /* CLASH_DETECTION */
1400 syms_of_font_lock();
1404 syms_of_glyphs_eimage();
1405 syms_of_glyphs_widget();
1415 #ifdef HAVE_DATABASE
1418 #ifdef HAVE_MENUBARS
1424 #if defined WITH_EMODULES && defined HAVE_EMODULES && 0
1426 #elif defined WITH_EMODULES && defined HAVE_EMODULES
1431 #if !defined (NO_SUBPROCESSES)
1435 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1437 #endif /* HAVE_MMAP && REL_ALLOC */
1439 syms_of_redisplay();
1444 syms_of_specifier();
1447 #ifdef HAVE_SCROLLBARS
1448 syms_of_scrollbar();
1450 #ifdef HAVE_TOOLBARS
1458 syms_of_console_tty();
1459 syms_of_device_tty();
1460 syms_of_objects_tty();
1463 #ifdef HAVE_X_WINDOWS
1464 #ifdef HAVE_BALLOON_HELP
1465 syms_of_balloon_x();
1473 syms_of_objects_x();
1474 #ifdef HAVE_MENUBARS
1475 syms_of_menubar_x();
1478 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1483 syms_of_input_method_xlib();
1485 #endif /* HAVE_XIM */
1486 #endif /* HAVE_X_WINDOWS */
1491 syms_of_mule_charset();
1494 syms_of_file_coding();
1501 syms_of_mule_canna();
1502 #endif /* HAVE_CANNA */
1514 #if defined (GNU_MALLOC) && \
1515 defined (ERROR_CHECK_MALLOC) && \
1516 !defined (HAVE_LIBMCHECK)
1518 /* Prior to SXEmacs 21, this was `#if 0'ed out. -slb */
1519 #if defined (LOSING_GCC_DESTRUCTOR_FREE_BUG)
1520 syms_of_free_hook();
1535 #ifdef HAVE_POSTGRESQL
1536 syms_of_postgresql();
1543 #ifdef WITH_NUMBER_TYPES
1555 /* Now create the subtypes for the types that have them.
1556 We do this before the vars_*() because more symbols
1557 may get initialized here. */
1559 /* Now initialize the console types and associated symbols.
1560 Other than the first function below, the functions may
1561 make exactly the following function/macro calls:
1563 INITIALIZE_CONSOLE_TYPE()
1564 CONSOLE_HAS_METHOD()
1566 For any given console type, the former macro must be called
1567 before the any calls to the latter macro. */
1569 console_type_create();
1571 console_type_create_stream();
1574 console_type_create_tty();
1575 console_type_create_device_tty();
1576 console_type_create_frame_tty();
1577 console_type_create_objects_tty();
1578 console_type_create_redisplay_tty();
1581 #ifdef HAVE_X_WINDOWS
1582 console_type_create_x();
1583 console_type_create_device_x();
1584 console_type_create_frame_x();
1585 console_type_create_glyphs_x();
1586 console_type_create_select_x();
1587 #ifdef HAVE_MENUBARS
1588 console_type_create_menubar_x();
1590 console_type_create_objects_x();
1591 console_type_create_redisplay_x();
1592 #ifdef HAVE_SCROLLBARS
1593 console_type_create_scrollbar_x();
1595 #ifdef HAVE_TOOLBARS
1596 console_type_create_toolbar_x();
1599 console_type_create_dialog_x();
1601 #endif /* HAVE_X_WINDOWS */
1603 /* Now initialize the specifier types and associated symbols.
1604 Other than the first function below, the functions may
1605 make exactly the following function/macro calls:
1607 INITIALIZE_SPECIFIER_TYPE()
1608 SPECIFIER_HAS_METHOD()
1610 For any given specifier type, the former macro must be called
1611 before the any calls to the latter macro. */
1613 specifier_type_create();
1615 specifier_type_create_image();
1616 specifier_type_create_gutter();
1617 specifier_type_create_objects();
1618 #ifdef HAVE_TOOLBARS
1619 specifier_type_create_toolbar();
1622 /* Now initialize the structure types and associated symbols.
1623 Other than the first function below, the functions may
1624 make exactly the following function/macro calls:
1626 define_structure_type()
1627 define_structure_type_keyword()
1631 structure_type_create();
1633 structure_type_create_chartab();
1634 structure_type_create_faces();
1635 structure_type_create_rangetab();
1636 structure_type_create_hash_table();
1638 /* Now initialize the image instantiator formats and associated symbols.
1639 Other than the first function below, the functions may
1640 make exactly the following function/macro calls:
1642 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT()
1643 IIFORMAT_HAS_METHOD()
1644 IIFORMAT_VALID_KEYWORD()
1646 For any given image instantiator format, the first macro must be
1647 called before the any calls to the other macros. */
1649 image_instantiator_format_create();
1650 image_instantiator_format_create_glyphs_eimage();
1651 image_instantiator_format_create_glyphs_widget();
1653 image_instantiator_format_create_glyphs_tty();
1655 #ifdef HAVE_X_WINDOWS
1656 image_instantiator_format_create_glyphs_x();
1657 #endif /* HAVE_X_WINDOWS */
1659 /* Now initialize the lstream types and associated symbols.
1660 Other than the first function below, the functions may
1661 make exactly the following function/macro calls:
1663 LSTREAM_HAS_METHOD()
1667 lstream_type_create();
1669 lstream_type_create_file_coding();
1672 /* Initialize processes implementation.
1673 The functions may make exactly the following function/macro calls:
1675 PROCESS_HAS_METHOD()
1677 #ifdef HAVE_UNIX_PROCESSES
1678 process_type_create_unix();
1681 /* Now initialize most variables.
1683 These functions may do exactly the following:
1696 defsymbol(), if it's absolutely necessary and you're sure that
1697 the symbol isn't referenced anywhere else in the initialization
1699 Fset() on a symbol that is unbound
1700 assigning a symbol or constant value to a variable
1701 using a global variable that has been initialized
1702 earlier on in the same function
1704 Any of the object-creating functions in alloc.c: e.g.
1717 perhaps a few others.
1719 NB: Initialization or assignment should not be done here to certain
1720 variables settable from the command line. See the comment above
1721 the call to pdump_load() in main_1(). This caveat should only
1722 apply to vars_of_emacs().
1725 /* Now allow Fprovide() statements to be made. */
1726 init_provide_once();
1728 /* Do that before any specifier creation (esp. vars_of_glyphs()) */
1729 vars_of_specifier();
1742 #ifdef DEBUG_SXEMACS
1746 vars_of_console_stream();
1753 #ifdef HAVE_DRAGNDROP
1761 #ifdef HAVE_X_WINDOWS
1764 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
1765 vars_of_event_tty();
1767 vars_of_event_stream();
1768 #ifdef EF_USE_ASYNEQ
1770 vars_of_worker_asyneq();
1777 #ifdef CLASH_DETECTION
1781 vars_of_font_lock();
1784 vars_of_glyphs_eimage();
1785 vars_of_glyphs_widget();
1793 vars_of_input_method_motif();
1794 #else /* XIM_XLIB */
1795 vars_of_input_method_xlib();
1797 #endif /* HAVE_XIM */
1803 #ifdef HAVE_DATABASE
1806 #ifdef HAVE_MENUBARS
1812 #if defined WITH_EMODULES && defined HAVE_EMODULES && 0
1814 #elif defined WITH_EMODULES && defined HAVE_EMODULES
1820 #ifndef NO_SUBPROCESSES
1822 #ifdef HAVE_UNIX_PROCESSES
1823 vars_of_process_unix();
1828 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1830 #endif /* HAVE_MMAP && REL_ALLOC */
1831 vars_of_redisplay();
1832 #ifdef HAVE_SCROLLBARS
1833 vars_of_scrollbar();
1840 #ifdef HAVE_TOOLBARS
1847 vars_of_console_tty();
1848 vars_of_frame_tty();
1849 vars_of_objects_tty();
1852 #ifdef HAVE_X_WINDOWS
1853 #ifdef HAVE_BALLOON_HELP
1854 vars_of_balloon_x();
1862 #ifdef HAVE_MENUBARS
1863 vars_of_menubar_x();
1865 vars_of_objects_x();
1867 #ifdef HAVE_SCROLLBARS
1868 vars_of_scrollbar_x();
1870 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1873 #endif /* HAVE_X_WINDOWS */
1878 vars_of_mule_charset();
1881 vars_of_file_coding();
1888 vars_of_mule_canna();
1889 #endif /* HAVE_CANNA */
1900 #ifdef HAVE_POSTGRESQL
1901 vars_of_postgresql();
1912 #ifdef WITH_NUMBER_TYPES
1924 /* Now initialize any specifier variables. We do this later
1925 because it has some dependence on the vars initialized
1928 These functions should *only* initialize specifier variables,
1929 and may make use of the following functions/macros in addition
1930 to the ones listed above:
1934 set_specifier_fallback()
1935 set_specifier_caching()
1938 specifier_vars_of_glyphs();
1939 specifier_vars_of_glyphs_widget();
1940 specifier_vars_of_gutter();
1941 #ifdef HAVE_MENUBARS
1942 specifier_vars_of_menubar();
1944 specifier_vars_of_redisplay();
1945 #ifdef HAVE_SCROLLBARS
1946 specifier_vars_of_scrollbar();
1948 #ifdef HAVE_TOOLBARS
1949 specifier_vars_of_toolbar();
1951 specifier_vars_of_window();
1953 /* Now comes all the rest of the variables that couldn't
1954 be handled above. There may be dependencies on variables
1955 initialized above, and dependencies between one complex_vars_()
1956 function and another. */
1958 /* Calls Fmake_range_table(). */
1959 complex_vars_of_regex();
1960 /* Calls Fmake_range_table(). */
1961 complex_vars_of_search();
1963 /* Calls make_lisp_hash_table(). */
1964 complex_vars_of_extents();
1966 /* Depends on hash tables and specifiers. */
1967 complex_vars_of_faces();
1970 /* These two depend on hash tables and various variables declared
1971 earlier. The second may also depend on the first. */
1972 complex_vars_of_mule_charset();
1975 complex_vars_of_file_coding();
1978 /* This calls allocate_glyph(), which creates specifiers
1979 and also relies on a variable (Vthe_nothing_vector) initialized
1980 above. It also calls make_ext_string(), which under Mule
1981 could require that the charsets be initialized. */
1982 complex_vars_of_glyphs();
1984 /* These rely on the glyphs just created in the previous function,
1985 and call Fadd_spec_to_specifier(), which relies on various
1986 variables initialized above. */
1987 #ifdef HAVE_X_WINDOWS
1988 complex_vars_of_glyphs_x();
1991 /* This calls Fmake_glyph_internal(). */
1992 complex_vars_of_alloc();
1994 /* This calls Fmake_glyph_internal(). */
1995 #ifdef HAVE_MENUBARS
1996 complex_vars_of_menubar();
1999 /* This calls Fmake_glyph_internal(). */
2000 #ifdef HAVE_SCROLLBARS
2001 complex_vars_of_scrollbar();
2004 /* This calls allocate_glyph(). */
2005 complex_vars_of_frame();
2007 /* This calls Fcopy_category_table() under Mule, which calls who
2009 complex_vars_of_chartab();
2011 /* This calls set_string_char(), which (under Mule) depends on the
2012 charsets being initialized. */
2013 complex_vars_of_casetab();
2015 /* This calls Fcopy_syntax_table(), which relies on char tables. */
2016 complex_vars_of_syntax();
2018 /* This initializes buffer-local variables, sets things up so
2019 that buffers can be created, and creates a couple of basic
2020 buffers. This depends on Vstandard_syntax_table and
2021 Vstandard_category_table (initialized in the previous
2022 functions), as well as a whole horde of variables that may
2023 have been initialized above. */
2024 complex_vars_of_buffer();
2026 /* This initializes console-local variables. */
2027 complex_vars_of_console();
2029 /* This creates a couple more buffers, and depends on the
2030 previous function. */
2031 complex_vars_of_minibuf();
2033 /* These two might call Ffile_name_as_directory(), which
2034 might depend on all sorts of things; I'm not sure. */
2035 complex_vars_of_emacs();
2037 /* This creates a couple of basic keymaps and depends on Lisp
2038 hash tables and Ffset() (both of which depend on some variables
2039 initialized in the vars_of_*() section) and possibly other
2041 complex_vars_of_keymap();
2043 /* Calls make_lisp_hash_table() and creates a keymap */
2044 complex_vars_of_event_stream();
2046 #ifdef ERROR_CHECK_GC
2048 extern int always_gc;
2049 if (always_gc) /* purification debugging hack */
2050 garbage_collect_1();
2054 } else if (!restart) { /* after successful pdump_load() */
2055 reinit_alloc_once_early();
2056 reinit_symbols_once_early();
2057 reinit_opaque_once_early();
2059 reinit_console_type_create_stream();
2061 reinit_console_type_create_tty();
2063 #ifdef HAVE_X_WINDOWS
2064 reinit_console_type_create_x();
2065 reinit_console_type_create_device_x();
2068 reinit_specifier_type_create();
2069 reinit_specifier_type_create_image();
2070 reinit_specifier_type_create_gutter();
2071 reinit_specifier_type_create_objects();
2072 #ifdef HAVE_TOOLBARS
2073 reinit_specifier_type_create_toolbar();
2076 structure_type_create();
2078 structure_type_create_chartab();
2079 structure_type_create_faces();
2080 structure_type_create_rangetab();
2081 structure_type_create_hash_table();
2083 lstream_type_create();
2085 lstream_type_create_file_coding();
2087 #ifdef HAVE_UNIX_PROCESSES
2088 process_type_create_unix();
2091 reinit_vars_of_buffer();
2092 reinit_vars_of_console();
2093 #ifdef DEBUG_SXEMACS
2094 reinit_vars_of_debug();
2096 reinit_vars_of_device();
2097 reinit_vars_of_eval();
2098 #ifdef HAVE_X_WINDOWS
2099 reinit_vars_of_event_Xt();
2101 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
2102 reinit_vars_of_event_tty();
2104 reinit_vars_of_event_stream();
2105 #ifdef EF_USE_ASYNEQ
2106 reinit_vars_of_worker_asyneq();
2108 reinit_vars_of_events();
2109 reinit_vars_of_extents();
2110 reinit_vars_of_fileio();
2111 reinit_vars_of_font_lock();
2112 reinit_vars_of_glyphs();
2113 reinit_vars_of_glyphs_widget();
2114 reinit_vars_of_insdel();
2115 reinit_vars_of_lread();
2116 reinit_vars_of_lstream();
2117 reinit_vars_of_minibuf();
2118 reinit_vars_of_dynacat();
2119 #if defined WITH_EMODULES && defined HAVE_EMODULES && 0
2120 reinit_vars_of_module();
2121 #elif defined WITH_EMODULES && defined HAVE_EMODULES
2122 reinit_vars_of_emodng();
2124 reinit_vars_of_objects();
2125 reinit_vars_of_print();
2126 reinit_vars_of_search();
2127 reinit_vars_of_undo();
2128 reinit_vars_of_window();
2130 #ifdef HAVE_X_WINDOWS
2131 reinit_vars_of_device_x();
2132 #ifdef HAVE_SCROLLBARS
2133 reinit_vars_of_scrollbar_x();
2135 #ifdef HAVE_MENUBARS
2136 reinit_vars_of_menubar_x();
2138 reinit_vars_of_select_x();
2139 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
2140 reinit_vars_of_gui_x();
2142 #endif /* HAVE_X_WINDOWS */
2144 #if defined(MULE) && defined(HAVE_WNN)
2145 reinit_vars_of_mule_wnn();
2148 reinit_complex_vars_of_buffer();
2149 reinit_complex_vars_of_console();
2150 reinit_complex_vars_of_minibuf();
2153 reinit_vars_of_ffi();
2156 #if defined USE_STATIC_ASE && USE_STATIC_ASE
2157 reinit_vars_of_ase();
2163 /* the category subsystem needs some inits */
2168 /* CONGRATULATIONS!!! We have successfully initialized the Lisp
2172 /* Stuff that should not be done at dump time, including stuff that
2173 needs to be reset at run time. Order below should not matter.
2175 Many initializations taken from the environment should go here. */
2179 reinit_mule_category();
2181 #ifdef HAVE_POSTGRESQL
2182 init_postgresql_from_environment();
2186 /* Now do further initialization/setup of stuff that is not needed by the
2187 syms_of_() routines. This involves stuff that only is enabled in
2188 an interactive run (redisplay, user input, etc.) and stuff that is
2189 not needed until we start loading Lisp code (the reader). A lot
2190 of this stuff involves querying the current environment and needs
2191 to be done both at dump time and at run time. */
2193 /* user-packages-topdir (early-packages) */
2195 Vuser_packages_topdir = Qnil;
2197 Vuser_packages_topdir = Ffile_name_as_directory
2198 (build_string(user_pkgd));
2201 init_initial_directory(); /* get the directory to use for the
2202 "*scratch*" buffer, etc. */
2204 init_callproc(); /* Set up the process environment (so that egetenv
2205 works), the basic directory variables
2206 (exec-directory and so on), and stuff
2207 related to subprocesses. This should be
2208 first because many of the functions below
2209 call egetenv() to get environment variables. */
2210 init_lread(); /* Set up the Lisp reader. */
2211 init_cmdargs(argc, (Extbyte **) argv, skip_args); /* Create list Vcommand_line_args */
2212 init_buffer(); /* Set default directory of *scratch* buffer */
2214 init_redisplay(); /* Determine terminal type.
2215 init_sys_modes uses results */
2217 init_event_stream(); /* Set up so we can get user input. */
2218 init_macros(); /* set up so we can run macros. */
2219 init_editfns(); /* Determine the name of the user we're running as */
2220 init_sxemacs_process(); /* set up for calling subprocesses */
2222 #ifdef WITH_NUMBER_TYPES
2223 /* Set up bignums, ratios, bigfloats, complex numbers.
2224 * This must be done before the Lisp reader is set up.
2230 init_sunpro(); /* Set up Sunpro usage tracking */
2232 #if defined (HAVE_NATIVE_SOUND) && defined (hp9000s800) && 0
2238 init_console_stream(restart); /* Create the first console */
2240 /* try to get the actual pathname of the exec file we are running */
2242 Vinvocation_name = Fcar(Vcommand_line_args);
2243 if (XSTRING_DATA(Vinvocation_name)[0] == '-') {
2244 /* SXEmacs as a login shell, oh goody! */
2245 Vinvocation_name = build_string(getenv("SHELL"));
2247 Vinvocation_directory = Vinvocation_name;
2249 if (!NILP(Ffile_name_directory(Vinvocation_name))) {
2250 /* invocation-name includes a directory component -- presumably it
2251 is relative to cwd, not $PATH */
2252 Vinvocation_directory =
2253 Fexpand_file_name(Vinvocation_name, Qnil);
2254 Vinvocation_path = Qnil;
2256 Vinvocation_path = decode_env_path("PATH", NULL);
2257 locate_file(Vinvocation_path, Vinvocation_name,
2258 Vlisp_EXEC_SUFFIXES,
2259 &Vinvocation_directory, X_OK);
2262 if (NILP(Vinvocation_directory))
2263 Vinvocation_directory = Vinvocation_name;
2265 /* kick double /s as we want a standard posix name */
2266 for (unsigned char *p = XSTRING_DATA(Vinvocation_name),
2267 *q = p; ((*q = *p));) {
2269 while (*++p == '/');
2276 Ffile_name_nondirectory(Vinvocation_directory);
2277 Vinvocation_directory =
2278 Ffile_name_directory(Vinvocation_directory);
2281 #if defined (LOCALTIME_CACHE) && defined (HAVE_TZSET)
2282 /* sun's localtime() has a bug. it caches the value of the time
2283 zone rather than looking it up every time. Since localtime() is
2284 called to bolt the undumping time into the undumped emacs, this
2285 results in localtime() ignoring the TZ environment variable.
2286 This flushes the new TZ value into localtime(). */
2288 #endif /* LOCALTIME_CACHE and TZSET */
2292 /* Handle -l loadup-and-dump, args passed by Makefile. */
2293 if (argc > 2 + skip_args && !strcmp(argv[1 + skip_args], "-l"))
2294 load_me = build_string(argv[2 + skip_args]);
2296 /* CANNOT_DUMP - this can never be right in SXEmacs --andyp */
2297 /* Unless next switch is -nl, load "loadup.el" first thing. */
2299 (argc > 1 + skip_args
2300 && !strcmp(argv[1 + skip_args], "-nl")))
2301 load_me = build_string("loadup.el");
2302 #endif /* CANNOT_DUMP */
2306 quantify_start_recording_data();
2307 #endif /* QUANTIFY */
2310 inhibit_non_essential_printing_operations = 0;
2312 /* This never returns. */
2313 initial_command_loop(load_me);
2317 /* Sort the args so we can find the most important ones
2318 at the beginning of argv. */
2320 /* First, here's a table of all the standard options. */
2322 struct standard_args {
2324 const char *longname;
2329 static const struct standard_args standard_args[] = {
2330 /* Handled by main_1 above: */
2331 {"--make-docfile", 0, 105, 0},
2332 {"-sd", "--show-dump-id", 105, 0},
2333 {"-t", "--terminal", 100, 1},
2334 {"-nd", "--no-dump-file", 95, 0},
2335 {"-ct", "--color-terminal", 92, 0},
2336 {"-nw", "--no-windows", 90, 0},
2337 {"-batch", "--batch", 85, 0},
2338 {"-debug-paths", "--debug-paths", 82, 0},
2339 {"-help", "--help", 80, 0},
2340 {"-version", "--version", 75, 0},
2342 {"-d", "--display", 80, 1},
2343 {"-display", 0, 80, 1},
2344 {"-NXHost", 0, 79, 0},
2345 {"-MachLaunch", 0, 79, 0},
2347 /* Handled by command-line-early in startup.el: */
2348 {"-q", "--no-init-file", 50, 0},
2349 {"-unmapped", 0, 50, 0},
2350 {"-no-init-file", 0, 50, 0},
2351 {"-vanilla", "--vanilla", 50, 0},
2352 {"-no-autoloads", "--no-autoloads", 50, 0},
2353 {"-no-site-file", "--no-site-file", 40, 0},
2354 {"-no-early-packages", "--no-early-packages", 35, 0},
2355 /* -user-pkgs-directory is actually handled in main_1() and
2356 not in startup.el. It is listed here because of the
2357 priority given to this arg. */
2358 {"-user-pkgs-directory", "--user-pkgs-directory", 30, 1},
2359 {"-u", "--user", 30, 1},
2360 {"-user", 0, 30, 1},
2361 {"-debug-init", "--debug-init", 20, 0},
2362 {"-debug-paths", "--debug-paths", 20, 0},
2365 {"-i", "--icon-type", 15, 0},
2366 {"-itype", 0, 15, 0},
2367 {"-iconic", "--iconic", 15, 0},
2368 {"-bg", "--background-color", 10, 1},
2369 {"-background", 0, 10, 1},
2370 {"-fg", "--foreground-color", 10, 1},
2371 {"-foreground", 0, 10, 1},
2372 {"-bd", "--border-color", 10, 1},
2373 {"-bw", "--border-width", 10, 1},
2374 {"-ib", "--internal-border", 10, 1},
2375 {"-ms", "--mouse-color", 10, 1},
2376 {"-cr", "--cursor-color", 10, 1},
2377 {"-fn", "--font", 10, 1},
2378 {"-font", 0, 10, 1},
2379 {"-g", "--geometry", 10, 1},
2380 {"-geometry", 0, 10, 1},
2381 {"-T", "--title", 10, 1},
2382 {"-title", 0, 10, 1},
2383 {"-name", "--name", 10, 1},
2384 {"-xrm", "--xrm", 10, 1},
2385 {"-r", "--reverse-video", 5, 0},
2387 {"-reverse", 0, 5, 0},
2388 {"-hb", "--horizontal-scroll-bars", 5, 0},
2389 {"-vb", "--vertical-scroll-bars", 5, 0},
2391 /* These have the same priority as ordinary file name args,
2392 so they are not reordered with respect to those. */
2393 {"-L", "--directory", 0, 1},
2394 {"-directory", 0, 0, 1},
2395 {"-l", "--load", 0, 1},
2397 {"-f", "--funcall", 0, 1},
2398 {"-funcall", 0, 0, 1},
2399 {"-eval", "--eval", 0, 1},
2400 {"-insert", "--insert", 0, 1},
2401 /* This should be processed after ordinary file name args and the like. */
2402 {"-kill", "--kill", -10, 0},
2405 /* Reorder the elements of ARGV (assumed to have ARGC elements)
2406 so that the highest priority ones come first.
2407 Do not change the order of elements of equal priority.
2408 If an option takes an argument, keep it and its argument together. */
2410 static void sort_args(int argc, char **argv)
2412 char **new_argv = (char**)malloc(sizeof(char*) * argc);
2413 /* For each element of argv,
2414 the corresponding element of options is:
2415 0 for an option that takes no arguments,
2416 1 for an option that takes one argument, etc.
2417 -1 for an ordinary non-option argument. */
2418 int *options = (int*)malloc(sizeof(int) * argc);
2419 int *priority = (int*)malloc(sizeof(int) * argc);
2423 int end_of_options_p = 0;
2425 /* Categorize all the options,
2426 and figure out which argv elts are option arguments. */
2427 for (from = 1; from < argc; from++) {
2430 /* Pseudo options "--" and "run-temacs" indicate end of
2432 if (!strcmp(argv[from], "--") ||
2433 !strcmp(argv[from], "run-temacs"))
2434 end_of_options_p = 1;
2435 if (!end_of_options_p && argv[from][0] == '-') {
2439 /* Look for a match with a known old-fashioned
2441 for (i = 0; i < countof(standard_args); i++) {
2442 if (!strcmp(argv[from],
2443 standard_args[i].name)) {
2444 options[from] = standard_args[i].nargs;
2446 standard_args[i].priority;
2447 if (from + standard_args[i].nargs >=
2449 fatal("Option `%s' requires "
2453 from += standard_args[i].nargs;
2458 /* Look for a match with a known long option. MATCH is
2459 -1 if no match so far, -2 if two or more matches so
2461 >= 0 (the table index of the match) if just one match
2463 if (argv[from][1] == '-') {
2465 thislen = strlen(argv[from]);
2466 equals = strchr(argv[from], '=');
2468 thislen = equals - argv[from];
2470 for (i = 0; i < countof(standard_args); i++)
2471 if (standard_args[i].longname
2472 && !strncmp(argv[from],
2474 longname, thislen)) {
2481 /* If we found exactly one match, use that. */
2484 standard_args[match].nargs;
2486 standard_args[match].priority;
2487 /* If --OPTION=VALUE syntax is used,
2488 this option uses just one argv
2492 if (from + options[from] >= argc) {
2493 fatal("Option `%s' requires "
2497 from += options[from];
2505 /* Copy the arguments, in order of decreasing priority, to NEW_ARGV. */
2506 new_argv[0] = argv[0];
2509 int best_priority = -9999;
2511 /* Find the highest priority remaining option.
2512 If several have equal priority, take the first of them. */
2513 for (from = 1; from < argc; from++) {
2514 if (argv[from] != 0 && priority[from] > best_priority) {
2515 best_priority = priority[from];
2518 /* Skip option arguments--they are tied to the options. */
2519 if (options[from] > 0) {
2520 from += options[from];
2528 /* Copy the highest priority remaining option, with its args, to
2530 new_argv[to++] = argv[best];
2531 for (i = 0; i < options[best]; i++) {
2532 new_argv[to++] = argv[best + i + 1];
2534 /* Clear out this option in ARGV. */
2536 for (i = 0; i < options[best]; i++) {
2537 argv[best + i + 1] = 0;
2541 memcpy(argv, new_argv, sizeof(char *) * argc);
2548 DEFUN("running-temacs-p", Frunning_temacs_p, 0, 0, 0, /*
2549 True if running temacs. This means we are in the dumping stage.
2550 This is false during normal execution of the `sxemacs' program, and
2551 becomes false once `run-emacs-from-temacs' is run.
2555 return run_temacs_argc >= 0 ? Qt : Qnil;
2558 DEFUN("run-emacs-from-temacs", Frun_emacs_from_temacs, 0, MANY, 0, /*
2559 Do not call this. It will reinitialize your SXEmacs. You'll be sorry.
2561 /* If this function is called from startup.el, it will be possible to run
2562 temacs as an editor using 'temacs -batch -l loadup.el run-temacs', instead
2563 of having to dump an emacs and then run that (when debugging emacs itself,
2564 this can be much faster)). [Actually, the speed difference isn't that
2565 much as long as your filesystem is local, and you don't end up with
2566 a dumped version in case you want to rerun it. This function is most
2567 useful when used as part of the `make all-elc' command. --ben]
2568 This will "restart" emacs with the specified command-line arguments.
2570 Martin thinks this function is most useful when using debugging
2571 tools like Purify or tcov that get confused by SXEmacs' dumping. */
2572 (int nargs, Lisp_Object * args))
2575 const Extbyte *wampum = NULL;
2578 Lisp_Object orig_invoc_name = Fcar(Vcommand_line_args);
2579 const Extbyte **wampum_all = alloca_array(const Extbyte *, nargs);
2580 int *wampum_all_len = alloca_array(int, nargs);
2582 assert(!gc_in_progress);
2584 if (run_temacs_argc < 0)
2585 error("I've lost my temacs-hood.");
2587 /* Need to convert the orig_invoc_name and all of the arguments
2588 to external format. */
2590 TO_EXTERNAL_FORMAT(LISP_STRING, orig_invoc_name,
2591 ALLOCA, (wampum, namesize), Qnative);
2592 if ( wampum == NULL )
2593 error("Could not transcode invocation name");
2597 for (ac = 0, total_len = namesize; ac < nargs; ac++) {
2598 CHECK_STRING(args[ac]);
2599 wampum_all[ac]=NULL;
2600 TO_EXTERNAL_FORMAT(LISP_STRING, args[ac],
2601 ALLOCA, (wampum_all[ac], wampum_all_len[ac]),
2603 if(wampum_all[ac]==NULL) {
2604 error("Could not transcode arguments");
2606 wampum_all_len[ac]++;
2607 total_len += wampum_all_len[ac];
2609 DO_REALLOC(run_temacs_args, run_temacs_args_size, total_len, char);
2610 DO_REALLOC(run_temacs_argv, run_temacs_argv_size, nargs + 2, char *);
2612 memcpy(run_temacs_args, wampum, namesize);
2613 run_temacs_argv[0] = run_temacs_args;
2614 for (ac = 0; ac < nargs; ac++) {
2615 memcpy(run_temacs_args + namesize,
2616 wampum_all[ac], wampum_all_len[ac]);
2617 run_temacs_argv[ac + 1] = run_temacs_args + namesize;
2618 namesize += wampum_all_len[ac];
2620 run_temacs_argv[nargs + 1] = 0;
2621 catchlist = NULL; /* Important! Otherwise free_cons() calls in
2622 condition_case_unwind() may lead to GC death. */
2623 unbind_to(0, Qnil); /* this closes loadup.el */
2625 run_temacs_argc = nargs + 1;
2626 LONGJMP(run_temacs_catch, 1);
2627 return Qnil; /* not reached; warning suppression */
2630 /* defined in alloc.c */
2631 extern void init_bdwgc(void);
2635 main(int argc, char **argv, char **envp)
2637 int volatile vol_argc = argc;
2638 char **volatile vol_argv = argv;
2639 char **volatile vol_envp = envp;
2640 /* This is hairy. We need to compute where the SXEmacs binary
2641 was invoked from because temacs initialization requires it
2642 to find the lisp directories. The code that recomputes the
2643 path is guarded by the restarted flag. There are three
2644 possible paths I've found so far through this:
2646 temacs -- When running temacs for basic build stuff, the
2647 first main_1 will be the only one invoked. It must compute
2648 the path else there will be a very ugly bomb in startup.el
2649 (can't find obvious location for doc-directory
2650 data-directory, etc.).
2652 temacs w/ run-temacs on the command line -- This is run to
2653 bytecompile all the out of date dumped lisp. It will
2654 execute both of the main_1 calls and the second one must
2655 not touch the first computation because argc/argv are hosed
2656 the second time through.
2658 sxemacs -- Only the second main_1 is executed. The
2659 invocation path must computed but this only matters when
2660 running in place or when running as a login shell.
2662 As a bonus for straightening this out, SXEmacs can now be
2663 run in place as a login shell. This never used to work.
2665 As another bonus, we can now guarantee that (concat
2666 invocation-directory invocation-name) contains the filename
2667 of the SXEmacs binary we are running. This can now be used
2668 in a definite test for out of date dumped files. -slb
2674 assert(vol_argv[0] != NULL || vol_argv[0][0] != '\0');
2676 for( arg=1; arg < argc; arg++ ) {
2677 assert(vol_argv[arg] != NULL);
2679 assert(vol_argv[argc] == NULL);
2682 quantify_stop_recording_data();
2683 quantify_clear_data();
2684 #endif /* QUANTIFY */
2686 inhibit_non_essential_printing_operations = 1;
2687 suppress_early_error_handler_backtrace = 0;
2688 lim_data = 0; /* force reinitialization of this variable */
2690 /* Lisp_Object must fit in a word; check VALBITS and GCTYPEBITS */
2691 assert(sizeof(Lisp_Object) == sizeof(void *));
2693 #ifdef LINUX_SBRK_BUG
2697 /* defined in alloc.c */
2701 #ifdef DOUG_LEA_MALLOC
2702 if (mallopt(M_MMAP_MAX, 0) != 1)
2705 run_temacs_argc = 0;
2706 if (!SETJMP(run_temacs_catch)) {
2707 main_1(vol_argc, vol_argv, vol_envp, 0);
2709 /* run-emacs-from-temacs called */
2711 vol_argc = run_temacs_argc;
2712 vol_argv = run_temacs_argv;
2714 /* This makes absolutely no sense to anyone involved. There are
2715 several people using this stuff. We've compared versions on
2716 everything we can think of. We can find no difference.
2717 However, on both my systems environ is a plain old global
2718 variable initialized to zero. _environ is the one that
2719 contains pointers to the actual environment.
2721 Since we can't figure out the difference (and we're hours
2722 away from a release), this takes a very cowardly approach and
2723 is bracketed with both a system specific preprocessor test
2724 and a runtime "do you have this problem" test
2726 06/20/96 robertl@dgii.com */
2728 extern char **_environ;
2729 if ((unsigned)environ == 0)
2732 #endif /* _SCO_DS */
2735 #if defined (RUN_TIME_REMAP) && ! defined (PDUMP)
2737 /* obviously no-one uses this because where it was before initialized was
2739 run_time_remap(argv[0]);
2742 #ifdef DOUG_LEA_MALLOC
2743 if (initialized && (malloc_state_ptr != NULL)) {
2744 int rc = malloc_set_state(malloc_state_ptr);
2746 stderr_out("malloc_set_state failed, rc = %d\n",
2751 free(malloc_state_ptr);
2753 /* mmap works in glibc-2.1, glibc-2.0 (Non-Mule only)
2754 * and Linux libc5 */
2755 #if (defined(__GLIBC__) && __GLIBC_MINOR__ >= 1) || \
2756 defined(_NO_MALLOC_WARNING_) || \
2757 (defined(__GLIBC__) && __GLIBC_MINOR__ < 1 && !defined(MULE)) || \
2758 defined(DEBUG_DOUG_LEA_MALLOC)
2759 if (mallopt(M_MMAP_MAX, 0) != 1)
2766 #endif /* DOUG_LEA_MALLOC */
2768 run_temacs_argc = -1;
2770 main_1(vol_argc, vol_argv, vol_envp, restarted);
2772 return 0; /* unreached */
2776 /* Dumping apparently isn't supported by versions of GCC >= 2.8. */
2777 /* The following needs conditionalization on whether either SXEmacs or */
2778 /* various system shared libraries have been built and linked with */
2779 /* GCC >= 2.8. -slb */
2780 #if defined(GNU_MALLOC)
2781 static void voodoo_free_hook(void *mem)
2783 /* Disable all calls to free() when SXEmacs is exiting and it doesn't */
2786 #if defined __GNUC__ || defined __INTEL_COMPILER
2787 /* prototype of __free_hook varies with glibc version */
2788 (__typeof__(__free_hook))
2792 #endif /* GNU_MALLOC */
2794 DEFUN("kill-emacs", Fkill_emacs, 0, 1, "P", /*
2795 Exit the SXEmacs job and kill it. Ask for confirmation, without argument.
2796 If ARG is an integer, return ARG as the exit program code.
2797 If ARG is a string, stuff it as keyboard input.
2799 The value of `kill-emacs-hook', if not void,
2800 is a list of functions (of no args),
2801 all of which are called before SXEmacs is actually killed.
2805 /* This function can GC */
2806 struct gcpro gcpro1;
2813 if (!preparing_for_armageddon && !noninteractive)
2814 run_hook(Qkill_emacs_hook);
2816 ensure_no_quitting_from_now_on();
2818 if (!preparing_for_armageddon) {
2819 Lisp_Object concons, nextcons;
2821 /* Normally, go ahead and delete all the consoles now.
2822 Some unmentionably lame window systems (MS Wwwww...... eek,
2823 I can't even say it) don't properly clean up after themselves,
2824 and even for those that do, it might be cleaner this way.
2825 If we're going down, however, we don't do this (might
2826 be too dangerous), and if we get a crash somewhere within
2827 this loop, we'll still autosave and won't try this again. */
2829 LIST_LOOP_DELETING(concons, nextcons, Vconsole_list) {
2830 /* There is very little point in deleting the stream console.
2831 It uses stdio, which should flush any buffered output and
2832 something can only go wrong. -slb */
2833 /* I changed my mind. There's a stupid hack in close to add
2834 a trailing newline. */
2835 /*if (!CONSOLE_STREAM_P (XCONSOLE (XCAR (concons)))) */
2836 delete_console_internal(XCONSOLE(XCAR(concons)), 1, 1,
2843 shut_down_emacs(0, STRINGP(arg) ? arg : Qnil, 0);
2845 #if defined(GNU_MALLOC)
2847 #if defined __GNUC__ || defined __INTEL_COMPILER
2848 /* prototype of __free_hook varies with glibc version */
2849 (__typeof__(__free_hook))
2854 exit(INTP(arg) ? XINT(arg) : 0);
2856 return Qnil; /* I'm sick of the compiler warning */
2859 /* Perform an orderly shutdown of SXEmacs. Autosave any modified
2860 buffers, kill any child processes, clean up the terminal modes (if
2861 we're in the foreground), and other stuff like that. Don't perform
2862 any redisplay; this may be called when SXEmacs is shutting down in
2863 the background, or after its X connection has died.
2865 If SIG is a signal number, print a message for it.
2867 This is called by fatal signal handlers and Fkill_emacs. It used to
2868 be called by X protocol error handlers, but instead they now call
2870 static void shut_down_emacs(int sig, Lisp_Object stuff, int no_auto_save)
2872 /* This function can GC */
2873 /* Prevent running of hooks and other non-essential stuff
2875 preparing_for_armageddon = 1;
2877 ensure_no_quitting_from_now_on();
2880 quantify_stop_recording_data();
2881 #endif /* QUANTIFY */
2883 /* This is absolutely the most important thing to do, so make sure
2884 we do it now, before anything else. We might have crashed and
2885 be in a weird inconsistent state, and potentially anything could
2886 set off another protection fault and cause us to bail out
2888 /* Steve writes the following:
2890 [[I'm not removing the code entirely, yet. We have run up against
2891 a spate of problems in diagnosing crashes due to crashes within
2892 crashes. It has very definitely been determined that code called
2893 during auto-saving cannot work if SXEmacs crashed inside of GC.
2894 We already auto-save on an itimer so there cannot be too much
2895 unsaved stuff around, and if we get better crash reports we might
2896 be able to get more problems fixed so I'm disabling this. -slb]]
2898 and DISABLES AUTO-SAVING ENTIRELY during crashes! Way way bad idea.
2900 Instead let's just be more intelligent about avoiding crashing
2901 when possible, esp. nested crashes.
2904 Fdo_auto_save(Qt, Qnil); /* do this before anything hazardous */
2907 reset_all_consoles();
2908 if (sig && sig != SIGTERM) {
2910 stderr_out("\nFatal error.\n\n");
2912 stderr_out("\nFatal error (%d).\n\n", sig);
2914 ("Your files have been auto-saved.\n"
2915 "Use `M-x recover-session' to recover them.\n"
2917 "Your version of SXEmacs was distributed with a PROBLEMS file that may describe\n"
2918 "your crash, and with luck a workaround. Please check it first, but do report\n"
2919 "the crash anyway. "
2921 "\n\nPlease report this bug by selecting `Report-Bug' in the InfoDock menu.\n"
2922 "*BE SURE* to include the SXEmacs configuration from M-x describe-installation,\n"
2923 "or the file Installation in the top directory of the build tree.\n"
2925 "Please report this bug by invoking M-x report-sxemacs-bug,\n"
2926 "or by selecting `Send Bug Report' from the Help menu. If necessary, send\n"
2927 "ordinary email to `sxemacs-devel@sxemacs.org'. *MAKE SURE* to include the SXEmacs\n"
2928 "configuration from M-x describe-installation, or equivalently the file\n"
2929 "Installation in the top of the build tree.\n"
2933 "*Please* try *hard* to obtain a C stack backtrace; without it, we are unlikely\n"
2934 "to be able to analyze the problem. Locate the core file produced as a result\n"
2935 "of this crash (often called `core' or `core.<process-id>', and located in\n"
2936 "the directory in which you started SXEmacs or your home directory), and type\n"
2944 /* Now try to determine the actual path to the executable,
2945 to try to make the backtrace-determination process as foolproof
2947 if (STRINGP(Vinvocation_name))
2948 name = (char *)XSTRING_DATA(Vinvocation_name);
2951 if (STRINGP(Vinvocation_directory))
2953 (char *)XSTRING_DATA(Vinvocation_directory);
2954 if (!dir || dir[0] != '/')
2955 stderr_out("`which %s`", name);
2956 else if (dir[strlen(dir) - 1] != '/')
2957 stderr_out("%s/%s", dir, name);
2959 stderr_out("%s%s", dir, name);
2964 "then type `where' at the debugger prompt. "
2965 "No GDB on your system? You may\n"
2966 "have DBX, or XDB, or SDB. (Ask your system "
2967 "administrator if you need help.)\n"
2968 "If no core file was produced, enable them "
2969 "(often with `ulimit -c unlimited'\n"
2970 "in case of future recurrance of the crash.\n");
2973 stuff_buffered_input(stuff);
2975 kill_buffer_processes(Qnil);
2977 #ifdef CLASH_DETECTION
2985 #if !defined(PDUMP) || !defined(SYSTEM_MALLOC)
2986 extern char my_edata[];
2989 extern void disable_free_hook(void);
2991 DEFUN("dump-emacs", Fdump_emacs, 2, 2, 0, /*
2992 Dump current state of SXEmacs into executable file FILENAME.
2993 Take symbols from SYMFILE (presumably the file you executed to run SXEmacs).
2994 This is used in the file `loadup.el' when building SXEmacs.
2996 Remember to set `command-line-processed' to nil before dumping
2997 if you want the dumped SXEmacs to process its command line
2998 and announce itself normally when it is run.
3000 (symfile, filename))
3002 /* This function can GC */
3003 struct gcpro gcpro1, gcpro2;
3006 GCPRO2(filename, symfile);
3010 Vinvocation_directory = Vinvocation_name = Qnil;
3011 Vcommand_line_args = Qnil;
3014 #ifdef FREE_CHECKING
3017 /* When we're dumping, we can't use the debugging free() */
3018 disable_free_hook();
3021 CHECK_STRING(filename);
3022 filename = Fexpand_file_name(filename, Qnil);
3023 if (!NILP(symfile)) {
3024 CHECK_STRING(symfile);
3025 if (XSTRING_LENGTH(symfile) > 0) {
3026 symfile = Fexpand_file_name(symfile, Qnil);
3032 opurify = purify_flag;
3040 disksave_object_finalization();
3041 release_breathing_space();
3043 /* Tell malloc where start of impure now is */
3044 /* Also arrange for warnings when nearly out of space. */
3045 #ifndef SYSTEM_MALLOC
3046 memory_warnings(my_edata, malloc_warning);
3055 LISP_STRING_TO_EXTERNAL(filename, filename_ext, Qfile_name);
3057 if (STRINGP(symfile)) {
3058 LISP_STRING_TO_EXTERNAL(symfile, symfile_ext,
3064 garbage_collect_1();
3067 pdump(filename_ext);
3070 #ifdef DOUG_LEA_MALLOC
3071 malloc_state_ptr = malloc_get_state();
3073 /* here we break our rule that the filename conversion should
3074 be performed at the actual time that the system call is made.
3075 It's a whole lot easier to do the conversion here than to
3076 modify all the unexec routines to ensure that filename
3077 conversion is applied everywhere. Don't worry about memory
3078 leakage because this call only happens once. */
3079 unexec(filename_ext, symfile_ext, (uintptr_t) my_edata, 0, 0);
3080 #ifdef DOUG_LEA_MALLOC
3081 free(malloc_state_ptr);
3083 #endif /* not PDUMP */
3086 purify_flag = opurify;
3091 #endif /* not CANNOT_DUMP */
3093 /* Split STRING into a list of substrings. The substrings are the
3094 parts of original STRING separated by SEPCHAR. */
3096 split_string_by_emchar_1(const Bufbyte * string, Bytecount size, Emchar sepchar)
3098 Lisp_Object result = Qnil;
3099 const Bufbyte *end = string + size;
3102 const Bufbyte *p = string;
3104 if (charptr_emchar(p) == sepchar)
3108 result = Fcons(make_string(string, p - string), result);
3111 INC_CHARPTR(string); /* skip sepchar */
3115 return Fnreverse(result);
3118 /* The same as the above, except PATH is an external C string (it is
3119 converted using Qfile_name), and sepchar is hardcoded to SEPCHAR
3120 (':' or whatever). */
3121 Lisp_Object decode_path(/*const*/ char *path)
3123 Bytecount newlen = 0;
3124 Bufbyte *newpath = NULL;
3128 TO_INTERNAL_FORMAT(C_STRING, path, ALLOCA, (newpath, newlen),
3131 /* #### Does this make sense? It certainly does for
3132 decode_env_path(), but it looks dubious here. Does any code
3133 depend on decode_path("") returning nil instead of an empty
3135 if (!newlen || !newpath)
3138 return split_string_by_emchar_1(newpath, newlen, SEPCHAR);
3141 Lisp_Object decode_env_path(const char *evarname, /*const*/ char *default_)
3143 /*const*/ char *path = 0;
3145 path = egetenv(evarname);
3148 return decode_path(path);
3151 /* Ben thinks this function should not exist or be exported to Lisp.
3152 We use it to define split-path-string in subr.el (not!). */
3154 DEFUN("split-string-by-char", Fsplit_string_by_char, 2, 2, 0, /*
3155 Split STRING into a list of substrings originally separated by SEPCHAR.
3159 CHECK_STRING(string);
3160 CHECK_CHAR(sepchar);
3161 return split_string_by_emchar_1(XSTRING_DATA(string),
3162 XSTRING_LENGTH(string), XCHAR(sepchar));
3165 /* #### This was supposed to be in subr.el, but is used VERY early in
3166 the bootstrap process, so it goes here. Damn. */
3168 DEFUN("split-path", Fsplit_path, 1, 1, 0, /*
3169 Explode a search path into a list of strings.
3170 The path components are separated with the characters specified
3171 with `path-separator'.
3177 while (!STRINGP(Vpath_separator)
3178 || (XSTRING_CHAR_LENGTH(Vpath_separator) != 1))
3179 Vpath_separator = signal_simple_continuable_error
3180 ("`path-separator' should be set to a single-character string",
3183 return (split_string_by_emchar_1
3184 (XSTRING_DATA(path), XSTRING_LENGTH(path),
3185 charptr_emchar(XSTRING_DATA(Vpath_separator))));
3188 DEFUN("noninteractive", Fnoninteractive, 0, 0, 0, /*
3189 Non-nil return value means SXEmacs is running without interactive terminal.
3193 return noninteractive ? Qt : Qnil;
3196 #ifdef USE_ASSERTIONS
3197 static int in_assert_failed = 0;
3198 static const char *assert_failed_file = NULL;
3199 static int assert_failed_line = 0;
3200 static const char *assert_failed_expr = NULL;
3201 /* This flag is useful to define if you're under a debugger; this way, you
3202 can put a breakpoint of assert_failed() and debug multiple problems
3203 in one session without having to recompile. */
3204 static int assertions_dont_abort = 0;
3211 #undef abort /* avoid infinite #define loop... */
3214 #define enter_debugger()
3217 assert_failed(const char *file, int line, const char *expr)
3219 /* If we're already crashing, let's not crash again. This might be
3220 critical to getting auto-saving working properly. */
3221 if (fatal_error_in_progress)
3224 /* We are extremely paranoid so we sensibly deal with recursive
3225 assertion failures. */
3227 inhibit_non_essential_printing_operations = 1;
3229 if (in_assert_failed >= 4)
3231 else if (in_assert_failed == 3) {
3234 } else if (in_assert_failed == 2) {
3235 /* Not stderr_out(), which does additional things and may trigger
3236 a recursive assertion failure. fprintf was undeffed above, in
3237 case it was encapsulated. */
3239 "\n\nFatal error: recursive assertion failure, "
3240 "file %s, line %d, %s\n", file, line, expr);
3242 "Original assertion failure: file %s, line %d, %s\n",
3243 assert_failed_file, assert_failed_line,
3244 assert_failed_expr);
3247 debug_short_backtrace(0x7FFF);
3249 assert_failed_file = file;
3250 assert_failed_line = line;
3251 assert_failed_expr = expr;
3255 "\nFatal error: assertion failed, file %s, line %d, %s\n",
3259 ("\nFatal error: assertion failed, file %s, line %d, %s\n",
3265 if (! assertions_dont_abort) {
3268 inhibit_non_essential_printing_operations = 0;
3269 in_assert_failed = 0;
3271 #endif /* USE_ASSERTIONS */
3274 DEFUN("quantify-start-recording-data", Fquantify_start_recording_data, 0, 0, "", /*
3275 Start recording Quantify data.
3279 quantify_start_recording_data();
3283 DEFUN("quantify-stop-recording-data", Fquantify_stop_recording_data, 0, 0, "", /*
3284 Stop recording Quantify data.
3288 quantify_stop_recording_data();
3292 DEFUN("quantify-clear-data", Fquantify_clear_data, 0, 0, "", /*
3293 Clear all Quantify data.
3297 quantify_clear_data();
3300 #endif /* QUANTIFY */
3302 void syms_of_emacs(void)
3305 DEFSUBR(Fdump_emacs);
3306 #endif /* !CANNOT_DUMP */
3308 DEFSUBR(Frun_emacs_from_temacs);
3309 DEFSUBR(Frunning_temacs_p);
3310 DEFSUBR(Finvocation_name);
3311 DEFSUBR(Finvocation_directory);
3312 DEFSUBR(Fkill_emacs);
3313 DEFSUBR(Fnoninteractive);
3315 #ifdef DEBUG_SXEMACS
3316 DEFSUBR(Fforce_debugging_signal);
3320 DEFSUBR(Fquantify_start_recording_data);
3321 DEFSUBR(Fquantify_stop_recording_data);
3322 DEFSUBR(Fquantify_clear_data);
3323 #endif /* QUANTIFY */
3325 DEFSUBR(Fsplit_string_by_char);
3326 DEFSUBR(Fsplit_path); /* #### */
3328 defsymbol(&Qkill_emacs_hook, "kill-emacs-hook");
3329 defsymbol(&Qsave_buffers_kill_emacs, "save-buffers-kill-emacs");
3332 void vars_of_emacs(void)
3334 DEFVAR_BOOL("suppress-early-error-handler-backtrace", &suppress_early_error_handler_backtrace /*
3335 Non-nil means early error handler shouldn't print a backtrace.
3338 DEFVAR_LISP("command-line-args", &Vcommand_line_args /*
3339 Args passed by shell to SXEmacs, as a list of strings.
3342 DEFVAR_LISP("invocation-name", &Vinvocation_name /*
3343 The program name that was used to run SXEmacs.
3344 Any directory names are omitted.
3347 DEFVAR_LISP("invocation-directory", &Vinvocation_directory /*
3348 The directory in which the SXEmacs executable was found, to run it.
3349 The value is simply the program name if that directory's name is not known.
3352 DEFVAR_LISP("invocation-path", &Vinvocation_path /*
3353 The path in which the SXEmacs executable was found, to run it.
3354 The value is simply the value of environment variable PATH on startup
3355 if SXEmacs was found there.
3359 xxDEFVAR_LISP("installation-directory", &Vinstallation_directory,
3360 "A directory within which to look for the `lib-src' and `etc' directories.\n"
3361 "This is non-nil when we can't find those directories in their standard\n"
3362 "installed locations, but we can find them\n"
3363 "near where the SXEmacs executable was found.");
3366 DEFVAR_LISP("system-type", &Vsystem_type /*
3367 Symbol indicating type of operating system you are using.
3369 Vsystem_type = intern(SYSTEM_TYPE);
3370 Fprovide(intern(SYSTEM_TYPE));
3372 #ifndef EMACS_CONFIGURATION
3373 # define EMACS_CONFIGURATION "UNKNOWN"
3375 DEFVAR_LISP("system-configuration", &Vsystem_configuration /*
3376 String naming the configuration SXEmacs was built for.
3378 Vsystem_configuration = build_string(EMACS_CONFIGURATION);
3380 #ifndef EMACS_CONFIG_OPTIONS
3381 # define EMACS_CONFIG_OPTIONS "UNKNOWN"
3383 DEFVAR_LISP("system-configuration-options", &Vsystem_configuration_options /*
3384 String containing the configuration options SXEmacs was built with.
3386 Vsystem_configuration_options = build_string(EMACS_CONFIG_OPTIONS);
3388 DEFVAR_LISP("emacs-major-version", &Vemacs_major_version /*
3389 Major version number of this version of Emacs, as an integer.
3390 Warning: this variable did not exist in Emacs versions earlier than:
3394 Vemacs_major_version = make_int(EMACS_MAJOR_VERSION);
3396 DEFVAR_LISP("emacs-minor-version", &Vemacs_minor_version /*
3397 Minor version number of this version of Emacs, as an integer.
3398 Warning: this variable did not exist in Emacs versions earlier than:
3402 Vemacs_minor_version = make_int(EMACS_MINOR_VERSION);
3404 DEFVAR_LISP("emacs-patch-level", &Vemacs_patch_level /*
3405 The patch level of this version of Emacs, as an integer.
3406 The value is non-nil if this version of SXEmacs is part of a series of
3407 stable SXEmacsen, but has bug fixes applied.
3408 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
3411 #ifdef EMACS_PATCH_LEVEL
3412 Vemacs_patch_level = make_int(EMACS_PATCH_LEVEL);
3414 Vemacs_patch_level = Qnil;
3417 DEFVAR_LISP("emacs-beta-version", &Vemacs_beta_version /*
3418 Beta number of this version of Emacs, as an integer.
3419 The value is nil if this is an officially released version of SXEmacs.
3420 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
3423 #ifdef EMACS_BETA_VERSION
3424 Vemacs_beta_version = make_int(EMACS_BETA_VERSION);
3426 Vemacs_beta_version = Qnil;
3429 DEFVAR_LISP("sxemacs-git-version", &Vsxemacs_git_version /*
3430 This revision name of this SXEmacs.
3431 Warning: this variable does not exist in FSF Emacs or XEmacs.
3434 Vsxemacs_git_version = build_string(SXEMACS_GIT_VERSION);
3437 DEFVAR_LISP("infodock-major-version", &Vinfodock_major_version /*
3438 Major version number of this InfoDock release.
3440 Vinfodock_major_version = make_int(INFODOCK_MAJOR_VERSION);
3442 DEFVAR_LISP("infodock-minor-version", &Vinfodock_minor_version /*
3443 Minor version number of this InfoDock release.
3445 Vinfodock_minor_version = make_int(INFODOCK_MINOR_VERSION);
3447 DEFVAR_LISP("infodock-build-version", &Vinfodock_build_version /*
3448 Build version of this InfoDock release.
3450 Vinfodock_build_version = make_int(INFODOCK_BUILD_VERSION);
3453 DEFVAR_LISP("sxemacs-codename", &Vsxemacs_codename /*
3454 Codename of this version of SXEmacs (a string).
3456 #ifndef SXEMACS_CODENAME
3457 #define SXEMACS_CODENAME "Noname"
3459 Vsxemacs_codename = build_string(SXEMACS_CODENAME);
3461 /* Lisp variables which contain command line flags.
3463 The portable dumper stomps on these; they must be saved and restored
3464 if they are processed before the call to pdump_load() in main_1().
3466 DEFVAR_BOOL("noninteractive", &noninteractive1 /*
3467 Non-nil means SXEmacs is running without interactive terminal.
3470 DEFVAR_BOOL("inhibit-early-packages", &inhibit_early_packages /*
3471 Set to non-nil when the early packages should not be respected at startup.
3473 DEFVAR_BOOL("warn-early-package-shadows", &warn_early_package_shadows /*
3474 Set to non-nil when the early packages should not shadow late packages. Issues
3475 warning at startup when that happens.
3477 warn_early_package_shadows = 0;
3479 DEFVAR_BOOL("inhibit-autoloads", &inhibit_autoloads /*
3480 Set to non-nil when autoloads should not be loaded at startup.
3483 DEFVAR_BOOL("debug-paths", &debug_paths /*
3484 Set to non-nil when debug information about paths should be printed.
3487 DEFVAR_BOOL("inhibit-site-modules", &inhibit_site_modules /*
3488 Set to non-nil when site-modules should not be searched at startup.
3490 #ifdef INHIBIT_SITE_MODULES
3491 inhibit_site_modules = 1;
3494 DEFVAR_LISP("user-packages-topdir", &Vuser_packages_topdir /*
3495 Top of the user's local package hierarchy.
3496 This is normally computed at run-time, but may be set via the
3497 `-user-pkgs-directory' command line argument.
3500 DEFVAR_INT("emacs-priority", &emacs_priority /*
3501 Priority for SXEmacs to run at.
3502 This value is effective only if set before SXEmacs is dumped,
3503 and only if the SXEmacs executable is installed with setuid to permit
3504 it to change priority. (SXEmacs sets its uid back to the real uid.)
3505 Currently, you need to define SET_EMACS_PRIORITY in `config.h'
3506 before you compile SXEmacs, to enable the code for this feature.
3510 DEFVAR_CONST_LISP("internal-error-checking", &Vinternal_error_checking /*
3511 Internal error checking built-in into this instance of SXEmacs.
3512 This is a list of symbols, initialized at build-time. Legal symbols
3514 extents - check extents prior to each extent change;
3515 typecheck - check types strictly, aborting in case of error;
3516 malloc - check operation of malloc;
3517 gc - check garbage collection;
3518 bufpos - check buffer positions.
3519 quick-build - user has requested the "quick-build" configure option.
3521 Vinternal_error_checking = Qnil;
3522 #ifdef ERROR_CHECK_EXTENTS
3523 Vinternal_error_checking = Fcons(intern("extents"),
3524 Vinternal_error_checking);
3526 #ifdef ERROR_CHECK_TYPECHECK
3527 Vinternal_error_checking = Fcons(intern("typecheck"),
3528 Vinternal_error_checking);
3530 #ifdef ERROR_CHECK_MALLOC
3531 Vinternal_error_checking = Fcons(intern("malloc"),
3532 Vinternal_error_checking);
3534 #ifdef ERROR_CHECK_GC
3535 Vinternal_error_checking = Fcons(intern("gc"),
3536 Vinternal_error_checking);
3538 #ifdef ERROR_CHECK_BUFPOS
3539 Vinternal_error_checking = Fcons(intern("bufpos"),
3540 Vinternal_error_checking);
3543 Vinternal_error_checking = Fcons(intern("quick-build"),
3544 Vinternal_error_checking);
3547 DEFVAR_CONST_LISP("mail-lock-methods", &Vmail_lock_methods /*
3548 Mail spool locking methods supported by this instance of SXEmacs.
3549 This is a list of symbols. Each of the symbols is one of the
3550 following: dot, lockf, flock, locking, mmdf.
3553 Vmail_lock_methods = Qnil;
3554 Vmail_lock_methods = Fcons(intern("dot"), Vmail_lock_methods);
3556 Vmail_lock_methods = Fcons(intern("lockf"), Vmail_lock_methods);
3559 Vmail_lock_methods = Fcons(intern("flock"), Vmail_lock_methods);
3562 Vmail_lock_methods = Fcons(intern("mmdf"), Vmail_lock_methods);
3565 Vmail_lock_methods =
3566 Fcons(intern("locking"), Vmail_lock_methods);
3570 DEFVAR_CONST_LISP("configure-mail-lock-method", &Vconfigure_mail_lock_method /*
3571 Mail spool locking method suggested by configure. This is one
3572 of the symbols in MAIL-LOCK-METHODS.
3575 #if defined(MAIL_LOCK_FLOCK) && defined(HAVE_FLOCK)
3576 Vconfigure_mail_lock_method = intern("flock");
3577 #elif defined(MAIL_LOCK_LOCKF) && defined(HAVE_LOCKF)
3578 Vconfigure_mail_lock_method = intern("lockf");
3579 #elif defined(MAIL_LOCK_MMDF) && defined(HAVE_MMDF)
3580 Vconfigure_mail_lock_method = intern("mmdf");
3581 #elif defined(MAIL_LOCK_LOCKING) && defined(HAVE_LOCKING)
3582 Vconfigure_mail_lock_method = intern("locking");
3584 Vconfigure_mail_lock_method = intern("dot");
3588 DEFVAR_LISP("path-separator", &Vpath_separator /*
3589 The directory separator in search paths, as a string.
3593 Vpath_separator = make_string((Bufbyte *) & c, 1);
3597 void complex_vars_of_emacs(void)
3599 /* This is all related to path searching. */
3601 DEFVAR_LISP("emacs-program-name", &Vemacs_program_name /*
3602 *Name of the Emacs variant.
3603 For example, this may be \"sxemacs\" or \"infodock\".
3604 This is mainly meant for use in path searching.
3606 Vemacs_program_name = build_string((char *)PATH_PROGNAME);
3608 DEFVAR_LISP("emacs-program-version", &Vemacs_program_version /*
3609 *Version of the Emacs variant.
3610 This typically has the form NN.NN-bNN.
3611 This is mainly meant for use in path searching.
3613 Vemacs_program_version = build_string((char *)PATH_VERSION);
3615 DEFVAR_LISP("exec-path", &Vexec_path /*
3616 *List of directories to search programs to run in subprocesses.
3617 Each element is a string (directory name) or nil (try default directory).
3621 DEFVAR_LISP("exec-directory", &Vexec_directory /*
3622 *Directory of architecture-dependent files that come with SXEmacs,
3623 especially executable programs intended for SXEmacs to invoke.
3625 Vexec_directory = Qnil;
3627 DEFVAR_LISP("configure-exec-directory", &Vconfigure_exec_directory /*
3628 For internal use by the build procedure only.
3629 configure's idea of what `exec-directory' will be.
3632 Vconfigure_exec_directory = Ffile_name_as_directory
3633 (build_string((char *)PATH_EXEC));
3635 Vconfigure_exec_directory = Qnil;
3638 DEFVAR_LISP("lisp-directory", &Vlisp_directory /*
3639 *Directory of core Lisp files that come with SXEmacs.
3641 Vlisp_directory = Qnil;
3643 DEFVAR_LISP("configure-lisp-directory", &Vconfigure_lisp_directory /*
3644 For internal use by the build procedure only.
3645 configure's idea of what `lisp-directory' will be.
3647 #ifdef PATH_LOADSEARCH
3648 Vconfigure_lisp_directory = Ffile_name_as_directory
3649 (build_string((char *)PATH_LOADSEARCH));
3651 Vconfigure_lisp_directory = Qnil;
3654 DEFVAR_LISP("mule-lisp-directory", &Vmule_lisp_directory /*
3655 *Directory of Mule Lisp files that come with SXEmacs.
3657 Vmule_lisp_directory = Qnil;
3659 DEFVAR_LISP("configure-mule-lisp-directory", &Vconfigure_mule_lisp_directory /*
3660 For internal use by the build procedure only.
3661 configure's idea of what `mule-lisp-directory' will be.
3663 #ifdef PATH_MULELOADSEARCH
3664 Vconfigure_mule_lisp_directory = Ffile_name_as_directory
3665 (build_string((char *)PATH_MULELOADSEARCH));
3667 Vconfigure_mule_lisp_directory = Qnil;
3670 DEFVAR_LISP("module-directory", &Vmodule_directory /*
3671 *Directory of core dynamic modules that come with SXEmacs.
3673 Vmodule_directory = Qnil;
3675 DEFVAR_LISP("configure-module-directory", &Vconfigure_module_directory /*
3676 For internal use by the build procedure only.
3677 configure's idea of what `module-directory' will be.
3679 #ifdef PATH_MODULESEARCH
3680 Vconfigure_module_directory = Ffile_name_as_directory
3681 (build_string((char *)PATH_MODULESEARCH));
3683 Vconfigure_module_directory = Qnil;
3686 DEFVAR_LISP("configure-package-path", &Vconfigure_package_path /*
3687 For internal use by the build procedure only.
3688 configure's idea of what the package path will be.
3690 #ifdef PATH_PACKAGEPATH
3691 Vconfigure_package_path = decode_path(PATH_PACKAGEPATH);
3693 Vconfigure_package_path = Qnil;
3696 DEFVAR_LISP("data-directory", &Vdata_directory /*
3697 *Directory of architecture-independent files that come with SXEmacs,
3698 intended for SXEmacs to use.
3699 Use of this variable in new code is almost never correct. See the
3700 functions `locate-data-file' and `locate-data-directory' and the variable
3701 `data-directory-list'.
3703 Vdata_directory = Qnil;
3705 DEFVAR_LISP("configure-data-directory", &Vconfigure_data_directory /*
3706 For internal use by the build procedure only.
3707 configure's idea of what `data-directory' will be.
3710 Vconfigure_data_directory = Ffile_name_as_directory
3711 (build_string((char *)PATH_DATA));
3713 Vconfigure_data_directory = Qnil;
3716 DEFVAR_LISP("data-directory-list", &Vdata_directory_list /*
3717 *List of directories of architecture-independent files that come with SXEmacs
3718 or were installed as packages, and are intended for SXEmacs to use.
3720 Vdata_directory_list = Qnil;
3722 DEFVAR_LISP("site-module-directory", &Vsite_module_directory /*
3723 *Directory of site-specific loadable modules that come with SXEmacs.
3725 Vsite_module_directory = Qnil;
3727 DEFVAR_LISP("configure-site-module-directory", &Vconfigure_site_module_directory /*
3728 For internal use by the build procedure only.
3729 configure's idea of what `site-directory' will be.
3731 #ifdef PATH_SITE_MODULES
3732 Vconfigure_site_module_directory = Ffile_name_as_directory
3733 (build_string((char *)PATH_SITE_MODULES));
3735 Vconfigure_site_module_directory = Qnil;
3738 DEFVAR_LISP("doc-directory", &Vdoc_directory /*
3739 *Directory containing the DOC file that comes with SXEmacs.
3740 This is usually the same as `exec-directory'.
3742 Vdoc_directory = Qnil;
3744 DEFVAR_LISP("configure-doc-directory", &Vconfigure_doc_directory /*
3745 For internal use by the build procedure only.
3746 configure's idea of what `doc-directory' will be.
3749 Vconfigure_doc_directory = Ffile_name_as_directory
3750 (build_string((char *)PATH_DOC));
3752 Vconfigure_doc_directory = Qnil;
3755 DEFVAR_LISP("configure-exec-prefix-directory", &Vconfigure_exec_prefix_directory /*
3756 For internal use by the build procedure only.
3757 configure's idea of what `exec-prefix-directory' will be.
3759 #ifdef PATH_EXEC_PREFIX
3760 Vconfigure_exec_prefix_directory = Ffile_name_as_directory
3761 (build_string((char *)PATH_EXEC_PREFIX));
3763 Vconfigure_exec_prefix_directory = Qnil;
3766 DEFVAR_LISP("configure-prefix-directory", &Vconfigure_prefix_directory /*
3767 For internal use by the build procedure only.
3768 configure's idea of what `prefix-directory' will be.
3771 Vconfigure_prefix_directory = Ffile_name_as_directory
3772 (build_string((char *)PATH_PREFIX));
3774 Vconfigure_prefix_directory = Qnil;
3777 DEFVAR_LISP("configure-info-directory", &Vconfigure_info_directory /*
3778 For internal use by the build procedure only.
3779 This is the name of the directory in which the build procedure installed
3780 Emacs's info files; the default value for Info-default-directory-list
3784 Vconfigure_info_directory =
3785 Ffile_name_as_directory(build_string(PATH_INFO));
3787 Vconfigure_info_directory = Qnil;
3790 DEFVAR_LISP("configure-info-path", &Vconfigure_info_path /*
3791 The configured initial path for info documentation.
3793 #ifdef PATH_INFOPATH
3794 Vconfigure_info_path = decode_path(PATH_INFOPATH);
3796 Vconfigure_info_path = Qnil;
3800 #if defined(__sgi) && !defined(PDUMP)
3801 /* This is so tremendously ugly I'd puke. But then, it works.
3802 * The target is to override the static constructor from the
3803 * libiflPNG.so library which is masquerading as libz, and
3804 * cores on us when re-started from the dumped executable.
3805 * This will have to go for 21.1 -- OG.
3807 void __sti__iflPNGFile_c___(void);
3808 void __sti__iflPNGFile_c___(void)