XEmacs 21.2.29 "Hestia".
[chise/xemacs-chise.git.1] / src / emacs.c
1 /* XEmacs -- Fully extensible Emacs, running on Unix and other platforms.
2    Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994
3    Free Software Foundation, Inc.
4    Copyright (C) 1995 Sun Microsystems, Inc.
5
6 This file is part of XEmacs.
7
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
11 later version.
12
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
16 for more details.
17
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.  */
22
23 /* Synched up with: Mule 2.0, FSF 19.28. */
24
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. */
29
30 #include <config.h>
31 #include "lisp.h"
32
33 #include "backtrace.h" /* run-emacs-from-temacs needs this */
34 #include "buffer.h"
35 #include "commands.h"
36 #include "console.h"
37 #include "process.h"
38 #include "redisplay.h"
39 #include "frame.h"
40 #include "sysdep.h"
41
42 #include "syssignal.h" /* Always include before systty.h */
43 #include "systty.h"
44 #include "sysfile.h"
45 #include "systime.h"
46
47 #ifdef QUANTIFY
48 #include <quantify.h>
49 #endif
50
51 #ifdef HAVE_SHLIB
52 #include "sysdll.h"
53 #endif
54
55 #if defined (HAVE_LOCALE_H) && \
56    (defined (I18N2) || defined (I18N3) || defined (I18N4))
57 #include <locale.h>
58 #endif
59
60 #ifdef TOOLTALK
61 #include TT_C_H_PATH
62 #endif
63
64 #if defined (WINDOWSNT)
65 #include <windows.h>
66 #endif
67
68 /* For PATH_EXEC */
69 #include <paths.h>
70
71 #ifdef HEAP_IN_DATA
72 void report_sheap_usage (int die_if_pure_storage_exceeded);
73 #endif
74
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 */
80
81 /* Command line args from shell, as list of strings */
82 Lisp_Object Vcommand_line_args;
83
84 /* Set nonzero after XEmacs has started up the first time.
85   Prevents reinitialization of the Lisp world and keymaps
86   on subsequent starts.  */
87 int initialized;
88
89 #ifdef DOUG_LEA_MALLOC
90 # include <malloc.h>
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 */
95
96 # ifdef REL_ALLOC
97 void r_alloc_reinit (void);
98 # endif
99
100 /* Variable whose value is symbol giving operating system type. */
101 Lisp_Object Vsystem_type;
102
103 /* Variable whose value is string giving configuration built for.  */
104 Lisp_Object Vsystem_configuration;
105
106 /* Variable whose value is string containing the configuration options
107    XEmacs was built with.  */
108 Lisp_Object Vsystem_configuration_options;
109
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;
116 #ifdef INFODOCK
117 Lisp_Object Vinfodock_major_version;
118 Lisp_Object Vinfodock_minor_version;
119 Lisp_Object Vinfodock_build_version;
120 #endif
121
122 /* The path under which XEmacs was invoked. */
123 Lisp_Object Vinvocation_path;
124
125 /* The name under which XEmacs was invoked, with any leading directory
126    names discarded.  */
127 Lisp_Object Vinvocation_name;
128
129 /* The directory name from which XEmacs was invoked.  */
130 Lisp_Object Vinvocation_directory;
131
132 #if 0 /* FSFmacs */
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;
136 #endif
137
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;
155
156 /* The default base directory XEmacs is installed under. */
157 Lisp_Object Vconfigure_exec_prefix_directory, Vconfigure_prefix_directory;
158
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
161    priority. */
162 int emacs_priority;
163
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;
167
168 /* If non-zero, a window-system was specified on the command line. */
169 int display_arg;
170
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
173    variable. */
174 const char *display_use;
175
176 /* If non-zero, then the early error handler will only print the error
177    message and exit. */
178 int suppress_early_error_handler_backtrace;
179
180 /* An address near the bottom of the stack.
181    Tells GC how to save a copy of the stack.  */
182 char *stack_bottom;
183
184 #ifdef USG_SHARED_LIBRARIES
185 /* If nonzero, this is the place to put the end of the writable segment
186    at startup.  */
187
188 uintptr_t bss_end = 0;
189 #endif
190
191 /* Number of bytes of writable memory we can expect to be able to get */
192 unsigned int lim_data;
193
194 /* Nonzero means running XEmacs without interactive terminal.  */
195
196 int noninteractive;
197
198 /* Value of Lisp variable `noninteractive'.
199    Normally same as C variable `noninteractive'
200    but nothing terrible happens if user sets this one.  */
201
202 int noninteractive1;
203
204 /* Nonzero means don't perform site-lisp searches at startup */
205 int inhibit_site_lisp;
206
207 /* Nonzero means don't perform site-modules searches at startup */
208 int inhibit_site_modules;
209
210 /* Nonzero means don't respect early packages at startup */
211 int inhibit_early_packages;
212
213 /* Nonzero means don't load package autoloads at startup */
214 int inhibit_autoloads;
215
216 /* Nonzero means print debug information about path searching */
217 int debug_paths;
218
219 /* Save argv and argc.  */
220 static char **initial_argv;
221 static int initial_argc;
222
223 static void sort_args (int argc, char **argv);
224
225 Lisp_Object Qkill_emacs_hook;
226 Lisp_Object Qsave_buffers_kill_emacs;
227
228 extern Lisp_Object Vlisp_EXEC_SUFFIXES;
229
230 \f
231 /* Signal code for the fatal signal that was received */
232 static int fatal_error_code;
233
234 /* Nonzero if handling a fatal error already */
235 static int fatal_error_in_progress;
236
237 static void shut_down_emacs (int sig, Lisp_Object stuff);
238
239 /* Handle bus errors, illegal instruction, etc. */
240 SIGTYPE
241 fatal_error_signal (int sig)
242 {
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);
248
249   /* If fatal error occurs in code below, avoid infinite recursion.  */
250   if (! fatal_error_in_progress)
251     {
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 */
258       {
259         const char *pstack = "/usr/proc/bin/pstack";
260         if (access (pstack, X_OK) == 0)
261           {
262             char buf[100];
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());
266             system (buf);
267           }
268       }
269 # endif
270     }
271   /* Signal the same code; this time it will really be fatal. */
272   kill (getpid (), fatal_error_code);
273   SIGRETURN;
274 }
275 \f
276
277 DOESNT_RETURN
278 fatal (const char *fmt, ...)
279 {
280   va_list args;
281   va_start (args, fmt);
282
283   fprintf (stderr, "\nXEmacs: ");
284   vfprintf (stderr, GETTEXT (fmt), args);
285   fprintf (stderr, "\n");
286
287   va_end (args);
288   fflush (stderr);
289   exit (1);
290 }
291
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). */
298
299 /* exactly equivalent to fprintf (stderr, fmt, ...) except that it calls
300    GETTEXT on the format string. */
301
302 int
303 stderr_out (const char *fmt, ...)
304 {
305   int retval;
306   va_list args;
307   va_start (args, fmt);
308
309   retval = vfprintf (stderr, GETTEXT (fmt), args);
310
311   va_end (args);
312   /* fflush (stderr); */
313   return retval;
314 }
315
316 /* exactly equivalent to fprintf (stdout, fmt, ...) except that it calls
317    GETTEXT on the format string. */
318
319 int
320 stdout_out (const char *fmt, ...)
321 {
322   int retval;
323   va_list args;
324   va_start (args, fmt);
325
326   retval = vfprintf (stdout, GETTEXT (fmt), args);
327
328   va_end (args);
329   return retval;
330 }
331
332 #ifdef SIGDANGER
333
334 /* Handler for SIGDANGER.  */
335 SIGTYPE
336 memory_warning_signal (int sig)
337 {
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);
341
342   malloc_warning
343     (GETTEXT ("Operating system warns that virtual memory is running low.\n"));
344
345   /* It might be unsafe to call do_auto_save now.  */
346   force_auto_save_soon ();
347 }
348 #endif /* SIGDANGER */
349 \f
350 /* Code for dealing with Lisp access to the Unix command line */
351
352 static Lisp_Object
353 make_arg_list_1 (int argc, char **argv, int skip_args)
354 {
355   Lisp_Object result = Qnil;
356   REGISTER int i;
357
358   for (i = argc - 1; i >= 0; i--)
359     {
360       if (i == 0 || i > skip_args)
361         {
362 #ifdef WINDOWSNT
363           if (i == 0)
364             {
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),
369                               result);
370 #if defined(HAVE_SHLIB)
371               (void)dll_init(full_exe_path);
372 #endif
373             }
374           else
375 #endif
376             result = Fcons (build_ext_string (argv [i], Qfile_name),
377                             result);
378         }
379     }
380   return result;
381 }
382
383 Lisp_Object
384 make_arg_list (int argc, char **argv)
385 {
386   return make_arg_list_1 (argc, argv, 0);
387 }
388
389 /* Calling functions are also responsible for calling free_argc_argv
390    when they are done with the generated list. */
391 void
392 make_argc_argv (Lisp_Object argv_list, int *argc, char ***argv)
393 {
394   Lisp_Object next;
395   int n = XINT (Flength (argv_list));
396   REGISTER int i;
397   *argv = (char**) xmalloc ((n+1) * sizeof (char*));
398
399   for (i = 0, next = argv_list; i < n; i++, next = XCDR (next))
400     {
401       const char *temp;
402       CHECK_STRING (XCAR (next));
403
404       TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (next),
405                           C_STRING_ALLOCA, temp,
406                           Qnative);
407       (*argv) [i] = xstrdup (temp);
408     }
409   (*argv) [n] = 0;
410   *argc = i;
411 }
412
413 void
414 free_argc_argv (char **argv)
415 {
416   int elt = 0;
417
418   while (argv[elt])
419     {
420       xfree (argv[elt]);
421       elt++;
422     }
423   xfree (argv);
424 }
425
426 static void
427 init_cmdargs (int argc, char **argv, int skip_args)
428 {
429   initial_argv = argv;
430   initial_argc = argc;
431
432   Vcommand_line_args = make_arg_list_1 (argc, argv, skip_args);
433 }
434
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.
438 */
439        ())
440 {
441   return Fcopy_sequence (Vinvocation_name);
442 }
443
444 DEFUN ("invocation-directory", Finvocation_directory, 0, 0, 0, /*
445 Return the directory name in which the Emacs executable was located.
446 */
447        ())
448 {
449   return Fcopy_sequence (Vinvocation_directory);
450 }
451
452 \f
453 #ifdef I18N4
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
458 #endif
459
460 #if defined (MULE) && defined (MSDOS) && defined (EMX)
461 /* Setup all of files be input/output'ed with binary translation mode. */
462 asm ("  .text");
463 asm ("L_setbinmode:");
464 asm ("  movl    $1, __fmode_bin");
465 asm ("  ret");
466 asm ("  .stabs  \"___CTOR_LIST__\", 23, 0, 0, L_setbinmode");
467 #endif
468
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.
475
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.  */
478
479 static int
480 argmatch (char **argv, int argc, char *sstr, char *lstr,
481           int minlen, char **valptr, int *skipptr)
482 {
483   char *p = NULL;
484   int arglen;
485   char *arg;
486
487   /* Don't access argv[argc]; give up in advance.  */
488   if (argc <= *skipptr + 1)
489     return 0;
490
491   arg = argv[*skipptr+1];
492   if (arg == NULL)
493     return 0;
494   if (strcmp (arg, sstr) == 0)
495     {
496       if (valptr != NULL)
497         {
498           *valptr = argv[*skipptr+2];
499           *skipptr += 2;
500         }
501       else
502         *skipptr += 1;
503       return 1;
504     }
505   arglen = (valptr != NULL && (p = strchr (arg, '=')) != NULL
506             ? p - arg : strlen (arg));
507   if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
508     return 0;
509   else if (valptr == NULL)
510     {
511       *skipptr += 1;
512       return 1;
513     }
514   else if (p != NULL)
515     {
516       *valptr = p+1;
517       *skipptr += 1;
518       return 1;
519     }
520   else if (argv[*skipptr+2] != NULL)
521     {
522       *valptr = argv[*skipptr+2];
523       *skipptr += 2;
524       return 1;
525     }
526   else
527     {
528       return 0;
529     }
530 }
531
532 /* Make stack traces always identify version + configuration */
533 #define main_1 STACK_TRACE_EYE_CATCHER
534
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));
538 DOESNT_RETURN
539 main_1 (int argc, char **argv, char **envp, int restart)
540 {
541   char stack_bottom_variable;
542   int skip_args = 0;
543   Lisp_Object load_me;
544   int inhibit_window_system;
545 #ifdef NeXT
546   extern int malloc_cookie;
547 #endif
548
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;
557   __free_hook = NULL;
558 #endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */
559
560   noninteractive = 0;
561
562 #ifdef NeXT
563   /* 19-Jun-1995 -baw
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
570    * complaining? */
571   if (initialized && malloc_jumpstart (malloc_cookie) != 0)
572     fprintf (stderr, "malloc jumpstart failed!\n");
573 #endif /* NeXT */
574
575   /*
576 #if defined (GNU_MALLOC) && \
577     defined (ERROR_CHECK_MALLOC) && \
578     !defined (HAVE_LIBMCHECK)
579   */
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. */
585   init_free_hook ();
586 #endif
587
588   sort_args (argc, argv);
589
590   /* Map in shared memory, if we are using that.  */
591 #ifdef HAVE_SHM
592   if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
593     {
594       map_in_data (0);
595       /* The shared memory was just restored, which clobbered this.  */
596       skip_args = 1;
597     }
598   else
599     {
600       map_in_data (1);
601       /* The shared memory was just restored, which clobbered this.  */
602       skip_args = 0;
603     }
604 #endif /* HAVE_SHM */
605
606 #if (defined (MSDOS) && defined (EMX)) || defined (WIN32) || defined (_SCO_DS)
607   environ = envp;
608 #endif
609
610   /* Record (approximately) where the stack begins.  */
611   stack_bottom = &stack_bottom_variable;
612
613 #ifdef USG_SHARED_LIBRARIES
614   if (bss_end)
615     brk ((void *) bss_end);
616 #endif
617
618   clearerr (stdin);
619
620 #if defined (HAVE_MMAP) && defined (REL_ALLOC)
621   /* ralloc can only be used if using the GNU memory allocator. */
622   init_ralloc ();
623 #elif defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
624   if (initialized)
625     init_ralloc();
626 #endif
627
628 #ifdef HAVE_SOCKS
629   if (initialized)
630     SOCKSinit (argv[0]);
631 #endif /* HAVE_SOCKS */
632
633 #ifndef SYSTEM_MALLOC
634   if (!initialized)
635     /* Arrange to get warning messages as memory fills up.  */
636     memory_warnings (0, malloc_warning);
637 #endif  /* not SYSTEM_MALLOC */
638
639 #ifdef MSDOS
640   /* We do all file input/output as binary files.  When we need to translate
641      newlines, we do that manually.  */
642   _fmode = O_BINARY;
643   (stdin) ->_flag &= ~_IOTEXT;
644   (stdout)->_flag &= ~_IOTEXT;
645   (stderr)->_flag &= ~_IOTEXT;
646 #endif /* MSDOS */
647
648 #ifdef SET_EMACS_PRIORITY
649   if (emacs_priority != 0)
650     nice (-emacs_priority);
651   setuid (getuid ());
652 #endif /* SET_EMACS_PRIORITY */
653
654 #ifdef EXTRA_INITIALIZE
655   EXTRA_INITIALIZE;
656 #endif
657
658 #ifdef HAVE_WINDOW_SYSTEM
659   inhibit_window_system = 0;
660 #else
661   inhibit_window_system = 1;
662 #endif
663
664   /* Handle the -t switch, which specifies filename to use as terminal */
665   {
666     char *term;
667     if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
668       {
669         close (0);
670         close (1);
671         if (open (term, O_RDWR | OPEN_BINARY, 2) < 0)
672           fatal ("%s: %s", term, strerror (errno));
673         dup (0);
674         if (! isatty (0))
675           fatal ("%s: not a tty", term);
676
677 #if 0
678         stderr_out ("Using %s", ttyname (0));
679 #endif
680         stderr_out ("Using %s", term);
681         inhibit_window_system = 1;      /* -t => -nw */
682       }
683   }
684
685   /* Handle -nw switch */
686   if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
687     inhibit_window_system = 1;
688
689   /* Handle the -batch switch, which means don't do interactive display.  */
690   if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
691     {
692 #if 0 /* I don't think this is correct. */
693       inhibit_autoloads = 1;
694 #endif
695       noninteractive = 1;
696     }
697
698   if (argmatch (argv, argc, "-debug-paths", "--debug-paths",
699                 11, NULL, &skip_args))
700       debug_paths = 1;
701
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 */
704   /* startup.el */
705   if (argmatch (argv, argc, "-no-early-packages", "--no-early-packages",
706                 6, NULL, &skip_args))
707     {
708       inhibit_early_packages = 1;
709       skip_args--;
710     }
711 #ifdef HAVE_SHLIB
712   if (argmatch (argv, argc, "-no-site-modules", "--no-site-modules",
713                 9, NULL, &skip_args))
714     {
715       inhibit_site_modules = 1;
716       skip_args--;
717     }
718 #else
719   inhibit_site_modules = 1;
720 #endif
721   if (argmatch (argv, argc, "-vanilla", "--vanilla",
722                 7, NULL, &skip_args))
723     {
724       inhibit_early_packages = 1;
725       skip_args--;
726     }
727
728   if (argmatch (argv, argc, "-no-autoloads", "--no-autoloads",
729                 7, NULL, &skip_args))
730     {
731       /* Inhibit everything */
732       inhibit_autoloads = 1;
733       skip_args--;
734     }
735
736   if (argmatch (argv, argc, "-debug-paths", "--debug-paths",
737                 6, NULL, &skip_args))
738     {
739       debug_paths = 1;
740       skip_args--;
741     }
742
743
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--;
748
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--;
752
753   /* Now, figure out which type of console is our first console. */
754
755   display_arg = 0;
756
757   if (noninteractive)
758     display_use = "stream";
759   else
760     display_use = "tty";
761
762 #ifndef HAVE_TTY
763   if (inhibit_window_system)
764     fatal ("Sorry, this XEmacs was not compiled with TTY support");
765 #endif
766
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)
773     {
774 #ifdef HAVE_X_WINDOWS
775       char *dpy = 0;
776       int count_before = skip_args;
777
778       if (argmatch (argv, argc, "-d", "--display", 3, &dpy, &skip_args) ||
779           argmatch (argv, argc, "-display", 0,     3, &dpy, &skip_args))
780         {
781           display_arg = 1;
782           display_use = "x";
783         }
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)
788         {
789           char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
790           int j;
791
792           for (j = 0; j < count_before + 1; j++)
793             new[j] = argv[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];
798           argv = new;
799           argc++;
800         }
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";
805
806       /* Don't actually discard this arg.  */
807       skip_args = count_before;
808
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])
813         display_use = "x";
814
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 */
820     }
821 #endif /* HAVE_WINDOW_SYSTEM */
822
823   noninteractive1 = noninteractive;
824
825   /****** Now initialize everything *******/
826
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. */
830
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. */
835 #endif
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
840                               such. */
841
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.
845
846      We try to do things in an order that minimizes the non-obvious
847      dependencies between functions. */
848
849   /* purify_flag 1 is correct even if CANNOT_DUMP.
850    * loadup.el will set to nil at end. */
851
852   purify_flag = 0;
853 #ifdef PDUMP
854   if (restart)
855     initialized = 1;
856   else {
857     initialized = pdump_load ();
858     purify_flag = !initialized;
859   }
860 #else
861   if (!initialized)
862     purify_flag = 1;
863 #endif
864
865   if (!initialized)
866     {
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 ();
873
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 ();
878
879       /* Declare the basic symbols pertaining to errors,
880          So that deferror() can be called. */
881       init_errors_once_early ();
882
883       /* Make sure that opaque pointers can be created. */
884       init_opaque_once_early ();
885
886       /* Now declare all the symbols and define all the Lisp primitives.
887
888          The *only* thing that the syms_of_*() functions are allowed to do
889          is call one of the following three functions:
890
891          defsymbol()
892          defsubr() (i.e. DEFSUBR)
893          deferror()
894          defkeyword()
895
896          Order does not matter in these functions.
897          */
898
899       syms_of_abbrev ();
900       syms_of_alloc ();
901       syms_of_buffer ();
902       syms_of_bytecode ();
903       syms_of_callint ();
904       syms_of_callproc ();
905       syms_of_casefiddle ();
906       syms_of_casetab ();
907       syms_of_chartab ();
908       syms_of_cmdloop ();
909       syms_of_cmds ();
910       syms_of_console ();
911       syms_of_data ();
912 #ifdef DEBUG_XEMACS
913       syms_of_debug ();
914       syms_of_tests ();
915 #endif /* DEBUG_XEMACS */
916       syms_of_device ();
917 #ifdef HAVE_DIALOGS
918       syms_of_dialog ();
919 #endif
920       syms_of_dired ();
921       syms_of_doc ();
922       syms_of_editfns ();
923       syms_of_elhash ();
924       syms_of_emacs ();
925       syms_of_eval ();
926 #ifdef HAVE_X_WINDOWS
927       syms_of_event_Xt ();
928 #endif
929 #ifdef HAVE_DRAGNDROP
930       syms_of_dragdrop ();
931 #endif
932       syms_of_event_stream ();
933       syms_of_events ();
934       syms_of_extents ();
935       syms_of_faces ();
936       syms_of_fileio ();
937 #ifdef CLASH_DETECTION
938       syms_of_filelock ();
939 #endif /* CLASH_DETECTION */
940       syms_of_floatfns ();
941       syms_of_fns ();
942       syms_of_font_lock ();
943       syms_of_frame ();
944       syms_of_general ();
945       syms_of_glyphs ();
946       syms_of_glyphs_eimage ();
947       syms_of_glyphs_widget ();
948 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
949       syms_of_gui ();
950 #endif
951       syms_of_gutter ();
952       syms_of_indent ();
953       syms_of_intl ();
954       syms_of_keymap ();
955       syms_of_lread ();
956       syms_of_macros ();
957       syms_of_marker ();
958       syms_of_md5 ();
959 #ifdef HAVE_DATABASE
960       syms_of_database ();
961 #endif
962 #ifdef HAVE_MENUBARS
963       syms_of_menubar ();
964 #endif
965       syms_of_minibuf ();
966 #ifdef HAVE_SHLIB
967       syms_of_module ();
968 #endif
969       syms_of_objects ();
970       syms_of_print ();
971 #if !defined (NO_SUBPROCESSES)
972       syms_of_process ();
973 #ifdef HAVE_WIN32_PROCESSES
974       syms_of_process_nt ();
975 #endif
976 #endif
977       syms_of_profile ();
978 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
979       syms_of_ralloc ();
980 #endif /* HAVE_MMAP && REL_ALLOC */
981       syms_of_rangetab ();
982       syms_of_redisplay ();
983       syms_of_search ();
984       syms_of_select ();
985       syms_of_signal ();
986       syms_of_sound ();
987       syms_of_specifier ();
988       syms_of_symbols ();
989       syms_of_syntax ();
990 #ifdef HAVE_SCROLLBARS
991       syms_of_scrollbar ();
992 #endif
993 #ifdef HAVE_TOOLBARS
994       syms_of_toolbar ();
995 #endif
996       syms_of_undo ();
997       syms_of_widget ();
998       syms_of_window ();
999
1000 #ifdef HAVE_TTY
1001       syms_of_console_tty ();
1002       syms_of_device_tty ();
1003       syms_of_objects_tty ();
1004 #endif
1005
1006 #ifdef HAVE_X_WINDOWS
1007       syms_of_balloon_x ();
1008       syms_of_device_x ();
1009 #ifdef HAVE_DIALOGS
1010       syms_of_dialog_x ();
1011 #endif
1012       syms_of_frame_x ();
1013       syms_of_glyphs_x ();
1014       syms_of_objects_x ();
1015 #ifdef HAVE_MENUBARS
1016       syms_of_menubar_x ();
1017 #endif
1018       syms_of_select_x ();
1019 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1020       syms_of_gui_x ();
1021 #endif
1022 #ifdef HAVE_XIM
1023 #ifdef XIM_XLIB
1024       syms_of_input_method_xlib ();
1025 #endif
1026 #endif /* HAVE_XIM */
1027 #endif /* HAVE_X_WINDOWS */
1028
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 ();
1039 #endif
1040 #ifdef HAVE_SCROLLBARS
1041       syms_of_scrollbar_mswindows ();
1042 #endif
1043 #ifdef HAVE_MSW_C_DIRED
1044       syms_of_dired_mswindows ();
1045 #endif
1046 #ifdef WINDOWSNT
1047       syms_of_ntproc ();
1048 #endif
1049 #endif  /* HAVE_MS_WINDOWS */
1050
1051 #ifdef MULE
1052       syms_of_mule ();
1053       syms_of_mule_ccl ();
1054       syms_of_mule_charset ();
1055 #endif
1056 #ifdef FILE_CODING
1057       syms_of_file_coding ();
1058 #endif
1059 #ifdef MULE
1060 #ifdef HAVE_WNN
1061       syms_of_mule_wnn ();
1062 #endif
1063 #ifdef HAVE_CANNA
1064       syms_of_mule_canna ();
1065 #endif /* HAVE_CANNA */
1066 #endif /* MULE */
1067
1068 #ifdef SYMS_SYSTEM
1069       SYMS_SYSTEM;
1070 #endif
1071
1072 #ifdef SYMS_MACHINE
1073       SYMS_MACHINE;
1074 #endif
1075
1076       /*
1077 #if defined (GNU_MALLOC) && \
1078     defined (ERROR_CHECK_MALLOC) && \
1079     !defined (HAVE_LIBMCHECK)
1080       */
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 ();
1084 #endif
1085
1086 #ifdef TOOLTALK
1087       syms_of_tooltalk ();
1088 #endif
1089
1090 #ifdef SUNPRO
1091       syms_of_sunpro ();
1092 #endif
1093
1094 #ifdef HAVE_LDAP
1095       syms_of_eldap ();
1096 #endif
1097
1098 #ifdef HAVE_GPM
1099           syms_of_gpmevent ();
1100 #endif
1101
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. */
1105
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:
1109
1110          INITIALIZE_CONSOLE_TYPE()
1111          CONSOLE_HAS_METHOD()
1112
1113          For any given console type, the former macro must be called
1114          before the any calls to the latter macro. */
1115
1116       console_type_create ();
1117
1118       console_type_create_stream ();
1119
1120 #ifdef HAVE_TTY
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 ();
1126 #endif
1127
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 ();
1136 #endif
1137       console_type_create_objects_x ();
1138       console_type_create_redisplay_x ();
1139 #ifdef HAVE_SCROLLBARS
1140       console_type_create_scrollbar_x ();
1141 #endif
1142 #ifdef HAVE_TOOLBARS
1143       console_type_create_toolbar_x ();
1144 #endif
1145 #ifdef HAVE_DIALOGS
1146       console_type_create_dialog_x ();
1147 #endif
1148 #endif /* HAVE_X_WINDOWS */
1149
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 ();
1160 # endif
1161 #ifdef HAVE_MENUBARS
1162       console_type_create_menubar_mswindows ();
1163 #endif
1164 #ifdef HAVE_TOOLBARS
1165       console_type_create_toolbar_mswindows ();
1166 #endif
1167 #ifdef HAVE_DIALOGS
1168       console_type_create_dialog_mswindows ();
1169 #endif
1170 #endif
1171
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:
1175
1176          INITIALIZE_SPECIFIER_TYPE()
1177          SPECIFIER_HAS_METHOD()
1178
1179          For any given specifier type, the former macro must be called
1180          before the any calls to the latter macro. */
1181
1182       specifier_type_create ();
1183
1184       specifier_type_create_image ();
1185       specifier_type_create_gutter ();
1186       specifier_type_create_objects ();
1187 #ifdef HAVE_TOOLBARS
1188       specifier_type_create_toolbar ();
1189 #endif
1190
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:
1194
1195          define_structure_type()
1196          define_structure_type_keyword()
1197
1198          */
1199
1200       structure_type_create ();
1201
1202       structure_type_create_chartab ();
1203       structure_type_create_faces ();
1204       structure_type_create_rangetab ();
1205       structure_type_create_hash_table ();
1206
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:
1210
1211          INITIALIZE_IMAGE_INSTANTIATOR_FORMAT()
1212          IIFORMAT_HAS_METHOD()
1213          IIFORMAT_VALID_KEYWORD()
1214
1215          For any given image instantiator format, the first macro must be
1216          called before the any calls to the other macros. */
1217
1218       image_instantiator_format_create ();
1219       image_instantiator_format_create_glyphs_eimage ();
1220       image_instantiator_format_create_glyphs_widget ();
1221 #ifdef HAVE_TTY
1222       image_instantiator_format_create_glyphs_tty ();
1223 #endif
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 */
1230
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:
1234
1235          LSTREAM_HAS_METHOD()
1236
1237          */
1238
1239       lstream_type_create ();
1240 #ifdef FILE_CODING
1241       lstream_type_create_file_coding ();
1242 #endif
1243 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
1244       lstream_type_create_mswindows_selectable ();
1245 #endif
1246
1247       /* Initialize processes implementation.
1248          The functions may make exactly the following function/macro calls:
1249
1250          PROCESS_HAS_METHOD()
1251       */
1252 #ifdef HAVE_UNIX_PROCESSES
1253       process_type_create_unix ();
1254 #endif
1255 #ifdef HAVE_WIN32_PROCESSES
1256       process_type_create_nt ();
1257 #endif
1258
1259       /* Now initialize most variables.
1260
1261          These functions may do exactly the following:
1262
1263          DEFVAR_INT()
1264          DEFVAR_LISP()
1265          DEFVAR_BOOL()
1266          DEFER_GETTEXT()
1267          Dynarr_*()
1268          Blocktype_*()
1269          staticpro()
1270          Fprovide(symbol)
1271          intern()
1272          Fput()
1273          xmalloc()
1274          defsymbol(), if it's absolutely necessary and you're sure that
1275            the symbol isn't referenced anywhere else in the initialization
1276            code
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
1281
1282          Any of the object-creating functions on alloc.c: e.g.
1283
1284          make_pure_*()
1285          make_string()
1286          build_string()
1287          make_vector()
1288          make_int()
1289          make_extent()
1290          alloc_lcrecord()
1291          Fcons()
1292          listN()
1293          make_opaque_ptr()
1294
1295          perhaps a few others.
1296        */
1297
1298       /* Now allow Fprovide() statements to be made. */
1299       init_provide_once ();
1300
1301       /* Do that before any specifier creation (esp. vars_of_glyphs()) */
1302       vars_of_specifier ();
1303
1304       vars_of_abbrev ();
1305       vars_of_alloc ();
1306       vars_of_buffer ();
1307       vars_of_bytecode ();
1308       vars_of_callint ();
1309       vars_of_callproc ();
1310       vars_of_chartab ();
1311       vars_of_cmdloop ();
1312       vars_of_cmds ();
1313       vars_of_console ();
1314       vars_of_data ();
1315 #ifdef DEBUG_XEMACS
1316       vars_of_debug ();
1317       vars_of_tests ();
1318 #endif
1319       vars_of_console_stream ();
1320       vars_of_device ();
1321 #ifdef HAVE_DIALOGS
1322       vars_of_dialog ();
1323 #endif
1324       vars_of_dired ();
1325       vars_of_doc ();
1326 #ifdef HAVE_DRAGNDROP
1327       vars_of_dragdrop ();
1328 #endif
1329       vars_of_editfns ();
1330       vars_of_elhash ();
1331       vars_of_emacs ();
1332       vars_of_eval ();
1333
1334 #ifdef HAVE_X_WINDOWS
1335       vars_of_event_Xt ();
1336 #endif
1337 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
1338       vars_of_event_tty ();
1339 #endif
1340 #ifdef HAVE_MS_WINDOWS
1341       vars_of_event_mswindows ();
1342 #endif
1343       vars_of_event_stream ();
1344
1345       vars_of_events ();
1346       vars_of_extents ();
1347       vars_of_faces ();
1348       vars_of_fileio ();
1349       vars_of_floatfns ();
1350       vars_of_font_lock ();
1351       vars_of_frame ();
1352       vars_of_glyphs ();
1353       vars_of_glyphs_eimage ();
1354       vars_of_glyphs_widget ();
1355 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1356       vars_of_gui ();
1357 #endif
1358       vars_of_gutter ();
1359       vars_of_indent ();
1360       vars_of_insdel ();
1361       vars_of_intl ();
1362 #ifdef HAVE_XIM
1363 #ifdef XIM_MOTIF
1364       vars_of_input_method_motif ();
1365 #else /* XIM_XLIB */
1366       vars_of_input_method_xlib ();
1367 #endif
1368 #endif /* HAVE_XIM */
1369       vars_of_keymap ();
1370       vars_of_lread ();
1371       vars_of_lstream ();
1372       vars_of_macros ();
1373       vars_of_md5 ();
1374 #ifdef HAVE_DATABASE
1375       vars_of_database ();
1376 #endif
1377 #ifdef HAVE_MENUBARS
1378       vars_of_menubar ();
1379 #endif
1380       vars_of_minibuf ();
1381 #ifdef HAVE_SHLIB
1382       vars_of_module ();
1383 #endif
1384 #ifdef WINDOWSNT
1385       vars_of_nt ();
1386       vars_of_ntproc ();
1387 #endif
1388       vars_of_objects ();
1389       vars_of_print ();
1390
1391 #ifndef NO_SUBPROCESSES
1392       vars_of_process ();
1393 #ifdef HAVE_UNIX_PROCESSES
1394       vars_of_process_unix ();
1395 #endif
1396 #ifdef HAVE_WIN32_PROCESSES
1397       vars_of_process_nt ();
1398 #endif
1399 #endif
1400
1401       vars_of_profile ();
1402 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1403       vars_of_ralloc ();
1404 #endif /* HAVE_MMAP && REL_ALLOC */
1405       vars_of_redisplay ();
1406 #ifdef HAVE_SCROLLBARS
1407       vars_of_scrollbar ();
1408 #endif
1409       vars_of_search ();
1410       vars_of_select ();
1411       vars_of_sound ();
1412       vars_of_symbols ();
1413       vars_of_syntax ();
1414 #ifdef HAVE_TOOLBARS
1415       vars_of_toolbar ();
1416 #endif
1417       vars_of_undo ();
1418       vars_of_window ();
1419
1420 #ifdef HAVE_TTY
1421       vars_of_console_tty ();
1422       vars_of_frame_tty ();
1423       vars_of_objects_tty ();
1424 #endif
1425
1426 #ifdef HAVE_X_WINDOWS
1427       vars_of_balloon_x ();
1428       vars_of_device_x ();
1429 #ifdef HAVE_DIALOGS
1430       vars_of_dialog_x ();
1431 #endif
1432       vars_of_frame_x ();
1433       vars_of_glyphs_x ();
1434 #ifdef HAVE_MENUBARS
1435       vars_of_menubar_x ();
1436 #endif
1437       vars_of_objects_x ();
1438       vars_of_select_x ();
1439 #ifdef HAVE_SCROLLBARS
1440       vars_of_scrollbar_x ();
1441 #endif
1442 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1443       vars_of_gui_x ();
1444 #endif
1445 #endif /* HAVE_X_WINDOWS */
1446
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 ();
1456 #endif
1457 #ifdef HAVE_MENUBARS
1458       vars_of_menubar_mswindows ();
1459 #endif
1460 #ifdef HAVE_MSW_C_DIRED
1461       vars_of_dired_mswindows ();
1462 #endif
1463 #ifdef HAVE_DIALOGS
1464       vars_of_dialog_mswindows ();
1465 #endif
1466 #endif  /* HAVE_MS_WINDOWS */
1467
1468 #ifdef MULE
1469       vars_of_mule ();
1470       vars_of_mule_ccl ();
1471       vars_of_mule_charset ();
1472 #endif
1473 #ifdef FILE_CODING
1474       vars_of_file_coding ();
1475 #endif
1476 #ifdef MULE
1477 #ifdef HAVE_WNN
1478       vars_of_mule_wnn ();
1479 #endif
1480 #ifdef HAVE_CANNA
1481       vars_of_mule_canna ();
1482 #endif /* HAVE_CANNA */
1483 #endif /* MULE */
1484
1485 #ifdef TOOLTALK
1486       vars_of_tooltalk ();
1487 #endif
1488
1489 #ifdef SUNPRO
1490       vars_of_sunpro ();
1491 #endif
1492
1493 #ifdef HAVE_LDAP
1494       vars_of_eldap ();
1495 #endif
1496
1497 #ifdef HAVE_GPM
1498           vars_of_gpmevent ();
1499 #endif
1500
1501       /* Now initialize any specifier variables.  We do this later
1502          because it has some dependence on the vars initialized
1503          above.
1504
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:
1508
1509          DEFVAR_SPECIFIER()
1510          Fmake_specifier()
1511          set_specifier_fallback()
1512          set_specifier_caching()
1513          */
1514
1515       specifier_vars_of_glyphs ();
1516       specifier_vars_of_gutter ();
1517 #ifdef HAVE_MENUBARS
1518       specifier_vars_of_menubar ();
1519 #endif
1520       specifier_vars_of_redisplay ();
1521 #ifdef HAVE_SCROLLBARS
1522       specifier_vars_of_scrollbar ();
1523 #endif
1524 #ifdef HAVE_TOOLBARS
1525       specifier_vars_of_toolbar ();
1526 #endif
1527       specifier_vars_of_window ();
1528
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. */
1533
1534       /* Calls Fmake_range_table(). */
1535       complex_vars_of_regex ();
1536       /* Calls Fmake_range_table(). */
1537       complex_vars_of_search ();
1538
1539       /* Calls make_lisp_hash_table(). */
1540       complex_vars_of_extents ();
1541
1542       /* Depends on hash tables and specifiers. */
1543       complex_vars_of_faces ();
1544
1545 #ifdef MULE
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 ();
1549 #endif
1550 #ifdef FILE_CODING
1551       complex_vars_of_file_coding ();
1552 #endif
1553
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 ();
1559
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 ();
1565 #endif
1566 #ifdef HAVE_MS_WINDOWS
1567       complex_vars_of_glyphs_mswindows ();
1568 #endif
1569
1570       /* This calls Fmake_glyph_internal(). */
1571       complex_vars_of_alloc ();
1572
1573       /* This calls Fmake_glyph_internal(). */
1574 #ifdef HAVE_MENUBARS
1575       complex_vars_of_menubar ();
1576 #endif
1577
1578       /* This calls Fmake_glyph_internal(). */
1579 #ifdef HAVE_SCROLLBARS
1580       complex_vars_of_scrollbar ();
1581 #endif
1582
1583       /* This calls allocate_glyph(). */
1584       complex_vars_of_frame ();
1585
1586       /* This calls Fcopy_category_table() under Mule, which calls who
1587          knows what. */
1588       complex_vars_of_chartab ();
1589
1590       /* This calls set_string_char(), which (under Mule) depends on the
1591          charsets being initialized. */
1592       complex_vars_of_casetab ();
1593
1594       /* This calls Fcopy_syntax_table(), which relies on char tables. */
1595       complex_vars_of_syntax ();
1596
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 ();
1604
1605       /* This initializes console-local variables. */
1606       complex_vars_of_console ();
1607
1608       /* This creates a couple more buffers, and depends on the
1609          previous function. */
1610       complex_vars_of_minibuf ();
1611
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 ();
1615
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
1619          stuff. */
1620       complex_vars_of_keymap ();
1621
1622       /* Calls make_lisp_hash_table() and creates a keymap */
1623       complex_vars_of_event_stream ();
1624
1625 #ifdef ERROR_CHECK_GC
1626       {
1627         extern int always_gc;
1628         if (always_gc)                /* purification debugging hack */
1629           garbage_collect_1 ();
1630       }
1631 #endif
1632 #ifdef PDUMP
1633     } else if (!restart) {
1634       reinit_alloc_once_early ();
1635       reinit_symbols_once_early ();
1636       reinit_opaque_once_early ();
1637
1638       reinit_console_type_create_stream ();
1639 #ifdef HAVE_TTY
1640       reinit_console_type_create_tty ();
1641 #endif
1642 #ifdef HAVE_X_WINDOWS
1643       reinit_console_type_create_x ();
1644       reinit_console_type_create_device_x ();
1645 #endif
1646 #ifdef HAVE_MS_WINDOWS
1647       reinit_console_type_create_mswindows ();
1648 #endif
1649
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 ();
1656 #endif
1657
1658       structure_type_create ();
1659
1660       structure_type_create_chartab ();
1661       structure_type_create_faces ();
1662       structure_type_create_rangetab ();
1663       structure_type_create_hash_table ();
1664
1665       lstream_type_create ();
1666 #ifdef FILE_CODING
1667       lstream_type_create_file_coding ();
1668 #endif
1669 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
1670       lstream_type_create_mswindows_selectable ();
1671 #endif
1672 #ifdef HAVE_UNIX_PROCESSES
1673       process_type_create_unix ();
1674 #endif
1675 #ifdef HAVE_WIN32_PROCESSES
1676       process_type_create_nt ();
1677 #endif
1678
1679       reinit_vars_of_buffer ();
1680       reinit_vars_of_console ();
1681 #ifdef DEBUG_XEMACS
1682       reinit_vars_of_debug ();
1683 #endif
1684       reinit_vars_of_device ();
1685       reinit_vars_of_eval ();
1686 #ifdef HAVE_X_WINDOWS
1687       reinit_vars_of_event_Xt ();
1688 #endif
1689 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
1690       reinit_vars_of_event_tty ();
1691 #endif
1692 #ifdef HAVE_MS_WINDOWS
1693       reinit_vars_of_event_mswindows ();
1694 #endif
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 ();
1705 #ifdef HAVE_SHLIB
1706       reinit_vars_of_module ();
1707 #endif
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 ();
1714
1715 #ifdef HAVE_MS_WINDOWS
1716       reinit_vars_of_frame_mswindows ();
1717 #endif
1718
1719 #ifdef HAVE_X_WINDOWS
1720       reinit_vars_of_device_x ();
1721 #ifdef HAVE_SCROLLBARS
1722       reinit_vars_of_scrollbar_x ();
1723 #endif
1724 #ifdef HAVE_MENUBARS
1725       reinit_vars_of_menubar_x ();
1726 #endif
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 ();
1730 #endif
1731 #endif /* HAVE_X_WINDOWS */
1732
1733 #if defined(MULE) && defined(HAVE_WNN)
1734       reinit_vars_of_mule_wnn ();
1735 #endif
1736
1737       reinit_complex_vars_of_buffer ();
1738       reinit_complex_vars_of_console ();
1739       reinit_complex_vars_of_minibuf ();
1740 #endif /* PDUMP */
1741     }
1742
1743
1744   /* CONGRATULATIONS!!!  We have successfully initialized the Lisp
1745      engine. */
1746
1747   if (initialized)
1748     {
1749       /* Stuff that needs to be reset at run time.  Order below should
1750          not matter. */
1751       reinit_alloc ();
1752       reinit_eval ();
1753 #ifdef MULE_REGEXP
1754       reinit_mule_category ();
1755 #endif
1756     }
1757
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. */
1764
1765   init_initial_directory();             /* get the directory to use for the
1766                                            "*scratch*" buffer, etc. */
1767
1768 #ifdef WINDOWSNT
1769   /*
1770    * For Win32, call init_environment() now, so that environment/registry
1771    * variables will be properly entered into Vprocess_environment.
1772    */
1773   init_environment();
1774 #endif
1775
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. */
1783 #ifdef MSDOS
1784   /* Call early 'cause init_environment needs it.  */
1785   init_dosfns ();
1786   /* Set defaults for several environment variables.  */
1787   init_environment (argc, argv, skip_args);
1788 #endif
1789   init_cmdargs (argc, argv, skip_args); /* Create list Vcommand_line_args */
1790   init_buffer ();       /* Set default directory of *scratch* buffer */
1791
1792 #ifdef WINDOWSNT
1793   init_ntproc();
1794 #endif
1795
1796   init_redisplay ();      /* Determine terminal type.
1797                              init_sys_modes uses results */
1798   init_frame ();
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 */
1803 #ifdef SUNPRO
1804   init_sunpro (); /* Set up Sunpro usage tracking */
1805 #endif
1806 #if defined (HAVE_NATIVE_SOUND) && defined (hp9000s800)
1807   init_hpplay ();
1808 #endif
1809 #ifdef HAVE_TTY
1810   init_device_tty ();
1811 #endif
1812   init_console_stream (); /* Create the first console */
1813
1814   /* try to get the actual pathname of the exec file we are running */
1815   if (!restart)
1816   {
1817     Vinvocation_name = Fcar (Vcommand_line_args);
1818     if (XSTRING_DATA(Vinvocation_name)[0] == '-')
1819       {
1820         /* XEmacs as a login shell, oh goody! */
1821         Vinvocation_name = build_string(getenv("SHELL"));
1822       }
1823     Vinvocation_directory = Vinvocation_name;
1824
1825     if (!NILP (Ffile_name_directory (Vinvocation_name)))
1826       {
1827         /* invocation-name includes a directory component -- presumably it
1828            is relative to cwd, not $PATH */
1829         Vinvocation_directory = Fexpand_file_name (Vinvocation_name,
1830                                                    Qnil);
1831         Vinvocation_path = Qnil;
1832       }
1833     else
1834       {
1835         Vinvocation_path = decode_env_path ("PATH", NULL);
1836         locate_file (Vinvocation_path, Vinvocation_name,
1837                      Vlisp_EXEC_SUFFIXES,
1838                      &Vinvocation_directory, X_OK);
1839       }
1840
1841     if (NILP (Vinvocation_directory))
1842       Vinvocation_directory = Vinvocation_name;
1843
1844     Vinvocation_name = Ffile_name_nondirectory (Vinvocation_directory);
1845     Vinvocation_directory = Ffile_name_directory (Vinvocation_directory);
1846   }
1847
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.  */
1852   {
1853     char *buf = (char *)alloca (XSTRING_LENGTH (Vinvocation_directory)
1854                                 + XSTRING_LENGTH (Vinvocation_name)
1855                                 + 2);
1856     sprintf (buf, "%s/%s", XSTRING_DATA (Vinvocation_directory),
1857              XSTRING_DATA (Vinvocation_name));
1858
1859     /* All we can do is cry if an error happens, so ignore it. */
1860     (void) dll_init (buf);
1861   }
1862 #endif
1863
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(). */
1870   tzset ();
1871 #endif /* LOCALTIME_CACHE and TZSET */
1872
1873   load_me = Qnil;
1874   if (!initialized)
1875     {
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 */
1884     }
1885
1886 #ifdef QUANTIFY
1887   if (initialized)
1888     quantify_start_recording_data ();
1889 #endif /* QUANTIFY */
1890
1891   initialized = 1;
1892
1893   /* This never returns.  */
1894   initial_command_loop (load_me);
1895   /* NOTREACHED */
1896 }
1897
1898 \f
1899 /* Sort the args so we can find the most important ones
1900    at the beginning of argv.  */
1901
1902 /* First, here's a table of all the standard options.  */
1903
1904 struct standard_args
1905 {
1906   const char * const name;
1907   const char * const longname;
1908   int priority;
1909   int nargs;
1910 };
1911
1912 static struct standard_args standard_args[] =
1913 {
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 },
1922   { "-V", 0, 75, 0 },
1923   { "-d", "--display", 80, 1 },
1924   { "-display", 0, 80, 1 },
1925   { "-NXHost",  0, 79, 0 },
1926   { "-MachLaunch", 0, 79, 0},
1927
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 },
1940
1941   /* Xt options: */
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 },
1963   { "-rv", 0, 5, 0 },
1964   { "-reverse", 0, 5, 0 },
1965   { "-hb", "--horizontal-scroll-bars", 5, 0 },
1966   { "-vb", "--vertical-scroll-bars", 5, 0 },
1967
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 },
1980 };
1981
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.  */
1986
1987 static void
1988 sort_args (int argc, char **argv)
1989 {
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);
1998   int to = 1;
1999   int from;
2000   int i;
2001   int end_of_options_p = 0;
2002
2003   /* Categorize all the options,
2004      and figure out which argv elts are option arguments.  */
2005   for (from = 1; from < argc; from++)
2006     {
2007       options[from] = -1;
2008       priority[from] = 0;
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] == '-')
2014         {
2015           int match, thislen;
2016           char *equals;
2017
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))
2021               {
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;
2027                 goto done;
2028               }
2029
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] == '-')
2034             {
2035               match = -1;
2036               thislen = strlen (argv[from]);
2037               equals = strchr (argv[from], '=');
2038               if (equals != 0)
2039                 thislen = equals - argv[from];
2040
2041               for (i = 0; i < countof (standard_args); i++)
2042                 if (standard_args[i].longname
2043                     && !strncmp (argv[from], standard_args[i].longname,
2044                                  thislen))
2045                   {
2046                     if (match == -1)
2047                       match = i;
2048                     else
2049                       match = -2;
2050                   }
2051
2052               /* If we found exactly one match, use that.  */
2053               if (match >= 0)
2054                 {
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.  */
2059                   if (equals != 0)
2060                     options[from] = 0;
2061                   if (from + options[from] >= argc)
2062                     fatal ("Option `%s' requires an argument\n", argv[from]);
2063                   from += options[from];
2064                 }
2065             }
2066         done: ;
2067         }
2068     }
2069
2070   /* Copy the arguments, in order of decreasing priority, to NEW_ARGV.  */
2071   new_argv[0] = argv[0];
2072   while (to < argc)
2073     {
2074       int best = -1;
2075       int best_priority = -9999;
2076
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++)
2080         {
2081           if (argv[from] != 0 && priority[from] > best_priority)
2082             {
2083               best_priority = priority[from];
2084               best = from;
2085             }
2086           /* Skip option arguments--they are tied to the options.  */
2087           if (options[from] > 0)
2088             from += options[from];
2089         }
2090
2091       if (best < 0)
2092         abort ();
2093
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];
2098
2099       /* Clear out this option in ARGV.  */
2100       argv[best] = 0;
2101       for (i = 0; i < options[best]; i++)
2102         argv[best + i + 1] = 0;
2103     }
2104
2105   memcpy (argv, new_argv, sizeof (char *) * argc);
2106   xfree (new_argv);
2107   xfree (options);
2108   xfree (priority);
2109 }
2110
2111 static JMP_BUF run_temacs_catch;
2112
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;
2118
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.
2123 */
2124        ())
2125 {
2126   return run_temacs_argc >= 0 ? Qt : Qnil;
2127 }
2128
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.
2131 */
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.
2140
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))
2144 {
2145   int ac;
2146   const Extbyte *wampum;
2147   int namesize;
2148   int total_len;
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);
2152
2153   assert (!gc_in_progress);
2154
2155   if (run_temacs_argc < 0)
2156     error ("I've lost my temacs-hood.");
2157
2158   /* Need to convert the orig_invoc_name and all of the arguments
2159      to external format. */
2160
2161   TO_EXTERNAL_FORMAT (LISP_STRING, orig_invoc_name,
2162                       ALLOCA, (wampum, namesize),
2163                       Qnative);
2164   namesize++;
2165
2166   for (ac = 0, total_len = namesize; ac < nargs; ac++)
2167     {
2168       CHECK_STRING (args[ac]);
2169       TO_EXTERNAL_FORMAT (LISP_STRING, args[ac],
2170                           ALLOCA, (wampum_all[ac], wampum_all_len[ac]),
2171                           Qnative);
2172       wampum_all_len[ac]++;
2173       total_len += wampum_all_len[ac];
2174     }
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 *);
2177
2178   memcpy (run_temacs_args, wampum, namesize);
2179   run_temacs_argv [0] = run_temacs_args;
2180   for (ac = 0; ac < nargs; ac++)
2181     {
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];
2186     }
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 */
2191   purify_flag = 0;
2192   run_temacs_argc = nargs + 1;
2193 #ifdef HEAP_IN_DATA
2194   report_sheap_usage (0);
2195 #endif
2196   LONGJMP (run_temacs_catch, 1);
2197   return Qnil; /* not reached; warning suppression */
2198 }
2199
2200 /* ARGSUSED */
2201 int
2202 main (int argc, char **argv, char **envp)
2203 {
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
2211      through this:
2212
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.).
2217
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.
2222
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
2225       as a login shell.
2226
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.
2229
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 */
2234   int restarted = 0;
2235 #ifdef QUANTIFY
2236   quantify_stop_recording_data ();
2237   quantify_clear_data ();
2238 #endif /* QUANTIFY */
2239
2240   suppress_early_error_handler_backtrace = 0;
2241   lim_data = 0; /* force reinitialization of this variable */
2242
2243   /* Lisp_Object must fit in a word; check VALBITS and GCTYPEBITS */
2244   assert (sizeof (Lisp_Object) == sizeof (void *));
2245
2246 #ifdef LINUX_SBRK_BUG
2247   sbrk (1);
2248 #endif
2249
2250   if (!initialized)
2251     {
2252 #ifdef DOUG_LEA_MALLOC
2253       mallopt (M_MMAP_MAX, 0);
2254 #endif
2255       run_temacs_argc = 0;
2256       if (! SETJMP (run_temacs_catch))
2257         {
2258           main_1 (vol_argc, vol_argv, vol_envp, 0);
2259         }
2260       /* run-emacs-from-temacs called */
2261       restarted = 1;
2262       vol_argc = run_temacs_argc;
2263       vol_argv = run_temacs_argv;
2264 #ifdef _SCO_DS
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.
2271
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
2276
2277          06/20/96 robertl@dgii.com */
2278       {
2279         extern char *_environ;
2280         if ((unsigned) environ == 0)
2281           environ=_environ;
2282       }
2283 #endif /* _SCO_DS */
2284       vol_envp = environ;
2285     }
2286 #ifdef RUN_TIME_REMAP
2287   else
2288     /* obviously no-one uses this because where it was before initialized was
2289      *always* true */
2290     run_time_remap (argv[0]);
2291 #endif
2292
2293 #ifdef DOUG_LEA_MALLOC
2294   if (initialized && (malloc_state_ptr != NULL))
2295     {
2296       int rc = malloc_set_state (malloc_state_ptr);
2297       if (rc != 0)
2298         {
2299           fprintf (stderr, "malloc_set_state failed, rc = %d\n", rc);
2300           abort ();
2301         }
2302 #if 0
2303       free (malloc_state_ptr);
2304 #endif
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);
2311 #endif
2312 #ifdef REL_ALLOC
2313       r_alloc_reinit ();
2314 #endif
2315     }
2316 #endif /* DOUG_LEA_MALLOC */
2317
2318   run_temacs_argc = -1;
2319
2320   main_1 (vol_argc, vol_argv, vol_envp, restarted);
2321   return 0; /* unreached */
2322 }
2323
2324 \f
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)
2330 static void
2331 voodoo_free_hook (void *mem)
2332 {
2333   /* Disable all calls to free() when XEmacs is exiting and it doesn't */
2334   /* matter. */
2335   __free_hook =
2336 #ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
2337     (__typeof__ (__free_hook))
2338 #endif
2339     voodoo_free_hook;
2340 }
2341 #endif /* GNU_MALLOC */
2342
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.
2347
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.
2351 */
2352        (arg))
2353 {
2354   /* This function can GC */
2355   struct gcpro gcpro1;
2356
2357   GCPRO1 (arg);
2358
2359   if (feof (stdin))
2360     arg = Qt;
2361
2362   if (!preparing_for_armageddon && !noninteractive)
2363     run_hook (Qkill_emacs_hook);
2364
2365   /* make sure no quitting from now on!! */
2366   dont_check_for_quit = 1;
2367   Vinhibit_quit = Qt;
2368
2369   if (!preparing_for_armageddon)
2370     {
2371       Lisp_Object concons, nextcons;
2372
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. */
2380
2381       LIST_LOOP_DELETING(concons, nextcons, Vconsole_list)
2382         {
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);
2390         }
2391     }
2392
2393   UNGCPRO;
2394
2395   shut_down_emacs (0, STRINGP (arg) ? arg : Qnil);
2396
2397 #if defined(GNU_MALLOC)
2398   __free_hook =
2399 #ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
2400     (__typeof__ (__free_hook))
2401 #endif
2402     voodoo_free_hook;
2403 #endif
2404
2405   exit (INTP (arg) ? XINT (arg) : 0);
2406   /* NOTREACHED */
2407   return Qnil; /* I'm sick of the compiler warning */
2408 }
2409
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.
2415
2416    If SIG is a signal number, print a message for it.
2417
2418    This is called by fatal signal handlers, X protocol error handlers,
2419    and Fkill_emacs.  */
2420 static void
2421 shut_down_emacs (int sig, Lisp_Object stuff)
2422 {
2423   /* This function can GC */
2424   /* Prevent running of hooks and other non-essential stuff
2425      from now on.  */
2426   preparing_for_armageddon = 1;
2427
2428   /* In case frames or windows are screwed up, avoid assertion
2429      failures here */
2430   Vinhibit_quit = Qt;
2431
2432 #ifdef QUANTIFY
2433   quantify_stop_recording_data ();
2434 #endif /* QUANTIFY */
2435
2436 #if 0
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
2441      immediately. */
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 */
2450 #endif
2451
2452   fflush (stdout);
2453   reset_all_consoles ();
2454   if (sig && sig != SIGTERM)
2455     {
2456       stderr_out ("\nFatal error (%d).\n", sig);
2457       stderr_out
2458         ("Your files have been auto-saved.\n"
2459          "Use `M-x recover-session' to recover them.\n"
2460          "\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"
2464 #ifdef INFODOCK
2465          "Otherwise, please report this bug by selecting `Report-Bug'\n"
2466          "in the InfoDock menu.\n"
2467 #else
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"
2472 #endif
2473          "*MAKE SURE* to include the information in the command\n"
2474          "M-x describe-installation.\n"
2475          "\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"
2482          "\n"
2483          "  gdb ");
2484       {
2485         const char *name;
2486         char *dir = 0;
2487
2488         /* Now try to determine the actual path to the executable,
2489            to try to make the backtrace-determination process as foolproof
2490            as possible. */
2491         if (STRINGP (Vinvocation_name))
2492           name = (char *) XSTRING_DATA (Vinvocation_name);
2493         else
2494           name = "xemacs";
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);
2501         else
2502           stderr_out ("%s%s", dir, name);
2503       }
2504       stderr_out
2505         (" core\n\n"
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");
2510     }
2511
2512   stuff_buffered_input (stuff);
2513
2514   kill_buffer_processes (Qnil);
2515
2516 #ifdef CLASH_DETECTION
2517   unlock_all_files ();
2518 #endif
2519
2520 #ifdef TOOLTALK
2521   tt_session_quit (tt_default_session ());
2522 #if 0
2523   /* The following crashes when built on X11R5 and run on X11R6 */
2524   tt_close ();
2525 #endif
2526 #endif /* TOOLTALK */
2527
2528 }
2529
2530 \f
2531 #ifndef CANNOT_DUMP
2532
2533 #if !defined(PDUMP) || !defined(SYSTEM_MALLOC)
2534 extern char my_edata[];
2535 #endif
2536
2537 #ifdef HAVE_SHM
2538
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.
2542 */
2543        (intoname))
2544 {
2545   /* This function can GC */
2546   int opurify;
2547   struct gcpro gcpro1;
2548   GCPRO1 (intoname);
2549
2550   CHECK_STRING (intoname);
2551   intoname = Fexpand_file_name (intoname, Qnil);
2552
2553   opurify = purify_flag;
2554   purify_flag = 0;
2555
2556   fflush (stderr);
2557   fflush (stdout);
2558
2559   disksave_object_finalization ();
2560   release_breathing_space ();
2561
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);
2566 #endif
2567   UNGCPRO;
2568   map_out_data (XSTRING_DATA (intoname));
2569
2570   purify_flag = opurify;
2571
2572   return Qnil;
2573 }
2574
2575 #else /* not HAVE_SHM */
2576 extern void disable_free_hook (void);
2577
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.
2582
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.
2586 */
2587        (intoname, symname))
2588 {
2589   /* This function can GC */
2590   struct gcpro gcpro1, gcpro2;
2591   int opurify;
2592
2593   GCPRO2 (intoname, symname);
2594
2595 #ifdef FREE_CHECKING
2596   Freally_free (Qnil);
2597
2598   /* When we're dumping, we can't use the debugging free() */
2599   disable_free_hook ();
2600 #endif
2601
2602   CHECK_STRING (intoname);
2603   intoname = Fexpand_file_name (intoname, Qnil);
2604   if (!NILP (symname))
2605     {
2606       CHECK_STRING (symname);
2607       if (XSTRING_LENGTH (symname) > 0)
2608         symname = Fexpand_file_name (symname, Qnil);
2609       else
2610         symname = Qnil;
2611     }
2612
2613   opurify = purify_flag;
2614   purify_flag = 0;
2615
2616 #ifdef HEAP_IN_DATA
2617   report_sheap_usage (1);
2618 #endif
2619
2620   clear_message ();
2621
2622   fflush (stderr);
2623   fflush (stdout);
2624
2625   disksave_object_finalization ();
2626   release_breathing_space ();
2627
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);
2632 #endif
2633
2634   UNGCPRO;
2635
2636 #if defined (MSDOS) && defined (EMX)
2637   {
2638     int fd = open ((char *) XSTRING_DATA (intoname),
2639                    O_WRONLY|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE);
2640     if (!fd) {
2641       error ("Failure operating on %s", XSTRING_DATA (intoname));
2642     } else {
2643       _core (fd);
2644       close (fd);
2645     }
2646   }
2647 #else /* not MSDOS and EMX */
2648   {
2649     char *intoname_ext;
2650     char *symname_ext;
2651
2652     TO_EXTERNAL_FORMAT (LISP_STRING, intoname,
2653                         C_STRING_ALLOCA, intoname_ext,
2654                         Qfile_name);
2655
2656     if (STRINGP (symname))
2657       TO_EXTERNAL_FORMAT (LISP_STRING, symname,
2658                           C_STRING_ALLOCA, symname_ext,
2659                           Qfile_name);
2660     else
2661       symname_ext = 0;
2662
2663     garbage_collect_1 ();
2664
2665 #ifdef PDUMP
2666     pdump ();
2667 #else
2668
2669 #ifdef DOUG_LEA_MALLOC
2670     malloc_state_ptr = malloc_get_state ();
2671 #endif
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);
2681 #endif
2682 #endif /* not PDUMP */
2683   }
2684 #endif /* not MSDOS and EMX */
2685
2686   purify_flag = opurify;
2687
2688   return Qnil;
2689 }
2690
2691 #endif /* not HAVE_SHM */
2692
2693 #endif /* not CANNOT_DUMP */
2694 \f
2695 #ifndef SEPCHAR
2696 #define SEPCHAR ':'
2697 #endif
2698
2699 /* Split STRING into a list of substrings.  The substrings are the
2700    parts of original STRING separated by SEPCHAR.  */
2701 static Lisp_Object
2702 split_string_by_emchar_1 (const Bufbyte *string, Bytecount size,
2703                           Emchar sepchar)
2704 {
2705   Lisp_Object result = Qnil;
2706   const Bufbyte *end = string + size;
2707
2708   while (1)
2709     {
2710       const Bufbyte *p = string;
2711       while (p < end)
2712         {
2713           if (charptr_emchar (p) == sepchar)
2714             break;
2715           INC_CHARPTR (p);
2716         }
2717       result = Fcons (make_string (string, p - string), result);
2718       if (p < end)
2719         {
2720           string = p;
2721           INC_CHARPTR (string); /* skip sepchar */
2722         }
2723       else
2724         break;
2725     }
2726   return Fnreverse (result);
2727 }
2728
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).  */
2732 Lisp_Object
2733 decode_path (const char *path)
2734 {
2735   Bytecount newlen;
2736   Bufbyte *newpath;
2737   if (!path)
2738     return Qnil;
2739
2740   TO_INTERNAL_FORMAT (C_STRING, path, ALLOCA, (newpath, newlen), Qfile_name);
2741
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
2745      string?  */
2746   if (!newlen)
2747     return Qnil;
2748
2749   return split_string_by_emchar_1 (newpath, newlen, SEPCHAR);
2750 }
2751
2752 Lisp_Object
2753 decode_env_path (const char *evarname, const char *default_)
2754 {
2755   const char *path = 0;
2756   if (evarname)
2757     path = egetenv (evarname);
2758   if (!path)
2759     path = default_;
2760   return decode_path (path);
2761 }
2762
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!).  */
2765
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.
2768 */
2769        (string, sepchar))
2770 {
2771   CHECK_STRING (string);
2772   CHECK_CHAR (sepchar);
2773   return split_string_by_emchar_1 (XSTRING_DATA (string),
2774                                    XSTRING_LENGTH (string),
2775                                    XCHAR (sepchar));
2776 }
2777
2778 /* #### This was supposed to be in subr.el, but is used VERY early in
2779    the bootstrap process, so it goes here.  Damn.  */
2780
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'.
2785 */
2786        (path))
2787 {
2788   CHECK_STRING (path);
2789
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",
2794        Vpath_separator);
2795
2796   return (split_string_by_emchar_1
2797           (XSTRING_DATA (path), XSTRING_LENGTH (path),
2798            charptr_emchar (XSTRING_DATA (Vpath_separator))));
2799 }
2800 \f
2801 DEFUN ("noninteractive", Fnoninteractive, 0, 0, 0, /*
2802 Non-nil return value means XEmacs is running without interactive terminal.
2803 */
2804        ())
2805 {
2806   return noninteractive ? Qt : Qnil;
2807 }
2808
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 */
2813
2814 #ifdef USE_ASSERTIONS
2815 /* This highly dubious kludge ... shut up Jamie, I'm tired of your slagging. */
2816
2817 DOESNT_RETURN
2818 assert_failed (const char *file, int line, const char *expr)
2819 {
2820   stderr_out ("Fatal error: assertion failed, file %s, line %d, %s\n",
2821               file, line, expr);
2822 #undef abort    /* avoid infinite #define loop... */
2823 #if defined (WINDOWSNT) && defined (DEBUG_XEMACS)
2824   DebugBreak ();
2825 #elif !defined (ASSERTIONS_DONT_ABORT)
2826   abort ();
2827 #endif
2828 }
2829 #endif /* USE_ASSERTIONS */
2830
2831 #ifdef QUANTIFY
2832 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
2833        0, 0, "", /*
2834 Start recording Quantify data.
2835 */
2836        ())
2837 {
2838   quantify_start_recording_data ();
2839   return Qnil;
2840 }
2841
2842 DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
2843        0, 0, "", /*
2844 Stop recording Quantify data.
2845 */
2846        ())
2847 {
2848   quantify_stop_recording_data ();
2849   return Qnil;
2850 }
2851
2852 DEFUN ("quantify-clear-data", Fquantify_clear_data, 0, 0, "", /*
2853 Clear all Quantify data.
2854 */
2855        ())
2856 {
2857   quantify_clear_data ();
2858   return Qnil;
2859 }
2860 #endif /* QUANTIFY */
2861
2862 void
2863 syms_of_emacs (void)
2864 {
2865 #ifndef CANNOT_DUMP
2866 #ifdef HAVE_SHM
2867   DEFSUBR (Fdump_emacs_data);
2868 #else
2869   DEFSUBR (Fdump_emacs);
2870 #endif
2871 #endif /* !CANNOT_DUMP */
2872
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);
2879
2880 #ifdef QUANTIFY
2881   DEFSUBR (Fquantify_start_recording_data);
2882   DEFSUBR (Fquantify_stop_recording_data);
2883   DEFSUBR (Fquantify_clear_data);
2884 #endif /* QUANTIFY */
2885
2886   DEFSUBR (Fsplit_string_by_char);
2887   DEFSUBR (Fsplit_path);        /* #### */
2888
2889   defsymbol (&Qkill_emacs_hook, "kill-emacs-hook");
2890   defsymbol (&Qsave_buffers_kill_emacs, "save-buffers-kill-emacs");
2891 }
2892
2893 void
2894 vars_of_emacs (void)
2895 {
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.
2899 */ );
2900
2901   DEFVAR_LISP ("command-line-args", &Vcommand_line_args /*
2902 Args passed by shell to XEmacs, as a list of strings.
2903 */ );
2904
2905   DEFVAR_LISP ("invocation-name", &Vinvocation_name /*
2906 The program name that was used to run XEmacs.
2907 Any directory names are omitted.
2908 */ );
2909
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.
2913 */ );
2914
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.
2919 */ );
2920
2921 #if 0 /* FSFmacs */
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.");
2927 #endif
2928
2929   DEFVAR_LISP ("system-type", &Vsystem_type /*
2930 Symbol indicating type of operating system you are using.
2931 */ );
2932   Vsystem_type = intern (SYSTEM_TYPE);
2933   Fprovide (intern(SYSTEM_TYPE));
2934
2935 #ifndef EMACS_CONFIGURATION
2936 # define EMACS_CONFIGURATION "UNKNOWN"
2937 #endif
2938   DEFVAR_LISP ("system-configuration", &Vsystem_configuration /*
2939 String naming the configuration XEmacs was built for.
2940 */ );
2941   Vsystem_configuration = build_string (EMACS_CONFIGURATION);
2942
2943 #ifndef EMACS_CONFIG_OPTIONS
2944 # define EMACS_CONFIG_OPTIONS "UNKNOWN"
2945 #endif
2946   DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options /*
2947 String containing the configuration options XEmacs was built with.
2948 */ );
2949   Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
2950
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:
2954   FSF Emacs:   19.23
2955   XEmacs:      19.10
2956 */ );
2957   Vemacs_major_version = make_int (EMACS_MAJOR_VERSION);
2958
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:
2962   FSF Emacs:   19.23
2963   XEmacs:      19.10
2964 */ );
2965   Vemacs_minor_version = make_int (EMACS_MINOR_VERSION);
2966
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
2972 earlier than 21.1.1
2973 */ );
2974 #ifdef EMACS_PATCH_LEVEL
2975   Vemacs_patch_level = make_int (EMACS_PATCH_LEVEL);
2976 #else
2977   Vemacs_patch_level = Qnil;
2978 #endif
2979
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
2984 earlier than 20.3.
2985 */ );
2986 #ifdef EMACS_BETA_VERSION
2987   Vemacs_beta_version = make_int (EMACS_BETA_VERSION);
2988 #else
2989   Vemacs_beta_version = Qnil;
2990 #endif
2991
2992 #ifdef INFODOCK
2993   DEFVAR_LISP ("infodock-major-version", &Vinfodock_major_version /*
2994 Major version number of this InfoDock release.
2995 */ );
2996   Vinfodock_major_version = make_int (INFODOCK_MAJOR_VERSION);
2997
2998   DEFVAR_LISP ("infodock-minor-version", &Vinfodock_minor_version /*
2999 Minor version number of this InfoDock release.
3000 */ );
3001   Vinfodock_minor_version = make_int (INFODOCK_MINOR_VERSION);
3002
3003   DEFVAR_LISP ("infodock-build-version", &Vinfodock_build_version /*
3004 Build version of this InfoDock release.
3005 */ );
3006   Vinfodock_build_version = make_int (INFODOCK_BUILD_VERSION);
3007 #endif
3008
3009   DEFVAR_LISP ("xemacs-codename", &Vxemacs_codename /*
3010 Codename of this version of Emacs (a string).
3011 */ );
3012 #ifndef XEMACS_CODENAME
3013 #define XEMACS_CODENAME "Noname"
3014 #endif
3015   Vxemacs_codename = build_string (XEMACS_CODENAME);
3016
3017   DEFVAR_BOOL ("noninteractive", &noninteractive1 /*
3018 Non-nil means XEmacs is running without interactive terminal.
3019 */ );
3020
3021   DEFVAR_BOOL ("inhibit-early-packages", &inhibit_early_packages /*
3022 Set to non-nil when the early packages should not be respected at startup.
3023 */ );
3024
3025   DEFVAR_BOOL ("inhibit-autoloads", &inhibit_autoloads /*
3026 Set to non-nil when autoloads should not be loaded at startup.
3027 */ );
3028
3029   DEFVAR_BOOL ("debug-paths", &debug_paths /*
3030 Set to non-nil when debug information about paths should be printed.
3031 */ );
3032
3033   DEFVAR_BOOL ("inhibit-site-lisp", &inhibit_site_lisp /*
3034 Set to non-nil when the site-lisp should not be searched at startup.
3035 */ );
3036 #ifdef INHIBIT_SITE_LISP
3037   inhibit_site_lisp = 1;
3038 #endif
3039
3040   DEFVAR_BOOL ("inhibit-site-modules", &inhibit_site_modules /*
3041 Set to non-nil when site-modules should not be searched at startup.
3042 */ );
3043 #ifdef INHIBIT_SITE_MODULES
3044   inhibit_site_modules = 1;
3045 #endif
3046
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.
3054 */ );
3055   emacs_priority = 0;
3056
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
3060 are:
3061
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.
3067 */ );
3068   Vinternal_error_checking = Qnil;
3069 #ifdef ERROR_CHECK_EXTENTS
3070   Vinternal_error_checking = Fcons (intern ("extents"),
3071                                     Vinternal_error_checking);
3072 #endif
3073 #ifdef ERROR_CHECK_TYPECHECK
3074   Vinternal_error_checking = Fcons (intern ("typecheck"),
3075                                     Vinternal_error_checking);
3076 #endif
3077 #ifdef ERROR_CHECK_MALLOC
3078   Vinternal_error_checking = Fcons (intern ("malloc"),
3079                                     Vinternal_error_checking);
3080 #endif
3081 #ifdef ERROR_CHECK_GC
3082   Vinternal_error_checking = Fcons (intern ("gc"),
3083                                     Vinternal_error_checking);
3084 #endif
3085 #ifdef ERROR_CHECK_BUFPOS
3086   Vinternal_error_checking = Fcons (intern ("bufpos"),
3087                                     Vinternal_error_checking);
3088 #endif
3089
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.
3094 */ );
3095   {
3096     Vmail_lock_methods = Qnil;
3097     Vmail_lock_methods = Fcons (intern ("dot"), Vmail_lock_methods);
3098 #ifdef HAVE_LOCKF
3099     Vmail_lock_methods = Fcons (intern ("lockf"), Vmail_lock_methods);
3100 #endif
3101 #ifdef HAVE_FLOCK
3102     Vmail_lock_methods = Fcons (intern ("flock"), Vmail_lock_methods);
3103 #endif
3104 #ifdef HAVE_MMDF
3105     Vmail_lock_methods = Fcons (intern ("mmdf"), Vmail_lock_methods);
3106 #endif
3107 #ifdef HAVE_LOCKING
3108     Vmail_lock_methods = Fcons (intern ("locking"), Vmail_lock_methods);
3109 #endif
3110   }
3111   
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.
3115 */ );
3116   {
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");
3125 #else
3126     Vconfigure_mail_lock_method = intern("dot");
3127 #endif
3128   }
3129
3130   DEFVAR_LISP ("path-separator", &Vpath_separator /*
3131 The directory separator in search paths, as a string.
3132 */ );
3133   {
3134     char c = SEPCHAR;
3135     Vpath_separator = make_string ((Bufbyte *)&c, 1);
3136   }
3137 }
3138
3139 void
3140 complex_vars_of_emacs (void)
3141 {
3142   /* This is all related to path searching. */
3143
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.
3148 */ );
3149   Vemacs_program_name = build_string ((char *) PATH_PROGNAME);
3150
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.
3155 */ );
3156   Vemacs_program_version = build_string ((char *) PATH_VERSION);
3157
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).
3161 */ );
3162   Vexec_path = Qnil;
3163
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.
3167 */ );
3168   Vexec_directory = Qnil;
3169
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.
3173 */ );
3174 #ifdef PATH_EXEC
3175   Vconfigure_exec_directory = Ffile_name_as_directory
3176     (build_string ((char *) PATH_EXEC));
3177 #else
3178   Vconfigure_exec_directory = Qnil;
3179 #endif
3180
3181   DEFVAR_LISP ("lisp-directory", &Vlisp_directory /*
3182 *Directory of core Lisp files that come with XEmacs.
3183 */ );
3184   Vlisp_directory = Qnil;
3185
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.
3189 */ );
3190 #ifdef PATH_LOADSEARCH
3191   Vconfigure_lisp_directory = Ffile_name_as_directory
3192     (build_string ((char *) PATH_LOADSEARCH));
3193 #else
3194   Vconfigure_lisp_directory = Qnil;
3195 #endif
3196
3197   DEFVAR_LISP ("module-directory", &Vmodule_directory /*
3198 *Directory of core dynamic modules that come with XEmacs.
3199 */ );
3200   Vmodule_directory = Qnil;
3201
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.
3205 */ );
3206 #ifdef PATH_MODULESEARCH
3207   Vconfigure_module_directory = Ffile_name_as_directory
3208     (build_string ((char *) PATH_MODULESEARCH));
3209 #else
3210   Vconfigure_module_directory = Qnil;
3211 #endif
3212
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.
3216 */ );
3217 #ifdef PATH_PACKAGEPATH
3218   Vconfigure_package_path = decode_path (PATH_PACKAGEPATH);
3219 #else
3220   Vconfigure_package_path = Qnil;
3221 #endif
3222
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'.
3228 */ );
3229   Vdata_directory = Qnil;
3230
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.
3234 */ );
3235 #ifdef PATH_DATA
3236   Vconfigure_data_directory = Ffile_name_as_directory
3237     (build_string ((char *) PATH_DATA));
3238 #else
3239   Vconfigure_data_directory = Qnil;
3240 #endif
3241
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.
3245 */ );
3246   Vdata_directory_list = Qnil;
3247
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.
3252 */ );
3253 #ifdef PATH_LOCK
3254   Vconfigure_lock_directory = Ffile_name_as_directory
3255     (build_string ((char *) PATH_LOCK));
3256 #else
3257   Vconfigure_lock_directory = Qnil;
3258 #endif
3259 #endif /* CLASH_DETECTION */
3260
3261   DEFVAR_LISP ("site-directory", &Vsite_directory /*
3262 *Directory of site-specific Lisp files that come with XEmacs.
3263 */ );
3264   Vsite_directory = Qnil;
3265
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.
3269 */ );
3270 #ifdef PATH_SITE
3271   Vconfigure_site_directory = Ffile_name_as_directory
3272     (build_string ((char *) PATH_SITE));
3273 #else
3274   Vconfigure_site_directory = Qnil;
3275 #endif
3276
3277   DEFVAR_LISP ("site-module-directory", &Vsite_module_directory /*
3278 *Directory of site-specific loadable modules that come with XEmacs.
3279 */ );
3280   Vsite_module_directory = Qnil;
3281
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.
3285 */ );
3286 #ifdef PATH_SITE_MODULES
3287   Vconfigure_site_module_directory = Ffile_name_as_directory
3288     (build_string ((char *) PATH_SITE_MODULES));
3289 #else
3290   Vconfigure_site_module_directory = Qnil;
3291 #endif
3292
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.
3296 */ );
3297   Vdoc_directory = Qnil;
3298
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.
3302 */ );
3303 #ifdef PATH_DOC
3304   Vconfigure_doc_directory = Ffile_name_as_directory
3305     (build_string ((char *) PATH_DOC));
3306 #else
3307   Vconfigure_doc_directory = Qnil;
3308 #endif
3309
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.
3313 */ );
3314 #ifdef PATH_EXEC_PREFIX
3315   Vconfigure_exec_prefix_directory = Ffile_name_as_directory
3316     (build_string ((char *) PATH_EXEC_PREFIX));
3317 #else
3318   Vconfigure_exec_prefix_directory = Qnil;
3319 #endif
3320
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.
3324 */ );
3325 #ifdef PATH_PREFIX
3326   Vconfigure_prefix_directory = Ffile_name_as_directory
3327     (build_string ((char *) PATH_PREFIX));
3328 #else
3329   Vconfigure_prefix_directory = Qnil;
3330 #endif
3331
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
3336 includes this.
3337 */ );
3338 #ifdef PATH_INFO
3339   Vconfigure_info_directory =
3340     Ffile_name_as_directory (build_string (PATH_INFO));
3341 #else
3342   Vconfigure_info_directory = Qnil;
3343 #endif
3344
3345   DEFVAR_LISP ("configure-info-path", &Vconfigure_info_path /*
3346 The configured initial path for info documentation.
3347 */ );
3348 #ifdef PATH_INFOPATH
3349   Vconfigure_info_path = decode_path (PATH_INFOPATH);
3350 #else
3351   Vconfigure_info_path = Qnil;
3352 #endif
3353 }
3354
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.
3361  */
3362 void __sti__iflPNGFile_c___(void);
3363 void __sti__iflPNGFile_c___()
3364 {
3365 }
3366
3367 #endif