XEmacs 21.4.11 "Native Windows TTY Support".
[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    Copyright (C) 2000, 2002 Ben Wing.
6
7 This file is part of XEmacs.
8
9 XEmacs is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with XEmacs; see the file COPYING.  If not, write to
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA.  */
23
24 /* Synched up with: Mule 2.0, FSF 19.28. */
25
26 /* Capsule summary of the various releases of Lucid Emacs/XEmacs and
27    FSF/GNU Emacs.  Provided here for use in cross-referencing version
28    releases and dates in comments, esp. in the authorship comments at
29    the beginning of each file.  More information about history can be
30    found in the beginning of the Internals Manual and in the About page.
31
32
33 -- A time line for Lucid Emacs/XEmacs is
34
35 version 19.0 shipped with Energize 1.0, April 1992.
36 version 19.1 released June 4, 1992.
37 version 19.2 released June 19, 1992.
38 version 19.3 released September 9, 1992.
39 version 19.4 released January 21, 1993.
40 version 19.5 was a repackaging of 19.4 with a few bug fixes and
41   shipped with Energize 2.0.  Never released to the net.
42 version 19.6 released April 9, 1993.
43 version 19.7 was a repackaging of 19.6 with a few bug fixes and
44   shipped with Energize 2.1.  Never released to the net.
45 version 19.8 released September 6, 1993.
46 version 19.9 released January 12, 1994.
47 version 19.10 released May 27, 1994.
48 version 19.11 (first XEmacs) released September 13, 1994.
49 version 19.12 released June 23, 1995.
50 version 19.13 released September 1, 1995.
51 version 19.14 released June 23, 1996.
52 version 20.0 released February 9, 1997.
53 version 19.15 released March 28, 1997.
54 version 20.1 (not released to the net) April 15, 1997.
55 version 20.2 released May 16, 1997.
56 version 19.16 released October 31, 1997.
57 version 20.3 (the first stable version of XEmacs 20.x) released
58   November 30, 1997.
59 version 20.4 released February 28, 1998.
60
61
62 -- A time line for GNU Emacs version 19 is
63
64 version 19.7 (beta) (first beta release) released ??????; prob. late May 1993.
65 version 19.8 (beta) released May 27, 1993.
66 version 19.9 (beta) released May 27, 1993.
67 version 19.10 (beta) released May 30, 1993.
68 version 19.11 (beta) released June 1, 1993.
69 version 19.12 (beta) released June 2, 1993.
70 version 19.13 (beta) released June 8, 1993.
71 version 19.14 (beta) released June 17, 1993.
72 version 19.15 (beta) released June 19, 1993.
73 version 19.16 (beta) released July 6, 1993.
74 version 19.17 (beta) released late July, 1993.
75 version 19.18 (beta) released August 9, 1993.
76 version 19.19 (beta) released August 15, 1993.
77 version 19.20 (beta) released November 17, 1993.
78 version 19.21 (beta) released November 17, 1993.
79 version 19.22 (beta) released November 28, 1993.
80 version 19.23 (beta) released May 17, 1994.
81 version 19.24 (beta) released May 16, 1994.
82 version 19.25 (beta) released June 3, 1994.
83 version 19.26 (beta) released September 11, 1994.
84 version 19.27 (beta) released September 14, 1994.
85 version 19.28 (first ``official'' release) released November 1, 1994.
86 version 19.29 released June 21, 1995.
87 version 19.30 released November 24, 1995.
88 version 19.31 released May 25, 1996.
89 version 19.32 released July 31, 1996.
90 version 19.33 released August 11, 1996.
91 version 19.34 released August 21, 1996.
92 version 19.34b released September 6, 1996.
93
94
95 -- A time line for GNU Emacs version 20 is
96
97 version 20.1 released September 17, 1997.
98 version 20.2 released September 20, 1997.
99 version 20.3 released August 19, 1998.
100
101
102 -- A time line for GNU Emacs version 18 and older is
103
104 GNU Emacs version 15 (15.34) was released sometime in 1984 or 1985 and
105   shared some code with a version of Emacs written by James Gosling (the
106   same James Gosling who later created the Java language).
107 GNU Emacs version 16 (first released version was 16.56) was released on
108   July 15, 1985.  All Gosling code was removed due to potential copyright
109   problems with the code.
110 version 16.57: released on September 16, 1985.
111 versions 16.58, 16.59: released on September 17, 1985.
112 version 16.60: released on September 19, 1985.  These later version 16's
113   incorporated patches from the net, esp. for getting Emacs to work under
114   System V.
115 version 17.36 (first official v17 release) released on December 20, 1985.
116   Included a TeX-able user manual.  First official unpatched version that
117    worked on vanilla System V machines.
118 version 17.43 (second official v17 release) released on January 25, 1986.
119 version 17.45 released on January 30, 1986.
120 version 17.46 released on February 4, 1986.
121 version 17.48 released on February 10, 1986.
122 version 17.49 released on February 12, 1986.
123 version 17.55 released on March 18, 1986.
124 version 17.57 released on March 27, 1986.
125 version 17.58 released on April 4, 1986.
126 version 17.61 released on April 12, 1986.
127 version 17.63 released on May 7, 1986.
128 version 17.64 released on May 12, 1986.
129 version 18.24 (a beta version) released on October 2, 1986.
130 version 18.30 (a beta version) released on November 15, 1986.
131 version 18.31 (a beta version) released on November 23, 1986.
132 version 18.32 (a beta version) released on December 7, 1986.
133 version 18.33 (a beta version) released on December 12, 1986.
134 version 18.35 (a beta version) released on January 5, 1987.
135 version 18.36 (a beta version) released on January 21, 1987.
136 January 27, 1987: The Great Usenet Renaming.  net.emacs is now comp.emacs.
137 version 18.37 (a beta version) released on February 12, 1987.
138 version 18.38 (a beta version) released on March 3, 1987.
139 version 18.39 (a beta version) released on March 14, 1987.
140 version 18.40 (a beta version) released on March 18, 1987.
141 version 18.41 (the first ``official'' release) released on March 22, 1987.
142 version 18.45 released on June 2, 1987.
143 version 18.46 released on June 9, 1987.
144 version 18.47 released on June 18, 1987.
145 version 18.48 released on September 3, 1987.
146 version 18.49 released on September 18, 1987.
147 version 18.50 released on February 13, 1988.
148 version 18.51 released on May 7, 1988.
149 version 18.52 released on September 1, 1988.
150 version 18.53 released on February 24, 1989.
151 version 18.54 released on April 26, 1989.
152 version 18.55 released on August 23, 1989.  This is the earliest version
153   that is still available by FTP.
154 version 18.56 released on January 17, 1991.
155 version 18.57 released late January, 1991.
156 version 18.58 released ?????.
157 version 18.59 released October 31, 1992.
158
159 */
160
161 /* Note: It is necessary to specify <config.h> and not "config.h" in
162    order for the --srcdir type of compilation to work properly.
163    Otherwise the config.h from the srcdir, rather than the one from
164    the build dir, will be used. */
165
166 #include <config.h>
167 #include "lisp.h"
168
169 #include "backtrace.h" /* run-emacs-from-temacs needs this */
170 #include "buffer.h"
171 #include "commands.h"
172 #include "console.h"
173 #include "process.h"
174 #include "redisplay.h"
175 #include "frame.h"
176 #include "sysdep.h"
177
178 #include "syssignal.h" /* Always include before systty.h */
179 #include "systty.h"
180 #include "sysfile.h"
181 #include "systime.h"
182
183 #ifdef PDUMP
184 #include "dumper.h"
185 #endif
186
187 #ifndef SEPCHAR
188 #define SEPCHAR ':'
189 #endif
190
191 #ifdef QUANTIFY
192 #include <quantify.h>
193 #endif
194
195 #ifdef HAVE_SHLIB
196 #include "sysdll.h"
197 #endif
198
199 #if defined (HAVE_LOCALE_H) && \
200    (defined (I18N2) || defined (I18N3) || defined (I18N4))
201 #include <locale.h>
202 #endif
203
204 #ifdef TOOLTALK
205 #include TT_C_H_FILE
206 #endif
207
208 #if defined (WIN32_NATIVE)
209 #include "nt.h"
210 #endif
211
212 /* For PATH_EXEC */
213 #include <paths.h>
214
215 #if defined (HEAP_IN_DATA) && !defined(PDUMP)
216 void report_sheap_usage (int die_if_pure_storage_exceeded);
217 #endif
218
219 #if !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC)
220 extern void *(*__malloc_hook)(size_t);
221 extern void *(*__realloc_hook)(void *, size_t);
222 extern void (*__free_hook)(void *);
223 #endif  /* not SYSTEM_MALLOC && not DOUG_LEA_MALLOC */
224
225 /* Command line args from shell, as list of strings */
226 Lisp_Object Vcommand_line_args;
227
228 /* Set nonzero after XEmacs has started up the first time.
229   Prevents reinitialization of the Lisp world and keymaps
230   on subsequent starts.  */
231 int initialized;
232
233 #ifdef DOUG_LEA_MALLOC
234 # include <malloc.h>
235 /* Preserves a pointer to the memory allocated that copies that
236    static data inside glibc's malloc.  */
237 static void *malloc_state_ptr;
238 #endif /* DOUG_LEA_MALLOC */
239
240 # ifdef REL_ALLOC
241 void r_alloc_reinit (void);
242 # endif
243
244 #ifdef HAVE_GTK
245 void console_type_create_select_gtk(void);
246 #endif
247
248 /* Variable whose value is symbol giving operating system type. */
249 Lisp_Object Vsystem_type;
250
251 /* Variable whose value is string giving configuration built for.  */
252 Lisp_Object Vsystem_configuration;
253
254 /* Variable whose value is string containing the configuration options
255    XEmacs was built with.  */
256 Lisp_Object Vsystem_configuration_options;
257
258 /* Version numbers and strings */
259 Lisp_Object Vemacs_major_version;
260 Lisp_Object Vemacs_minor_version;
261 Lisp_Object Vemacs_patch_level;
262 Lisp_Object Vemacs_beta_version;
263 Lisp_Object Vxemacs_codename;
264 #ifdef INFODOCK
265 Lisp_Object Vinfodock_major_version;
266 Lisp_Object Vinfodock_minor_version;
267 Lisp_Object Vinfodock_build_version;
268 #endif
269
270 /* The path under which XEmacs was invoked. */
271 Lisp_Object Vinvocation_path;
272
273 /* The name under which XEmacs was invoked, with any leading directory
274    names discarded.  */
275 Lisp_Object Vinvocation_name;
276
277 /* The directory name from which XEmacs was invoked.  */
278 Lisp_Object Vinvocation_directory;
279
280 #if 0 /* FSFmacs */
281 /* The directory name in which to find subdirs such as lisp and etc.
282    nil means get them only from PATH_LOADSEARCH.  */
283 Lisp_Object Vinstallation_directory;
284 #endif
285
286 Lisp_Object Vemacs_program_name, Vemacs_program_version;
287 Lisp_Object Vexec_path;
288 Lisp_Object Vexec_directory, Vconfigure_exec_directory;
289 Lisp_Object Vlisp_directory, Vconfigure_lisp_directory;
290 Lisp_Object Vmule_lisp_directory, Vconfigure_mule_lisp_directory;
291 Lisp_Object Vmodule_directory, Vconfigure_module_directory;
292 Lisp_Object Vsite_module_directory, Vconfigure_site_module_directory;
293 Lisp_Object Vconfigure_package_path;
294 Lisp_Object Vdata_directory, Vconfigure_data_directory;
295 Lisp_Object Vdoc_directory, Vconfigure_doc_directory;
296 Lisp_Object Vconfigure_lock_directory;
297 Lisp_Object Vdata_directory_list;
298 Lisp_Object Vconfigure_info_directory;
299 Lisp_Object Vsite_directory, Vconfigure_site_directory;
300 Lisp_Object Vconfigure_info_path;
301 Lisp_Object Vinternal_error_checking;
302 Lisp_Object Vmail_lock_methods, Vconfigure_mail_lock_method;
303 Lisp_Object Vpath_separator;
304
305 /* The default base directory XEmacs is installed under. */
306 Lisp_Object Vconfigure_exec_prefix_directory, Vconfigure_prefix_directory;
307
308 /* If nonzero, set XEmacs to run at this priority.  This is also used
309    in child_setup and sys_suspend to make sure subshells run at normal
310    priority. */
311 Fixnum emacs_priority;
312
313 /* Some FSF junk with running_asynch_code, to preserve the match
314    data.  Not necessary because we don't call process filters
315    asynchronously (i.e. from within QUIT). */
316 /* #### Delete this when merging the rest of my code */
317 int running_asynch_code;
318
319 /* If non-zero, a window-system was specified on the command line. */
320 int display_arg;
321
322 /* Type of display specified.  We cannot use a Lisp symbol here because
323    Lisp symbols may not initialized at the time that we set this
324    variable. */
325 const char *display_use;
326
327 /* If non-zero, then the early error handler will only print the error
328    message and exit. */
329 int suppress_early_error_handler_backtrace;
330
331 /* An address near the bottom of the stack.
332    Tells GC how to save a copy of the stack.  */
333 char *stack_bottom;
334
335 #ifdef USG_SHARED_LIBRARIES
336 /* If nonzero, this is the place to put the end of the writable segment
337    at startup.  */
338
339 uintptr_t bss_end = 0;
340 #endif
341
342 /* Number of bytes of writable memory we can expect to be able to get */
343 unsigned int lim_data;
344
345 /* WARNING!
346
347    Some LISP-visible command-line options are set by XEmacs _before_ the
348    data is dumped in building a --pdump XEmacs, but used _after_ it is
349    restored in normal operation.  Thus the dump-time values overwrite the
350    values XEmacs is getting at runtime.  Such variables must be saved
351    before loading the dumpfile, and restored afterward.
352
353    Therefore these variables may not be initialized in vars_of_emacs().
354
355    The save/restore is done immediately before and after pdump_load() in
356    main_1().  See that function for the current list of protected variables.
357
358    Note that saving/restoring is only necessary for a few variables that are
359      o command line arguments effective at runtime (as opposed to dump-time),
360      o parsed before pdump_load, and
361      o exported to Lisp via a DEFVAR.
362 */
363
364 /* Nonzero means running XEmacs without interactive terminal.  */
365
366 int noninteractive;
367
368 /* Value of Lisp variable `noninteractive'.
369    Normally same as C variable `noninteractive'
370    but nothing terrible happens if user sets this one.
371
372    Shadowed from the pdumper by `noninteractive'. */
373
374 int noninteractive1;
375
376 /* Nonzero means don't perform site-lisp searches at startup */
377 int inhibit_site_lisp;
378
379 /* Nonzero means don't perform site-modules searches at startup */
380 int inhibit_site_modules;
381
382 /* Nonzero means don't respect early packages at startup */
383 int inhibit_early_packages;
384
385 /* Nonzero means don't load package autoloads at startup */
386 int inhibit_autoloads;
387
388 /* Nonzero means don't load the dump file (ignored if not PDUMP)  */
389
390 int nodumpfile;
391
392 /* Nonzero means print debug information about path searching */
393 int debug_paths;
394
395 /* Save argv and argc.  */
396 static Extbyte **initial_argv;  /* #### currently unused */
397 static int initial_argc;        /* #### currently unused */
398
399 static void sort_args (int argc, char **argv);
400
401 Lisp_Object Qkill_emacs_hook;
402 Lisp_Object Qsave_buffers_kill_emacs;
403
404 extern Lisp_Object Vlisp_EXEC_SUFFIXES;
405
406 \f
407
408 /* Ben's capsule summary about expected and unexpected exits from XEmacs.
409
410    Expected exits occur when the user directs XEmacs to exit, for example
411    by pressing the close button on the only frame in XEmacs, or by typing
412    C-x C-c.  This runs `save-buffers-kill-emacs', which saves any necessary
413    buffers, and then exits using the primitive `kill-emacs'.
414
415    However, unexpected exits occur in a few different ways:
416
417      -- a memory access violation or other hardware-generated exception
418         occurs.  This is the worst possible problem to deal with, because
419         the fault can occur while XEmacs is in any state whatsoever, even
420         quite unstable ones.  As a result, we need to be *extremely* careful
421         what we do.
422      -- we are using one X display (or if we've used more, we've closed the
423         others already), and some hardware or other problem happens and
424         suddenly we've lost our connection to the display.  In this situation,
425         things are not so dire as in the last one; our code itself isn't
426         trashed, so we can continue execution as normal, after having set
427         things up so that we can exit at the appropriate time.  Our exit
428         still needs to be of the emergency nature; we have no displays, so
429         any attempts to use them will fail.  We simply want to auto-save
430         (the single most important thing to do during shut-down), do minimal
431         cleanup of stuff that has an independent existence outside of XEmacs,
432         and exit.
433
434         Currently, both unexpected exit scenarios described above set
435         preparing_for_armageddon to indicate that nonessential and possibly
436         dangerous things should not be done, specifically:
437
438         -- no garbage collection.
439         -- no hooks are run.
440         -- no messages of any sort from autosaving.
441         -- autosaving tries harder, ignoring certain failures.
442         -- existing frames are not deleted.
443
444         (Also, all places that set preparing_for_armageddon also
445         set dont_check_for_quit.  This happens separately because it's
446         also necessary to set other variables to make absolutely sure
447         no quitting happens.)
448
449         In the first scenario above (the access violation), we also set
450         fatal_error_in_progress.  This causes more things to not happen:
451
452         -- assertion failures do not abort.
453         -- printing code does not do code conversion or gettext when
454            printing to stdout/stderr.
455 */
456
457 /* Nonzero if handling a fatal error already. */
458 int fatal_error_in_progress;
459
460 /* Non-nil means we're going down, so we better not run any hooks
461    or do other non-essential stuff. */
462 int preparing_for_armageddon;
463
464 /* Nonzero means we're in an unstable situation and need to skip
465    i18n conversions and such during printing. */
466 int inhibit_non_essential_printing_operations;
467
468 static JMP_BUF run_temacs_catch;
469
470 static int run_temacs_argc;
471 static char **run_temacs_argv;
472 static char *run_temacs_args;
473 static EMACS_INT run_temacs_argv_size;
474 static EMACS_INT run_temacs_args_size;
475
476 static void shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save);
477
478 /* ------------------------------- */
479 /*  low-level debugging functions  */
480 /* ------------------------------- */
481
482 #if defined (WIN32_NATIVE) && defined (DEBUG_XEMACS)
483 #define debugging_breakpoint() DebugBreak ()
484 #else
485 #define debugging_breakpoint()
486 #endif
487
488 void
489 debug_break (void)
490 {
491   debugging_breakpoint ();
492 }
493
494 #if defined (WIN32_NATIVE) || defined (CYGWIN)
495
496 /* Return whether all bytes in the specified memory block can be read. */
497 int
498 debug_can_access_memory (void *ptr, Bytecount len)
499 {
500   return !IsBadReadPtr (ptr, len);
501 }
502
503 #else /* !(defined (WIN32_NATIVE) || defined (CYGWIN)) */
504
505 /* #### There must be a better way!!!! */
506
507 static JMP_BUF memory_error_jump;
508
509 static SIGTYPE
510 debug_memory_error (int signum)
511 {
512   EMACS_REESTABLISH_SIGNAL (signum, debug_memory_error);
513   EMACS_UNBLOCK_SIGNAL (signum);
514   LONGJMP (memory_error_jump, 1);
515 }
516
517 /* Return whether all bytes in the specified memory block can be read. */
518 int
519 debug_can_access_memory (void *ptr, Bytecount len)
520 {
521   /* Use volatile to protect variables from being clobbered by longjmp. */
522   SIGTYPE (*volatile old_sigbus) (int);
523   SIGTYPE (*volatile old_sigsegv) (int);
524   volatile int old_errno = errno;
525   volatile int retval = 1;
526
527   if (!SETJMP (memory_error_jump))
528     {
529       old_sigbus =
530         (SIGTYPE (*) (int)) signal (SIGBUS, debug_memory_error);
531       old_sigsegv =
532         (SIGTYPE (*) (int)) signal (SIGSEGV, debug_memory_error);
533
534       if (len > 1)
535         /* If we can, try to avoid problems with super-optimizing compilers
536            that might decide that memcmp (ptr, ptr, len) can be optimized
537            away since its result is always 1. */
538         memcmp (ptr, (char *) ptr + 1, len - 1);
539       else
540         memcmp (ptr, ptr, len);
541     }
542   else
543     retval = 0;
544   signal (SIGBUS, old_sigbus);
545   signal (SIGSEGV, old_sigsegv);
546   errno = old_errno;
547
548   return retval;
549 }
550
551 #endif /* defined (WIN32_NATIVE) || defined (CYGWIN) */
552
553 #ifdef DEBUG_XEMACS
554
555 DEFUN ("force-debugging-signal", Fforce_debugging_signal, 0, 1, 0, /*
556 Cause XEmacs to enter the debugger.
557 On some systems, there may be no way to do this gracefully; if so,
558 nothing happens unless ABORT is non-nil, in which case XEmacs will
559 abort() -- a sure-fire way to immediately get back to the debugger,
560 but also a sure-fire way to kill XEmacs (and dump core on Unix
561 systems)!
562 */
563        (abort_))
564 {
565   debugging_breakpoint ();
566   if (!NILP (abort_))
567     abort ();
568   return Qnil;
569 }
570
571 #endif /* DEBUG_XEMACS */
572
573 static void
574 ensure_no_quitting_from_now_on (void)
575 {
576   /* make sure no quitting from now on!! */
577   dont_check_for_quit = 1;
578   Vinhibit_quit = Qt;
579   Vquit_flag = Qnil;
580 }
581
582 /* Handle bus errors, illegal instruction, etc. */
583 SIGTYPE
584 fatal_error_signal (int sig)
585 {
586   fatal_error_in_progress++;
587   inhibit_non_essential_printing_operations = 1;
588   preparing_for_armageddon = 1;
589
590   ensure_no_quitting_from_now_on ();
591
592   /* Unblock the signal so that if the same signal gets sent in the
593      code below, we avoid a deadlock. */
594   EMACS_UNBLOCK_SIGNAL (sig);
595
596   /* Only try auto-saving first time through.  If we crash in auto-saving,
597      don't do it again. */
598   if (fatal_error_in_progress == 1)
599     {
600       Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
601       /* Do this so that the variable has the same value of 2 regardless of
602          whether we made it through auto-saving correctly. */
603       fatal_error_in_progress++;
604     }
605   else if (fatal_error_in_progress == 2)
606     stderr_out ("WARNING: Unable to auto-save your files properly.\n"
607                 "Some or all may in fact have been auto-saved.\n"
608                 "\n");
609
610   /* Now, reset our signal handler, so the next time, we just die.
611      Don't do this before auto-saving. */
612   signal (sig, SIG_DFL);
613
614   /* Keep in mind that there's more than one signal that we can crash
615      on. */
616   /* If fatal error occurs in code below, avoid infinite recursion.  */
617   if (fatal_error_in_progress <= 2)
618     {
619       shut_down_emacs (sig, Qnil, 1);
620       stderr_out ("\nLisp backtrace follows:\n\n");
621       Fbacktrace (Qexternal_debugging_output, Qt);
622 # if 0  /* This is evil, rarely useful, and causes grief in some cases. */
623       /* Check for Sun-style stack printing via /proc */
624       {
625         const char *pstack = "/usr/proc/bin/pstack";
626         if (access (pstack, X_OK) == 0)
627           {
628             char buf[100];
629             stderr_out ("\nC backtrace follows:\n"
630                        "(A real debugger may provide better information)\n\n");
631             sprintf (buf, "%s %d >&2", pstack, (int)getpid());
632             system (buf);
633           }
634       }
635 # endif
636     }
637   /* Signal the same code; this time it will really be fatal. */
638   kill (getpid (), sig);
639   SIGRETURN;
640 }
641
642 #ifdef _MSC_VER
643
644 static DWORD
645 mswindows_handle_hardware_exceptions (DWORD code)
646 {
647   if (code != STATUS_ACCESS_VIOLATION && code != STATUS_ILLEGAL_INSTRUCTION
648       && code != STATUS_PRIVILEGED_INSTRUCTION
649       && code != STATUS_DATATYPE_MISALIGNMENT)
650     return EXCEPTION_CONTINUE_SEARCH;
651
652   /* I don't know if this filter is still wrapped in the outer __try, but
653      it doesn't hurt to have another one. --ben
654      And it lets us control more exactly what we really want to do in such
655      a situation. */
656   __try
657     {
658       fatal_error_in_progress++;
659       inhibit_non_essential_printing_operations = 1;
660       preparing_for_armageddon = 1;
661
662       ensure_no_quitting_from_now_on ();
663
664       /* Only try auto-saving first time through.  If we crash in auto-saving,
665          don't do it again. */
666       if (fatal_error_in_progress == 1)
667         {
668           Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
669           /* Do this so that the variable has the same value of 2 regardless of
670              whether we made it through auto-saving correctly. */
671           fatal_error_in_progress++;
672         }
673       else if (fatal_error_in_progress == 2)
674         stderr_out ("WARNING: Unable to auto-save your files properly.\n"
675                     "Some or all may in fact have been auto-saved.\n"
676                     "\n");
677
678       /* If fatal error occurs in code below, avoid infinite recursion.  */
679       if (fatal_error_in_progress <= 2)
680         {
681           shut_down_emacs (-1, Qnil, 1);
682           stderr_out ("\nLisp backtrace follows:\n\n");
683           Fbacktrace (Qexternal_debugging_output, Qt);
684         }
685     }
686   /* VC++ documentation says that
687      GetExceptionCode() cannot be called inside the filter itself. */
688
689   /*  __except (mswindows_handle_hardware_exceptions (GetExceptionCode ())) {}
690
691      The line above is original.  Unfortunately, when an error is tripped
692      inside of the handler (e.g. during Fbacktrace()), and the handler for
693      the handler is invoked, it correctly notices that something is amiss
694      and it should just return -- but it returns EXCEPTION_CONTINUE_SEARCH,
695      which causes the debugger to be invoked debugging the handler code in
696      this function -- and WITH THE STACK UNWOUND so that you see main()
697      calling mswindows_handle_hardware_exceptions(), calling Fbacktrace(),
698      and a crash a couple of frames in -- AND NO SIGN OF THE ORIGINAL CRASH!
699
700      There's some real weirdness going on in the stack handling -- unlike
701      in Unix, where further crashes just keep adding to the stack, it seems
702      that under the structured-exception-handling, the stack can actually
703      bounce back and forth between the full stack at the location of the
704      exception and the unwound stack at the place where the __try clause was
705      established.  I don't completely understand it.  What I do know is that
706      returning EXCEPTION_EXECUTE_HANDLER on nested crash has the effect of
707      aborting execution of the handler and going back to the outer filter
708      function, which returns EXCEPTION_CONTINUE_SEARCH and everything is
709      hunky-dorey -- your debugger sees a crash at the right location with
710      the right stack.
711
712      I'm leaving in the trickier Unix-like code in the handler; someone who
713      understands better than me how the stack works in these handlers could
714      fix it up more.  As it is, it works pretty well, so I'm not likely to
715      touch it more. --ben
716   */
717
718   __except (EXCEPTION_EXECUTE_HANDLER) {}
719
720
721   /* pretend we didn't handle this, so that the debugger is invoked and/or
722      the normal GPF box appears. */
723   return EXCEPTION_CONTINUE_SEARCH;
724 }
725
726 #endif /* _MSC_VER */
727
728 \f
729
730 #ifdef SIGDANGER
731
732 /* Handler for SIGDANGER.  */
733 SIGTYPE
734 memory_warning_signal (int sig)
735 {
736   /* #### bad bad bad; this function shouldn't do anything except
737      set a flag, or weird corruption could happen. */
738   signal (sig, memory_warning_signal);
739
740   malloc_warning
741     (GETTEXT ("Operating system warns that virtual memory is running low.\n"));
742
743   /* It might be unsafe to call do_auto_save now.  */
744   force_auto_save_soon ();
745 }
746 #endif /* SIGDANGER */
747 \f
748 /* Code for dealing with Lisp access to the Unix command line */
749
750 static Lisp_Object
751 make_arg_list_1 (int argc, Extbyte **argv, int skip_args)
752 {
753   Lisp_Object result = Qnil;
754   REGISTER int i;
755
756   for (i = argc - 1; i >= 0; i--)
757     {
758       if (i == 0 || i > skip_args)
759         {
760 #ifdef WIN32_NATIVE
761           if (i == 0)
762             {
763               /* Do not trust to what crt0 has stuffed into argv[0] */
764               char full_exe_path[MAX_PATH];
765               Lisp_Object fullpath;
766
767               GetModuleFileName (NULL, full_exe_path, MAX_PATH);
768               fullpath = build_ext_string (full_exe_path, Qmswindows_tstr);
769               result = Fcons (fullpath, result);
770 #if defined(HAVE_SHLIB)
771               {
772                 Extbyte *fullpathext;
773
774                 LISP_STRING_TO_EXTERNAL (fullpath, fullpathext,
775                                   Qdll_filename_encoding);
776                 (void) dll_init (fullpathext);
777               }
778 #endif
779             }
780           else
781 #endif
782             result = Fcons (build_ext_string (argv[i],
783                                               Qcommand_argument_encoding),
784                             result);
785         }
786     }
787   return result;
788 }
789
790 Lisp_Object
791 make_arg_list (int argc, Extbyte **argv)
792 {
793   return make_arg_list_1 (argc, argv, 0);
794 }
795
796 /* Calling functions are also responsible for calling free_argc_argv
797    when they are done with the generated list. */
798 void
799 make_argc_argv (Lisp_Object argv_list, int *argc, Extbyte ***argv)
800 {
801   Lisp_Object next;
802   int n = XINT (Flength (argv_list));
803   REGISTER int i;
804   *argv = (Extbyte**) xmalloc ((n+1) * sizeof (Extbyte*));
805
806   for (i = 0, next = argv_list; i < n; i++, next = XCDR (next))
807     {
808       const Extbyte *temp;
809       CHECK_STRING (XCAR (next));
810
811       LISP_STRING_TO_EXTERNAL (XCAR (next), temp, Qcommand_argument_encoding);
812       (*argv) [i] = xstrdup (temp);
813     }
814   (*argv) [n] = 0;
815   *argc = i;
816 }
817
818 void
819 free_argc_argv (Extbyte **argv)
820 {
821   int elt = 0;
822
823   while (argv[elt])
824     {
825       xfree (argv[elt]);
826       elt++;
827     }
828   xfree (argv);
829 }
830
831 static void
832 init_cmdargs (int argc, Extbyte **argv, int skip_args)
833 {
834   initial_argv = argv;
835   initial_argc = argc;
836
837   Vcommand_line_args = make_arg_list_1 (argc, argv, skip_args);
838 }
839
840 DEFUN ("invocation-name", Finvocation_name, 0, 0, 0, /*
841 Return the program name that was used to run XEmacs.
842 Any directory names are omitted.
843 */
844        ())
845 {
846   return Fcopy_sequence (Vinvocation_name);
847 }
848
849 DEFUN ("invocation-directory", Finvocation_directory, 0, 0, 0, /*
850 Return the directory name in which the Emacs executable was located.
851 */
852        ())
853 {
854   return Fcopy_sequence (Vinvocation_directory);
855 }
856
857 \f
858 #ifdef I18N4
859                                 /* #### - don't know why I18N4 on SunOS/JLE
860                                    can't deal with this.  It's a potential
861                                    bug that needs to be looked at. */
862 # undef RUN_TIME_REMAP
863 #endif
864
865 /* Test whether the next argument in ARGV matches SSTR or a prefix of
866    LSTR (at least MINLEN characters).  If so, then if VALPTR is non-null
867    (the argument is supposed to have a value) store in *VALPTR either
868    the next argument or the portion of this one after the equal sign.
869    ARGV is read starting at position *SKIPPTR; this index is advanced
870    by the number of arguments used.
871
872    Too bad we can't just use getopt for all of this, but we don't have
873    enough information to do it right.  */
874
875 static int
876 argmatch (char **argv, int argc, char *sstr, char *lstr,
877           int minlen, char **valptr, int *skipptr)
878 {
879   char *p = NULL;
880   int arglen;
881   char *arg;
882
883   /* Don't access argv[argc]; give up in advance.  */
884   if (argc <= *skipptr + 1)
885     return 0;
886
887   arg = argv[*skipptr+1];
888   if (arg == NULL)
889     return 0;
890   if (strcmp (arg, sstr) == 0)
891     {
892       if (valptr != NULL)
893         {
894           *valptr = argv[*skipptr+2];
895           *skipptr += 2;
896         }
897       else
898         *skipptr += 1;
899       return 1;
900     }
901   arglen = (valptr != NULL && (p = strchr (arg, '=')) != NULL
902             ? p - arg : (int) strlen (arg));
903   if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
904     return 0;
905   else if (valptr == NULL)
906     {
907       *skipptr += 1;
908       return 1;
909     }
910   else if (p != NULL)
911     {
912       *valptr = p+1;
913       *skipptr += 1;
914       return 1;
915     }
916   else if (argv[*skipptr+2] != NULL)
917     {
918       *valptr = argv[*skipptr+2];
919       *skipptr += 2;
920       return 1;
921     }
922   else
923     {
924       return 0;
925     }
926 }
927
928 /* Make stack traces always identify version + configuration */
929 #define main_1 STACK_TRACE_EYE_CATCHER
930
931 /* This function is not static, so that the compiler is less likely to
932    inline it, which would make it not show up in stack traces.
933
934    The restart argument is a flag that indicates that main_1 is now
935    being called for the second time in this invocation of xemacs; this can
936    only happen in an xemacs that is not loaded with dumped data (temacs
937    with the conventional dumper or xemacs -nd with the pdumper).   See
938    Frun_emacs_from_temacs().
939
940    restart interacts with initialized as follows (per Olivier Galibert):
941
942      It's perverted.
943
944      initialized==0 => temacs
945      initialized!=0 && restart!=0 => run-temacs
946      initialized!=0 && restart==0 => xemacs/post pdump_load()
947 */
948 DECLARE_DOESNT_RETURN (main_1 (int, char **, char **, int));
949 DOESNT_RETURN
950 main_1 (int argc, char **argv, char **envp, int restart)
951 {
952   char stack_bottom_variable;
953   int skip_args = 0;
954   Lisp_Object load_me;
955   int inhibit_window_system;
956 #ifdef NeXT
957   extern int malloc_cookie;
958 #endif
959
960 #if (!defined (SYSTEM_MALLOC) && !defined (HAVE_LIBMCHECK)      \
961      && !defined (DOUG_LEA_MALLOC))
962   /* Make sure that any libraries we link against haven't installed a
963      hook for a gmalloc of a potentially incompatible version. */
964   /* If we're using libmcheck, the hooks have already been initialized, */
965   /* don't touch them. -slb */
966   __malloc_hook = NULL;
967   __realloc_hook = NULL;
968   __free_hook = NULL;
969 #endif /* not SYSTEM_MALLOC or HAVE_LIBMCHECK or DOUG_LEA_MALLOC */
970
971   noninteractive = 0;
972   inhibit_non_essential_printing_operations = 1;
973
974 #ifdef NeXT
975   /* 19-Jun-1995 -baw
976    * NeXT secret magic, ripped from Emacs-for-NS by Carl Edman
977    * <cedman@princeton.edu>.  Note that even Carl doesn't know what this
978    * does; it was provided by NeXT, and it presumable makes NS's mallocator
979    * work with dumping.  But malloc_jumpstart() and malloc_freezedry() in
980    * unexnext.c are both completely undocumented, even in NS header files!
981    * But hey, it solves all NS related memory problems, so who's
982    * complaining? */
983   if (initialized && malloc_jumpstart (malloc_cookie) != 0)
984     stderr_out ("malloc jumpstart failed!\n");
985 #endif /* NeXT */
986
987   /*
988 #if defined (GNU_MALLOC) && \
989     defined (ERROR_CHECK_MALLOC) && \
990     !defined (HAVE_LIBMCHECK)
991   */
992 #if defined(LOSING_GCC_DESTRUCTOR_FREE_BUG)
993   /* Prior to XEmacs 21, this was `#if 0'ed out.  */
994   /* I'm enabling this because it is the only reliable way I've found to */
995   /* prevent a very annoying problem where GCC will attempt to free(3) */
996   /* memory at exit() and cause a coredump. */
997   init_free_hook ();
998 #endif
999
1000   sort_args (argc, argv);
1001
1002 #if defined (WIN32_NATIVE) || defined (_SCO_DS)
1003   environ = envp;
1004 #endif
1005
1006   /* Record (approximately) where the stack begins.  */
1007   stack_bottom = &stack_bottom_variable;
1008
1009 #ifdef USG_SHARED_LIBRARIES
1010   if (bss_end)
1011     brk ((void *) bss_end);
1012 #endif
1013
1014   clearerr (stdin);
1015
1016 #if defined (HAVE_MMAP) && defined (REL_ALLOC)
1017   /* ralloc can only be used if using the GNU memory allocator. */
1018   init_ralloc ();
1019 #elif defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1020   if (initialized)
1021     init_ralloc();
1022 #endif
1023
1024 #ifdef HAVE_SOCKS
1025   if (initialized)
1026     SOCKSinit (argv[0]);
1027 #endif /* HAVE_SOCKS */
1028
1029 #ifndef SYSTEM_MALLOC
1030   if (!initialized)
1031     /* Arrange to get warning messages as memory fills up.  */
1032     memory_warnings (0, malloc_warning);
1033 #endif  /* not SYSTEM_MALLOC */
1034
1035 #ifdef SET_EMACS_PRIORITY
1036   if (emacs_priority != 0)
1037     nice (-emacs_priority);
1038   setuid (getuid ());
1039 #endif /* SET_EMACS_PRIORITY */
1040
1041 #ifdef EXTRA_INITIALIZE
1042   EXTRA_INITIALIZE;
1043 #endif
1044
1045 #ifdef HAVE_WINDOW_SYSTEM
1046   inhibit_window_system = 0;
1047 #else
1048   inhibit_window_system = 1;
1049 #endif
1050
1051   /* Handle the -sd/--show-dump-id switch, which means show the hex dump_id and quit */
1052   if (argmatch (argv, argc, "-sd", "--show-dump-id", 9, NULL, &skip_args))
1053     {
1054 #ifdef PDUMP
1055       printf ("%08x\n", dump_id);
1056 #else
1057       printf ("Portable dumper not configured; -sd just forces exit.\n");
1058 #endif
1059       exit (0);
1060     }
1061
1062   /* Handle the -t switch, which specifies filename to use as terminal */
1063   {
1064     char *term;
1065     if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
1066       {
1067         close (0);
1068         close (1);
1069         if (open (term, O_RDWR | OPEN_BINARY, 2) < 0)
1070           fatal ("%s: %s", term, strerror (errno));
1071         dup (0);
1072         if (! isatty (0))
1073           fatal ("%s: not a tty", term);
1074
1075 #if 0
1076         stderr_out ("Using %s", ttyname (0));
1077 #endif
1078         stderr_out ("Using %s", term);
1079         inhibit_window_system = 1;      /* -t => -nw */
1080       }
1081   }
1082
1083   /* Handle the --no-dump-file/-nd switch, which means don't load the dump file (ignored when not using pdump) */
1084   if (argmatch (argv, argc, "-nd", "--no-dump-file", 7, NULL, &skip_args))
1085     {
1086       nodumpfile = 1;
1087     }
1088
1089   /* Handle -nw switch */
1090   if (argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
1091     inhibit_window_system = 1;
1092
1093   /* Handle the -batch switch, which means don't do interactive display.  */
1094   if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
1095     {
1096 #if 0 /* I don't think this is correct. */
1097       inhibit_autoloads = 1;
1098 #endif
1099       noninteractive = 1;
1100     }
1101
1102   if (argmatch (argv, argc, "-debug-paths", "--debug-paths",
1103                 11, NULL, &skip_args))
1104       debug_paths = 1;
1105
1106   /* Partially handle -no-autoloads, -no-early-packages and -vanilla.  Packages */
1107   /* are searched prior to the rest of the command line being parsed in */
1108   /* startup.el */
1109   if (argmatch (argv, argc, "-no-early-packages", "--no-early-packages",
1110                 6, NULL, &skip_args))
1111     {
1112       inhibit_early_packages = 1;
1113       skip_args--;
1114     }
1115 #ifdef HAVE_SHLIB
1116   if (argmatch (argv, argc, "-no-site-modules", "--no-site-modules",
1117                 9, NULL, &skip_args))
1118     {
1119       inhibit_site_modules = 1;
1120       skip_args--;
1121     }
1122 #else
1123   inhibit_site_modules = 1;
1124 #endif
1125   if (argmatch (argv, argc, "-vanilla", "--vanilla",
1126                 7, NULL, &skip_args))
1127     {
1128       inhibit_early_packages = 1;
1129       skip_args--;
1130     }
1131
1132   if (argmatch (argv, argc, "-no-autoloads", "--no-autoloads",
1133                 7, NULL, &skip_args))
1134     {
1135       /* Inhibit everything */
1136       inhibit_autoloads = 1;
1137       skip_args--;
1138     }
1139
1140   if (argmatch (argv, argc, "-debug-paths", "--debug-paths",
1141                 6, NULL, &skip_args))
1142     {
1143       debug_paths = 1;
1144       skip_args--;
1145     }
1146
1147
1148   /* Partially handle the -version and -help switches: they imply -batch,
1149      but are not removed from the list. */
1150   if (argmatch (argv, argc, "-help", "--help",   3, NULL, &skip_args))
1151     noninteractive = 1, skip_args--;
1152
1153   if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args) ||
1154       argmatch (argv, argc, "-V",    0,              2, NULL, &skip_args))
1155       noninteractive = 1, skip_args--;
1156
1157   /* Now, figure out which type of console is our first console. */
1158
1159   display_arg = 0;
1160
1161   if (noninteractive)
1162     display_use = "stream";
1163   else
1164     display_use = "tty";
1165
1166 #ifndef HAVE_TTY
1167   if (inhibit_window_system)
1168     fatal ("Sorry, this XEmacs was not compiled with TTY support");
1169 #endif
1170
1171 #ifdef HAVE_WINDOW_SYSTEM
1172   /* Stupid kludge to catch command-line display spec.  We can't
1173      handle this argument entirely in window-system-dependent code
1174      because we don't even know which window-system-dependent code
1175      to run until we've recognized this argument.  */
1176   if (!inhibit_window_system && !noninteractive)
1177     {
1178 #ifdef HAVE_X_WINDOWS
1179       char *dpy = 0;
1180       int count_before = skip_args;
1181
1182       if (argmatch (argv, argc, "-d", "--display", 3, &dpy, &skip_args) ||
1183           argmatch (argv, argc, "-display", 0,     3, &dpy, &skip_args))
1184         {
1185           display_arg = 1;
1186           display_use = "x";
1187         }
1188       /* If we have the form --display=NAME,
1189          convert it into  -d name.
1190          This requires inserting a new element into argv.  */
1191       if (dpy != 0 && skip_args - count_before == 1)
1192         {
1193           char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
1194           int j;
1195
1196           for (j = 0; j < count_before + 1; j++)
1197             new[j] = argv[j];
1198           new[count_before + 1] = "-d";
1199           new[count_before + 2] = dpy;
1200           for (j = count_before + 2; j <argc; j++)
1201             new[j + 1] = argv[j];
1202           argv = new;
1203           argc++;
1204         }
1205       /* Change --display to -d, when its arg is separate.  */
1206       else if (dpy != 0 && skip_args > count_before
1207                && argv[count_before + 1][1] == '-')
1208         argv[count_before + 1] = "-d";
1209
1210       /* Don't actually discard this arg.  */
1211       skip_args = count_before;
1212
1213       /* If there is a non-empty environment var DISPLAY, set
1214          `display_use', but not `display_arg', which is only to be set
1215          if the display was specified on the command line. */
1216       if ((dpy = getenv ("DISPLAY")) && dpy[0])
1217         display_use = "x";
1218
1219 #endif /* HAVE_X_WINDOWS */
1220 #ifdef HAVE_GTK
1221       {
1222         char *dpy = getenv ("DISPLAY");
1223         if (dpy && dpy[0])
1224           display_use = "gtk";
1225       }
1226 #endif
1227 #ifdef HAVE_MS_WINDOWS
1228       if (strcmp(display_use, "x") != 0)
1229         display_use = "mswindows";
1230 #endif /* HAVE_MS_WINDOWS */
1231     }
1232 #endif /* HAVE_WINDOW_SYSTEM */
1233
1234   noninteractive1 = noninteractive;
1235
1236   /****** Now initialize everything *******/
1237
1238   /* First, do really basic environment initialization -- catching signals
1239      and the like.  These functions have no dependence on any part of
1240      the Lisp engine and need to be done both at dump time and at run time. */
1241
1242   init_signals_very_early ();
1243   init_data_very_early (); /* Catch math errors. */
1244 #ifdef LISP_FLOAT_TYPE
1245   init_floatfns_very_early (); /* Catch floating-point math errors. */
1246 #endif
1247   init_process_times_very_early (); /* Initialize our process timers.
1248                                        As early as possible, of course,
1249                                        so we can be fairly accurate. */
1250   init_intl_very_early (); /* set up the locale and domain for gettext and
1251                               such. */
1252 #ifdef HAVE_MS_WINDOWS
1253   init_mswindows_very_early (); /* Some things - like dde need to be
1254                                    initialized early so that the
1255                                    client doesn't give up waiting.  */
1256 #endif
1257
1258   /* Now initialize the Lisp engine and the like.  Done only during
1259      dumping.  No dependence on anything that may be in the user's
1260      environment when the dumped XEmacs is run.
1261
1262      We try to do things in an order that minimizes the non-obvious
1263      dependencies between functions. */
1264
1265   /* purify_flag 1 is correct even if CANNOT_DUMP.
1266    * loadup.el will set to nil at end. */
1267
1268   purify_flag = 0;
1269 #ifdef PDUMP
1270   if (restart)
1271     initialized = 1;
1272   else if (nodumpfile) {
1273     initialized = 0;
1274     purify_flag = 1;
1275   } else {
1276
1277     /* Keep command options from getting stomped.
1278
1279        Some LISP-visible options are changed by XEmacs _after_ the data is
1280        dumped in building a --pdump XEmacs, but _before_ it is restored in
1281        normal operation.  Thus the restored values overwrite the values
1282        XEmacs is getting at run-time.  Such variables must be saved here,
1283        and restored after loading the dumped data.
1284
1285        Boy, this is ugly, but how else to do it?
1286     */
1287
1288     /* noninteractive1 is saved in noninteractive, which isn't LISP-visible */
1289     int inhibit_early_packages_save = inhibit_early_packages;
1290     int inhibit_autoloads_save      = inhibit_autoloads;
1291     int debug_paths_save            = debug_paths;
1292     /* #### Give inhibit-site-lisp a command switch?  If so, uncomment: */
1293     /* int inhibit_site_lisp_save      = inhibit_site_lisp; */
1294     int inhibit_site_modules_save   = inhibit_site_modules;
1295
1296     initialized = pdump_load (argv[0]);
1297
1298     /* Now unstomp everything */
1299     noninteractive1        = noninteractive;
1300     inhibit_early_packages = inhibit_early_packages_save;
1301     inhibit_autoloads      = inhibit_autoloads_save;
1302     debug_paths            = debug_paths_save;
1303     /* #### Give inhibit-site-lisp a command switch?  If so, uncomment: */
1304     /* inhibit_site_lisp      = inhibit_site_lisp_save; */
1305     inhibit_site_modules   = inhibit_site_modules_save;
1306
1307     if (initialized)
1308       run_temacs_argc = -1;
1309     else
1310       purify_flag = 1;
1311   }
1312 #else
1313   if (!initialized)
1314     purify_flag = 1;
1315 #endif
1316
1317   if (!initialized)
1318     {
1319       /* Initialize things so that new Lisp objects
1320          can be created and objects can be staticpro'd.
1321          Must be basically the very first thing done
1322          because pretty much all of the initialization
1323          routines below create new objects. */
1324       init_alloc_once_early ();
1325
1326       /* Initialize Qnil, Qt, Qunbound, and the
1327          obarray.  After this, symbols can be
1328          interned.  This depends on init_alloc_once_early(). */
1329       init_symbols_once_early ();
1330
1331       /* Declare the basic symbols pertaining to errors,
1332          So that DEFERROR*() can be called. */
1333       init_errors_once_early ();
1334
1335       /* Make sure that opaque pointers can be created. */
1336       init_opaque_once_early ();
1337
1338       /* Now declare all the symbols and define all the Lisp primitives.
1339
1340          The *only* thing that the syms_of_*() functions are allowed to do
1341          is call one of the following:
1342
1343          INIT_LRECORD_IMPLEMENTATION()
1344          defsymbol(), DEFSYMBOL(), or DEFSYMBOL_MULTIWORD_PREDICATE()
1345          defsubr() (i.e. DEFSUBR)
1346          deferror(), DEFERROR(), or DEFERROR_STANDARD()
1347          defkeyword() or DEFKEYWORD()
1348
1349          Order does not matter in these functions.
1350          */
1351
1352       syms_of_abbrev ();
1353       syms_of_alloc ();
1354       syms_of_buffer ();
1355       syms_of_bytecode ();
1356       syms_of_callint ();
1357       syms_of_callproc ();
1358       syms_of_casefiddle ();
1359       syms_of_casetab ();
1360       syms_of_chartab ();
1361       syms_of_cmdloop ();
1362       syms_of_cmds ();
1363       syms_of_console ();
1364       syms_of_data ();
1365 #ifdef DEBUG_XEMACS
1366       syms_of_debug ();
1367       syms_of_tests ();
1368 #endif /* DEBUG_XEMACS */
1369       syms_of_device ();
1370 #ifdef HAVE_DIALOGS
1371       syms_of_dialog ();
1372 #endif
1373       syms_of_dired ();
1374       syms_of_doc ();
1375       syms_of_editfns ();
1376       syms_of_elhash ();
1377       syms_of_emacs ();
1378       syms_of_eval ();
1379 #ifdef HAVE_X_WINDOWS
1380       syms_of_event_Xt ();
1381 #endif
1382 #ifdef HAVE_GTK
1383       syms_of_event_gtk ();
1384 #endif
1385 #ifdef HAVE_DRAGNDROP
1386       syms_of_dragdrop ();
1387 #endif
1388       syms_of_event_stream ();
1389       syms_of_events ();
1390       syms_of_extents ();
1391       syms_of_faces ();
1392       syms_of_fileio ();
1393 #ifdef CLASH_DETECTION
1394       syms_of_filelock ();
1395 #endif /* CLASH_DETECTION */
1396       syms_of_floatfns ();
1397       syms_of_fns ();
1398       syms_of_font_lock ();
1399       syms_of_frame ();
1400       syms_of_general ();
1401       syms_of_glyphs ();
1402       syms_of_glyphs_eimage ();
1403       syms_of_glyphs_widget ();
1404       syms_of_gui ();
1405       syms_of_gutter ();
1406       syms_of_indent ();
1407       syms_of_intl ();
1408       syms_of_keymap ();
1409       syms_of_lread ();
1410       syms_of_macros ();
1411       syms_of_marker ();
1412       syms_of_md5 ();
1413 #ifdef HAVE_DATABASE
1414       syms_of_database ();
1415 #endif
1416 #ifdef HAVE_MENUBARS
1417       syms_of_menubar ();
1418 #endif
1419       syms_of_minibuf ();
1420 #ifdef HAVE_SHLIB
1421       syms_of_module ();
1422 #endif
1423       syms_of_objects ();
1424       syms_of_print ();
1425 #if !defined (NO_SUBPROCESSES)
1426       syms_of_process ();
1427 #ifdef HAVE_WIN32_PROCESSES
1428       syms_of_process_nt ();
1429 #endif
1430 #endif
1431       syms_of_profile ();
1432 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1433       syms_of_ralloc ();
1434 #endif /* HAVE_MMAP && REL_ALLOC */
1435       syms_of_rangetab ();
1436       syms_of_redisplay ();
1437       syms_of_search ();
1438       syms_of_select ();
1439       syms_of_signal ();
1440       syms_of_sound ();
1441       syms_of_specifier ();
1442       syms_of_symbols ();
1443       syms_of_syntax ();
1444 #ifdef HAVE_SCROLLBARS
1445       syms_of_scrollbar ();
1446 #endif
1447 #ifdef HAVE_TOOLBARS
1448       syms_of_toolbar ();
1449 #endif
1450       syms_of_undo ();
1451       syms_of_widget ();
1452       syms_of_window ();
1453
1454 #ifdef HAVE_TTY
1455       syms_of_console_tty ();
1456       syms_of_device_tty ();
1457       syms_of_objects_tty ();
1458 #endif
1459
1460 #ifdef HAVE_GTK
1461       syms_of_device_gtk ();
1462       syms_of_frame_gtk ();
1463       syms_of_glyphs_gtk ();
1464       syms_of_objects_gtk ();
1465       syms_of_ui_gtk ();
1466       syms_of_select_gtk ();
1467 #ifdef HAVE_DIALOGS
1468       syms_of_dialog_gtk ();
1469 #endif
1470 #ifdef HAVE_MENUBARS
1471       syms_of_menubar_gtk ();
1472 #endif
1473       syms_of_select_gtk ();
1474       
1475 #if defined (HAVE_MENUBARS) || defined(HAVE_SCROLLBARS) || defined(HAVE_DIALOGS) || defined(HAVE_TOOLBARS)
1476       syms_of_gui_gtk ();
1477 #endif
1478 #endif /* HAVE_GTK */
1479
1480 #ifdef HAVE_X_WINDOWS
1481 #ifdef HAVE_BALLOON_HELP
1482       syms_of_balloon_x ();
1483 #endif
1484       syms_of_device_x ();
1485 #ifdef HAVE_DIALOGS
1486       syms_of_dialog_x ();
1487 #endif
1488       syms_of_frame_x ();
1489       syms_of_glyphs_x ();
1490       syms_of_objects_x ();
1491 #ifdef HAVE_MENUBARS
1492       syms_of_menubar_x ();
1493 #endif
1494       syms_of_select_x ();
1495 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1496       syms_of_gui_x ();
1497 #endif
1498 #ifdef HAVE_XIM
1499 #ifdef XIM_XLIB
1500       syms_of_input_method_xlib ();
1501 #endif
1502 #endif /* HAVE_XIM */
1503 #endif /* HAVE_X_WINDOWS */
1504
1505 #ifdef HAVE_MS_WINDOWS
1506       syms_of_console_mswindows ();
1507       syms_of_device_mswindows ();
1508       syms_of_dialog_mswindows ();
1509       syms_of_frame_mswindows ();
1510       syms_of_objects_mswindows ();
1511       syms_of_select_mswindows ();
1512       syms_of_glyphs_mswindows ();
1513       syms_of_gui_mswindows ();
1514 #ifdef HAVE_MENUBARS
1515       syms_of_menubar_mswindows ();
1516 #endif
1517 #ifdef HAVE_SCROLLBARS
1518       syms_of_scrollbar_mswindows ();
1519 #endif
1520 #endif  /* HAVE_MS_WINDOWS */
1521 #ifdef HAVE_MSW_C_DIRED
1522       syms_of_dired_mswindows ();
1523 #endif
1524 #ifdef WIN32_NATIVE
1525       syms_of_ntproc ();
1526 #endif
1527 #if defined (WIN32_NATIVE) || defined (CYGWIN)
1528       syms_of_win32 ();
1529 #endif
1530
1531 #ifdef MULE
1532       syms_of_mule ();
1533       syms_of_mule_ccl ();
1534       syms_of_mule_charset ();
1535 #endif
1536 #ifdef FILE_CODING
1537       syms_of_file_coding ();
1538 #endif
1539 #ifdef MULE
1540 #ifdef HAVE_WNN
1541       syms_of_mule_wnn ();
1542 #endif
1543 #ifdef HAVE_CANNA
1544       syms_of_mule_canna ();
1545 #endif /* HAVE_CANNA */
1546 #endif /* MULE */
1547
1548 #ifdef SYMS_SYSTEM
1549       SYMS_SYSTEM;
1550 #endif
1551
1552 #ifdef SYMS_MACHINE
1553       SYMS_MACHINE;
1554 #endif
1555
1556       /*
1557 #if defined (GNU_MALLOC) && \
1558     defined (ERROR_CHECK_MALLOC) && \
1559     !defined (HAVE_LIBMCHECK)
1560       */
1561       /* Prior to XEmacs 21, this was `#if 0'ed out. -slb */
1562 #if defined (LOSING_GCC_DESTRUCTOR_FREE_BUG)
1563       syms_of_free_hook ();
1564 #endif
1565
1566 #ifdef TOOLTALK
1567       syms_of_tooltalk ();
1568 #endif
1569
1570 #ifdef SUNPRO
1571       syms_of_sunpro ();
1572 #endif
1573
1574 #ifdef HAVE_LDAP
1575       syms_of_eldap ();
1576 #endif
1577
1578 #ifdef HAVE_GPM
1579       syms_of_gpmevent ();
1580 #endif
1581
1582 #ifdef HAVE_POSTGRESQL
1583       syms_of_postgresql ();
1584 #endif
1585
1586       /* Now create the subtypes for the types that have them.
1587          We do this before the vars_*() because more symbols
1588          may get initialized here. */
1589
1590       /* Now initialize the console types and associated symbols.
1591          Other than the first function below, the functions may
1592          make exactly the following function/macro calls:
1593
1594          INITIALIZE_CONSOLE_TYPE()
1595          CONSOLE_HAS_METHOD()
1596
1597          For any given console type, the former macro must be called
1598          before the any calls to the latter macro. */
1599
1600       console_type_create ();
1601
1602       console_type_create_stream ();
1603
1604 #ifdef HAVE_TTY
1605       console_type_create_tty ();
1606       console_type_create_device_tty ();
1607       console_type_create_frame_tty ();
1608       console_type_create_objects_tty ();
1609       console_type_create_redisplay_tty ();
1610 #endif
1611
1612 #ifdef HAVE_GTK
1613       console_type_create_gtk ();
1614       console_type_create_select_gtk ();
1615       console_type_create_device_gtk ();
1616       console_type_create_frame_gtk ();
1617       console_type_create_objects_gtk ();
1618       console_type_create_glyphs_gtk ();
1619       console_type_create_redisplay_gtk ();
1620 #ifdef HAVE_MENUBARS
1621       console_type_create_menubar_gtk ();
1622 #endif
1623 #ifdef HAVE_SCROLLBARS
1624       console_type_create_scrollbar_gtk ();
1625 #endif
1626 #ifdef HAVE_TOOLBARS
1627       console_type_create_toolbar_gtk ();
1628 #endif
1629 #ifdef HAVE_DIALOGS
1630       console_type_create_dialog_gtk ();
1631 #endif
1632 #endif /* HAVE_GTK */
1633
1634 #ifdef HAVE_X_WINDOWS
1635       console_type_create_x ();
1636       console_type_create_device_x ();
1637       console_type_create_frame_x ();
1638       console_type_create_glyphs_x ();
1639       console_type_create_select_x ();
1640 #ifdef HAVE_MENUBARS
1641       console_type_create_menubar_x ();
1642 #endif
1643       console_type_create_objects_x ();
1644       console_type_create_redisplay_x ();
1645 #ifdef HAVE_SCROLLBARS
1646       console_type_create_scrollbar_x ();
1647 #endif
1648 #ifdef HAVE_TOOLBARS
1649       console_type_create_toolbar_x ();
1650 #endif
1651 #ifdef HAVE_DIALOGS
1652       console_type_create_dialog_x ();
1653 #endif
1654 #endif /* HAVE_X_WINDOWS */
1655
1656 #ifdef HAVE_MS_WINDOWS
1657       console_type_create_mswindows ();
1658       console_type_create_device_mswindows ();
1659       console_type_create_frame_mswindows ();
1660       console_type_create_objects_mswindows ();
1661       console_type_create_redisplay_mswindows ();
1662       console_type_create_glyphs_mswindows ();
1663       console_type_create_select_mswindows ();
1664 # ifdef HAVE_SCROLLBARS
1665       console_type_create_scrollbar_mswindows ();
1666 # endif
1667 #ifdef HAVE_MENUBARS
1668       console_type_create_menubar_mswindows ();
1669 #endif
1670 #ifdef HAVE_TOOLBARS
1671       console_type_create_toolbar_mswindows ();
1672 #endif
1673 #ifdef HAVE_DIALOGS
1674       console_type_create_dialog_mswindows ();
1675 #endif
1676 #endif
1677
1678       /* Now initialize the specifier types and associated symbols.
1679          Other than the first function below, the functions may
1680          make exactly the following function/macro calls:
1681
1682          INITIALIZE_SPECIFIER_TYPE()
1683          SPECIFIER_HAS_METHOD()
1684
1685          For any given specifier type, the former macro must be called
1686          before the any calls to the latter macro. */
1687
1688       specifier_type_create ();
1689
1690       specifier_type_create_image ();
1691       specifier_type_create_gutter ();
1692       specifier_type_create_objects ();
1693 #ifdef HAVE_TOOLBARS
1694       specifier_type_create_toolbar ();
1695 #endif
1696
1697       /* Now initialize the structure types and associated symbols.
1698          Other than the first function below, the functions may
1699          make exactly the following function/macro calls:
1700
1701          define_structure_type()
1702          define_structure_type_keyword()
1703
1704          */
1705
1706       structure_type_create ();
1707
1708       structure_type_create_chartab ();
1709       structure_type_create_faces ();
1710       structure_type_create_rangetab ();
1711       structure_type_create_hash_table ();
1712
1713       /* Now initialize the image instantiator formats and associated symbols.
1714          Other than the first function below, the functions may
1715          make exactly the following function/macro calls:
1716
1717          INITIALIZE_IMAGE_INSTANTIATOR_FORMAT()
1718          IIFORMAT_HAS_METHOD()
1719          IIFORMAT_VALID_KEYWORD()
1720
1721          For any given image instantiator format, the first macro must be
1722          called before the any calls to the other macros. */
1723
1724       image_instantiator_format_create ();
1725       image_instantiator_format_create_glyphs_eimage ();
1726       image_instantiator_format_create_glyphs_widget ();
1727 #ifdef HAVE_TTY
1728       image_instantiator_format_create_glyphs_tty ();
1729 #endif
1730 #ifdef HAVE_X_WINDOWS
1731       image_instantiator_format_create_glyphs_x ();
1732 #endif /* HAVE_X_WINDOWS */
1733 #ifdef HAVE_MS_WINDOWS
1734       image_instantiator_format_create_glyphs_mswindows ();
1735 #endif /* HAVE_MSWINDOWS_WINDOWS */
1736 #ifdef HAVE_GTK
1737       image_instantiator_format_create_glyphs_gtk ();
1738 #endif
1739
1740       /* Now initialize the lstream types and associated symbols.
1741          Other than the first function below, the functions may
1742          make exactly the following function/macro calls:
1743
1744          LSTREAM_HAS_METHOD()
1745
1746          */
1747
1748       lstream_type_create ();
1749 #ifdef FILE_CODING
1750       lstream_type_create_file_coding ();
1751 #endif
1752 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
1753       lstream_type_create_mswindows_selectable ();
1754 #endif
1755
1756       /* Initialize processes implementation.
1757          The functions may make exactly the following function/macro calls:
1758
1759          PROCESS_HAS_METHOD()
1760       */
1761 #ifdef HAVE_UNIX_PROCESSES
1762       process_type_create_unix ();
1763 #endif
1764 #ifdef HAVE_WIN32_PROCESSES
1765       process_type_create_nt ();
1766 #endif
1767
1768       /* Now initialize most variables.
1769
1770          These functions may do exactly the following:
1771
1772          DEFVAR_INT()
1773          DEFVAR_LISP()
1774          DEFVAR_BOOL()
1775          DEFER_GETTEXT()
1776          Dynarr_*()
1777          Blocktype_*()
1778          staticpro()
1779          Fprovide(symbol)
1780          intern()
1781          Fput()
1782          xmalloc()
1783          defsymbol(), if it's absolutely necessary and you're sure that
1784            the symbol isn't referenced anywhere else in the initialization
1785            code
1786          Fset() on a symbol that is unbound
1787          assigning a symbol or constant value to a variable
1788          using a global variable that has been initialized
1789            earlier on in the same function
1790
1791          Any of the object-creating functions in alloc.c: e.g.
1792
1793          make_pure_*()
1794          make_string()
1795          build_string()
1796          make_vector()
1797          make_int()
1798          make_extent()
1799          alloc_lcrecord()
1800          Fcons()
1801          listN()
1802          make_opaque_ptr()
1803
1804          perhaps a few others.
1805
1806          NB:  Initialization or assignment should not be done here to certain
1807            variables settable from the command line.  See the comment above
1808            the call to pdump_load() in main_1().  This caveat should only
1809            apply to vars_of_emacs().
1810        */
1811
1812       /* Now allow Fprovide() statements to be made. */
1813       init_provide_once ();
1814
1815       /* Do that before any specifier creation (esp. vars_of_glyphs()) */
1816       vars_of_specifier ();
1817
1818       vars_of_abbrev ();
1819       vars_of_alloc ();
1820       vars_of_buffer ();
1821       vars_of_bytecode ();
1822       vars_of_callint ();
1823       vars_of_callproc ();
1824       vars_of_chartab ();
1825       vars_of_cmdloop ();
1826       vars_of_cmds ();
1827       vars_of_console ();
1828       vars_of_data ();
1829 #ifdef DEBUG_XEMACS
1830       vars_of_debug ();
1831       vars_of_tests ();
1832 #endif
1833       vars_of_console_stream ();
1834       vars_of_device ();
1835 #ifdef HAVE_DIALOGS
1836       vars_of_dialog ();
1837 #endif
1838       vars_of_dired ();
1839       vars_of_doc ();
1840 #ifdef HAVE_DRAGNDROP
1841       vars_of_dragdrop ();
1842 #endif
1843       vars_of_editfns ();
1844       vars_of_elhash ();
1845       vars_of_emacs ();
1846       vars_of_eval ();
1847
1848 #ifdef HAVE_X_WINDOWS
1849       vars_of_event_Xt ();
1850 #endif
1851 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
1852       vars_of_event_tty ();
1853 #endif
1854 #ifdef HAVE_MS_WINDOWS
1855       vars_of_event_mswindows ();
1856 #endif
1857       vars_of_event_stream ();
1858
1859       vars_of_events ();
1860       vars_of_extents ();
1861       vars_of_faces ();
1862       vars_of_fileio ();
1863 #ifdef CLASH_DETECTION
1864       vars_of_filelock ();
1865 #endif
1866       vars_of_floatfns ();
1867       vars_of_font_lock ();
1868       vars_of_frame ();
1869       vars_of_glyphs ();
1870       vars_of_glyphs_eimage ();
1871       vars_of_glyphs_widget ();
1872       vars_of_gui ();
1873       vars_of_gutter ();
1874       vars_of_indent ();
1875       vars_of_insdel ();
1876       vars_of_intl ();
1877 #ifdef HAVE_XIM
1878 #ifdef XIM_MOTIF
1879       vars_of_input_method_motif ();
1880 #else /* XIM_XLIB */
1881       vars_of_input_method_xlib ();
1882 #endif
1883 #endif /* HAVE_XIM */
1884       vars_of_keymap ();
1885       vars_of_lread ();
1886       vars_of_lstream ();
1887       vars_of_macros ();
1888       vars_of_md5 ();
1889 #ifdef HAVE_DATABASE
1890       vars_of_database ();
1891 #endif
1892 #ifdef HAVE_MENUBARS
1893       vars_of_menubar ();
1894 #endif
1895       vars_of_minibuf ();
1896 #ifdef HAVE_SHLIB
1897       vars_of_module ();
1898 #endif
1899 #ifdef WIN32_NATIVE
1900       vars_of_nt ();
1901       vars_of_ntproc ();
1902 #endif
1903       vars_of_objects ();
1904       vars_of_print ();
1905
1906 #ifndef NO_SUBPROCESSES
1907       vars_of_process ();
1908 #ifdef HAVE_UNIX_PROCESSES
1909       vars_of_process_unix ();
1910 #endif
1911 #ifdef HAVE_WIN32_PROCESSES
1912       vars_of_process_nt ();
1913 #endif
1914 #endif
1915
1916       vars_of_profile ();
1917 #if defined (HAVE_MMAP) && defined (REL_ALLOC) && !defined(DOUG_LEA_MALLOC)
1918       vars_of_ralloc ();
1919 #endif /* HAVE_MMAP && REL_ALLOC */
1920       vars_of_redisplay ();
1921 #ifdef HAVE_SCROLLBARS
1922       vars_of_scrollbar ();
1923 #endif
1924       vars_of_search ();
1925       vars_of_select ();
1926       vars_of_sound ();
1927       vars_of_symbols ();
1928       vars_of_syntax ();
1929 #ifdef HAVE_TOOLBARS
1930       vars_of_toolbar ();
1931 #endif
1932       vars_of_undo ();
1933       vars_of_window ();
1934
1935 #ifdef HAVE_TTY
1936       vars_of_console_tty ();
1937       vars_of_frame_tty ();
1938       vars_of_objects_tty ();
1939 #endif
1940
1941 #ifdef HAVE_GTK
1942       vars_of_device_gtk ();
1943 #ifdef HAVE_DIALOGS
1944       vars_of_dialog_gtk ();
1945 #endif
1946       vars_of_event_gtk ();
1947       vars_of_frame_gtk ();
1948       vars_of_glyphs_gtk ();
1949       vars_of_ui_gtk ();
1950 #ifdef HAVE_MENUBARS
1951       vars_of_menubar_gtk ();
1952 #endif
1953       vars_of_objects_gtk ();
1954       vars_of_select_gtk ();
1955 #ifdef HAVE_SCROLLBARS
1956       vars_of_scrollbar_gtk ();
1957 #endif
1958 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1959       vars_of_gui_gtk ();
1960 #endif
1961 #endif /* HAVE_GTK */
1962
1963 #ifdef HAVE_X_WINDOWS
1964 #ifdef HAVE_BALLOON_HELP
1965       vars_of_balloon_x ();
1966 #endif
1967       vars_of_device_x ();
1968 #ifdef HAVE_DIALOGS
1969       vars_of_dialog_x ();
1970 #endif
1971       vars_of_frame_x ();
1972       vars_of_glyphs_x ();
1973 #ifdef HAVE_MENUBARS
1974       vars_of_menubar_x ();
1975 #endif
1976       vars_of_objects_x ();
1977       vars_of_select_x ();
1978 #ifdef HAVE_SCROLLBARS
1979       vars_of_scrollbar_x ();
1980 #endif
1981 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
1982       vars_of_gui_x ();
1983 #endif
1984 #endif /* HAVE_X_WINDOWS */
1985
1986
1987 #ifdef HAVE_MS_WINDOWS
1988       vars_of_device_mswindows ();
1989       vars_of_console_mswindows ();
1990       vars_of_frame_mswindows ();
1991       vars_of_objects_mswindows ();
1992       vars_of_select_mswindows ();
1993       vars_of_glyphs_mswindows ();
1994 #ifdef HAVE_SCROLLBARS
1995       vars_of_scrollbar_mswindows ();
1996 #endif
1997 #ifdef HAVE_MENUBARS
1998       vars_of_menubar_mswindows ();
1999 #endif
2000 #ifdef HAVE_MSW_C_DIRED
2001       vars_of_dired_mswindows ();
2002 #endif
2003 #ifdef HAVE_DIALOGS
2004       vars_of_dialog_mswindows ();
2005 #endif
2006 #endif  /* HAVE_MS_WINDOWS */
2007
2008 #ifdef MULE
2009       vars_of_mule ();
2010       vars_of_mule_ccl ();
2011       vars_of_mule_charset ();
2012 #endif
2013 #ifdef FILE_CODING
2014       vars_of_file_coding ();
2015 #endif
2016 #ifdef MULE
2017 #ifdef HAVE_WNN
2018       vars_of_mule_wnn ();
2019 #endif
2020 #ifdef HAVE_CANNA
2021       vars_of_mule_canna ();
2022 #endif /* HAVE_CANNA */
2023 #endif /* MULE */
2024
2025 #ifdef TOOLTALK
2026       vars_of_tooltalk ();
2027 #endif
2028
2029 #ifdef SUNPRO
2030       vars_of_sunpro ();
2031 #endif
2032
2033 #ifdef HAVE_LDAP
2034       vars_of_eldap ();
2035 #endif
2036
2037 #ifdef HAVE_POSTGRESQL
2038       vars_of_postgresql();
2039 #endif
2040
2041 #ifdef HAVE_GPM
2042       vars_of_gpmevent ();
2043 #endif
2044
2045       /* Now initialize any specifier variables.  We do this later
2046          because it has some dependence on the vars initialized
2047          above.
2048
2049          These functions should *only* initialize specifier variables,
2050          and may make use of the following functions/macros in addition
2051          to the ones listed above:
2052
2053          DEFVAR_SPECIFIER()
2054          Fmake_specifier()
2055          set_specifier_fallback()
2056          set_specifier_caching()
2057          */
2058
2059       specifier_vars_of_glyphs ();
2060       specifier_vars_of_glyphs_widget ();
2061       specifier_vars_of_gutter ();
2062 #ifdef HAVE_MENUBARS
2063       specifier_vars_of_menubar ();
2064 #endif
2065       specifier_vars_of_redisplay ();
2066 #ifdef HAVE_SCROLLBARS
2067       specifier_vars_of_scrollbar ();
2068 #endif
2069 #ifdef HAVE_TOOLBARS
2070       specifier_vars_of_toolbar ();
2071 #endif
2072       specifier_vars_of_window ();
2073
2074       /* Now comes all the rest of the variables that couldn't
2075          be handled above.  There may be dependencies on variables
2076          initialized above, and dependencies between one complex_vars_()
2077          function and another. */
2078
2079       /* Calls Fmake_range_table(). */
2080       complex_vars_of_regex ();
2081       /* Calls Fmake_range_table(). */
2082       complex_vars_of_search ();
2083
2084       /* Calls make_lisp_hash_table(). */
2085       complex_vars_of_extents ();
2086
2087       /* Depends on hash tables and specifiers. */
2088       complex_vars_of_faces ();
2089
2090 #ifdef MULE
2091       /* These two depend on hash tables and various variables declared
2092          earlier.  The second may also depend on the first. */
2093       complex_vars_of_mule_charset ();
2094 #endif
2095 #ifdef FILE_CODING
2096       complex_vars_of_file_coding ();
2097 #endif
2098
2099       /* This calls allocate_glyph(), which creates specifiers
2100          and also relies on a variable (Vthe_nothing_vector) initialized
2101          above.  It also calls make_ext_string(), which under Mule
2102          could require that the charsets be initialized. */
2103       complex_vars_of_glyphs ();
2104
2105       /* These rely on the glyphs just created in the previous function,
2106          and call Fadd_spec_to_specifier(), which relies on various
2107          variables initialized above. */
2108 #ifdef HAVE_GTK
2109       complex_vars_of_glyphs_gtk ();
2110 #endif
2111 #ifdef HAVE_X_WINDOWS
2112       complex_vars_of_glyphs_x ();
2113 #endif
2114 #ifdef HAVE_MS_WINDOWS
2115       complex_vars_of_glyphs_mswindows ();
2116 #endif
2117
2118       /* This calls Fmake_glyph_internal(). */
2119       complex_vars_of_alloc ();
2120
2121       /* This calls Fmake_glyph_internal(). */
2122 #ifdef HAVE_MENUBARS
2123       complex_vars_of_menubar ();
2124 #endif
2125
2126       /* This calls Fmake_glyph_internal(). */
2127 #ifdef HAVE_SCROLLBARS
2128       complex_vars_of_scrollbar ();
2129 #endif
2130
2131       /* This calls allocate_glyph(). */
2132       complex_vars_of_frame ();
2133
2134       /* This calls Fcopy_category_table() under Mule, which calls who
2135          knows what. */
2136       complex_vars_of_chartab ();
2137
2138       /* This calls set_string_char(), which (under Mule) depends on the
2139          charsets being initialized. */
2140       complex_vars_of_casetab ();
2141
2142       /* This calls Fcopy_syntax_table(), which relies on char tables. */
2143       complex_vars_of_syntax ();
2144
2145       /* This initializes buffer-local variables, sets things up so
2146          that buffers can be created, and creates a couple of basic
2147          buffers.  This depends on Vstandard_syntax_table and
2148          Vstandard_category_table (initialized in the previous
2149          functions), as well as a whole horde of variables that may
2150          have been initialized above. */
2151       complex_vars_of_buffer ();
2152
2153       /* This initializes console-local variables. */
2154       complex_vars_of_console ();
2155
2156       /* This creates a couple more buffers, and depends on the
2157          previous function. */
2158       complex_vars_of_minibuf ();
2159
2160       /* These two might call Ffile_name_as_directory(), which
2161          might depend on all sorts of things; I'm not sure. */
2162       complex_vars_of_emacs ();
2163
2164       /* This creates a couple of basic keymaps and depends on Lisp
2165          hash tables and Ffset() (both of which depend on some variables
2166          initialized in the vars_of_*() section) and possibly other
2167          stuff. */
2168       complex_vars_of_keymap ();
2169
2170       /* Calls make_lisp_hash_table() and creates a keymap */
2171       complex_vars_of_event_stream ();
2172
2173 #ifdef ERROR_CHECK_GC
2174       {
2175         extern int always_gc;
2176         if (always_gc)                /* purification debugging hack */
2177           garbage_collect_1 ();
2178       }
2179 #endif
2180 #ifdef PDUMP
2181     } else if (!restart) {            /* after successful pdump_load() */
2182       reinit_alloc_once_early ();
2183       reinit_symbols_once_early ();
2184       reinit_opaque_once_early ();
2185
2186       reinit_console_type_create_stream ();
2187 #ifdef HAVE_TTY
2188       reinit_console_type_create_tty ();
2189 #endif
2190 #ifdef HAVE_X_WINDOWS
2191       reinit_console_type_create_x ();
2192       reinit_console_type_create_device_x ();
2193 #endif
2194 #ifdef HAVE_MS_WINDOWS
2195       reinit_console_type_create_mswindows ();
2196 #endif
2197 #ifdef HAVE_GTK
2198       reinit_console_type_create_gtk ();
2199 #endif
2200
2201       reinit_specifier_type_create ();
2202       reinit_specifier_type_create_image ();
2203       reinit_specifier_type_create_gutter ();
2204       reinit_specifier_type_create_objects ();
2205 #ifdef HAVE_TOOLBARS
2206       reinit_specifier_type_create_toolbar ();
2207 #endif
2208
2209       structure_type_create ();
2210
2211       structure_type_create_chartab ();
2212       structure_type_create_faces ();
2213       structure_type_create_rangetab ();
2214       structure_type_create_hash_table ();
2215
2216       lstream_type_create ();
2217 #ifdef FILE_CODING
2218       lstream_type_create_file_coding ();
2219 #endif
2220 #if defined (HAVE_MS_WINDOWS) && !defined(HAVE_MSG_SELECT)
2221       lstream_type_create_mswindows_selectable ();
2222 #endif
2223 #ifdef HAVE_UNIX_PROCESSES
2224       process_type_create_unix ();
2225 #endif
2226 #ifdef HAVE_WIN32_PROCESSES
2227       process_type_create_nt ();
2228 #endif
2229
2230       reinit_vars_of_buffer ();
2231       reinit_vars_of_console ();
2232 #ifdef DEBUG_XEMACS
2233       reinit_vars_of_debug ();
2234 #endif
2235       reinit_vars_of_device ();
2236       reinit_vars_of_eval ();
2237 #ifdef HAVE_X_WINDOWS
2238       reinit_vars_of_event_Xt ();
2239 #endif
2240 #ifdef HAVE_GTK
2241       reinit_vars_of_event_gtk ();
2242 #endif
2243 #if defined(HAVE_TTY) && (defined (DEBUG_TTY_EVENT_STREAM) || !defined (HAVE_X_WINDOWS))
2244       reinit_vars_of_event_tty ();
2245 #endif
2246 #ifdef HAVE_MS_WINDOWS
2247       reinit_vars_of_event_mswindows ();
2248 #endif
2249       reinit_vars_of_event_stream ();
2250       reinit_vars_of_events ();
2251       reinit_vars_of_extents ();
2252       reinit_vars_of_fileio ();
2253       reinit_vars_of_font_lock ();
2254       reinit_vars_of_glyphs ();
2255       reinit_vars_of_glyphs_widget ();
2256       reinit_vars_of_insdel ();
2257       reinit_vars_of_lread ();
2258       reinit_vars_of_lstream ();
2259       reinit_vars_of_minibuf ();
2260 #ifdef HAVE_SHLIB
2261       reinit_vars_of_module ();
2262 #endif
2263       reinit_vars_of_objects ();
2264       reinit_vars_of_print ();
2265       reinit_vars_of_search ();
2266       reinit_vars_of_undo ();
2267       reinit_vars_of_window ();
2268
2269 #ifdef HAVE_MS_WINDOWS
2270       reinit_vars_of_frame_mswindows ();
2271 #endif
2272
2273 #ifdef HAVE_GTK
2274       reinit_vars_of_menubar_gtk ();
2275 #endif
2276
2277 #ifdef HAVE_X_WINDOWS
2278       reinit_vars_of_device_x ();
2279 #ifdef HAVE_SCROLLBARS
2280       reinit_vars_of_scrollbar_x ();
2281 #endif
2282 #ifdef HAVE_MENUBARS
2283       reinit_vars_of_menubar_x ();
2284 #endif
2285       reinit_vars_of_select_x ();
2286 #if defined (HAVE_MENUBARS) || defined (HAVE_SCROLLBARS) || defined (HAVE_DIALOGS) || defined (HAVE_TOOLBARS)
2287       reinit_vars_of_gui_x ();
2288 #endif
2289 #endif /* HAVE_X_WINDOWS */
2290
2291 #if defined(MULE) && defined(HAVE_WNN)
2292       reinit_vars_of_mule_wnn ();
2293 #endif
2294
2295       reinit_complex_vars_of_buffer ();
2296       reinit_complex_vars_of_console ();
2297       reinit_complex_vars_of_minibuf ();
2298 #endif /* PDUMP */
2299     }
2300
2301
2302   /* CONGRATULATIONS!!!  We have successfully initialized the Lisp
2303      engine. */
2304
2305   if (initialized)
2306     {
2307       /* Stuff that should not be done at dump time, including stuff that
2308          needs to be reset at run time.  Order below should not matter.
2309
2310          Many initializations taken from the environment should go here. */
2311       reinit_alloc ();
2312       reinit_eval ();
2313 #ifdef MULE_REGEXP
2314       reinit_mule_category ();
2315 #endif
2316 #ifdef HAVE_POSTGRESQL
2317       init_postgresql_from_environment();
2318 #endif
2319     }
2320
2321   /* Now do further initialization/setup of stuff that is not needed by the
2322      syms_of_() routines.  This involves stuff that only is enabled in
2323      an interactive run (redisplay, user input, etc.) and stuff that is
2324      not needed until we start loading Lisp code (the reader).  A lot
2325      of this stuff involves querying the current environment and needs
2326      to be done both at dump time and at run time. */
2327
2328   init_initial_directory();             /* get the directory to use for the
2329                                            "*scratch*" buffer, etc. */
2330
2331 #ifdef WIN32_NATIVE
2332   /*
2333    * For Win32, call init_environment() now, so that environment/registry
2334    * variables will be properly entered into Vprocess_environment.
2335    */
2336   init_environment();
2337 #endif
2338
2339   init_callproc ();     /* Set up the process environment (so that egetenv
2340                            works), the basic directory variables
2341                            (exec-directory and so on), and stuff
2342                            related to subprocesses.  This should be
2343                            first because many of the functions below
2344                            call egetenv() to get environment variables. */
2345   init_lread ();        /* Set up the Lisp reader. */
2346   init_cmdargs (argc, (Extbyte **) argv,
2347                 skip_args);     /* Create list Vcommand_line_args */
2348   init_buffer ();       /* Set default directory of *scratch* buffer */
2349
2350 #ifdef WIN32_NATIVE
2351   init_ntproc();
2352 #endif
2353
2354   init_redisplay ();      /* Determine terminal type.
2355                              init_sys_modes uses results */
2356   init_frame ();
2357   init_event_stream (); /* Set up so we can get user input. */
2358   init_macros (); /* set up so we can run macros. */
2359   init_editfns (); /* Determine the name of the user we're running as */
2360   init_xemacs_process (); /* set up for calling subprocesses */
2361 #ifdef SUNPRO
2362   init_sunpro (); /* Set up Sunpro usage tracking */
2363 #endif
2364 #if defined (WIN32_NATIVE) || defined (CYGWIN)
2365   init_win32 ();
2366 #endif
2367 #if defined (HAVE_NATIVE_SOUND) && defined (hp9000s800)
2368   init_hpplay ();
2369 #endif
2370 #ifdef HAVE_TTY
2371   init_device_tty ();
2372 #endif
2373   init_console_stream (restart); /* Create the first console */
2374
2375   /* try to get the actual pathname of the exec file we are running */
2376   if (!restart)
2377   {
2378     Vinvocation_name = Fcar (Vcommand_line_args);
2379     if (XSTRING_DATA(Vinvocation_name)[0] == '-')
2380       {
2381         /* XEmacs as a login shell, oh goody! */
2382         Vinvocation_name = build_string(getenv("SHELL"));
2383       }
2384     Vinvocation_directory = Vinvocation_name;
2385
2386     if (!NILP (Ffile_name_directory (Vinvocation_name)))
2387       {
2388         /* invocation-name includes a directory component -- presumably it
2389            is relative to cwd, not $PATH */
2390         Vinvocation_directory = Fexpand_file_name (Vinvocation_name,
2391                                                    Qnil);
2392         Vinvocation_path = Qnil;
2393       }
2394     else
2395       {
2396         Vinvocation_path = decode_env_path ("PATH", NULL);
2397         locate_file (Vinvocation_path, Vinvocation_name,
2398                      Vlisp_EXEC_SUFFIXES,
2399                      &Vinvocation_directory, X_OK);
2400       }
2401
2402     if (NILP (Vinvocation_directory))
2403       Vinvocation_directory = Vinvocation_name;
2404
2405     Vinvocation_name = Ffile_name_nondirectory (Vinvocation_directory);
2406     Vinvocation_directory = Ffile_name_directory (Vinvocation_directory);
2407   }
2408
2409 #if defined(HAVE_SHLIB) && !defined(WIN32_NATIVE)
2410   /* This is Unix only.  MS Windows NT has a library call that does
2411      The Right Thing on that system.  Rumor has it, this must be
2412      called for GNU dld in temacs and xemacs.  */
2413   {
2414     char *buf = (char *)alloca (XSTRING_LENGTH (Vinvocation_directory)
2415                                 + XSTRING_LENGTH (Vinvocation_name)
2416                                 + 2);
2417     sprintf (buf, "%s/%s", XSTRING_DATA (Vinvocation_directory),
2418              XSTRING_DATA (Vinvocation_name));
2419
2420     /* All we can do is cry if an error happens, so ignore it. */
2421     (void) dll_init (buf);
2422   }
2423 #endif
2424
2425 #if defined (LOCALTIME_CACHE) && defined (HAVE_TZSET)
2426   /* sun's localtime() has a bug.  it caches the value of the time
2427      zone rather than looking it up every time.  Since localtime() is
2428      called to bolt the undumping time into the undumped emacs, this
2429      results in localtime() ignoring the TZ environment variable.
2430      This flushes the new TZ value into localtime(). */
2431   tzset ();
2432 #endif /* LOCALTIME_CACHE and TZSET */
2433
2434   load_me = Qnil;
2435   if (!initialized)
2436     {
2437       /* Handle -l loadup-and-dump, args passed by Makefile. */
2438       if (argc > 2 + skip_args && !strcmp (argv[1 + skip_args], "-l"))
2439         load_me = build_string (argv[2 + skip_args]);
2440 #if 0 /* CANNOT_DUMP - this can never be right in XEmacs --andyp */
2441       /* Unless next switch is -nl, load "loadup.el" first thing.  */
2442       if (!(argc > 1 + skip_args && !strcmp (argv[1 + skip_args], "-nl")))
2443         load_me = build_string ("loadup.el");
2444 #endif /* CANNOT_DUMP */
2445     }
2446
2447 #ifdef QUANTIFY
2448   if (initialized)
2449     quantify_start_recording_data ();
2450 #endif /* QUANTIFY */
2451
2452   initialized = 1;
2453   inhibit_non_essential_printing_operations = 0;
2454
2455   /* This never returns.  */
2456   initial_command_loop (load_me);
2457   /* NOTREACHED */
2458 }
2459
2460 \f
2461 /* Sort the args so we can find the most important ones
2462    at the beginning of argv.  */
2463
2464 /* First, here's a table of all the standard options.  */
2465
2466 struct standard_args
2467 {
2468   const char *name;
2469   const char *longname;
2470   int priority;
2471   int nargs;
2472 };
2473
2474 static const struct standard_args standard_args[] =
2475 {
2476   /* Handled by main_1 above: */
2477   { "-sd", "--show-dump-id", 105, 0 },
2478   { "-t", "--terminal", 100, 1 },
2479   { "-nd", "--no-dump-file", 95, 0 },
2480   { "-nw", "--no-windows", 90, 0 },
2481   { "-batch", "--batch", 85, 0 },
2482   { "-debug-paths", "--debug-paths", 82, 0 },
2483   { "-help", "--help", 80, 0 },
2484   { "-version", "--version", 75, 0 },
2485   { "-V", 0, 75, 0 },
2486   { "-d", "--display", 80, 1 },
2487   { "-display", 0, 80, 1 },
2488   { "-NXHost",  0, 79, 0 },
2489   { "-MachLaunch", 0, 79, 0},
2490
2491   /* Handled by command-line-early in startup.el: */
2492   { "-q", "--no-init-file", 50, 0 },
2493   { "-unmapped", 0, 50, 0 },
2494   { "-no-init-file", 0, 50, 0 },
2495   { "-vanilla", "--vanilla", 50, 0 },
2496   { "-no-autoloads", "--no-autoloads", 50, 0 },
2497   { "-no-site-file", "--no-site-file", 40, 0 },
2498   { "-no-early-packages", "--no-early-packages", 35, 0 },
2499   { "-u", "--user", 30, 1 },
2500   { "-user", 0, 30, 1 },
2501   { "-debug-init", "--debug-init", 20, 0 },
2502   { "-debug-paths", "--debug-paths", 20, 0 },
2503
2504   /* Xt options: */
2505   { "-i", "--icon-type", 15, 0 },
2506   { "-itype", 0, 15, 0 },
2507   { "-iconic", "--iconic", 15, 0 },
2508   { "-bg", "--background-color", 10, 1 },
2509   { "-background", 0, 10, 1 },
2510   { "-fg", "--foreground-color", 10, 1 },
2511   { "-foreground", 0, 10, 1 },
2512   { "-bd", "--border-color", 10, 1 },
2513   { "-bw", "--border-width", 10, 1 },
2514   { "-ib", "--internal-border", 10, 1 },
2515   { "-ms", "--mouse-color", 10, 1 },
2516   { "-cr", "--cursor-color", 10, 1 },
2517   { "-fn", "--font", 10, 1 },
2518   { "-font", 0, 10, 1 },
2519   { "-g", "--geometry", 10, 1 },
2520   { "-geometry", 0, 10, 1 },
2521   { "-T", "--title", 10, 1 },
2522   { "-title", 0, 10, 1 },
2523   { "-name", "--name", 10, 1 },
2524   { "-xrm", "--xrm", 10, 1 },
2525   { "-r", "--reverse-video", 5, 0 },
2526   { "-rv", 0, 5, 0 },
2527   { "-reverse", 0, 5, 0 },
2528   { "-hb", "--horizontal-scroll-bars", 5, 0 },
2529   { "-vb", "--vertical-scroll-bars", 5, 0 },
2530
2531   /* These have the same priority as ordinary file name args,
2532      so they are not reordered with respect to those.  */
2533   { "-L", "--directory", 0, 1 },
2534   { "-directory", 0, 0, 1 },
2535   { "-l", "--load", 0, 1 },
2536   { "-load", 0, 0, 1 },
2537   { "-f", "--funcall", 0, 1 },
2538   { "-funcall", 0, 0, 1 },
2539   { "-eval", "--eval", 0, 1 },
2540   { "-insert", "--insert", 0, 1 },
2541   /* This should be processed after ordinary file name args and the like.  */
2542   { "-kill", "--kill", -10, 0 },
2543 };
2544
2545 /* Reorder the elements of ARGV (assumed to have ARGC elements)
2546    so that the highest priority ones come first.
2547    Do not change the order of elements of equal priority.
2548    If an option takes an argument, keep it and its argument together.  */
2549
2550 static void
2551 sort_args (int argc, char **argv)
2552 {
2553   char **new_argv = xnew_array (char *, argc);
2554   /* For each element of argv,
2555      the corresponding element of options is:
2556      0 for an option that takes no arguments,
2557      1 for an option that takes one argument, etc.
2558      -1 for an ordinary non-option argument.  */
2559   int *options  = xnew_array (int, argc);
2560   int *priority = xnew_array (int, argc);
2561   int to = 1;
2562   int from;
2563   int i;
2564   int end_of_options_p = 0;
2565
2566   /* Categorize all the options,
2567      and figure out which argv elts are option arguments.  */
2568   for (from = 1; from < argc; from++)
2569     {
2570       options[from] = -1;
2571       priority[from] = 0;
2572       /* Pseudo options "--" and "run-temacs" indicate end of options */
2573       if (!strcmp (argv[from], "--") ||
2574           !strcmp (argv[from], "run-temacs"))
2575         end_of_options_p = 1;
2576       if (!end_of_options_p && argv[from][0] == '-')
2577         {
2578           int match, thislen;
2579           char *equals;
2580
2581           /* Look for a match with a known old-fashioned option.  */
2582           for (i = 0; i < countof (standard_args); i++)
2583             if (!strcmp (argv[from], standard_args[i].name))
2584               {
2585                 options[from]  = standard_args[i].nargs;
2586                 priority[from] = standard_args[i].priority;
2587                 if (from + standard_args[i].nargs >= argc)
2588                   fatal ("Option `%s' requires an argument\n", argv[from]);
2589                 from += standard_args[i].nargs;
2590                 goto done;
2591               }
2592
2593           /* Look for a match with a known long option.
2594              MATCH is -1 if no match so far, -2 if two or more matches so far,
2595              >= 0 (the table index of the match) if just one match so far.  */
2596           if (argv[from][1] == '-')
2597             {
2598               match = -1;
2599               thislen = strlen (argv[from]);
2600               equals = strchr (argv[from], '=');
2601               if (equals != 0)
2602                 thislen = equals - argv[from];
2603
2604               for (i = 0; i < countof (standard_args); i++)
2605                 if (standard_args[i].longname
2606                     && !strncmp (argv[from], standard_args[i].longname,
2607                                  thislen))
2608                   {
2609                     if (match == -1)
2610                       match = i;
2611                     else
2612                       match = -2;
2613                   }
2614
2615               /* If we found exactly one match, use that.  */
2616               if (match >= 0)
2617                 {
2618                   options[from]  = standard_args[match].nargs;
2619                   priority[from] = standard_args[match].priority;
2620                   /* If --OPTION=VALUE syntax is used,
2621                      this option uses just one argv element.  */
2622                   if (equals != 0)
2623                     options[from] = 0;
2624                   if (from + options[from] >= argc)
2625                     fatal ("Option `%s' requires an argument\n", argv[from]);
2626                   from += options[from];
2627                 }
2628             }
2629         done: ;
2630         }
2631     }
2632
2633   /* Copy the arguments, in order of decreasing priority, to NEW_ARGV.  */
2634   new_argv[0] = argv[0];
2635   while (to < argc)
2636     {
2637       int best = -1;
2638       int best_priority = -9999;
2639
2640       /* Find the highest priority remaining option.
2641          If several have equal priority, take the first of them.  */
2642       for (from = 1; from < argc; from++)
2643         {
2644           if (argv[from] != 0 && priority[from] > best_priority)
2645             {
2646               best_priority = priority[from];
2647               best = from;
2648             }
2649           /* Skip option arguments--they are tied to the options.  */
2650           if (options[from] > 0)
2651             from += options[from];
2652         }
2653
2654       if (best < 0)
2655         abort ();
2656
2657       /* Copy the highest priority remaining option, with its args, to NEW_ARGV.  */
2658       new_argv[to++] = argv[best];
2659       for (i = 0; i < options[best]; i++)
2660         new_argv[to++] = argv[best + i + 1];
2661
2662       /* Clear out this option in ARGV.  */
2663       argv[best] = 0;
2664       for (i = 0; i < options[best]; i++)
2665         argv[best + i + 1] = 0;
2666     }
2667
2668   memcpy (argv, new_argv, sizeof (char *) * argc);
2669   xfree (new_argv);
2670   xfree (options);
2671   xfree (priority);
2672 }
2673
2674 DEFUN ("running-temacs-p", Frunning_temacs_p, 0, 0, 0, /*
2675 True if running temacs.  This means we are in the dumping stage.
2676 This is false during normal execution of the `xemacs' program, and
2677 becomes false once `run-emacs-from-temacs' is run.
2678 */
2679        ())
2680 {
2681   return run_temacs_argc >= 0 ? Qt : Qnil;
2682 }
2683
2684 DEFUN ("run-emacs-from-temacs", Frun_emacs_from_temacs, 0, MANY, 0, /*
2685 Do not call this.  It will reinitialize your XEmacs.  You'll be sorry.
2686 */
2687 /* If this function is called from startup.el, it will be possible to run
2688    temacs as an editor using 'temacs -batch -l loadup.el run-temacs', instead
2689    of having to dump an emacs and then run that (when debugging emacs itself,
2690    this can be much faster)). [Actually, the speed difference isn't that
2691    much as long as your filesystem is local, and you don't end up with
2692    a dumped version in case you want to rerun it.  This function is most
2693    useful when used as part of the `make all-elc' command. --ben]
2694    This will "restart" emacs with the specified command-line arguments.
2695
2696    Martin thinks this function is most useful when using debugging
2697    tools like Purify or tcov that get confused by XEmacs' dumping.  */
2698      (int nargs, Lisp_Object *args))
2699 {
2700   int ac;
2701   const Extbyte *wampum;
2702   int namesize;
2703   int total_len;
2704   Lisp_Object orig_invoc_name = Fcar (Vcommand_line_args);
2705   const Extbyte **wampum_all = alloca_array (const Extbyte *, nargs);
2706   int *wampum_all_len  = alloca_array (int, nargs);
2707
2708   assert (!gc_in_progress);
2709
2710   if (run_temacs_argc < 0)
2711     error ("I've lost my temacs-hood.");
2712
2713   /* Need to convert the orig_invoc_name and all of the arguments
2714      to external format. */
2715
2716   TO_EXTERNAL_FORMAT (LISP_STRING, orig_invoc_name,
2717                       ALLOCA, (wampum, namesize),
2718                       Qnative);
2719   namesize++;
2720
2721   for (ac = 0, total_len = namesize; ac < nargs; ac++)
2722     {
2723       CHECK_STRING (args[ac]);
2724       TO_EXTERNAL_FORMAT (LISP_STRING, args[ac],
2725                           ALLOCA, (wampum_all[ac], wampum_all_len[ac]),
2726                           Qnative);
2727       wampum_all_len[ac]++;
2728       total_len += wampum_all_len[ac];
2729     }
2730   DO_REALLOC (run_temacs_args, run_temacs_args_size, total_len, char);
2731   DO_REALLOC (run_temacs_argv, run_temacs_argv_size, nargs+2, char *);
2732
2733   memcpy (run_temacs_args, wampum, namesize);
2734   run_temacs_argv [0] = run_temacs_args;
2735   for (ac = 0; ac < nargs; ac++)
2736     {
2737       memcpy (run_temacs_args + namesize,
2738               wampum_all[ac], wampum_all_len[ac]);
2739       run_temacs_argv [ac + 1] = run_temacs_args + namesize;
2740       namesize += wampum_all_len[ac];
2741     }
2742   run_temacs_argv [nargs + 1] = 0;
2743   catchlist = NULL; /* Important!  Otherwise free_cons() calls in
2744                        condition_case_unwind() may lead to GC death. */
2745   unbind_to (0, Qnil); /* this closes loadup.el */
2746   purify_flag = 0;
2747   run_temacs_argc = nargs + 1;
2748 #if defined (HEAP_IN_DATA) && !defined(PDUMP)
2749   report_sheap_usage (0);
2750 #endif
2751   LONGJMP (run_temacs_catch, 1);
2752   return Qnil; /* not reached; warning suppression */
2753 }
2754
2755 /* ARGSUSED */
2756 int
2757 main (int argc, char **argv, char **envp)
2758 {
2759
2760 #ifdef _MSC_VER
2761   /* Under VC++, access violations and the like are not sent through
2762      the standard signal() mechanism.  Rather, they need to be handled
2763      using the Microsoft "structured exception handling" mechanism,
2764      which vaguely resembles the C++ mechanisms. */
2765   __try
2766   {
2767 #endif
2768
2769   int     volatile vol_argc = argc;
2770   char ** volatile vol_argv = argv;
2771   char ** volatile vol_envp = envp;
2772   /* This is hairy.  We need to compute where the XEmacs binary was invoked
2773      from because temacs initialization requires it to find the lisp
2774      directories.  The code that recomputes the path is guarded by the
2775      restarted flag.  There are three possible paths I've found so far
2776      through this:
2777
2778      temacs -- When running temacs for basic build stuff, the first main_1
2779       will be the only one invoked.  It must compute the path else there
2780       will be a very ugly bomb in startup.el (can't find obvious location
2781       for doc-directory data-directory, etc.).
2782
2783      temacs w/ run-temacs on the command line -- This is run to bytecompile
2784       all the out of date dumped lisp.  It will execute both of the main_1
2785       calls and the second one must not touch the first computation because
2786       argc/argv are hosed the second time through.
2787
2788      xemacs -- Only the second main_1 is executed.  The invocation path must
2789       computed but this only matters when running in place or when running
2790       as a login shell.
2791
2792      As a bonus for straightening this out, XEmacs can now be run in place
2793      as a login shell.  This never used to work.
2794
2795      As another bonus, we can now guarantee that
2796      (concat invocation-directory invocation-name) contains the filename
2797      of the XEmacs binary we are running.  This can now be used in a
2798      definite test for out of date dumped files.  -slb */
2799   int restarted = 0;
2800 #ifdef QUANTIFY
2801   quantify_stop_recording_data ();
2802   quantify_clear_data ();
2803 #endif /* QUANTIFY */
2804
2805   inhibit_non_essential_printing_operations = 1;
2806   suppress_early_error_handler_backtrace = 0;
2807   lim_data = 0; /* force reinitialization of this variable */
2808
2809   /* Lisp_Object must fit in a word; check VALBITS and GCTYPEBITS */
2810   assert (sizeof (Lisp_Object) == sizeof (void *));
2811
2812 #ifdef LINUX_SBRK_BUG
2813   sbrk (1);
2814 #endif
2815
2816   if (!initialized)
2817     {
2818 #ifdef DOUG_LEA_MALLOC
2819       if (mallopt (M_MMAP_MAX, 0) != 1)
2820         abort();
2821 #endif
2822       run_temacs_argc = 0;
2823       if (! SETJMP (run_temacs_catch))
2824         {
2825           main_1 (vol_argc, vol_argv, vol_envp, 0);
2826         }
2827       /* run-emacs-from-temacs called */
2828       restarted = 1;
2829       vol_argc = run_temacs_argc;
2830       vol_argv = run_temacs_argv;
2831 #ifdef _SCO_DS
2832       /* This makes absolutely no sense to anyone involved.  There are
2833          several people using this stuff.  We've compared versions on
2834          everything we can think of.  We can find no difference.
2835          However, on both my systems environ is a plain old global
2836          variable initialized to zero.  _environ is the one that
2837          contains pointers to the actual environment.
2838
2839          Since we can't figure out the difference (and we're hours
2840          away from a release), this takes a very cowardly approach and
2841          is bracketed with both a system specific preprocessor test
2842          and a runtime "do you have this problem" test
2843
2844          06/20/96 robertl@dgii.com */
2845       {
2846         extern char **_environ;
2847         if ((unsigned) environ == 0)
2848           environ=_environ;
2849       }
2850 #endif /* _SCO_DS */
2851       vol_envp = environ;
2852     }
2853 #if defined (RUN_TIME_REMAP) && ! defined (PDUMP)
2854   else
2855     /* obviously no-one uses this because where it was before initialized was
2856      *always* true */
2857     run_time_remap (argv[0]);
2858 #endif
2859
2860 #ifdef DOUG_LEA_MALLOC
2861   if (initialized && (malloc_state_ptr != NULL))
2862     {
2863       int rc = malloc_set_state (malloc_state_ptr);
2864       if (rc != 0)
2865         {
2866           stderr_out ("malloc_set_state failed, rc = %d\n", rc);
2867           abort ();
2868         }
2869 #if 0
2870       free (malloc_state_ptr);
2871 #endif
2872       /* mmap works in glibc-2.1, glibc-2.0 (Non-Mule only) and Linux libc5 */
2873 #if (defined(__GLIBC__) && __GLIBC_MINOR__ >= 1) || \
2874     defined(_NO_MALLOC_WARNING_) || \
2875     (defined(__GLIBC__) && __GLIBC_MINOR__ < 1 && !defined(MULE)) || \
2876     defined(DEBUG_DOUG_LEA_MALLOC)
2877       if(mallopt (M_MMAP_MAX, 0) != 1)
2878         abort();
2879 #endif
2880 #ifdef REL_ALLOC
2881       r_alloc_reinit ();
2882 #endif
2883     }
2884 #endif /* DOUG_LEA_MALLOC */
2885
2886   run_temacs_argc = -1;
2887
2888   main_1 (vol_argc, vol_argv, vol_envp, restarted);
2889
2890 #ifdef _MSC_VER
2891   }
2892   /* VC++ documentation says that
2893      GetExceptionCode() cannot be called inside the filter itself. */
2894   __except (mswindows_handle_hardware_exceptions (GetExceptionCode ())) {}
2895 #endif
2896
2897   return 0; /* unreached */
2898 }
2899
2900 \f
2901 /* Dumping apparently isn't supported by versions of GCC >= 2.8. */
2902 /* The following needs conditionalization on whether either XEmacs or */
2903 /* various system shared libraries have been built and linked with */
2904 /* GCC >= 2.8.  -slb */
2905 #if defined(GNU_MALLOC)
2906 static void
2907 voodoo_free_hook (void *mem)
2908 {
2909   /* Disable all calls to free() when XEmacs is exiting and it doesn't */
2910   /* matter. */
2911   __free_hook =
2912 #ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
2913     (__typeof__ (__free_hook))
2914 #endif
2915     voodoo_free_hook;
2916 }
2917 #endif /* GNU_MALLOC */
2918
2919 DEFUN ("kill-emacs", Fkill_emacs, 0, 1, "P", /*
2920 Exit the XEmacs job and kill it.  Ask for confirmation, without argument.
2921 If ARG is an integer, return ARG as the exit program code.
2922 If ARG is a string, stuff it as keyboard input.
2923
2924 The value of `kill-emacs-hook', if not void,
2925 is a list of functions (of no args),
2926 all of which are called before XEmacs is actually killed.
2927 */
2928        (arg))
2929 {
2930   /* This function can GC */
2931   struct gcpro gcpro1;
2932
2933   GCPRO1 (arg);
2934
2935   if (feof (stdin))
2936     arg = Qt;
2937
2938   if (!preparing_for_armageddon && !noninteractive)
2939     run_hook (Qkill_emacs_hook);
2940
2941   ensure_no_quitting_from_now_on ();
2942
2943   if (!preparing_for_armageddon)
2944     {
2945       Lisp_Object concons, nextcons;
2946
2947       /* Normally, go ahead and delete all the consoles now.
2948          Some unmentionably lame window systems (MS Wwwww...... eek,
2949          I can't even say it) don't properly clean up after themselves,
2950          and even for those that do, it might be cleaner this way.
2951          If we're going down, however, we don't do this (might
2952          be too dangerous), and if we get a crash somewhere within
2953          this loop, we'll still autosave and won't try this again. */
2954
2955       LIST_LOOP_DELETING (concons, nextcons, Vconsole_list)
2956         {
2957           /* There is very little point in deleting the stream console.
2958              It uses stdio, which should flush any buffered output and
2959              something can only go wrong. -slb */
2960           /* I changed my mind.  There's a stupid hack in close to add
2961              a trailing newline. */
2962           /*if (!CONSOLE_STREAM_P (XCONSOLE (XCAR (concons))))*/
2963             delete_console_internal (XCONSOLE (XCAR (concons)), 1, 1, 0);
2964         }
2965     }
2966
2967   UNGCPRO;
2968
2969 #ifdef HAVE_MS_WINDOWS
2970   /* If we displayed a message on the console, then we must allow the
2971      user to see this message.  This may be unnecessary, but can't
2972      hurt, and we can't necessarily check arg; e.g. xemacs --help
2973      kills with argument 0.
2974
2975      Don't do this in batch mode, it makes no sense and is more
2976      annoying than useful. --andyp */
2977   if (mswindows_message_outputted && !noninteractive)
2978     Fmswindows_message_box (build_string ("Messages outputted.  XEmacs is exiting."),
2979                             Qnil, Qnil);
2980 #endif
2981
2982   shut_down_emacs (0, STRINGP (arg) ? arg : Qnil, 0);
2983
2984 #if defined(GNU_MALLOC)
2985   __free_hook =
2986 #ifdef __GNUC__ /* prototype of __free_hook varies with glibc version */
2987     (__typeof__ (__free_hook))
2988 #endif
2989     voodoo_free_hook;
2990 #endif
2991
2992   exit (INTP (arg) ? XINT (arg) : 0);
2993   /* NOTREACHED */
2994   return Qnil; /* I'm sick of the compiler warning */
2995 }
2996
2997 /* Perform an orderly shutdown of XEmacs.  Autosave any modified
2998    buffers, kill any child processes, clean up the terminal modes (if
2999    we're in the foreground), and other stuff like that.  Don't perform
3000    any redisplay; this may be called when XEmacs is shutting down in
3001    the background, or after its X connection has died.
3002
3003    If SIG is a signal number, print a message for it.
3004
3005    This is called by fatal signal handlers and Fkill_emacs.  It used to
3006    be called by X protocol error handlers, but instead they now call
3007    Fkill_emacs. */
3008 static void
3009 shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save)
3010 {
3011   /* This function can GC */
3012   /* Prevent running of hooks and other non-essential stuff
3013      from now on.  */
3014   preparing_for_armageddon = 1;
3015
3016   ensure_no_quitting_from_now_on ();
3017
3018 #ifdef QUANTIFY
3019   quantify_stop_recording_data ();
3020 #endif /* QUANTIFY */
3021
3022   /* This is absolutely the most important thing to do, so make sure
3023      we do it now, before anything else.  We might have crashed and
3024      be in a weird inconsistent state, and potentially anything could
3025      set off another protection fault and cause us to bail out
3026      immediately. */
3027   /* Steve writes the following:
3028
3029      [[I'm not removing the code entirely, yet.  We have run up against
3030      a spate of problems in diagnosing crashes due to crashes within
3031      crashes.  It has very definitely been determined that code called
3032      during auto-saving cannot work if XEmacs crashed inside of GC.
3033      We already auto-save on an itimer so there cannot be too much
3034      unsaved stuff around, and if we get better crash reports we might
3035      be able to get more problems fixed so I'm disabling this.  -slb]]
3036
3037      and DISABLES AUTO-SAVING ENTIRELY during crashes!  Way way bad idea.
3038
3039      Instead let's just be more intelligent about avoiding crashing
3040      when possible, esp. nested crashes.
3041   */
3042   if (!no_auto_save)
3043     Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
3044
3045   fflush (stdout);
3046   reset_all_consoles ();
3047   if (sig && sig != SIGTERM)
3048     {
3049       if (sig == -1)
3050         stderr_out ("\nFatal error.\n\n");
3051       else
3052         stderr_out ("\nFatal error (%d).\n\n", sig);
3053       stderr_out
3054         ("Your files have been auto-saved.\n"
3055          "Use `M-x recover-session' to recover them.\n"
3056          "\n"
3057          "Your version of XEmacs was distributed with a PROBLEMS file that  may describe\n"
3058          "your crash, and with luck a workaround.  Please check it first, but do report\n"
3059          "the crash anyway.  "
3060 #ifdef INFODOCK
3061          "\n\nPlease report this bug by selecting `Report-Bug' in the InfoDock menu.\n"
3062          "*BE SURE* to include the XEmacs configuration from M-x describe-installation,\n"
3063          "or the file Installation in the top directory of the build tree.\n"
3064 #else
3065          "Please report this bug by invoking M-x report-emacs-bug,\n"
3066          "or by selecting `Send Bug Report' from the Help menu.  If necessary, send\n"
3067          "ordinary email to `crashes@xemacs.org'.  *MAKE SURE* to include the XEmacs\n"
3068          "configuration from M-x describe-installation, or equivalently the file\n"
3069          "Installation in the top of the build tree.\n"
3070 #endif
3071 #ifndef _MSC_VER
3072          "\n"
3073          "*Please* try *hard* to obtain a C stack backtrace; without it, we are unlikely\n"
3074          "to be able to analyze the problem.  Locate the core file produced as a result\n"
3075          "of this crash (often called `core' or `core.<process-id>', and located in\n"
3076          "the directory in which you started XEmacs or your home directory), and type\n"
3077          "\n"
3078          "  gdb "
3079 #endif
3080          );
3081 #ifndef _MSC_VER
3082       {
3083         const char *name;
3084         char *dir = 0;
3085
3086         /* Now try to determine the actual path to the executable,
3087            to try to make the backtrace-determination process as foolproof
3088            as possible. */
3089         if (STRINGP (Vinvocation_name))
3090           name = (char *) XSTRING_DATA (Vinvocation_name);
3091         else
3092           name = "xemacs";
3093         if (STRINGP (Vinvocation_directory))
3094           dir = (char *) XSTRING_DATA (Vinvocation_directory);
3095         if (!dir || dir[0] != '/')
3096           stderr_out ("`which %s`", name);
3097         else if (dir[strlen (dir) - 1] != '/')
3098           stderr_out ("%s/%s", dir, name);
3099         else
3100           stderr_out ("%s%s", dir, name);
3101       }
3102       stderr_out
3103         (" core\n"
3104          "\n"
3105          "then type `where' at the debugger prompt.  No GDB on your system?  You may\n"
3106          "have DBX, or XDB, or SDB.  (Ask your system administrator if you need help.)\n"
3107          "If no core file was produced, enable them (often with `ulimit -c unlimited'\n"
3108          "in case of future recurrance of the crash.\n");
3109 #endif /* _MSC_VER */
3110     }
3111
3112   stuff_buffered_input (stuff);
3113
3114   kill_buffer_processes (Qnil);
3115
3116 #ifdef CLASH_DETECTION
3117   unlock_all_files ();
3118 #endif
3119
3120 #ifdef TOOLTALK
3121   tt_session_quit (tt_default_session ());
3122 #if 0
3123   /* The following crashes when built on X11R5 and run on X11R6 */
3124   tt_close ();
3125 #endif
3126 #endif /* TOOLTALK */
3127
3128 }
3129
3130 \f
3131 #ifndef CANNOT_DUMP
3132
3133 #if !defined(PDUMP) || !defined(SYSTEM_MALLOC)
3134 extern char my_edata[];
3135 #endif
3136
3137 extern void disable_free_hook (void);
3138
3139 DEFUN ("dump-emacs", Fdump_emacs, 2, 2, 0, /*
3140 Dump current state of XEmacs into executable file FILENAME.
3141 Take symbols from SYMFILE (presumably the file you executed to run XEmacs).
3142 This is used in the file `loadup.el' when building XEmacs.
3143
3144 Remember to set `command-line-processed' to nil before dumping
3145 if you want the dumped XEmacs to process its command line
3146 and announce itself normally when it is run.
3147 */
3148        (filename, symfile))
3149 {
3150   /* This function can GC */
3151   struct gcpro gcpro1, gcpro2;
3152   int opurify;
3153
3154   GCPRO2 (filename, symfile);
3155
3156 #ifdef FREE_CHECKING
3157   Freally_free (Qnil);
3158
3159   /* When we're dumping, we can't use the debugging free() */
3160   disable_free_hook ();
3161 #endif
3162
3163   CHECK_STRING (filename);
3164   filename = Fexpand_file_name (filename, Qnil);
3165   if (!NILP (symfile))
3166     {
3167       CHECK_STRING (symfile);
3168       if (XSTRING_LENGTH (symfile) > 0)
3169         symfile = Fexpand_file_name (symfile, Qnil);
3170       else
3171         symfile = Qnil;
3172     }
3173
3174   opurify = purify_flag;
3175   purify_flag = 0;
3176
3177 #if defined (HEAP_IN_DATA) && !defined(PDUMP)
3178   report_sheap_usage (1);
3179 #endif
3180
3181   clear_message ();
3182
3183   fflush (stderr);
3184   fflush (stdout);
3185
3186   disksave_object_finalization ();
3187   release_breathing_space ();
3188
3189   /* Tell malloc where start of impure now is */
3190   /* Also arrange for warnings when nearly out of space.  */
3191 #ifndef SYSTEM_MALLOC
3192   memory_warnings (my_edata, malloc_warning);
3193 #endif
3194
3195   UNGCPRO;
3196
3197   {
3198     char *filename_ext;
3199     char *symfile_ext;
3200
3201     LISP_STRING_TO_EXTERNAL (filename, filename_ext, Qfile_name);
3202
3203     if (STRINGP (symfile))
3204       LISP_STRING_TO_EXTERNAL (symfile, symfile_ext, Qfile_name);
3205     else
3206       symfile_ext = 0;
3207
3208     garbage_collect_1 ();
3209
3210 #ifdef PDUMP
3211     pdump ();
3212 #else
3213
3214 #ifdef DOUG_LEA_MALLOC
3215     malloc_state_ptr = malloc_get_state ();
3216 #endif
3217   /* here we break our rule that the filename conversion should
3218      be performed at the actual time that the system call is made.
3219      It's a whole lot easier to do the conversion here than to
3220      modify all the unexec routines to ensure that filename
3221      conversion is applied everywhere.  Don't worry about memory
3222      leakage because this call only happens once. */
3223     unexec (filename_ext, symfile_ext, (uintptr_t) my_edata, 0, 0);
3224 #ifdef DOUG_LEA_MALLOC
3225     free (malloc_state_ptr);
3226 #endif
3227 #endif /* not PDUMP */
3228   }
3229
3230   purify_flag = opurify;
3231
3232   return Qnil;
3233 }
3234
3235 #endif /* not CANNOT_DUMP */
3236 \f
3237
3238 /* Split STRING into a list of substrings.  The substrings are the
3239    parts of original STRING separated by SEPCHAR.  */
3240 static Lisp_Object
3241 split_string_by_emchar_1 (const Bufbyte *string, Bytecount size,
3242                           Emchar sepchar)
3243 {
3244   Lisp_Object result = Qnil;
3245   const Bufbyte *end = string + size;
3246
3247   while (1)
3248     {
3249       const Bufbyte *p = string;
3250       while (p < end)
3251         {
3252           if (charptr_emchar (p) == sepchar)
3253             break;
3254           INC_CHARPTR (p);
3255         }
3256       result = Fcons (make_string (string, p - string), result);
3257       if (p < end)
3258         {
3259           string = p;
3260           INC_CHARPTR (string); /* skip sepchar */
3261         }
3262       else
3263         break;
3264     }
3265   return Fnreverse (result);
3266 }
3267
3268 /* The same as the above, except PATH is an external C string (it is
3269    converted using Qfile_name), and sepchar is hardcoded to SEPCHAR
3270    (':' or whatever).  */
3271 Lisp_Object
3272 decode_path (const char *path)
3273 {
3274   Bytecount newlen;
3275   Bufbyte *newpath;
3276   if (!path)
3277     return Qnil;
3278
3279   TO_INTERNAL_FORMAT (C_STRING, path, ALLOCA, (newpath, newlen), Qfile_name);
3280
3281   /* #### Does this make sense?  It certainly does for
3282      decode_env_path(), but it looks dubious here.  Does any code
3283      depend on decode_path("") returning nil instead of an empty
3284      string?  */
3285   if (!newlen)
3286     return Qnil;
3287
3288   return split_string_by_emchar_1 (newpath, newlen, SEPCHAR);
3289 }
3290
3291 Lisp_Object
3292 decode_env_path (const char *evarname, const char *default_)
3293 {
3294   const char *path = 0;
3295   if (evarname)
3296     path = egetenv (evarname);
3297   if (!path)
3298     path = default_;
3299   return decode_path (path);
3300 }
3301
3302 /* Ben thinks this function should not exist or be exported to Lisp.
3303    We use it to define split-path-string in subr.el (not!).  */
3304
3305 DEFUN ("split-string-by-char", Fsplit_string_by_char, 2, 2, 0, /*
3306 Split STRING into a list of substrings originally separated by SEPCHAR.
3307 */
3308        (string, sepchar))
3309 {
3310   CHECK_STRING (string);
3311   CHECK_CHAR (sepchar);
3312   return split_string_by_emchar_1 (XSTRING_DATA (string),
3313                                    XSTRING_LENGTH (string),
3314                                    XCHAR (sepchar));
3315 }
3316
3317 /* #### This was supposed to be in subr.el, but is used VERY early in
3318    the bootstrap process, so it goes here.  Damn.  */
3319
3320 DEFUN ("split-path", Fsplit_path, 1, 1, 0, /*
3321 Explode a search path into a list of strings.
3322 The path components are separated with the characters specified
3323 with `path-separator'.
3324 */
3325        (path))
3326 {
3327   CHECK_STRING (path);
3328
3329   while (!STRINGP (Vpath_separator)
3330          || (XSTRING_CHAR_LENGTH (Vpath_separator) != 1))
3331     Vpath_separator = signal_simple_continuable_error
3332       ("`path-separator' should be set to a single-character string",
3333        Vpath_separator);
3334
3335   return (split_string_by_emchar_1
3336           (XSTRING_DATA (path), XSTRING_LENGTH (path),
3337            charptr_emchar (XSTRING_DATA (Vpath_separator))));
3338 }
3339 \f
3340 DEFUN ("noninteractive", Fnoninteractive, 0, 0, 0, /*
3341 Non-nil return value means XEmacs is running without interactive terminal.
3342 */
3343        ())
3344 {
3345   return noninteractive ? Qt : Qnil;
3346 }
3347
3348 /* This flag is useful to define if you're under a debugger; this way, you
3349    can put a breakpoint of assert_failed() and debug multiple problems
3350    in one session without having to recompile. */
3351 /* #define ASSERTIONS_DONT_ABORT */
3352
3353 #ifdef USE_ASSERTIONS
3354 /* This highly dubious kludge ... shut up Jamie, I'm tired of your slagging. */
3355
3356 static int in_assert_failed;
3357 static const char *assert_failed_file;
3358 static int assert_failed_line;
3359 static const char *assert_failed_expr;
3360
3361 #ifdef fprintf
3362 #undef fprintf
3363 #endif
3364
3365 #undef abort    /* avoid infinite #define loop... */
3366
3367 #if defined (WIN32_NATIVE) && defined (DEBUG_XEMACS)
3368 #define enter_debugger() DebugBreak ()
3369 #else
3370 #define enter_debugger()
3371 #endif
3372
3373 void
3374 assert_failed (const char *file, int line, const char *expr)
3375 {
3376   /* If we're already crashing, let's not crash again.  This might be
3377      critical to getting auto-saving working properly. */
3378   if (fatal_error_in_progress)
3379     return;
3380
3381   /* We are extremely paranoid so we sensibly deal with recursive
3382      assertion failures. */
3383   in_assert_failed++;
3384   inhibit_non_essential_printing_operations = 1;
3385
3386   if (in_assert_failed >= 4)
3387     _exit (-1);
3388   else if (in_assert_failed == 3)
3389     {
3390       enter_debugger ();
3391       _exit (-1);
3392     }
3393   else if (in_assert_failed == 2)
3394     {
3395       /* Not stderr_out(), which does additional things and may trigger
3396          a recursive assertion failure.  fprintf was undeffed above, in
3397          case it was encapsulated. */
3398       fprintf (stderr,
3399                "Fatal error: recursive assertion failure, "
3400                "file %s, line %d, %s\n",
3401                file, line, expr);
3402       fprintf (stderr,
3403                "Original assertion failure: file %s, line %d, %s\n",
3404                assert_failed_file, assert_failed_line, assert_failed_expr);
3405     }
3406   else
3407     {
3408       assert_failed_file = file;
3409       assert_failed_line = line;
3410       assert_failed_expr = expr;
3411
3412       if (!initialized)
3413         fprintf (stderr,
3414                  "Fatal error: assertion failed, file %s, line %d, %s\n",
3415                  file, line, expr);
3416       else
3417         stderr_out ("Fatal error: assertion failed, file %s, line %d, %s\n",
3418                     file, line, expr);
3419     }
3420
3421   enter_debugger ();
3422 #if !defined (ASSERTIONS_DONT_ABORT)
3423   abort ();
3424 #endif
3425   inhibit_non_essential_printing_operations = 0;
3426   in_assert_failed = 0;
3427 }
3428 #endif /* USE_ASSERTIONS */
3429
3430 #ifdef QUANTIFY
3431 DEFUN ("quantify-start-recording-data", Fquantify_start_recording_data,
3432        0, 0, "", /*
3433 Start recording Quantify data.
3434 */
3435        ())
3436 {
3437   quantify_start_recording_data ();
3438   return Qnil;
3439 }
3440
3441 DEFUN ("quantify-stop-recording-data", Fquantify_stop_recording_data,
3442        0, 0, "", /*
3443 Stop recording Quantify data.
3444 */
3445        ())
3446 {
3447   quantify_stop_recording_data ();
3448   return Qnil;
3449 }
3450
3451 DEFUN ("quantify-clear-data", Fquantify_clear_data, 0, 0, "", /*
3452 Clear all Quantify data.
3453 */
3454        ())
3455 {
3456   quantify_clear_data ();
3457   return Qnil;
3458 }
3459 #endif /* QUANTIFY */
3460
3461 void
3462 syms_of_emacs (void)
3463 {
3464 #ifndef CANNOT_DUMP
3465   DEFSUBR (Fdump_emacs);
3466 #endif /* !CANNOT_DUMP */
3467
3468   DEFSUBR (Frun_emacs_from_temacs);
3469   DEFSUBR (Frunning_temacs_p);
3470   DEFSUBR (Finvocation_name);
3471   DEFSUBR (Finvocation_directory);
3472   DEFSUBR (Fkill_emacs);
3473   DEFSUBR (Fnoninteractive);
3474
3475 #ifdef DEBUG_XEMACS
3476   DEFSUBR (Fforce_debugging_signal);
3477 #endif
3478
3479 #ifdef QUANTIFY
3480   DEFSUBR (Fquantify_start_recording_data);
3481   DEFSUBR (Fquantify_stop_recording_data);
3482   DEFSUBR (Fquantify_clear_data);
3483 #endif /* QUANTIFY */
3484
3485   DEFSUBR (Fsplit_string_by_char);
3486   DEFSUBR (Fsplit_path);        /* #### */
3487
3488   defsymbol (&Qkill_emacs_hook, "kill-emacs-hook");
3489   defsymbol (&Qsave_buffers_kill_emacs, "save-buffers-kill-emacs");
3490 }
3491
3492 void
3493 vars_of_emacs (void)
3494 {
3495   DEFVAR_BOOL ("suppress-early-error-handler-backtrace",
3496                &suppress_early_error_handler_backtrace /*
3497 Non-nil means early error handler shouldn't print a backtrace.
3498 */ );
3499
3500   DEFVAR_LISP ("command-line-args", &Vcommand_line_args /*
3501 Args passed by shell to XEmacs, as a list of strings.
3502 */ );
3503
3504   DEFVAR_LISP ("invocation-name", &Vinvocation_name /*
3505 The program name that was used to run XEmacs.
3506 Any directory names are omitted.
3507 */ );
3508
3509   DEFVAR_LISP ("invocation-directory", &Vinvocation_directory /*
3510 The directory in which the XEmacs executable was found, to run it.
3511 The value is simply the program name if that directory's name is not known.
3512 */ );
3513
3514   DEFVAR_LISP ("invocation-path", &Vinvocation_path /*
3515 The path in which the XEmacs executable was found, to run it.
3516 The value is simply the value of environment variable PATH on startup
3517 if XEmacs was found there.
3518 */ );
3519
3520 #if 0 /* FSFmacs */
3521   xxDEFVAR_LISP ("installation-directory", &Vinstallation_directory,
3522     "A directory within which to look for the `lib-src' and `etc' directories.\n"
3523 "This is non-nil when we can't find those directories in their standard\n"
3524 "installed locations, but we can find them\n"
3525 "near where the XEmacs executable was found.");
3526 #endif
3527
3528   DEFVAR_LISP ("system-type", &Vsystem_type /*
3529 Symbol indicating type of operating system you are using.
3530 */ );
3531   Vsystem_type = intern (SYSTEM_TYPE);
3532   Fprovide (intern(SYSTEM_TYPE));
3533
3534 #ifndef EMACS_CONFIGURATION
3535 # define EMACS_CONFIGURATION "UNKNOWN"
3536 #endif
3537   DEFVAR_LISP ("system-configuration", &Vsystem_configuration /*
3538 String naming the configuration XEmacs was built for.
3539 */ );
3540   Vsystem_configuration = build_string (EMACS_CONFIGURATION);
3541
3542 #ifndef EMACS_CONFIG_OPTIONS
3543 # define EMACS_CONFIG_OPTIONS "UNKNOWN"
3544 #endif
3545   DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options /*
3546 String containing the configuration options XEmacs was built with.
3547 */ );
3548   Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
3549
3550   DEFVAR_LISP ("emacs-major-version", &Vemacs_major_version /*
3551 Major version number of this version of Emacs, as an integer.
3552 Warning: this variable did not exist in Emacs versions earlier than:
3553   FSF Emacs:   19.23
3554   XEmacs:      19.10
3555 */ );
3556   Vemacs_major_version = make_int (EMACS_MAJOR_VERSION);
3557
3558   DEFVAR_LISP ("emacs-minor-version", &Vemacs_minor_version /*
3559 Minor version number of this version of Emacs, as an integer.
3560 Warning: this variable did not exist in Emacs versions earlier than:
3561   FSF Emacs:   19.23
3562   XEmacs:      19.10
3563 */ );
3564   Vemacs_minor_version = make_int (EMACS_MINOR_VERSION);
3565
3566   DEFVAR_LISP ("emacs-patch-level", &Vemacs_patch_level /*
3567 The patch level of this version of Emacs, as an integer.
3568 The value is non-nil if this version of XEmacs is part of a series of
3569 stable XEmacsen, but has bug fixes applied.
3570 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
3571 earlier than 21.1.1
3572 */ );
3573 #ifdef EMACS_PATCH_LEVEL
3574   Vemacs_patch_level = make_int (EMACS_PATCH_LEVEL);
3575 #else
3576   Vemacs_patch_level = Qnil;
3577 #endif
3578
3579     DEFVAR_LISP ("emacs-beta-version", &Vemacs_beta_version /*
3580 Beta number of this version of Emacs, as an integer.
3581 The value is nil if this is an officially released version of XEmacs.
3582 Warning: this variable does not exist in FSF Emacs or in XEmacs versions
3583 earlier than 20.3.
3584 */ );
3585 #ifdef EMACS_BETA_VERSION
3586   Vemacs_beta_version = make_int (EMACS_BETA_VERSION);
3587 #else
3588   Vemacs_beta_version = Qnil;
3589 #endif
3590
3591 #ifdef INFODOCK
3592   DEFVAR_LISP ("infodock-major-version", &Vinfodock_major_version /*
3593 Major version number of this InfoDock release.
3594 */ );
3595   Vinfodock_major_version = make_int (INFODOCK_MAJOR_VERSION);
3596
3597   DEFVAR_LISP ("infodock-minor-version", &Vinfodock_minor_version /*
3598 Minor version number of this InfoDock release.
3599 */ );
3600   Vinfodock_minor_version = make_int (INFODOCK_MINOR_VERSION);
3601
3602   DEFVAR_LISP ("infodock-build-version", &Vinfodock_build_version /*
3603 Build version of this InfoDock release.
3604 */ );
3605   Vinfodock_build_version = make_int (INFODOCK_BUILD_VERSION);
3606 #endif
3607
3608   DEFVAR_LISP ("xemacs-codename", &Vxemacs_codename /*
3609 Codename of this version of Emacs (a string).
3610 */ );
3611 #ifndef XEMACS_CODENAME
3612 #define XEMACS_CODENAME "Noname"
3613 #endif
3614   Vxemacs_codename = build_string (XEMACS_CODENAME);
3615
3616   /* Lisp variables which contain command line flags.
3617
3618      The portable dumper stomps on these; they must be saved and restored
3619      if they are processed before the call to pdump_load() in main_1().
3620   */
3621   DEFVAR_BOOL ("noninteractive", &noninteractive1 /*
3622 Non-nil means XEmacs is running without interactive terminal.
3623 */ );
3624
3625   DEFVAR_BOOL ("inhibit-early-packages", &inhibit_early_packages /*
3626 Set to non-nil when the early packages should not be respected at startup.
3627 */ );
3628
3629   DEFVAR_BOOL ("inhibit-autoloads", &inhibit_autoloads /*
3630 Set to non-nil when autoloads should not be loaded at startup.
3631 */ );
3632
3633   DEFVAR_BOOL ("debug-paths", &debug_paths /*
3634 Set to non-nil when debug information about paths should be printed.
3635 */ );
3636
3637   DEFVAR_BOOL ("inhibit-site-lisp", &inhibit_site_lisp /*
3638 Set to non-nil when the site-lisp should not be searched at startup.
3639 */ );
3640 #ifdef INHIBIT_SITE_LISP
3641   inhibit_site_lisp = 1;
3642 #endif
3643
3644   DEFVAR_BOOL ("inhibit-site-modules", &inhibit_site_modules /*
3645 Set to non-nil when site-modules should not be searched at startup.
3646 */ );
3647 #ifdef INHIBIT_SITE_MODULES
3648   inhibit_site_modules = 1;
3649 #endif
3650
3651   DEFVAR_INT ("emacs-priority", &emacs_priority /*
3652 Priority for XEmacs to run at.
3653 This value is effective only if set before XEmacs is dumped,
3654 and only if the XEmacs executable is installed with setuid to permit
3655 it to change priority.  (XEmacs sets its uid back to the real uid.)
3656 Currently, you need to define SET_EMACS_PRIORITY in `config.h'
3657 before you compile XEmacs, to enable the code for this feature.
3658 */ );
3659   emacs_priority = 0;
3660
3661   DEFVAR_CONST_LISP ("internal-error-checking", &Vinternal_error_checking /*
3662 Internal error checking built-in into this instance of XEmacs.
3663 This is a list of symbols, initialized at build-time.  Legal symbols
3664 are:
3665
3666 extents         - check extents prior to each extent change;
3667 typecheck       - check types strictly, aborting in case of error;
3668 malloc          - check operation of malloc;
3669 gc              - check garbage collection;
3670 bufpos          - check buffer positions.
3671
3672 quick-build     - user has requested the "quick-build" configure option.
3673 */ );
3674   Vinternal_error_checking = Qnil;
3675 #ifdef ERROR_CHECK_EXTENTS
3676   Vinternal_error_checking = Fcons (intern ("extents"),
3677                                     Vinternal_error_checking);
3678 #endif
3679 #ifdef ERROR_CHECK_TYPECHECK
3680   Vinternal_error_checking = Fcons (intern ("typecheck"),
3681                                     Vinternal_error_checking);
3682 #endif
3683 #ifdef ERROR_CHECK_MALLOC
3684   Vinternal_error_checking = Fcons (intern ("malloc"),
3685                                     Vinternal_error_checking);
3686 #endif
3687 #ifdef ERROR_CHECK_GC
3688   Vinternal_error_checking = Fcons (intern ("gc"),
3689                                     Vinternal_error_checking);
3690 #endif
3691 #ifdef ERROR_CHECK_BUFPOS
3692   Vinternal_error_checking = Fcons (intern ("bufpos"),
3693                                     Vinternal_error_checking);
3694 #endif
3695 #ifdef QUICK_BUILD
3696   Vinternal_error_checking = Fcons (intern ("quick-build"),
3697                                     Vinternal_error_checking);
3698 #endif
3699
3700   DEFVAR_CONST_LISP ("mail-lock-methods", &Vmail_lock_methods /*
3701 Mail spool locking methods supported by this instance of XEmacs.
3702 This is a list of symbols.  Each of the symbols is one of the
3703 following: dot, lockf, flock, locking, mmdf.
3704 */ );
3705   {
3706     Vmail_lock_methods = Qnil;
3707     Vmail_lock_methods = Fcons (intern ("dot"), Vmail_lock_methods);
3708 #ifdef HAVE_LOCKF
3709     Vmail_lock_methods = Fcons (intern ("lockf"), Vmail_lock_methods);
3710 #endif
3711 #ifdef HAVE_FLOCK
3712     Vmail_lock_methods = Fcons (intern ("flock"), Vmail_lock_methods);
3713 #endif
3714 #ifdef HAVE_MMDF
3715     Vmail_lock_methods = Fcons (intern ("mmdf"), Vmail_lock_methods);
3716 #endif
3717 #ifdef HAVE_LOCKING
3718     Vmail_lock_methods = Fcons (intern ("locking"), Vmail_lock_methods);
3719 #endif
3720   }
3721
3722   DEFVAR_CONST_LISP ("configure-mail-lock-method", &Vconfigure_mail_lock_method /*
3723 Mail spool locking method suggested by configure.  This is one
3724 of the symbols in MAIL-LOCK-METHODS.
3725 */ );
3726   {
3727 #if defined(MAIL_LOCK_FLOCK) && defined(HAVE_FLOCK)
3728     Vconfigure_mail_lock_method = intern("flock");
3729 #elif defined(MAIL_LOCK_LOCKF) && defined(HAVE_LOCKF)
3730     Vconfigure_mail_lock_method = intern("lockf");
3731 #elif defined(MAIL_LOCK_MMDF) && defined(HAVE_MMDF)
3732     Vconfigure_mail_lock_method = intern("mmdf");
3733 #elif defined(MAIL_LOCK_LOCKING) && defined(HAVE_LOCKING)
3734     Vconfigure_mail_lock_method = intern("locking");
3735 #else
3736     Vconfigure_mail_lock_method = intern("dot");
3737 #endif
3738   }
3739
3740   DEFVAR_LISP ("path-separator", &Vpath_separator /*
3741 The directory separator in search paths, as a string.
3742 */ );
3743   {
3744     char c = SEPCHAR;
3745     Vpath_separator = make_string ((Bufbyte *)&c, 1);
3746   }
3747 }
3748
3749 void
3750 complex_vars_of_emacs (void)
3751 {
3752   /* This is all related to path searching. */
3753
3754   DEFVAR_LISP ("emacs-program-name", &Vemacs_program_name /*
3755 *Name of the Emacs variant.
3756 For example, this may be \"xemacs\" or \"infodock\".
3757 This is mainly meant for use in path searching.
3758 */ );
3759   Vemacs_program_name = build_string ((char *) PATH_PROGNAME);
3760
3761   DEFVAR_LISP ("emacs-program-version", &Vemacs_program_version /*
3762 *Version of the Emacs variant.
3763 This typically has the form NN.NN-bNN.
3764 This is mainly meant for use in path searching.
3765 */ );
3766   Vemacs_program_version = build_string ((char *) PATH_VERSION);
3767
3768   DEFVAR_LISP ("exec-path", &Vexec_path /*
3769 *List of directories to search programs to run in subprocesses.
3770 Each element is a string (directory name) or nil (try default directory).
3771 */ );
3772   Vexec_path = Qnil;
3773
3774   DEFVAR_LISP ("exec-directory", &Vexec_directory /*
3775 *Directory of architecture-dependent files that come with XEmacs,
3776 especially executable programs intended for XEmacs to invoke.
3777 */ );
3778   Vexec_directory = Qnil;
3779
3780   DEFVAR_LISP ("configure-exec-directory", &Vconfigure_exec_directory /*
3781 For internal use by the build procedure only.
3782 configure's idea of what `exec-directory' will be.
3783 */ );
3784 #ifdef PATH_EXEC
3785   Vconfigure_exec_directory = Ffile_name_as_directory
3786     (build_string ((char *) PATH_EXEC));
3787 #else
3788   Vconfigure_exec_directory = Qnil;
3789 #endif
3790
3791   DEFVAR_LISP ("lisp-directory", &Vlisp_directory /*
3792 *Directory of core Lisp files that come with XEmacs.
3793 */ );
3794   Vlisp_directory = Qnil;
3795
3796   DEFVAR_LISP ("configure-lisp-directory", &Vconfigure_lisp_directory /*
3797 For internal use by the build procedure only.
3798 configure's idea of what `lisp-directory' will be.
3799 */ );
3800 #ifdef PATH_LOADSEARCH
3801   Vconfigure_lisp_directory = Ffile_name_as_directory
3802     (build_string ((char *) PATH_LOADSEARCH));
3803 #else
3804   Vconfigure_lisp_directory = Qnil;
3805 #endif
3806
3807   DEFVAR_LISP ("mule-lisp-directory", &Vmule_lisp_directory /*
3808 *Directory of Mule Lisp files that come with XEmacs.
3809 */ );
3810   Vmule_lisp_directory = Qnil;
3811
3812   DEFVAR_LISP ("configure-mule-lisp-directory", &Vconfigure_mule_lisp_directory /*
3813 For internal use by the build procedure only.
3814 configure's idea of what `mule-lisp-directory' will be.
3815 */ );
3816 #ifdef PATH_MULELOADSEARCH
3817   Vconfigure_mule_lisp_directory = Ffile_name_as_directory
3818     (build_string ((char *) PATH_MULELOADSEARCH));
3819 #else
3820   Vconfigure_mule_lisp_directory = Qnil;
3821 #endif
3822
3823   DEFVAR_LISP ("module-directory", &Vmodule_directory /*
3824 *Directory of core dynamic modules that come with XEmacs.
3825 */ );
3826   Vmodule_directory = Qnil;
3827
3828   DEFVAR_LISP ("configure-module-directory", &Vconfigure_module_directory /*
3829 For internal use by the build procedure only.
3830 configure's idea of what `module-directory' will be.
3831 */ );
3832 #ifdef PATH_MODULESEARCH
3833   Vconfigure_module_directory = Ffile_name_as_directory
3834     (build_string ((char *) PATH_MODULESEARCH));
3835 #else
3836   Vconfigure_module_directory = Qnil;
3837 #endif
3838
3839   DEFVAR_LISP ("configure-package-path", &Vconfigure_package_path /*
3840 For internal use by the build procedure only.
3841 configure's idea of what the package path will be.
3842 */ );
3843 #ifdef PATH_PACKAGEPATH
3844   Vconfigure_package_path = decode_path (PATH_PACKAGEPATH);
3845 #else
3846   Vconfigure_package_path = Qnil;
3847 #endif
3848
3849   DEFVAR_LISP ("data-directory", &Vdata_directory /*
3850 *Directory of architecture-independent files that come with XEmacs,
3851 intended for XEmacs to use.
3852 Use of this variable in new code is almost never correct.  See the
3853 functions `locate-data-file' and `locate-data-directory' and the variable
3854 `data-directory-list'.
3855 */ );
3856   Vdata_directory = Qnil;
3857
3858   DEFVAR_LISP ("configure-data-directory", &Vconfigure_data_directory /*
3859 For internal use by the build procedure only.
3860 configure's idea of what `data-directory' will be.
3861 */ );
3862 #ifdef PATH_DATA
3863   Vconfigure_data_directory = Ffile_name_as_directory
3864     (build_string ((char *) PATH_DATA));
3865 #else
3866   Vconfigure_data_directory = Qnil;
3867 #endif
3868
3869   DEFVAR_LISP ("data-directory-list", &Vdata_directory_list /*
3870 *List of directories of architecture-independent files that come with XEmacs
3871 or were installed as packages, and are intended for XEmacs to use.
3872 */ );
3873   Vdata_directory_list = Qnil;
3874
3875   DEFVAR_LISP ("site-directory", &Vsite_directory /*
3876 *Directory of site-specific Lisp files that come with XEmacs.
3877 */ );
3878   Vsite_directory = Qnil;
3879
3880   DEFVAR_LISP ("configure-site-directory", &Vconfigure_site_directory /*
3881 For internal use by the build procedure only.
3882 configure's idea of what `site-directory' will be.
3883 */ );
3884 #ifdef PATH_SITE
3885   Vconfigure_site_directory = Ffile_name_as_directory
3886     (build_string ((char *) PATH_SITE));
3887 #else
3888   Vconfigure_site_directory = Qnil;
3889 #endif
3890
3891   DEFVAR_LISP ("site-module-directory", &Vsite_module_directory /*
3892 *Directory of site-specific loadable modules that come with XEmacs.
3893 */ );
3894   Vsite_module_directory = Qnil;
3895
3896   DEFVAR_LISP ("configure-site-module-directory", &Vconfigure_site_module_directory /*
3897 For internal use by the build procedure only.
3898 configure's idea of what `site-directory' will be.
3899 */ );
3900 #ifdef PATH_SITE_MODULES
3901   Vconfigure_site_module_directory = Ffile_name_as_directory
3902     (build_string ((char *) PATH_SITE_MODULES));
3903 #else
3904   Vconfigure_site_module_directory = Qnil;
3905 #endif
3906
3907   DEFVAR_LISP ("doc-directory", &Vdoc_directory /*
3908 *Directory containing the DOC file that comes with XEmacs.
3909 This is usually the same as `exec-directory'.
3910 */ );
3911   Vdoc_directory = Qnil;
3912
3913   DEFVAR_LISP ("configure-doc-directory", &Vconfigure_doc_directory /*
3914 For internal use by the build procedure only.
3915 configure's idea of what `doc-directory' will be.
3916 */ );
3917 #ifdef PATH_DOC
3918   Vconfigure_doc_directory = Ffile_name_as_directory
3919     (build_string ((char *) PATH_DOC));
3920 #else
3921   Vconfigure_doc_directory = Qnil;
3922 #endif
3923
3924   DEFVAR_LISP ("configure-exec-prefix-directory", &Vconfigure_exec_prefix_directory /*
3925 For internal use by the build procedure only.
3926 configure's idea of what `exec-prefix-directory' will be.
3927 */ );
3928 #ifdef PATH_EXEC_PREFIX
3929   Vconfigure_exec_prefix_directory = Ffile_name_as_directory
3930     (build_string ((char *) PATH_EXEC_PREFIX));
3931 #else
3932   Vconfigure_exec_prefix_directory = Qnil;
3933 #endif
3934
3935   DEFVAR_LISP ("configure-prefix-directory", &Vconfigure_prefix_directory /*
3936 For internal use by the build procedure only.
3937 configure's idea of what `prefix-directory' will be.
3938 */ );
3939 #ifdef PATH_PREFIX
3940   Vconfigure_prefix_directory = Ffile_name_as_directory
3941     (build_string ((char *) PATH_PREFIX));
3942 #else
3943   Vconfigure_prefix_directory = Qnil;
3944 #endif
3945
3946   DEFVAR_LISP ("configure-info-directory", &Vconfigure_info_directory /*
3947 For internal use by the build procedure only.
3948 This is the name of the directory in which the build procedure installed
3949 Emacs's info files; the default value for Info-default-directory-list
3950 includes this.
3951 */ );
3952 #ifdef PATH_INFO
3953   Vconfigure_info_directory =
3954     Ffile_name_as_directory (build_string (PATH_INFO));
3955 #else
3956   Vconfigure_info_directory = Qnil;
3957 #endif
3958
3959   DEFVAR_LISP ("configure-info-path", &Vconfigure_info_path /*
3960 The configured initial path for info documentation.
3961 */ );
3962 #ifdef PATH_INFOPATH
3963   Vconfigure_info_path = decode_path (PATH_INFOPATH);
3964 #else
3965   Vconfigure_info_path = Qnil;
3966 #endif
3967 }
3968
3969 #if defined(__sgi) && !defined(PDUMP)
3970 /* This is so tremendously ugly I'd puke. But then, it works.
3971  * The target is to override the static constructor from the
3972  * libiflPNG.so library which is masquerading as libz, and
3973  * cores on us when re-started from the dumped executable.
3974  * This will have to go for 21.1  -- OG.
3975  */
3976 void __sti__iflPNGFile_c___ (void);
3977 void
3978 __sti__iflPNGFile_c___ (void)
3979 {
3980 }
3981
3982 #endif