1 /* XEmacs -- Fully extensible Emacs, running on Unix and other platforms.
2 Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994
3 Free Software Foundation, Inc.
4 Copyright (C) 1995 Sun Microsystems, Inc.
6 This file is part of XEmacs.
8 XEmacs is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with XEmacs; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
23 /* Synched up with: Mule 2.0, FSF 19.28. */
25 /* Note: It is necessary to specify <config.h> and not "config.h" in
26 order for the --srcdir type of compilation to work properly.
27 Otherwise the config.h from the srcdir, rather than the one from
28 the build dir, will be used. */
33 #include "backtrace.h" /* run-emacs-from-temacs needs this */
38 #include "redisplay.h"
42 #include "syssignal.h" /* Always include before systty.h */
55 #if defined (HAVE_LOCALE_H) && \
56 (defined (I18N2) || defined (I18N3) || defined (I18N4))
64 #if defined (WINDOWSNT)
72 void report_sheap_usage (int die_if_pure_storage_exceeded);
75 #if !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
76 extern void *(*__malloc_hook)(size_t);
77 extern void *(*__realloc_hook)(void *, size_t);
78 extern void (*__free_hook)(void *);
79 #endif /* not SYSTEM_MALLOC && not DOUG_LEA_MALLOC */
81 /* Command line args from shell, as list of strings */
82 Lisp_Object Vcommand_line_args;
84 /* Set nonzero after XEmacs has started up the first time.
85 Prevents reinitialization of the Lisp world and keymaps
86 on subsequent starts. */
89 #ifdef DOUG_LEA_MALLOC
91 /* Preserves a pointer to the memory allocated that copies that
92 static data inside glibc's malloc. */
93 static void *malloc_state_ptr;
94 #endif /* DOUG_LEA_MALLOC */
97 void r_alloc_reinit (void);
100 /* Variable whose value is symbol giving operating system type. */
101 Lisp_Object Vsystem_type;
103 /* Variable whose value is string giving configuration built for. */
104 Lisp_Object Vsystem_configuration;
106 /* Variable whose value is string containing the configuration options
107 XEmacs was built with. */
108 Lisp_Object Vsystem_configuration_options;
110 /* Version numbers and strings */
111 Lisp_Object Vemacs_major_version;
112 Lisp_Object Vemacs_minor_version;
113 Lisp_Object Vemacs_patch_level;
114 Lisp_Object Vemacs_beta_version;
115 Lisp_Object Vxemacs_codename;
117 Lisp_Object Vinfodock_major_version;
118 Lisp_Object Vinfodock_minor_version;
119 Lisp_Object Vinfodock_build_version;
122 /* The path under which XEmacs was invoked. */
123 Lisp_Object Vinvocation_path;
125 /* The name under which XEmacs was invoked, with any leading directory
127 Lisp_Object Vinvocation_name;
129 /* The directory name from which XEmacs was invoked. */
130 Lisp_Object Vinvocation_directory;
133 /* The directory name in which to find subdirs such as lisp and etc.
134 nil means get them only from PATH_LOADSEARCH. */
135 Lisp_Object Vinstallation_directory;
138 Lisp_Object Vemacs_program_name, Vemacs_program_version;
139 Lisp_Object Vexec_path;
140 Lisp_Object Vexec_directory, Vconfigure_exec_directory;
141 Lisp_Object Vlisp_directory, Vconfigure_lisp_directory;
142 Lisp_Object Vmodule_directory, Vconfigure_module_directory;
143 Lisp_Object Vsite_module_directory, Vconfigure_site_module_directory;
144 Lisp_Object Vconfigure_package_path;
145 Lisp_Object Vdata_directory, Vconfigure_data_directory;
146 Lisp_Object Vdoc_directory, Vconfigure_doc_directory;
147 Lisp_Object Vconfigure_lock_directory;
148 Lisp_Object Vdata_directory_list;
149 Lisp_Object Vconfigure_info_directory;
150 Lisp_Object Vsite_directory, Vconfigure_site_directory;
151 Lisp_Object Vconfigure_info_path;
152 Lisp_Object Vinternal_error_checking;
153 Lisp_Object Vmail_lock_methods, Vconfigure_mail_lock_method;
154 Lisp_Object Vpath_separator;
156 /* The default base directory XEmacs is installed under. */
157 Lisp_Object Vconfigure_exec_prefix_directory, Vconfigure_prefix_directory;
159 /* If nonzero, set XEmacs to run at this priority. This is also used
160 in child_setup and sys_suspend to make sure subshells run at normal
164 /* If non-zero a filter or a sentinel is running. Tested to save the match
165 data on the first attempt to change it inside asynchronous code. */
166 int running_asynch_code;
168 /* If non-zero, a window-system was specified on the command line. */
171 /* Type of display specified. We cannot use a Lisp symbol here because
172 Lisp symbols may not initialized at the time that we set this
174 const char *display_use;
176 /* If non-zero, then the early error handler will only print the error
178 int suppress_early_error_handler_backtrace;
180 /* An address near the bottom of the stack.
181 Tells GC how to save a copy of the stack. */
184 #ifdef USG_SHARED_LIBRARIES
185 /* If nonzero, this is the place to put the end of the writable segment
188 uintptr_t bss_end = 0;
191 /* Number of bytes of writable memory we can expect to be able to get */
192 unsigned int lim_data;
194 /* Nonzero means running XEmacs without interactive terminal. */
198 /* Value of Lisp variable `noninteractive'.
199 Normally same as C variable `noninteractive'
200 but nothing terrible happens if user sets this one. */
204 /* Nonzero means don't perform site-lisp searches at startup */
205 int inhibit_site_lisp;
207 /* Nonzero means don't perform site-modules searches at startup */
208 int inhibit_site_modules;
210 /* Nonzero means don't respect early packages at startup */
211 int inhibit_early_packages;
213 /* Nonzero means don't load package autoloads at startup */
214 int inhibit_autoloads;
216 /* Nonzero means print debug information about path searching */
219 /* Save argv and argc. */
220 static char **initial_argv;
221 static int initial_argc;
223 static void sort_args (int argc, char **argv);
225 Lisp_Object Qkill_emacs_hook;
226 Lisp_Object Qsave_buffers_kill_emacs;
228 extern Lisp_Object Vlisp_EXEC_SUFFIXES;
231 /* Signal code for the fatal signal that was received */
232 static int fatal_error_code;
234 /* Nonzero if handling a fatal error already */
235 static int fatal_error_in_progress;
237 static void shut_down_emacs (int sig, Lisp_Object stuff);
239 /* Handle bus errors, illegal instruction, etc. */
241 fatal_error_signal (int sig)
243 fatal_error_code = sig;
244 signal (sig, SIG_DFL);
245 /* Unblock the signal so that if the same signal gets sent in the
246 code below, we avoid a deadlock. */
247 EMACS_UNBLOCK_SIGNAL (fatal_error_code);
249 /* If fatal error occurs in code below, avoid infinite recursion. */
250 if (! fatal_error_in_progress)
252 fatal_error_in_progress = dont_check_for_quit = 1;
253 shut_down_emacs (sig, Qnil);
254 stderr_out ("\nLisp backtrace follows:\n\n");
255 Fbacktrace (Qexternal_debugging_output, Qt);
256 # if 0 /* This is evil, rarely useful, and causes grief in some cases. */
257 /* Check for Sun-style stack printing via /proc */
259 const char *pstack = "/usr/proc/bin/pstack";
260 if (access (pstack, X_OK) == 0)
263 stderr_out ("\nC backtrace follows:\n"
264 "(A real debugger may provide better information)\n\n");
265 sprintf (buf, "%s %d >&2", pstack, (int)getpid());
271 /* Signal the same code; this time it will really be fatal. */
272 kill (getpid (), fatal_error_code);
278 fatal (const char *fmt, ...)
281 va_start (args, fmt);
283 fprintf (stderr, "\nXEmacs: ");
284 vfprintf (stderr, GETTEXT (fmt), args);
285 fprintf (stderr, "\n");
292 /* #### The following two functions should be replaced with
293 calls to emacs_doprnt_*() functions, with STREAM set to send out
294 to stdout or stderr. This is the only way to ensure that
295 I18N3 works properly (many implementations of the *printf()
296 functions, including the ones included in glibc, do not implement
297 the %###$ argument-positioning syntax). */
299 /* exactly equivalent to fprintf (stderr, fmt, ...) except that it calls
300 GETTEXT on the format string. */
303 stderr_out (const char *fmt, ...)
307 va_start (args, fmt);
309 retval = vfprintf (stderr, GETTEXT (fmt), args);
312 /* fflush (stderr); */
316 /* exactly equivalent to fprintf (stdout, fmt, ...) except that it calls
317 GETTEXT on the format string. */
320 stdout_out (const char *fmt, ...)
324 va_start (args, fmt);
326 retval = vfprintf (stdout, GETTEXT (fmt), args);
334 /* Handler for SIGDANGER. */
336 memory_warning_signal (int sig)
338 /* #### bad bad bad; this function shouldn't do anything except
339 set a flag, or weird corruption could happen. */
340 signal (sig, memory_warning_signal);
343 (GETTEXT ("Operating system warns that virtual memory is running low.\n"));
345 /* It might be unsafe to call do_auto_save now. */
346 force_auto_save_soon ();
348 #endif /* SIGDANGER */
350 /* Code for dealing with Lisp access to the Unix command line */
353 make_arg_list_1 (int argc, char **argv, int skip_args)
355 Lisp_Object result = Qnil;
358 for (i = argc - 1; i >= 0; i--)
360 if (i == 0 || i > skip_args)
365 /* Do not trust to what crt0 has stuffed into argv[0] */
366 char full_exe_path [MAX_PATH];
367 GetModuleFileName (NULL, full_exe_path, MAX_PATH);
368 result = Fcons (build_ext_string (full_exe_path, Qfile_name),
370 #if defined(HAVE_SHLIB)
371 (void)dll_init(full_exe_path);
376 result = Fcons (build_ext_string (argv [i], Qfile_name),
384 make_arg_list (int argc, char **argv)
386 return make_arg_list_1 (argc, argv, 0);
389 /* Calling functions are also responsible for calling free_argc_argv
390 when they are done with the generated list. */
392 make_argc_argv (Lisp_Object argv_list, int *argc, char ***argv)
395 int n = XINT (Flength (argv_list));
397 *argv = (char**) xmalloc ((n+1) * sizeof (char*));
399 for (i = 0, next = argv_list; i < n; i++, next = XCDR (next))
402 CHECK_STRING (XCAR (next));
404 TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (next),
405 C_STRING_ALLOCA, temp,
407 (*argv) [i] = xstrdup (temp);
414 free_argc_argv (char **argv)
427 init_cmdargs (int argc, char **argv, int skip_args)
432 Vcommand_line_args = make_arg_list_1 (argc, argv, skip_args);
435 DEFUN ("invocation-name", Finvocation_name, 0, 0, 0, /*
436 Return the program name that was used to run XEmacs.
437 Any directory names are omitted.
441 return Fcopy_sequence (Vinvocation_name);
444 DEFUN ("invocation-directory", Finvocation_directory, 0, 0, 0, /*
445 Return the directory name in which the Emacs executable was located.
449 return Fcopy_sequence (Vinvocation_directory);
454 /* #### - don't know why I18N4 on SunOS/JLE
455 can't deal with this. It's a potential
456 bug that needs to be looked at. */
457 # undef RUN_TIME_REMAP
460 #if defined (MULE) && defined (MSDOS) && defined (EMX)
461 /* Setup all of files be input/output'ed with binary translation mode. */
463 asm ("L_setbinmode:");
464 asm (" movl $1, __fmode_bin");
466 asm (" .stabs \"___CTOR_LIST__\", 23, 0, 0, L_setbinmode");
469 /* Test whether the next argument in ARGV matches SSTR or a prefix of
470 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
471 (the argument is supposed to have a value) store in *VALPTR either
472 the next argument or the portion of this one after the equal sign.
473 ARGV is read starting at position *SKIPPTR; this index is advanced
474 by the number of arguments used.
476 Too bad we can't just use getopt for all of this, but we don't have
477 enough information to do it right. */
480 argmatch (char **argv, int argc, char *sstr, char *lstr,
481 int minlen, char **valptr, int *skipptr)
487 /* Don't access argv[argc]; give up in advance. */
488 if (argc <= *skipptr + 1)
491 arg = argv[*skipptr+1];
494 if (strcmp (arg, sstr) == 0)
498 *valptr = argv[*skipptr+2];
505 arglen = (valptr != NULL && (p = strchr (arg, '=')) != NULL
506 ? p - arg : strlen (arg));
507 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
509 else if (valptr == NULL)
520 else if (argv[*skipptr+2] != NULL)
522 *valptr = argv[*skipptr+2];
532 /* Make stack traces always identify version + configuration */
533 #define main_1 STACK_TRACE_EYE_CATCHER
535 /* This function is not static, so that the compiler is less likely to
536 inline it, which would make it not show up in stack traces. */
537 DECLARE_DOESNT_RETURN (main_1 (int, char **, char **, int));
539 main_1 (int argc, char **argv, char **envp, int restart)
541 char stack_bottom_variable;
544 int inhibit_window_system;
546 extern int malloc_cookie;
549 #if (!defined (SYSTEM_MALLOC) && !defined (HAVE_LIBMCHECK) \
550 && !defined (DOUG_LEA_MALLOC))
551 /* Make sure that any libraries we link against haven't installed a
552 hook for a gmalloc of a potentially incompatible version. */
553 /* If we're using libmcheck, the hooks have already been initialized, */
554 /* don't touch them. -slb */
555 __malloc_hook = NULL;
556 __realloc_hook = NULL;
558 #endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */
564 * NeXT secret magic, ripped from Emacs-for-NS by Carl Edman
565 * <cedman@princeton.edu>. Note that even Carl doesn't know what this
566 * does; it was provided by NeXT, and it presumable makes NS's mallocator
567 * work with dumping. But malloc_jumpstart() and malloc_freezedry() in
568 * unexnext.c are both completely undocumented, even in NS header files!
569 * But hey, it solves all NS related memory problems, so who's
571 if (initialized && malloc_jumpstart (malloc_cookie) != 0)
572 fprintf (stderr, "malloc jumpstart failed!\n");
576 #if defined (GNU_MALLOC) && \
577 defined (ERROR_CHECK_MALLOC) && \
578 !defined (HAVE_LIBMCHECK)
580 #if defined(LOSING_GCC_DESTRUCTOR_FREE_BUG)
581 /* Prior to XEmacs 21, this was `#if 0'ed out. */
582 /* I'm enabling this because it is the only reliable way I've found to */
583 /* prevent a very annoying problem where GCC will attempt to free(3) */
584 /* memory at exit() and cause a coredump. */
588 sort_args (argc, argv);
590 /* Map in shared memory, if we are using that. */
592 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
595 /* The shared memory was just restored, which clobbered this. */
601 /* The shared memory was just restored, which clobbered this. */
604 #endif /* HAVE_SHM */
606 #if (defined (MSDOS) && defined (EMX)) || defined (WIN32) || defined (_SCO_DS)
610 /* Record (approximately) where the stack begins. */
611 stack_bottom = &stack_bottom_variable;
613 #ifdef USG_SHARED_LIBRARIES
615 brk ((void *) bss_end);
620 #if defined (HAVE_MMAP) && defined (REL_ALLOC)
621 /* ralloc can only be used if using the GNU memory allocator. */
623 #elif defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
631 #endif /* HAVE_SOCKS */
633 #ifndef SYSTEM_MALLOC
635 /* Arrange to get warning messages as memory fills up. */
636 memory_warnings (0, malloc_warning);
637 #endif /* not SYSTEM_MALLOC */
640 /* We do all file input/output as binary files. When we need to translate
641 newlines, we do that manually. */
643 (stdin) ->_flag &= ~_IOTEXT;
644 (stdout)->_flag &= ~_IOTEXT;
645 (stderr)->_flag &= ~_IOTEXT;
648 #ifdef SET_EMACS_PRIORITY
649 if (emacs_priority != 0)
650 nice (-emacs_priority);
652 #endif /* SET_EMACS_PRIORITY */
654 #ifdef EXTRA_INITIALIZE
658 #ifdef HAVE_WINDOW_SYSTEM
659 inhibit_window_system = 0;
661 inhibit_window_system = 1;
664 /* Handle the -t switch, which specifies filename to use as terminal */
667 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
671 if (open (term, O_RDWR | OPEN_BINARY, 2) < 0)
672 fatal ("%s: %s", term, strerror (errno));
675 fatal ("%s: not a tty", term);
678 stderr_out ("Using %s", ttyname (0));
680 stderr_out ("Using %s", term);
681 inhibit_window_system = 1; /* -t => -nw */
685 /* Handle -nw switch */
686 if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
687 inhibit_window_system = 1;
689 /* Handle the -batch switch, which means don't do interactive display. */
690 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
692 #if 0 /* I don't think this is correct. */
693 inhibit_autoloads = 1;
698 if (argmatch (argv, argc, "-debug-paths", "--debug-paths",
699 11, NULL, &skip_args))
702 /* Partially handle -no-autoloads, -no-early-packages and -vanilla. Packages */
703 /* are searched prior to the rest of the command line being parsed in */
705 if (argmatch (argv, argc, "-no-early-packages", "--no-early-packages",
706 6, NULL, &skip_args))
708 inhibit_early_packages = 1;
712 if (argmatch (argv, argc, "-no-site-modules", "--no-site-modules",
713 9, NULL, &skip_args))
715 inhibit_site_modules = 1;
719 inhibit_site_modules = 1;
721 if (argmatch (argv, argc, "-vanilla", "--vanilla",
722 7, NULL, &skip_args))
724 inhibit_early_packages = 1;
728 if (argmatch (argv, argc, "-no-autoloads", "--no-autoloads",
729 7, NULL, &skip_args))
731 /* Inhibit everything */
732 inhibit_autoloads = 1;
736 if (argmatch (argv, argc, "-debug-paths", "--debug-paths",
737 6, NULL, &skip_args))
744 /* Partially handle the -version and -help switches: they imply -batch,
745 but are not removed from the list. */
746 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
747 noninteractive = 1, skip_args--;
749 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args) ||
750 argmatch (argv, argc, "-V", 0, 2, NULL, &skip_args))
751 noninteractive = 1, skip_args--;
753 /* Now, figure out which type of console is our first console. */
758 display_use = "stream";
763 if (inhibit_window_system)
764 fatal ("Sorry, this XEmacs was not compiled with TTY support");
767 #ifdef HAVE_WINDOW_SYSTEM
768 /* Stupid kludge to catch command-line display spec. We can't
769 handle this argument entirely in window-system-dependent code
770 because we don't even know which window-system-dependent code
771 to run until we've recognized this argument. */
772 if (!inhibit_window_system && !noninteractive)
774 #ifdef HAVE_X_WINDOWS
776 int count_before = skip_args;
778 if (argmatch (argv, argc, "-d", "--display", 3, &dpy, &skip_args) ||
779 argmatch (argv, argc, "-display", 0, 3, &dpy, &skip_args))
784 /* If we have the form --display=NAME,
785 convert it into -d name.
786 This requires inserting a new element into argv. */
787 if (dpy != 0 && skip_args - count_before == 1)
789 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
792 for (j = 0; j < count_before + 1; j++)
794 new[count_before + 1] = "-d";
795 new[count_before + 2] = dpy;
796 for (j = count_before + 2; j <argc; j++)
797 new[j + 1] = argv[j];
801 /* Change --display to -d, when its arg is separate. */
802 else if (dpy != 0 && skip_args > count_before
803 && argv[count_before + 1][1] == '-')
804 argv[count_before + 1] = "-d";
806 /* Don't actually discard this arg. */
807 skip_args = count_before;
809 /* If there is a non-empty environment var DISPLAY, set
810 `display_use', but not `display_arg', which is only to be set
811 if the display was specified on the command line. */
812 if ((dpy = getenv ("DISPLAY")) && dpy[0])
815 #endif /* HAVE_X_WINDOWS */
816 #ifdef HAVE_MS_WINDOWS
817 if (strcmp(display_use, "x") != 0)
818 display_use = "mswindows";
819 #endif /* HAVE_MS_WINDOWS */
821 #endif /* HAVE_WINDOW_SYSTEM */
823 noninteractive1 = noninteractive;
825 /****** Now initialize everything *******/
827 /* First, do really basic environment initialization -- catching signals
828 and the like. These functions have no dependence on any part of
829 the Lisp engine and need to be done both at dump time and at run time. */
831 init_signals_very_early ();
832 init_data_very_early (); /* Catch math errors. */
833 #ifdef LISP_FLOAT_TYPE
834 init_floatfns_very_early (); /* Catch floating-point math errors. */
836 init_process_times_very_early (); /* Initialize our process timers.
837 As early as possible, of course,
838 so we can be fairly accurate. */
839 init_intl_very_early (); /* set up the locale and domain for gettext and
842 /* Now initialize the Lisp engine and the like. Done only during
843 dumping. No dependence on anything that may be in the user's
844 environment when the dumped XEmacs is run.
846 We try to do things in an order that minimizes the non-obvious
847 dependencies between functions. */
849 /* purify_flag 1 is correct even if CANNOT_DUMP.
850 * loadup.el will set to nil at end. */
857 initialized = pdump_load ();
858 purify_flag = !initialized;
867 /* Initialize things so that new Lisp objects
868 can be created and objects can be staticpro'd.
869 Must be basically the very first thing done
870 because pretty much all of the initialization
871 routines below create new objects. */
872 init_alloc_once_early ();
874 /* Initialize Qnil, Qt, Qunbound, and the
875 obarray. After this, symbols can be
876 interned. This depends on init_alloc_once(). */
877 init_symbols_once_early ();
879 /* Declare the basic symbols pertaining to errors,
880 So that deferror() can be called. */
881 init_errors_once_early ();
883 /* Make sure that opaque pointers can be created. */
884 init_opaque_once_early ();
886 /* Now declare all the symbols and define all the Lisp primitives.
888 The *only* thing that the syms_of_*() functions are allowed to do
889 is call one of the following three functions:
892 defsubr() (i.e. DEFSUBR)
896 Order does not matter in these functions.
905 syms_of_casefiddle ();
915 #endif /* DEBUG_XEMACS */
926 #ifdef HAVE_X_WINDOWS
929 #ifdef HAVE_DRAGNDROP
932 syms_of_event_stream ();
937 #ifdef CLASH_DETECTION
939 #endif /* CLASH_DETECTION */
942 syms_of_font_lock ();
946 syms_of_glyphs_eimage ();
947 syms_of_glyphs_widget ();
948 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
971 #if !defined (NO_SUBPROCESSES)
973 #ifdef HAVE_WIN32_PROCESSES
974 syms_of_process_nt ();
978 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
980 #endif /* HAVE_MMAP && REL_ALLOC */
982 syms_of_redisplay ();
987 syms_of_specifier ();
990 #ifdef HAVE_SCROLLBARS
991 syms_of_scrollbar ();
1001 syms_of_console_tty ();
1002 syms_of_device_tty ();
1003 syms_of_objects_tty ();
1006 #ifdef HAVE_X_WINDOWS
1007 syms_of_balloon_x ();
1008 syms_of_device_x ();
1010 syms_of_dialog_x ();
1013 syms_of_glyphs_x ();
1014 syms_of_objects_x ();
1015 #ifdef HAVE_MENUBARS
1016 syms_of_menubar_x ();
1018 syms_of_select_x ();
1019 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1024 syms_of_input_method_xlib ();
1026 #endif /* HAVE_XIM */
1027 #endif /* HAVE_X_WINDOWS */
1029 #ifdef HAVE_MS_WINDOWS
1030 syms_of_console_mswindows ();
1031 syms_of_device_mswindows ();
1032 syms_of_frame_mswindows ();
1033 syms_of_objects_mswindows ();
1034 syms_of_select_mswindows ();
1035 syms_of_glyphs_mswindows ();
1036 syms_of_gui_mswindows ();
1037 #ifdef HAVE_MENUBARS
1038 syms_of_menubar_mswindows ();
1040 #ifdef HAVE_SCROLLBARS
1041 syms_of_scrollbar_mswindows ();
1043 #ifdef HAVE_MSW_C_DIRED
1044 syms_of_dired_mswindows ();
1049 #endif /* HAVE_MS_WINDOWS */
1053 syms_of_mule_ccl ();
1054 syms_of_mule_charset ();
1057 syms_of_file_coding ();
1061 syms_of_mule_wnn ();
1064 syms_of_mule_canna ();
1065 #endif /* HAVE_CANNA */
1077 #if defined (GNU_MALLOC) && \
1078 defined (ERROR_CHECK_MALLOC) && \
1079 !defined (HAVE_LIBMCHECK)
1081 /* Prior to XEmacs 21, this was `#if 0'ed out. -slb */
1082 #if defined (LOSING_GCC_DESTRUCTOR_FREE_BUG)
1083 syms_of_free_hook ();
1087 syms_of_tooltalk ();
1099 syms_of_gpmevent ();
1102 /* Now create the subtypes for the types that have them.
1103 We do this before the vars_*() because more symbols
1104 may get initialized here. */
1106 /* Now initialize the console types and associated symbols.
1107 Other than the first function below, the functions may
1108 make exactly the following function/macro calls:
1110 INITIALIZE_CONSOLE_TYPE()
1111 CONSOLE_HAS_METHOD()
1113 For any given console type, the former macro must be called
1114 before the any calls to the latter macro. */
1116 console_type_create ();
1118 console_type_create_stream ();
1121 console_type_create_tty ();
1122 console_type_create_device_tty ();
1123 console_type_create_frame_tty ();
1124 console_type_create_objects_tty ();
1125 console_type_create_redisplay_tty ();
1128 #ifdef HAVE_X_WINDOWS
1129 console_type_create_x ();
1130 console_type_create_device_x ();
1131 console_type_create_frame_x ();
1132 console_type_create_glyphs_x ();
1133 console_type_create_select_x ();
1134 #ifdef HAVE_MENUBARS
1135 console_type_create_menubar_x ();
1137 console_type_create_objects_x ();
1138 console_type_create_redisplay_x ();
1139 #ifdef HAVE_SCROLLBARS
1140 console_type_create_scrollbar_x ();
1142 #ifdef HAVE_TOOLBARS
1143 console_type_create_toolbar_x ();
1146 console_type_create_dialog_x ();
1148 #endif /* HAVE_X_WINDOWS */
1150 #ifdef HAVE_MS_WINDOWS
1151 console_type_create_mswindows ();
1152 console_type_create_device_mswindows ();
1153 console_type_create_frame_mswindows ();
1154 console_type_create_objects_mswindows ();
1155 console_type_create_redisplay_mswindows ();
1156 console_type_create_glyphs_mswindows ();
1157 console_type_create_select_mswindows ();
1158 # ifdef HAVE_SCROLLBARS
1159 console_type_create_scrollbar_mswindows ();
1161 #ifdef HAVE_MENUBARS
1162 console_type_create_menubar_mswindows ();
1164 #ifdef HAVE_TOOLBARS
1165 console_type_create_toolbar_mswindows ();
1168 console_type_create_dialog_mswindows ();
1172 /* Now initialize the specifier types and associated symbols.
1173 Other than the first function below, the functions may
1174 make exactly the following function/macro calls:
1176 INITIALIZE_SPECIFIER_TYPE()
1177 SPECIFIER_HAS_METHOD()
1179 For any given specifier type, the former macro must be called
1180 before the any calls to the latter macro. */
1182 specifier_type_create ();
1184 specifier_type_create_image ();
1185 specifier_type_create_gutter ();
1186 specifier_type_create_objects ();
1187 #ifdef HAVE_TOOLBARS
1188 specifier_type_create_toolbar ();
1191 /* Now initialize the structure types and associated symbols.
1192 Other than the first function below, the functions may
1193 make exactly the following function/macro calls:
1195 define_structure_type()
1196 define_structure_type_keyword()
1200 structure_type_create ();
1202 structure_type_create_chartab ();
1203 structure_type_create_faces ();
1204 structure_type_create_rangetab ();
1205 structure_type_create_hash_table ();
1207 /* Now initialize the image instantiator formats and associated symbols.
1208 Other than the first function below, the functions may
1209 make exactly the following function/macro calls:
1211 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT()
1212 IIFORMAT_HAS_METHOD()
1213 IIFORMAT_VALID_KEYWORD()
1215 For any given image instantiator format, the first macro must be
1216 called before the any calls to the other macros. */
1218 image_instantiator_format_create ();
1219 image_instantiator_format_create_glyphs_eimage ();
1220 image_instantiator_format_create_glyphs_widget ();
1222 image_instantiator_format_create_glyphs_tty ();
1224 #ifdef HAVE_X_WINDOWS
1225 image_instantiator_format_create_glyphs_x ();
1226 #endif /* HAVE_X_WINDOWS */
1227 #ifdef HAVE_MS_WINDOWS
1228 image_instantiator_format_create_glyphs_mswindows ();
1229 #endif /* HAVE_MSWINDOWS_WINDOWS */
1231 /* Now initialize the lstream types and associated symbols.
1232 Other than the first function below, the functions may
1233 make exactly the following function/macro calls:
1235 LSTREAM_HAS_METHOD()
1239 lstream_type_create ();
1241 lstream_type_create_file_coding ();
1243 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
1244 lstream_type_create_mswindows_selectable ();
1247 /* Initialize processes implementation.
1248 The functions may make exactly the following function/macro calls:
1250 PROCESS_HAS_METHOD()
1252 #ifdef HAVE_UNIX_PROCESSES
1253 process_type_create_unix ();
1255 #ifdef HAVE_WIN32_PROCESSES
1256 process_type_create_nt ();
1259 /* Now initialize most variables.
1261 These functions may do exactly the following:
1274 defsymbol(), if it's absolutely necessary and you're sure that
1275 the symbol isn't referenced anywhere else in the initialization
1277 Fset() on a symbol that is unbound
1278 assigning a symbol or constant value to a variable
1279 using a global variable that has been initialized
1280 earlier on in the same function
1282 Any of the object-creating functions on alloc.c: e.g.
1295 perhaps a few others.
1298 /* Now allow Fprovide() statements to be made. */
1299 init_provide_once ();
1301 /* Do that before any specifier creation (esp. vars_of_glyphs()) */
1302 vars_of_specifier ();
1307 vars_of_bytecode ();
1309 vars_of_callproc ();
1319 vars_of_console_stream ();
1326 #ifdef HAVE_DRAGNDROP
1327 vars_of_dragdrop ();
1334 #ifdef HAVE_X_WINDOWS
1335 vars_of_event_Xt ();
1337 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
1338 vars_of_event_tty ();
1340 #ifdef HAVE_MS_WINDOWS
1341 vars_of_event_mswindows ();
1343 vars_of_event_stream ();
1349 vars_of_floatfns ();
1350 vars_of_font_lock ();
1353 vars_of_glyphs_eimage ();
1354 vars_of_glyphs_widget ();
1355 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1364 vars_of_input_method_motif ();
1365 #else /* XIM_XLIB */
1366 vars_of_input_method_xlib ();
1368 #endif /* HAVE_XIM */
1374 #ifdef HAVE_DATABASE
1375 vars_of_database ();
1377 #ifdef HAVE_MENUBARS
1391 #ifndef NO_SUBPROCESSES
1393 #ifdef HAVE_UNIX_PROCESSES
1394 vars_of_process_unix ();
1396 #ifdef HAVE_WIN32_PROCESSES
1397 vars_of_process_nt ();
1402 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1404 #endif /* HAVE_MMAP && REL_ALLOC */
1405 vars_of_redisplay ();
1406 #ifdef HAVE_SCROLLBARS
1407 vars_of_scrollbar ();
1414 #ifdef HAVE_TOOLBARS
1421 vars_of_console_tty ();
1422 vars_of_frame_tty ();
1423 vars_of_objects_tty ();
1426 #ifdef HAVE_X_WINDOWS
1427 vars_of_balloon_x ();
1428 vars_of_device_x ();
1430 vars_of_dialog_x ();
1433 vars_of_glyphs_x ();
1434 #ifdef HAVE_MENUBARS
1435 vars_of_menubar_x ();
1437 vars_of_objects_x ();
1438 vars_of_select_x ();
1439 #ifdef HAVE_SCROLLBARS
1440 vars_of_scrollbar_x ();
1442 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1445 #endif /* HAVE_X_WINDOWS */
1447 #ifdef HAVE_MS_WINDOWS
1448 vars_of_device_mswindows ();
1449 vars_of_console_mswindows ();
1450 vars_of_frame_mswindows ();
1451 vars_of_objects_mswindows ();
1452 vars_of_select_mswindows ();
1453 vars_of_glyphs_mswindows ();
1454 #ifdef HAVE_SCROLLBARS
1455 vars_of_scrollbar_mswindows ();
1457 #ifdef HAVE_MENUBARS
1458 vars_of_menubar_mswindows ();
1460 #ifdef HAVE_MSW_C_DIRED
1461 vars_of_dired_mswindows ();
1464 vars_of_dialog_mswindows ();
1466 #endif /* HAVE_MS_WINDOWS */
1470 vars_of_mule_ccl ();
1471 vars_of_mule_charset ();
1474 vars_of_file_coding ();
1478 vars_of_mule_wnn ();
1481 vars_of_mule_canna ();
1482 #endif /* HAVE_CANNA */
1486 vars_of_tooltalk ();
1498 vars_of_gpmevent ();
1501 /* Now initialize any specifier variables. We do this later
1502 because it has some dependence on the vars initialized
1505 These functions should *only* initialize specifier variables,
1506 and may make use of the following functions/macros in addition
1507 to the ones listed above:
1511 set_specifier_fallback()
1512 set_specifier_caching()
1515 specifier_vars_of_glyphs ();
1516 specifier_vars_of_gutter ();
1517 #ifdef HAVE_MENUBARS
1518 specifier_vars_of_menubar ();
1520 specifier_vars_of_redisplay ();
1521 #ifdef HAVE_SCROLLBARS
1522 specifier_vars_of_scrollbar ();
1524 #ifdef HAVE_TOOLBARS
1525 specifier_vars_of_toolbar ();
1527 specifier_vars_of_window ();
1529 /* Now comes all the rest of the variables that couldn't
1530 be handled above. There may be dependencies on variables
1531 initialized above, and dependencies between one complex_vars_()
1532 function and another. */
1534 /* Calls Fmake_range_table(). */
1535 complex_vars_of_regex ();
1536 /* Calls Fmake_range_table(). */
1537 complex_vars_of_search ();
1539 /* Calls make_lisp_hash_table(). */
1540 complex_vars_of_extents ();
1542 /* Depends on hash tables and specifiers. */
1543 complex_vars_of_faces ();
1546 /* These two depend on hash tables and various variables declared
1547 earlier. The second may also depend on the first. */
1548 complex_vars_of_mule_charset ();
1551 complex_vars_of_file_coding ();
1554 /* This calls allocate_glyph(), which creates specifiers
1555 and also relies on a variable (Vthe_nothing_vector) initialized
1556 above. It also calls make_ext_string(), which under Mule
1557 could require that the charsets be initialized. */
1558 complex_vars_of_glyphs ();
1560 /* These rely on the glyphs just created in the previous function,
1561 and call Fadd_spec_to_specifier(), which relies on various
1562 variables initialized above. */
1563 #ifdef HAVE_X_WINDOWS
1564 complex_vars_of_glyphs_x ();
1566 #ifdef HAVE_MS_WINDOWS
1567 complex_vars_of_glyphs_mswindows ();
1570 /* This calls Fmake_glyph_internal(). */
1571 complex_vars_of_alloc ();
1573 /* This calls Fmake_glyph_internal(). */
1574 #ifdef HAVE_MENUBARS
1575 complex_vars_of_menubar ();
1578 /* This calls Fmake_glyph_internal(). */
1579 #ifdef HAVE_SCROLLBARS
1580 complex_vars_of_scrollbar ();
1583 /* This calls allocate_glyph(). */
1584 complex_vars_of_frame ();
1586 /* This calls Fcopy_category_table() under Mule, which calls who
1588 complex_vars_of_chartab ();
1590 /* This calls set_string_char(), which (under Mule) depends on the
1591 charsets being initialized. */
1592 complex_vars_of_casetab ();
1594 /* This calls Fcopy_syntax_table(), which relies on char tables. */
1595 complex_vars_of_syntax ();
1597 /* This initializes buffer-local variables, sets things up so
1598 that buffers can be created, and creates a couple of basic
1599 buffers. This depends on Vstandard_syntax_table and
1600 Vstandard_category_table (initialized in the previous
1601 functions), as well as a whole horde of variables that may
1602 have been initialized above. */
1603 complex_vars_of_buffer ();
1605 /* This initializes console-local variables. */
1606 complex_vars_of_console ();
1608 /* This creates a couple more buffers, and depends on the
1609 previous function. */
1610 complex_vars_of_minibuf ();
1612 /* These two might call Ffile_name_as_directory(), which
1613 might depend on all sorts of things; I'm not sure. */
1614 complex_vars_of_emacs ();
1616 /* This creates a couple of basic keymaps and depends on Lisp
1617 hash tables and Ffset() (both of which depend on some variables
1618 initialized in the vars_of_*() section) and possibly other
1620 complex_vars_of_keymap ();
1622 /* Calls make_lisp_hash_table() and creates a keymap */
1623 complex_vars_of_event_stream ();
1625 #ifdef ERROR_CHECK_GC
1627 extern int always_gc;
1628 if (always_gc) /* purification debugging hack */
1629 garbage_collect_1 ();
1633 } else if (!restart) {
1634 reinit_alloc_once_early ();
1635 reinit_symbols_once_early ();
1636 reinit_opaque_once_early ();
1638 reinit_console_type_create_stream ();
1640 reinit_console_type_create_tty ();
1642 #ifdef HAVE_X_WINDOWS
1643 reinit_console_type_create_x ();
1644 reinit_console_type_create_device_x ();
1646 #ifdef HAVE_MS_WINDOWS
1647 reinit_console_type_create_mswindows ();
1650 reinit_specifier_type_create ();
1651 reinit_specifier_type_create_image ();
1652 reinit_specifier_type_create_gutter ();
1653 reinit_specifier_type_create_objects ();
1654 #ifdef HAVE_TOOLBARS
1655 reinit_specifier_type_create_toolbar ();
1658 structure_type_create ();
1660 structure_type_create_chartab ();
1661 structure_type_create_faces ();
1662 structure_type_create_rangetab ();
1663 structure_type_create_hash_table ();
1665 lstream_type_create ();
1667 lstream_type_create_file_coding ();
1669 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
1670 lstream_type_create_mswindows_selectable ();
1672 #ifdef HAVE_UNIX_PROCESSES
1673 process_type_create_unix ();
1675 #ifdef HAVE_WIN32_PROCESSES
1676 process_type_create_nt ();
1679 reinit_vars_of_buffer ();
1680 reinit_vars_of_console ();
1682 reinit_vars_of_debug ();
1684 reinit_vars_of_device ();
1685 reinit_vars_of_eval ();
1686 #ifdef HAVE_X_WINDOWS
1687 reinit_vars_of_event_Xt ();
1689 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
1690 reinit_vars_of_event_tty ();
1692 #ifdef HAVE_MS_WINDOWS
1693 reinit_vars_of_event_mswindows ();
1695 reinit_vars_of_event_stream ();
1696 reinit_vars_of_events ();
1697 reinit_vars_of_extents ();
1698 reinit_vars_of_font_lock ();
1699 reinit_vars_of_glyphs ();
1700 reinit_vars_of_glyphs_widget ();
1701 reinit_vars_of_insdel ();
1702 reinit_vars_of_lread ();
1703 reinit_vars_of_lstream ();
1704 reinit_vars_of_minibuf ();
1706 reinit_vars_of_module ();
1708 reinit_vars_of_objects ();
1709 reinit_vars_of_print ();
1710 reinit_vars_of_redisplay ();
1711 reinit_vars_of_search ();
1712 reinit_vars_of_undo ();
1713 reinit_vars_of_window ();
1715 #ifdef HAVE_MS_WINDOWS
1716 reinit_vars_of_frame_mswindows ();
1719 #ifdef HAVE_X_WINDOWS
1720 reinit_vars_of_device_x ();
1721 #ifdef HAVE_SCROLLBARS
1722 reinit_vars_of_scrollbar_x ();
1724 #ifdef HAVE_MENUBARS
1725 reinit_vars_of_menubar_x ();
1727 reinit_vars_of_select_x ();
1728 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1729 reinit_vars_of_gui_x ();
1731 #endif /* HAVE_X_WINDOWS */
1733 #if defined(MULE) && defined(HAVE_WNN)
1734 reinit_vars_of_mule_wnn ();
1737 reinit_complex_vars_of_buffer ();
1738 reinit_complex_vars_of_console ();
1739 reinit_complex_vars_of_minibuf ();
1744 /* CONGRATULATIONS!!! We have successfully initialized the Lisp
1749 /* Stuff that needs to be reset at run time. Order below should
1754 reinit_mule_category ();
1758 /* Now do further initialization/setup of stuff that is not needed by the
1759 syms_of_() routines. This involves stuff that only is enabled in
1760 an interactive run (redisplay, user input, etc.) and stuff that is
1761 not needed until we start loading Lisp code (the reader). A lot
1762 of this stuff involves querying the current environment and needs
1763 to be done both at dump time and at run time. */
1765 init_initial_directory(); /* get the directory to use for the
1766 "*scratch*" buffer, etc. */
1770 * For Win32, call init_environment() now, so that environment/registry
1771 * variables will be properly entered into Vprocess_environment.
1776 init_callproc (); /* Set up the process environment (so that egetenv
1777 works), the basic directory variables
1778 (exec-directory and so on), and stuff
1779 related to subprocesses. This should be
1780 first because many of the functions below
1781 call egetenv() to get environment variables. */
1782 init_lread (); /* Set up the Lisp reader. */
1784 /* Call early 'cause init_environment needs it. */
1786 /* Set defaults for several environment variables. */
1787 init_environment (argc, argv, skip_args);
1789 init_cmdargs (argc, argv, skip_args); /* Create list Vcommand_line_args */
1790 init_buffer (); /* Set default directory of *scratch* buffer */
1796 init_redisplay (); /* Determine terminal type.
1797 init_sys_modes uses results */
1799 init_event_stream (); /* Set up so we can get user input. */
1800 init_macros (); /* set up so we can run macros. */
1801 init_editfns (); /* Determine the name of the user we're running as */
1802 init_xemacs_process (); /* set up for calling subprocesses */
1804 init_sunpro (); /* Set up Sunpro usage tracking */
1806 #if defined (HAVE_NATIVE_SOUND) && defined (hp9000s800)
1812 init_console_stream (); /* Create the first console */
1814 /* try to get the actual pathname of the exec file we are running */
1817 Vinvocation_name = Fcar (Vcommand_line_args);
1818 if (XSTRING_DATA(Vinvocation_name)[0] == '-')
1820 /* XEmacs as a login shell, oh goody! */
1821 Vinvocation_name = build_string(getenv("SHELL"));
1823 Vinvocation_directory = Vinvocation_name;
1825 if (!NILP (Ffile_name_directory (Vinvocation_name)))
1827 /* invocation-name includes a directory component -- presumably it
1828 is relative to cwd, not $PATH */
1829 Vinvocation_directory = Fexpand_file_name (Vinvocation_name,
1831 Vinvocation_path = Qnil;
1835 Vinvocation_path = decode_env_path ("PATH", NULL);
1836 locate_file (Vinvocation_path, Vinvocation_name,
1837 Vlisp_EXEC_SUFFIXES,
1838 &Vinvocation_directory, X_OK);
1841 if (NILP (Vinvocation_directory))
1842 Vinvocation_directory = Vinvocation_name;
1844 Vinvocation_name = Ffile_name_nondirectory (Vinvocation_directory);
1845 Vinvocation_directory = Ffile_name_directory (Vinvocation_directory);
1848 #if defined(HAVE_SHLIB) && !defined(WINDOWSNT)
1849 /* This is Unix only. MS Windows NT has a library call that does
1850 The Right Thing on that system. Rumor has it, this must be
1851 called for GNU dld in temacs and xemacs. */
1853 char *buf = (char *)alloca (XSTRING_LENGTH (Vinvocation_directory)
1854 + XSTRING_LENGTH (Vinvocation_name)
1856 sprintf (buf, "%s/%s", XSTRING_DATA (Vinvocation_directory),
1857 XSTRING_DATA (Vinvocation_name));
1859 /* All we can do is cry if an error happens, so ignore it. */
1860 (void) dll_init (buf);
1864 #if defined (LOCALTIME_CACHE) && defined (HAVE_TZSET)
1865 /* sun's localtime() has a bug. it caches the value of the time
1866 zone rather than looking it up every time. Since localtime() is
1867 called to bolt the undumping time into the undumped emacs, this
1868 results in localtime() ignoring the TZ environment variable.
1869 This flushes the new TZ value into localtime(). */
1871 #endif /* LOCALTIME_CACHE and TZSET */
1876 /* Handle -l loadup-and-dump, args passed by Makefile. */
1877 if (argc > 2 + skip_args && !strcmp (argv[1 + skip_args], "-l"))
1878 load_me = build_string (argv[2 + skip_args]);
1879 #if 0 /* CANNOT_DUMP - this can never be right in XEmacs --andyp */
1880 /* Unless next switch is -nl, load "loadup.el" first thing. */
1881 if (!(argc > 1 + skip_args && !strcmp (argv[1 + skip_args], "-nl")))
1882 load_me = build_string ("loadup.el");
1883 #endif /* CANNOT_DUMP */
1888 quantify_start_recording_data ();
1889 #endif /* QUANTIFY */
1893 /* This never returns. */
1894 initial_command_loop (load_me);
1899 /* Sort the args so we can find the most important ones
1900 at the beginning of argv. */
1902 /* First, here's a table of all the standard options. */
1904 struct standard_args
1906 const char * const name;
1907 const char * const longname;
1912 static struct standard_args standard_args[] =
1914 /* Handled by main_1 above: */
1915 { "-nl", "--no-shared-memory", 100, 0 },
1916 { "-t", "--terminal", 95, 1 },
1917 { "-nw", "--no-windows", 90, 0 },
1918 { "-batch", "--batch", 85, 0 },
1919 { "-debug-paths", "--debug-paths", 82, 0 },
1920 { "-help", "--help", 80, 0 },
1921 { "-version", "--version", 75, 0 },
1923 { "-d", "--display", 80, 1 },
1924 { "-display", 0, 80, 1 },
1925 { "-NXHost", 0, 79, 0 },
1926 { "-MachLaunch", 0, 79, 0},
1928 /* Handled by command-line-early in startup.el: */
1929 { "-q", "--no-init-file", 50, 0 },
1930 { "-unmapped", 0, 50, 0 },
1931 { "-no-init-file", 0, 50, 0 },
1932 { "-vanilla", "--vanilla", 50, 0 },
1933 { "-no-autoloads", "--no-autoloads", 50, 0 },
1934 { "-no-site-file", "--no-site-file", 40, 0 },
1935 { "-no-early-packages", "--no-early-packages", 35, 0 },
1936 { "-u", "--user", 30, 1 },
1937 { "-user", 0, 30, 1 },
1938 { "-debug-init", "--debug-init", 20, 0 },
1939 { "-debug-paths", "--debug-paths", 20, 0 },
1942 { "-i", "--icon-type", 15, 0 },
1943 { "-itype", 0, 15, 0 },
1944 { "-iconic", "--iconic", 15, 0 },
1945 { "-bg", "--background-color", 10, 1 },
1946 { "-background", 0, 10, 1 },
1947 { "-fg", "--foreground-color", 10, 1 },
1948 { "-foreground", 0, 10, 1 },
1949 { "-bd", "--border-color", 10, 1 },
1950 { "-bw", "--border-width", 10, 1 },
1951 { "-ib", "--internal-border", 10, 1 },
1952 { "-ms", "--mouse-color", 10, 1 },
1953 { "-cr", "--cursor-color", 10, 1 },
1954 { "-fn", "--font", 10, 1 },
1955 { "-font", 0, 10, 1 },
1956 { "-g", "--geometry", 10, 1 },
1957 { "-geometry", 0, 10, 1 },
1958 { "-T", "--title", 10, 1 },
1959 { "-title", 0, 10, 1 },
1960 { "-name", "--name", 10, 1 },
1961 { "-xrm", "--xrm", 10, 1 },
1962 { "-r", "--reverse-video", 5, 0 },
1964 { "-reverse", 0, 5, 0 },
1965 { "-hb", "--horizontal-scroll-bars", 5, 0 },
1966 { "-vb", "--vertical-scroll-bars", 5, 0 },
1968 /* These have the same priority as ordinary file name args,
1969 so they are not reordered with respect to those. */
1970 { "-L", "--directory", 0, 1 },
1971 { "-directory", 0, 0, 1 },
1972 { "-l", "--load", 0, 1 },
1973 { "-load", 0, 0, 1 },
1974 { "-f", "--funcall", 0, 1 },
1975 { "-funcall", 0, 0, 1 },
1976 { "-eval", "--eval", 0, 1 },
1977 { "-insert", "--insert", 0, 1 },
1978 /* This should be processed after ordinary file name args and the like. */
1979 { "-kill", "--kill", -10, 0 },
1982 /* Reorder the elements of ARGV (assumed to have ARGC elements)
1983 so that the highest priority ones come first.
1984 Do not change the order of elements of equal priority.
1985 If an option takes an argument, keep it and its argument together. */
1988 sort_args (int argc, char **argv)
1990 char **new_argv = xnew_array (char *, argc);
1991 /* For each element of argv,
1992 the corresponding element of options is:
1993 0 for an option that takes no arguments,
1994 1 for an option that takes one argument, etc.
1995 -1 for an ordinary non-option argument. */
1996 int *options = xnew_array (int, argc);
1997 int *priority = xnew_array (int, argc);
2001 int end_of_options_p = 0;
2003 /* Categorize all the options,
2004 and figure out which argv elts are option arguments. */
2005 for (from = 1; from < argc; from++)
2009 /* Pseudo options "--" and "run-temacs" indicate end of options */
2010 if (!strcmp (argv[from], "--") ||
2011 !strcmp (argv[from], "run-temacs"))
2012 end_of_options_p = 1;
2013 if (!end_of_options_p && argv[from][0] == '-')
2018 /* Look for a match with a known old-fashioned option. */
2019 for (i = 0; i < countof (standard_args); i++)
2020 if (!strcmp (argv[from], standard_args[i].name))
2022 options[from] = standard_args[i].nargs;
2023 priority[from] = standard_args[i].priority;
2024 if (from + standard_args[i].nargs >= argc)
2025 fatal ("Option `%s' requires an argument\n", argv[from]);
2026 from += standard_args[i].nargs;
2030 /* Look for a match with a known long option.
2031 MATCH is -1 if no match so far, -2 if two or more matches so far,
2032 >= 0 (the table index of the match) if just one match so far. */
2033 if (argv[from][1] == '-')
2036 thislen = strlen (argv[from]);
2037 equals = strchr (argv[from], '=');
2039 thislen = equals - argv[from];
2041 for (i = 0; i < countof (standard_args); i++)
2042 if (standard_args[i].longname
2043 && !strncmp (argv[from], standard_args[i].longname,
2052 /* If we found exactly one match, use that. */
2055 options[from] = standard_args[match].nargs;
2056 priority[from] = standard_args[match].priority;
2057 /* If --OPTION=VALUE syntax is used,
2058 this option uses just one argv element. */
2061 if (from + options[from] >= argc)
2062 fatal ("Option `%s' requires an argument\n", argv[from]);
2063 from += options[from];
2070 /* Copy the arguments, in order of decreasing priority, to NEW_ARGV. */
2071 new_argv[0] = argv[0];
2075 int best_priority = -9999;
2077 /* Find the highest priority remaining option.
2078 If several have equal priority, take the first of them. */
2079 for (from = 1; from < argc; from++)
2081 if (argv[from] != 0 && priority[from] > best_priority)
2083 best_priority = priority[from];
2086 /* Skip option arguments--they are tied to the options. */
2087 if (options[from] > 0)
2088 from += options[from];
2094 /* Copy the highest priority remaining option, with its args, to NEW_ARGV. */
2095 new_argv[to++] = argv[best];
2096 for (i = 0; i < options[best]; i++)
2097 new_argv[to++] = argv[best + i + 1];
2099 /* Clear out this option in ARGV. */
2101 for (i = 0; i < options[best]; i++)
2102 argv[best + i + 1] = 0;
2105 memcpy (argv, new_argv, sizeof (char *) * argc);
2111 static JMP_BUF run_temacs_catch;
2113 static int run_temacs_argc;
2114 static char **run_temacs_argv;
2115 static char *run_temacs_args;
2116 static size_t run_temacs_argv_size;
2117 static size_t run_temacs_args_size;
2119 DEFUN ("running-temacs-p", Frunning_temacs_p, 0, 0, 0, /*
2120 True if running temacs. This means we are in the dumping stage.
2121 This is false during normal execution of the `xemacs' program, and
2122 becomes false once `run-emacs-from-temacs' is run.
2126 return run_temacs_argc >= 0 ? Qt : Qnil;
2129 DEFUN ("run-emacs-from-temacs", Frun_emacs_from_temacs, 0, MANY, 0, /*
2130 Do not call this. It will reinitialize your XEmacs. You'll be sorry.
2132 /* If this function is called from startup.el, it will be possible to run
2133 temacs as an editor using 'temacs -batch -l loadup.el run-temacs', instead
2134 of having to dump an emacs and then run that (when debugging emacs itself,
2135 this can be much faster)). [Actually, the speed difference isn't that
2136 much as long as your filesystem is local, and you don't end up with
2137 a dumped version in case you want to rerun it. This function is most
2138 useful when used as part of the `make all-elc' command. --ben]
2139 This will "restart" emacs with the specified command-line arguments.
2141 Martin thinks this function is most useful when using debugging
2142 tools like Purify or tcov that get confused by XEmacs' dumping. */
2143 (int nargs, Lisp_Object *args))
2146 const Extbyte *wampum;
2149 Lisp_Object orig_invoc_name = Fcar (Vcommand_line_args);
2150 const Extbyte **wampum_all = alloca_array (const Extbyte *, nargs);
2151 int *wampum_all_len = alloca_array (int, nargs);
2153 assert (!gc_in_progress);
2155 if (run_temacs_argc < 0)
2156 error ("I've lost my temacs-hood.");
2158 /* Need to convert the orig_invoc_name and all of the arguments
2159 to external format. */
2161 TO_EXTERNAL_FORMAT (LISP_STRING, orig_invoc_name,
2162 ALLOCA, (wampum, namesize),
2166 for (ac = 0, total_len = namesize; ac < nargs; ac++)
2168 CHECK_STRING (args[ac]);
2169 TO_EXTERNAL_FORMAT (LISP_STRING, args[ac],
2170 ALLOCA, (wampum_all[ac], wampum_all_len[ac]),
2172 wampum_all_len[ac]++;
2173 total_len += wampum_all_len[ac];
2175 DO_REALLOC (run_temacs_args, run_temacs_args_size, total_len, char);
2176 DO_REALLOC (run_temacs_argv, run_temacs_argv_size, nargs+2, char *);
2178 memcpy (run_temacs_args, wampum, namesize);
2179 run_temacs_argv [0] = run_temacs_args;
2180 for (ac = 0; ac < nargs; ac++)
2182 memcpy (run_temacs_args + namesize,
2183 wampum_all[ac], wampum_all_len[ac]);
2184 run_temacs_argv [ac + 1] = run_temacs_args + namesize;
2185 namesize += wampum_all_len[ac];
2187 run_temacs_argv [nargs + 1] = 0;
2188 catchlist = NULL; /* Important! Otherwise free_cons() calls in
2189 condition_case_unwind() may lead to GC death. */
2190 unbind_to (0, Qnil); /* this closes loadup.el */
2192 run_temacs_argc = nargs + 1;
2194 report_sheap_usage (0);
2196 LONGJMP (run_temacs_catch, 1);
2197 return Qnil; /* not reached; warning suppression */
2202 main (int argc, char **argv, char **envp)
2204 int volatile vol_argc = argc;
2205 char ** volatile vol_argv = argv;
2206 char ** volatile vol_envp = envp;
2207 /* This is hairy. We need to compute where the XEmacs binary was invoked
2208 from because temacs initialization requires it to find the lisp
2209 directories. The code that recomputes the path is guarded by the
2210 restarted flag. There are three possible paths I've found so far
2213 temacs -- When running temacs for basic build stuff, the first main_1
2214 will be the only one invoked. It must compute the path else there
2215 will be a very ugly bomb in startup.el (can't find obvious location
2216 for doc-directory data-directory, etc.).
2218 temacs w/ run-temacs on the command line -- This is run to bytecompile
2219 all the out of date dumped lisp. It will execute both of the main_1
2220 calls and the second one must not touch the first computation because
2221 argc/argv are hosed the second time through.
2223 xemacs -- Only the second main_1 is executed. The invocation path must
2224 computed but this only matters when running in place or when running
2227 As a bonus for straightening this out, XEmacs can now be run in place
2228 as a login shell. This never used to work.
2230 As another bonus, we can now guarantee that
2231 (concat invocation-directory invocation-name) contains the filename
2232 of the XEmacs binary we are running. This can now be used in a
2233 definite test for out of date dumped files. -slb */
2236 quantify_stop_recording_data ();
2237 quantify_clear_data ();
2238 #endif /* QUANTIFY */
2240 suppress_early_error_handler_backtrace = 0;
2241 lim_data = 0; /* force reinitialization of this variable */
2243 /* Lisp_Object must fit in a word; check VALBITS and GCTYPEBITS */
2244 assert (sizeof (Lisp_Object) == sizeof (void *));
2246 #ifdef LINUX_SBRK_BUG
2252 #ifdef DOUG_LEA_MALLOC
2253 mallopt (M_MMAP_MAX, 0);
2255 run_temacs_argc = 0;
2256 if (! SETJMP (run_temacs_catch))
2258 main_1 (vol_argc, vol_argv, vol_envp, 0);
2260 /* run-emacs-from-temacs called */
2262 vol_argc = run_temacs_argc;
2263 vol_argv = run_temacs_argv;
2265 /* This makes absolutely no sense to anyone involved. There are
2266 several people using this stuff. We've compared versions on
2267 everything we can think of. We can find no difference.
2268 However, on both my systems environ is a plain old global
2269 variable initialized to zero. _environ is the one that
2270 contains pointers to the actual environment.
2272 Since we can't figure out the difference (and we're hours
2273 away from a release), this takes a very cowardly approach and
2274 is bracketed with both a system specific preprocessor test
2275 and a runtime "do you have this problem" test
2277 06/20/96 robertl@dgii.com */
2279 extern char *_environ;
2280 if ((unsigned) environ == 0)
2283 #endif /* _SCO_DS */
2286 #ifdef RUN_TIME_REMAP
2288 /* obviously no-one uses this because where it was before initialized was
2290 run_time_remap (argv[0]);
2293 #ifdef DOUG_LEA_MALLOC
2294 if (initialized && (malloc_state_ptr != NULL))
2296 int rc = malloc_set_state (malloc_state_ptr);
2299 fprintf (stderr, "malloc_set_state failed, rc = %d\n", rc);
2303 free (malloc_state_ptr);
2305 /* mmap works in glibc-2.1, glibc-2.0 (Non-Mule only) and Linux libc5 */
2306 #if (defined(__GLIBC__) && __GLIBC_MINOR__ >= 1) || \
2307 defined(_NO_MALLOC_WARNING_) || \
2308 (defined(__GLIBC__) && __GLIBC_MINOR__ < 1 && !defined(MULE)) || \
2309 defined(DEBUG_DOUG_LEA_MALLOC)
2310 mallopt (M_MMAP_MAX, 64);
2316 #endif /* DOUG_LEA_MALLOC */
2318 run_temacs_argc = -1;
2320 main_1 (vol_argc, vol_argv, vol_envp, restarted);
2321 return 0; /* unreached */
2325 /* Dumping apparently isn't supported by versions of GCC >= 2.8. */
2326 /* The following needs conditionalization on whether either XEmacs or */
2327 /* various system shared libraries have been built and linked with */
2328 /* GCC >= 2.8. -slb */
2329 #if defined(GNU_MALLOC)
2331 voodoo_free_hook (void *mem)
2333 /* Disable all calls to free() when XEmacs is exiting and it doesn't */
2336 #ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
2337 (__typeof__ (__free_hook))
2341 #endif /* GNU_MALLOC */
2343 DEFUN ("kill-emacs", Fkill_emacs, 0, 1, "P", /*
2344 Exit the XEmacs job and kill it. Ask for confirmation, without argument.
2345 If ARG is an integer, return ARG as the exit program code.
2346 If ARG is a string, stuff it as keyboard input.
2348 The value of `kill-emacs-hook', if not void,
2349 is a list of functions (of no args),
2350 all of which are called before XEmacs is actually killed.
2354 /* This function can GC */
2355 struct gcpro gcpro1;
2362 if (!preparing_for_armageddon && !noninteractive)
2363 run_hook (Qkill_emacs_hook);
2365 /* make sure no quitting from now on!! */
2366 dont_check_for_quit = 1;
2369 if (!preparing_for_armageddon)
2371 Lisp_Object concons, nextcons;
2373 /* Normally, go ahead and delete all the consoles now.
2374 Some unmentionably lame window systems (MS Wwwww...... eek,
2375 I can't even say it) don't properly clean up after themselves,
2376 and even for those that do, it might be cleaner this way.
2377 If we're going down, however, we don't do this (might
2378 be too dangerous), and if we get a crash somewhere within
2379 this loop, we'll still autosave and won't try this again. */
2381 LIST_LOOP_DELETING(concons, nextcons, Vconsole_list)
2383 /* There is very little point in deleting the stream console.
2384 It uses stdio, which should flush any buffered output and
2385 something can only go wrong. -slb */
2386 /* I changed my mind. There's a stupid hack in close to add
2387 a trailing newline. */
2388 /*if (!CONSOLE_STREAM_P (XCONSOLE (XCAR (concons))))*/
2389 delete_console_internal (XCONSOLE (XCAR (concons)), 1, 1, 0);
2395 shut_down_emacs (0, STRINGP (arg) ? arg : Qnil);
2397 #if defined(GNU_MALLOC)
2399 #ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
2400 (__typeof__ (__free_hook))
2405 exit (INTP (arg) ? XINT (arg) : 0);
2407 return Qnil; /* I'm sick of the compiler warning */
2410 /* Perform an orderly shutdown of XEmacs. Autosave any modified
2411 buffers, kill any child processes, clean up the terminal modes (if
2412 we're in the foreground), and other stuff like that. Don't perform
2413 any redisplay; this may be called when XEmacs is shutting down in
2414 the background, or after its X connection has died.
2416 If SIG is a signal number, print a message for it.
2418 This is called by fatal signal handlers, X protocol error handlers,
2421 shut_down_emacs (int sig, Lisp_Object stuff)
2423 /* This function can GC */
2424 /* Prevent running of hooks and other non-essential stuff
2426 preparing_for_armageddon = 1;
2428 /* In case frames or windows are screwed up, avoid assertion
2433 quantify_stop_recording_data ();
2434 #endif /* QUANTIFY */
2437 /* This is absolutely the most important thing to do, so make sure
2438 we do it now, before anything else. We might have crashed and
2439 be in a weird inconsistent state, and potentially anything could
2440 set off another protection fault and cause us to bail out
2442 /* I'm not removing the code entirely, yet. We have run up against
2443 a spate of problems in diagnosing crashes due to crashes within
2444 crashes. It has very definitely been determined that code called
2445 during auto-saving cannot work if XEmacs crashed inside of GC.
2446 We already auto-save on an itimer so there cannot be too much
2447 unsaved stuff around, and if we get better crash reports we might
2448 be able to get more problems fixed so I'm disabling this. -slb */
2449 Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
2453 reset_all_consoles ();
2454 if (sig && sig != SIGTERM)
2456 stderr_out ("\nFatal error (%d).\n", sig);
2458 ("Your files have been auto-saved.\n"
2459 "Use `M-x recover-session' to recover them.\n"
2461 "If you have access to the PROBLEMS file that came with your\n"
2462 "version of XEmacs, please check to see if your crash is described\n"
2463 "there, as there may be a workaround available.\n"
2465 "Otherwise, please report this bug by selecting `Report-Bug'\n"
2466 "in the InfoDock menu.\n"
2468 "Otherwise, please report this bug by running the send-pr\n"
2469 "script included with XEmacs, or selecting `Send Bug Report'\n"
2470 "from the help menu.\n"
2471 "As a last resort send ordinary email to `crashes@xemacs.org'.\n"
2473 "*MAKE SURE* to include the information in the command\n"
2474 "M-x describe-installation.\n"
2476 "If at all possible, *please* try to obtain a C stack backtrace;\n"
2477 "it will help us immensely in determining what went wrong.\n"
2478 "To do this, locate the core file that was produced as a result\n"
2479 "of this crash (it's usually called `core' and is located in the\n"
2480 "directory in which you started the editor, or maybe in your home\n"
2481 "directory), and type\n"
2488 /* Now try to determine the actual path to the executable,
2489 to try to make the backtrace-determination process as foolproof
2491 if (STRINGP (Vinvocation_name))
2492 name = (char *) XSTRING_DATA (Vinvocation_name);
2495 if (STRINGP (Vinvocation_directory))
2496 dir = (char *) XSTRING_DATA (Vinvocation_directory);
2497 if (!dir || dir[0] != '/')
2498 stderr_out ("`which %s`", name);
2499 else if (dir[strlen (dir) - 1] != '/')
2500 stderr_out ("%s/%s", dir, name);
2502 stderr_out ("%s%s", dir, name);
2506 "then type `where' when the debugger prompt comes up.\n"
2507 "(If you don't have GDB on your system, you might have DBX,\n"
2508 "or XDB, or SDB. A similar procedure should work for all of\n"
2509 "these. Ask your system administrator if you need more help.)\n");
2512 stuff_buffered_input (stuff);
2514 kill_buffer_processes (Qnil);
2516 #ifdef CLASH_DETECTION
2517 unlock_all_files ();
2521 tt_session_quit (tt_default_session ());
2523 /* The following crashes when built on X11R5 and run on X11R6 */
2526 #endif /* TOOLTALK */
2533 #if !defined(PDUMP) || !defined(SYSTEM_MALLOC)
2534 extern char my_edata[];
2539 DEFUN ("dump-emacs-data", Fdump_emacs_data, 1, 1, 0, /*
2540 Dump current state of XEmacs into data file FILENAME.
2541 This function exists on systems that use HAVE_SHM.
2545 /* This function can GC */
2547 struct gcpro gcpro1;
2550 CHECK_STRING (intoname);
2551 intoname = Fexpand_file_name (intoname, Qnil);
2553 opurify = purify_flag;
2559 disksave_object_finalization ();
2560 release_breathing_space ();
2562 /* Tell malloc where start of impure now is */
2563 /* Also arrange for warnings when nearly out of space. */
2564 #ifndef SYSTEM_MALLOC
2565 memory_warnings (my_edata, malloc_warning);
2568 map_out_data (XSTRING_DATA (intoname));
2570 purify_flag = opurify;
2575 #else /* not HAVE_SHM */
2576 extern void disable_free_hook (void);
2578 DEFUN ("dump-emacs", Fdump_emacs, 2, 2, 0, /*
2579 Dump current state of XEmacs into executable file FILENAME.
2580 Take symbols from SYMFILE (presumably the file you executed to run XEmacs).
2581 This is used in the file `loadup.el' when building XEmacs.
2583 Remember to set `command-line-processed' to nil before dumping
2584 if you want the dumped XEmacs to process its command line
2585 and announce itself normally when it is run.
2587 (intoname, symname))
2589 /* This function can GC */
2590 struct gcpro gcpro1, gcpro2;
2593 GCPRO2 (intoname, symname);
2595 #ifdef FREE_CHECKING
2596 Freally_free (Qnil);
2598 /* When we're dumping, we can't use the debugging free() */
2599 disable_free_hook ();
2602 CHECK_STRING (intoname);
2603 intoname = Fexpand_file_name (intoname, Qnil);
2604 if (!NILP (symname))
2606 CHECK_STRING (symname);
2607 if (XSTRING_LENGTH (symname) > 0)
2608 symname = Fexpand_file_name (symname, Qnil);
2613 opurify = purify_flag;
2617 report_sheap_usage (1);
2625 disksave_object_finalization ();
2626 release_breathing_space ();
2628 /* Tell malloc where start of impure now is */
2629 /* Also arrange for warnings when nearly out of space. */
2630 #ifndef SYSTEM_MALLOC
2631 memory_warnings (my_edata, malloc_warning);
2636 #if defined (MSDOS) && defined (EMX)
2638 int fd = open ((char *) XSTRING_DATA (intoname),
2639 O_WRONLY|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE);
2641 error ("Failure operating on %s", XSTRING_DATA (intoname));
2647 #else /* not MSDOS and EMX */
2652 TO_EXTERNAL_FORMAT (LISP_STRING, intoname,
2653 C_STRING_ALLOCA, intoname_ext,
2656 if (STRINGP (symname))
2657 TO_EXTERNAL_FORMAT (LISP_STRING, symname,
2658 C_STRING_ALLOCA, symname_ext,
2663 garbage_collect_1 ();
2669 #ifdef DOUG_LEA_MALLOC
2670 malloc_state_ptr = malloc_get_state ();
2672 /* here we break our rule that the filename conversion should
2673 be performed at the actual time that the system call is made.
2674 It's a whole lot easier to do the conversion here than to
2675 modify all the unexec routines to ensure that filename
2676 conversion is applied everywhere. Don't worry about memory
2677 leakage because this call only happens once. */
2678 unexec (intoname_ext, symname_ext, (uintptr_t) my_edata, 0, 0);
2679 #ifdef DOUG_LEA_MALLOC
2680 free (malloc_state_ptr);
2682 #endif /* not PDUMP */
2684 #endif /* not MSDOS and EMX */
2686 purify_flag = opurify;
2691 #endif /* not HAVE_SHM */
2693 #endif /* not CANNOT_DUMP */
2699 /* Split STRING into a list of substrings. The substrings are the
2700 parts of original STRING separated by SEPCHAR. */
2702 split_string_by_emchar_1 (const Bufbyte *string, Bytecount size,
2705 Lisp_Object result = Qnil;
2706 const Bufbyte *end = string + size;
2710 const Bufbyte *p = string;
2713 if (charptr_emchar (p) == sepchar)
2717 result = Fcons (make_string (string, p - string), result);
2721 INC_CHARPTR (string); /* skip sepchar */
2726 return Fnreverse (result);
2729 /* The same as the above, except PATH is an external C string (it is
2730 converted using Qfile_name), and sepchar is hardcoded to SEPCHAR
2731 (':' or whatever). */
2733 decode_path (const char *path)
2740 TO_INTERNAL_FORMAT (C_STRING, path, ALLOCA, (newpath, newlen), Qfile_name);
2742 /* #### Does this make sense? It certainly does for
2743 decode_env_path(), but it looks dubious here. Does any code
2744 depend on decode_path("") returning nil instead of an empty
2749 return split_string_by_emchar_1 (newpath, newlen, SEPCHAR);
2753 decode_env_path (const char *evarname, const char *default_)
2755 const char *path = 0;
2757 path = egetenv (evarname);
2760 return decode_path (path);
2763 /* Ben thinks this function should not exist or be exported to Lisp.
2764 We use it to define split-path-string in subr.el (not!). */
2766 DEFUN ("split-string-by-char", Fsplit_string_by_char, 1, 2, 0, /*
2767 Split STRING into a list of substrings originally separated by SEPCHAR.
2771 CHECK_STRING (string);
2772 CHECK_CHAR (sepchar);
2773 return split_string_by_emchar_1 (XSTRING_DATA (string),
2774 XSTRING_LENGTH (string),
2778 /* #### This was supposed to be in subr.el, but is used VERY early in
2779 the bootstrap process, so it goes here. Damn. */
2781 DEFUN ("split-path", Fsplit_path, 1, 1, 0, /*
2782 Explode a search path into a list of strings.
2783 The path components are separated with the characters specified
2784 with `path-separator'.
2788 CHECK_STRING (path);
2790 while (!STRINGP (Vpath_separator)
2791 || (XSTRING_CHAR_LENGTH (Vpath_separator) != 1))
2792 Vpath_separator = signal_simple_continuable_error
2793 ("`path-separator' should be set to a single-character string",
2796 return (split_string_by_emchar_1
2797 (XSTRING_DATA (path), XSTRING_LENGTH (path),
2798 charptr_emchar (XSTRING_DATA (Vpath_separator))));
2801 DEFUN ("noninteractive", Fnoninteractive, 0, 0, 0, /*
2802 Non-nil return value means XEmacs is running without interactive terminal.
2806 return noninteractive ? Qt : Qnil;
2809 /* This flag is useful to define if you're under a debugger; this way, you
2810 can put a breakpoint of assert_failed() and debug multiple problems
2811 in one session without having to recompile. */
2812 /* #define ASSERTIONS_DONT_ABORT */
2814 #ifdef USE_ASSERTIONS
2815 /* This highly dubious kludge ... shut up Jamie, I'm tired of your slagging. */
2818 assert_failed (const char *file, int line, const char *expr)
2820 stderr_out ("Fatal error: assertion failed, file %s, line %d, %s\n",
2822 #undef abort /* avoid infinite #define loop... */
2823 #if defined (WINDOWSNT) && defined (DEBUG_XEMACS)
2825 #elif !defined (ASSERTIONS_DONT_ABORT)
2829 #endif /* USE_ASSERTIONS */
2832 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
2834 Start recording Quantify data.
2838 quantify_start_recording_data ();
2842 DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
2844 Stop recording Quantify data.
2848 quantify_stop_recording_data ();
2852 DEFUN ("quantify-clear-data", Fquantify_clear_data, 0, 0, "", /*
2853 Clear all Quantify data.
2857 quantify_clear_data ();
2860 #endif /* QUANTIFY */
2863 syms_of_emacs (void)
2867 DEFSUBR (Fdump_emacs_data);
2869 DEFSUBR (Fdump_emacs);
2871 #endif /* !CANNOT_DUMP */
2873 DEFSUBR (Frun_emacs_from_temacs);
2874 DEFSUBR (Frunning_temacs_p);
2875 DEFSUBR (Finvocation_name);
2876 DEFSUBR (Finvocation_directory);
2877 DEFSUBR (Fkill_emacs);
2878 DEFSUBR (Fnoninteractive);
2881 DEFSUBR (Fquantify_start_recording_data);
2882 DEFSUBR (Fquantify_stop_recording_data);
2883 DEFSUBR (Fquantify_clear_data);
2884 #endif /* QUANTIFY */
2886 DEFSUBR (Fsplit_string_by_char);
2887 DEFSUBR (Fsplit_path); /* #### */
2889 defsymbol (&Qkill_emacs_hook, "kill-emacs-hook");
2890 defsymbol (&Qsave_buffers_kill_emacs, "save-buffers-kill-emacs");
2894 vars_of_emacs (void)
2896 DEFVAR_BOOL ("suppress-early-error-handler-backtrace",
2897 &suppress_early_error_handler_backtrace /*
2898 Non-nil means early error handler shouldn't print a backtrace.
2901 DEFVAR_LISP ("command-line-args", &Vcommand_line_args /*
2902 Args passed by shell to XEmacs, as a list of strings.
2905 DEFVAR_LISP ("invocation-name", &Vinvocation_name /*
2906 The program name that was used to run XEmacs.
2907 Any directory names are omitted.
2910 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory /*
2911 The directory in which the XEmacs executable was found, to run it.
2912 The value is simply the program name if that directory's name is not known.
2915 DEFVAR_LISP ("invocation-path", &Vinvocation_path /*
2916 The path in which the XEmacs executable was found, to run it.
2917 The value is simply the value of environment variable PATH on startup
2918 if XEmacs was found there.
2922 xxDEFVAR_LISP ("installation-directory", &Vinstallation_directory,
2923 "A directory within which to look for the `lib-src' and `etc' directories.\n"
2924 "This is non-nil when we can't find those directories in their standard\n"
2925 "installed locations, but we can find them\n"
2926 "near where the XEmacs executable was found.");
2929 DEFVAR_LISP ("system-type", &Vsystem_type /*
2930 Symbol indicating type of operating system you are using.
2932 Vsystem_type = intern (SYSTEM_TYPE);
2933 Fprovide (intern(SYSTEM_TYPE));
2935 #ifndef EMACS_CONFIGURATION
2936 # define EMACS_CONFIGURATION "UNKNOWN"
2938 DEFVAR_LISP ("system-configuration", &Vsystem_configuration /*
2939 String naming the configuration XEmacs was built for.
2941 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
2943 #ifndef EMACS_CONFIG_OPTIONS
2944 # define EMACS_CONFIG_OPTIONS "UNKNOWN"
2946 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options /*
2947 String containing the configuration options XEmacs was built with.
2949 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2951 DEFVAR_LISP ("emacs-major-version", &Vemacs_major_version /*
2952 Major version number of this version of Emacs, as an integer.
2953 Warning: this variable did not exist in Emacs versions earlier than:
2957 Vemacs_major_version = make_int (EMACS_MAJOR_VERSION);
2959 DEFVAR_LISP ("emacs-minor-version", &Vemacs_minor_version /*
2960 Minor version number of this version of Emacs, as an integer.
2961 Warning: this variable did not exist in Emacs versions earlier than:
2965 Vemacs_minor_version = make_int (EMACS_MINOR_VERSION);
2967 DEFVAR_LISP ("emacs-patch-level", &Vemacs_patch_level /*
2968 The patch level of this version of Emacs, as an integer.
2969 The value is non-nil if this version of XEmacs is part of a series of
2970 stable XEmacsen, but has bug fixes applied.
2971 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
2974 #ifdef EMACS_PATCH_LEVEL
2975 Vemacs_patch_level = make_int (EMACS_PATCH_LEVEL);
2977 Vemacs_patch_level = Qnil;
2980 DEFVAR_LISP ("emacs-beta-version", &Vemacs_beta_version /*
2981 Beta number of this version of Emacs, as an integer.
2982 The value is nil if this is an officially released version of XEmacs.
2983 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
2986 #ifdef EMACS_BETA_VERSION
2987 Vemacs_beta_version = make_int (EMACS_BETA_VERSION);
2989 Vemacs_beta_version = Qnil;
2993 DEFVAR_LISP ("infodock-major-version", &Vinfodock_major_version /*
2994 Major version number of this InfoDock release.
2996 Vinfodock_major_version = make_int (INFODOCK_MAJOR_VERSION);
2998 DEFVAR_LISP ("infodock-minor-version", &Vinfodock_minor_version /*
2999 Minor version number of this InfoDock release.
3001 Vinfodock_minor_version = make_int (INFODOCK_MINOR_VERSION);
3003 DEFVAR_LISP ("infodock-build-version", &Vinfodock_build_version /*
3004 Build version of this InfoDock release.
3006 Vinfodock_build_version = make_int (INFODOCK_BUILD_VERSION);
3009 DEFVAR_LISP ("xemacs-codename", &Vxemacs_codename /*
3010 Codename of this version of Emacs (a string).
3012 #ifndef XEMACS_CODENAME
3013 #define XEMACS_CODENAME "Noname"
3015 Vxemacs_codename = build_string (XEMACS_CODENAME);
3017 DEFVAR_BOOL ("noninteractive", &noninteractive1 /*
3018 Non-nil means XEmacs is running without interactive terminal.
3021 DEFVAR_BOOL ("inhibit-early-packages", &inhibit_early_packages /*
3022 Set to non-nil when the early packages should not be respected at startup.
3025 DEFVAR_BOOL ("inhibit-autoloads", &inhibit_autoloads /*
3026 Set to non-nil when autoloads should not be loaded at startup.
3029 DEFVAR_BOOL ("debug-paths", &debug_paths /*
3030 Set to non-nil when debug information about paths should be printed.
3033 DEFVAR_BOOL ("inhibit-site-lisp", &inhibit_site_lisp /*
3034 Set to non-nil when the site-lisp should not be searched at startup.
3036 #ifdef INHIBIT_SITE_LISP
3037 inhibit_site_lisp = 1;
3040 DEFVAR_BOOL ("inhibit-site-modules", &inhibit_site_modules /*
3041 Set to non-nil when site-modules should not be searched at startup.
3043 #ifdef INHIBIT_SITE_MODULES
3044 inhibit_site_modules = 1;
3047 DEFVAR_INT ("emacs-priority", &emacs_priority /*
3048 Priority for XEmacs to run at.
3049 This value is effective only if set before XEmacs is dumped,
3050 and only if the XEmacs executable is installed with setuid to permit
3051 it to change priority. (XEmacs sets its uid back to the real uid.)
3052 Currently, you need to define SET_EMACS_PRIORITY in `config.h'
3053 before you compile XEmacs, to enable the code for this feature.
3057 DEFVAR_CONST_LISP ("internal-error-checking", &Vinternal_error_checking /*
3058 Internal error checking built-in into this instance of XEmacs.
3059 This is a list of symbols, initialized at build-time. Legal symbols
3062 extents - check extents prior to each extent change;
3063 typecheck - check types strictly, aborting in case of error;
3064 malloc - check operation of malloc;
3065 gc - check garbage collection;
3066 bufpos - check buffer positions.
3068 Vinternal_error_checking = Qnil;
3069 #ifdef ERROR_CHECK_EXTENTS
3070 Vinternal_error_checking = Fcons (intern ("extents"),
3071 Vinternal_error_checking);
3073 #ifdef ERROR_CHECK_TYPECHECK
3074 Vinternal_error_checking = Fcons (intern ("typecheck"),
3075 Vinternal_error_checking);
3077 #ifdef ERROR_CHECK_MALLOC
3078 Vinternal_error_checking = Fcons (intern ("malloc"),
3079 Vinternal_error_checking);
3081 #ifdef ERROR_CHECK_GC
3082 Vinternal_error_checking = Fcons (intern ("gc"),
3083 Vinternal_error_checking);
3085 #ifdef ERROR_CHECK_BUFPOS
3086 Vinternal_error_checking = Fcons (intern ("bufpos"),
3087 Vinternal_error_checking);
3090 DEFVAR_CONST_LISP ("mail-lock-methods", &Vmail_lock_methods /*
3091 Mail spool locking methods supported by this instance of XEmacs.
3092 This is a list of symbols. Each of the symbols is one of the
3093 following: dot, lockf, flock, locking, mmdf.
3096 Vmail_lock_methods = Qnil;
3097 Vmail_lock_methods = Fcons (intern ("dot"), Vmail_lock_methods);
3099 Vmail_lock_methods = Fcons (intern ("lockf"), Vmail_lock_methods);
3102 Vmail_lock_methods = Fcons (intern ("flock"), Vmail_lock_methods);
3105 Vmail_lock_methods = Fcons (intern ("mmdf"), Vmail_lock_methods);
3108 Vmail_lock_methods = Fcons (intern ("locking"), Vmail_lock_methods);
3112 DEFVAR_CONST_LISP ("configure-mail-lock-method", &Vconfigure_mail_lock_method /*
3113 Mail spool locking method suggested by configure. This is one
3114 of the symbols in MAIL-LOCK-METHODS.
3117 #if defined(MAIL_LOCK_FLOCK) && defined(HAVE_FLOCK)
3118 Vconfigure_mail_lock_method = intern("flock");
3119 #elif defined(MAIL_LOCK_LOCKF) && defined(HAVE_LOCKF)
3120 Vconfigure_mail_lock_method = intern("lockf");
3121 #elif defined(MAIL_LOCK_MMDF) && defined(HAVE_MMDF)
3122 Vconfigure_mail_lock_method = intern("mmdf");
3123 #elif defined(MAIL_LOCK_LOCKING) && defined(HAVE_LOCKING)
3124 Vconfigure_mail_lock_method = intern("locking");
3126 Vconfigure_mail_lock_method = intern("dot");
3130 DEFVAR_LISP ("path-separator", &Vpath_separator /*
3131 The directory separator in search paths, as a string.
3135 Vpath_separator = make_string ((Bufbyte *)&c, 1);
3140 complex_vars_of_emacs (void)
3142 /* This is all related to path searching. */
3144 DEFVAR_LISP ("emacs-program-name", &Vemacs_program_name /*
3145 *Name of the Emacs variant.
3146 For example, this may be \"xemacs\" or \"infodock\".
3147 This is mainly meant for use in path searching.
3149 Vemacs_program_name = build_string ((char *) PATH_PROGNAME);
3151 DEFVAR_LISP ("emacs-program-version", &Vemacs_program_version /*
3152 *Version of the Emacs variant.
3153 This typically has the form XX.XX[-bXX].
3154 This is mainly meant for use in path searching.
3156 Vemacs_program_version = build_string ((char *) PATH_VERSION);
3158 DEFVAR_LISP ("exec-path", &Vexec_path /*
3159 *List of directories to search programs to run in subprocesses.
3160 Each element is a string (directory name) or nil (try default directory).
3164 DEFVAR_LISP ("exec-directory", &Vexec_directory /*
3165 *Directory of architecture-dependent files that come with XEmacs,
3166 especially executable programs intended for XEmacs to invoke.
3168 Vexec_directory = Qnil;
3170 DEFVAR_LISP ("configure-exec-directory", &Vconfigure_exec_directory /*
3171 For internal use by the build procedure only.
3172 configure's idea of what EXEC-DIRECTORY will be.
3175 Vconfigure_exec_directory = Ffile_name_as_directory
3176 (build_string ((char *) PATH_EXEC));
3178 Vconfigure_exec_directory = Qnil;
3181 DEFVAR_LISP ("lisp-directory", &Vlisp_directory /*
3182 *Directory of core Lisp files that come with XEmacs.
3184 Vlisp_directory = Qnil;
3186 DEFVAR_LISP ("configure-lisp-directory", &Vconfigure_lisp_directory /*
3187 For internal use by the build procedure only.
3188 configure's idea of what LISP-DIRECTORY will be.
3190 #ifdef PATH_LOADSEARCH
3191 Vconfigure_lisp_directory = Ffile_name_as_directory
3192 (build_string ((char *) PATH_LOADSEARCH));
3194 Vconfigure_lisp_directory = Qnil;
3197 DEFVAR_LISP ("module-directory", &Vmodule_directory /*
3198 *Directory of core dynamic modules that come with XEmacs.
3200 Vmodule_directory = Qnil;
3202 DEFVAR_LISP ("configure-module-directory", &Vconfigure_module_directory /*
3203 For internal use by the build procedure only.
3204 configure's idea of what MODULE-DIRECTORY will be.
3206 #ifdef PATH_MODULESEARCH
3207 Vconfigure_module_directory = Ffile_name_as_directory
3208 (build_string ((char *) PATH_MODULESEARCH));
3210 Vconfigure_module_directory = Qnil;
3213 DEFVAR_LISP ("configure-package-path", &Vconfigure_package_path /*
3214 For internal use by the build procedure only.
3215 configure's idea of what the package path will be.
3217 #ifdef PATH_PACKAGEPATH
3218 Vconfigure_package_path = decode_path (PATH_PACKAGEPATH);
3220 Vconfigure_package_path = Qnil;
3223 DEFVAR_LISP ("data-directory", &Vdata_directory /*
3224 *Directory of architecture-independent files that come with XEmacs,
3225 intended for XEmacs to use.
3226 Use of this variable in new code is almost never correct. See the
3227 function `locate-data-directory' and the variable `data-directory-list'.
3229 Vdata_directory = Qnil;
3231 DEFVAR_LISP ("configure-data-directory", &Vconfigure_data_directory /*
3232 For internal use by the build procedure only.
3233 configure's idea of what DATA-DIRECTORY will be.
3236 Vconfigure_data_directory = Ffile_name_as_directory
3237 (build_string ((char *) PATH_DATA));
3239 Vconfigure_data_directory = Qnil;
3242 DEFVAR_LISP ("data-directory-list", &Vdata_directory_list /*
3243 *List of directories of architecture-independent files that come with XEmacs
3244 or were installed as packages, and are intended for XEmacs to use.
3246 Vdata_directory_list = Qnil;
3248 #ifdef CLASH_DETECTION
3249 DEFVAR_LISP ("configure-lock-directory", &Vconfigure_lock_directory /*
3250 For internal use by the build procedure only.
3251 configure's idea of what LOCK-DIRECTORY will be.
3254 Vconfigure_lock_directory = Ffile_name_as_directory
3255 (build_string ((char *) PATH_LOCK));
3257 Vconfigure_lock_directory = Qnil;
3259 #endif /* CLASH_DETECTION */
3261 DEFVAR_LISP ("site-directory", &Vsite_directory /*
3262 *Directory of site-specific Lisp files that come with XEmacs.
3264 Vsite_directory = Qnil;
3266 DEFVAR_LISP ("configure-site-directory", &Vconfigure_site_directory /*
3267 For internal use by the build procedure only.
3268 configure's idea of what SITE-DIRECTORY will be.
3271 Vconfigure_site_directory = Ffile_name_as_directory
3272 (build_string ((char *) PATH_SITE));
3274 Vconfigure_site_directory = Qnil;
3277 DEFVAR_LISP ("site-module-directory", &Vsite_module_directory /*
3278 *Directory of site-specific loadable modules that come with XEmacs.
3280 Vsite_module_directory = Qnil;
3282 DEFVAR_LISP ("configure-site-module-directory", &Vconfigure_site_module_directory /*
3283 For internal use by the build procedure only.
3284 configure's idea of what SITE-DIRECTORY will be.
3286 #ifdef PATH_SITE_MODULES
3287 Vconfigure_site_module_directory = Ffile_name_as_directory
3288 (build_string ((char *) PATH_SITE_MODULES));
3290 Vconfigure_site_module_directory = Qnil;
3293 DEFVAR_LISP ("doc-directory", &Vdoc_directory /*
3294 *Directory containing the DOC file that comes with XEmacs.
3295 This is usually the same as exec-directory.
3297 Vdoc_directory = Qnil;
3299 DEFVAR_LISP ("configure-doc-directory", &Vconfigure_doc_directory /*
3300 For internal use by the build procedure only.
3301 configure's idea of what DOC-DIRECTORY will be.
3304 Vconfigure_doc_directory = Ffile_name_as_directory
3305 (build_string ((char *) PATH_DOC));
3307 Vconfigure_doc_directory = Qnil;
3310 DEFVAR_LISP ("configure-exec-prefix-directory", &Vconfigure_exec_prefix_directory /*
3311 For internal use by the build procedure only.
3312 configure's idea of what EXEC-PREFIX-DIRECTORY will be.
3314 #ifdef PATH_EXEC_PREFIX
3315 Vconfigure_exec_prefix_directory = Ffile_name_as_directory
3316 (build_string ((char *) PATH_EXEC_PREFIX));
3318 Vconfigure_exec_prefix_directory = Qnil;
3321 DEFVAR_LISP ("configure-prefix-directory", &Vconfigure_prefix_directory /*
3322 For internal use by the build procedure only.
3323 configure's idea of what PREFIX-DIRECTORY will be.
3326 Vconfigure_prefix_directory = Ffile_name_as_directory
3327 (build_string ((char *) PATH_PREFIX));
3329 Vconfigure_prefix_directory = Qnil;
3332 DEFVAR_LISP ("configure-info-directory", &Vconfigure_info_directory /*
3333 For internal use by the build procedure only.
3334 This is the name of the directory in which the build procedure installed
3335 Emacs's info files; the default value for Info-default-directory-list
3339 Vconfigure_info_directory =
3340 Ffile_name_as_directory (build_string (PATH_INFO));
3342 Vconfigure_info_directory = Qnil;
3345 DEFVAR_LISP ("configure-info-path", &Vconfigure_info_path /*
3346 The configured initial path for info documentation.
3348 #ifdef PATH_INFOPATH
3349 Vconfigure_info_path = decode_path (PATH_INFOPATH);
3351 Vconfigure_info_path = Qnil;
3355 #if defined(__sgi) && !defined(PDUMP)
3356 /* This is so tremendously ugly I'd puke. But then, it works.
3357 * The target is to override the static constructor from the
3358 * libiflPNG.so library which is maskerading as libz, and
3359 * cores on us when re-started from the dumped executable.
3360 * This will have to go for 21.1 -- OG.
3362 void __sti__iflPNGFile_c___(void);
3363 void __sti__iflPNGFile_c___()