284
|
1 /* Fully extensible Emacs, running on Unix, intended for GNU.
|
36982
|
2 Copyright (C) 1985,86,87,93,94,95,97,98,1999,2001
|
|
3 Free Software Foundation, Inc.
|
284
|
4
|
|
5 This file is part of GNU Emacs.
|
|
6
|
|
7 GNU Emacs is free software; you can redistribute it and/or modify
|
|
8 it under the terms of the GNU General Public License as published by
|
1774
|
9 the Free Software Foundation; either version 2, or (at your option)
|
284
|
10 any later version.
|
|
11
|
|
12 GNU Emacs is distributed in the hope that it will be useful,
|
|
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15 GNU General Public License for more details.
|
|
16
|
|
17 You should have received a copy of the GNU General Public License
|
|
18 along with GNU Emacs; see the file COPYING. If not, write to
|
14862
|
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
20 Boston, MA 02111-1307, USA. */
|
284
|
21
|
|
22
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
23 #include <config.h>
|
284
|
24 #include <signal.h>
|
|
25 #include <errno.h>
|
|
26 #include <stdio.h>
|
|
27
|
|
28 #include <sys/types.h>
|
|
29 #include <sys/file.h>
|
|
30
|
|
31 #ifdef VMS
|
|
32 #include <ssdef.h>
|
|
33 #endif
|
|
34
|
25746
|
35 #ifdef HAVE_UNISTD_H
|
|
36 #include <unistd.h>
|
|
37 #endif
|
|
38
|
16219
|
39 #ifdef BSD_SYSTEM
|
284
|
40 #include <sys/ioctl.h>
|
|
41 #endif
|
|
42
|
|
43 #include "lisp.h"
|
|
44 #include "commands.h"
|
1284
|
45 #include "intervals.h"
|
21722
|
46 #include "buffer.h"
|
284
|
47
|
1043
|
48 #include "systty.h"
|
14502
|
49 #include "blockinput.h"
|
1945
|
50 #include "syssignal.h"
|
4589
|
51 #include "process.h"
|
24348
|
52 #include "termhooks.h"
|
21514
|
53 #include "keyboard.h"
|
39748
|
54 #include "keymap.h"
|
554
|
55
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
56 #ifdef HAVE_SETLOCALE
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
57 #include <locale.h>
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
58 #endif
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
59
|
16046
|
60 #ifdef HAVE_SETRLIMIT
|
|
61 #include <sys/time.h>
|
|
62 #include <sys/resource.h>
|
|
63 #endif
|
|
64
|
284
|
65 #ifndef O_RDWR
|
|
66 #define O_RDWR 2
|
|
67 #endif
|
|
68
|
29125
|
69 #ifdef HAVE_SETPGID
|
29150
|
70 #if !defined (USG) || defined (BSD_PGRPS)
|
29915
|
71 #undef setpgrp
|
29125
|
72 #define setpgrp setpgid
|
|
73 #endif
|
29150
|
74 #endif
|
29125
|
75
|
29915
|
76 extern void malloc_warning P_ ((char *));
|
|
77 extern void set_time_zone_rule P_ ((char *));
|
31336
|
78 #ifdef HAVE_INDEX
|
|
79 extern char *index P_ ((const char *, int));
|
|
80 #endif
|
6027
|
81
|
26532
|
82 /* Make these values available in GDB, which doesn't see macros. */
|
|
83
|
|
84 EMACS_INT gdb_valbits = VALBITS;
|
|
85 EMACS_INT gdb_gctypebits = GCTYPEBITS;
|
|
86 EMACS_INT gdb_emacs_intbits = sizeof (EMACS_INT) * BITS_PER_CHAR;
|
|
87 #ifdef DATA_SEG_BITS
|
|
88 EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS;
|
|
89 #else
|
|
90 EMACS_INT gdb_data_seg_bits = 0;
|
|
91 #endif
|
26567
|
92 EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
|
26532
|
93
|
40372
|
94 /* Command line args from shell, as list of strings. */
|
284
|
95 Lisp_Object Vcommand_line_args;
|
|
96
|
2279
|
97 /* The name under which Emacs was invoked, with any leading directory
|
|
98 names discarded. */
|
|
99 Lisp_Object Vinvocation_name;
|
|
100
|
4484
|
101 /* The directory name from which Emacs was invoked. */
|
|
102 Lisp_Object Vinvocation_directory;
|
|
103
|
5763
|
104 /* The directory name in which to find subdirs such as lisp and etc.
|
|
105 nil means get them only from PATH_LOADSEARCH. */
|
|
106 Lisp_Object Vinstallation_directory;
|
|
107
|
732
|
108 /* Hook run by `kill-emacs' before it does really anything. */
|
|
109 Lisp_Object Vkill_emacs_hook;
|
|
110
|
39803
|
111 /* An empty lisp string. To avoid having to build any other. */
|
|
112 Lisp_Object empty_string;
|
|
113
|
20489
|
114 #ifdef SIGUSR1
|
40372
|
115 /* Hooks for signal USR1 and USR2 handling. */
|
20489
|
116 Lisp_Object Vsignal_USR1_hook;
|
|
117 #ifdef SIGUSR2
|
|
118 Lisp_Object Vsignal_USR2_hook;
|
40372
|
119 #endif
|
20489
|
120 #endif
|
|
121
|
21622
|
122 /* Search path separator. */
|
|
123 Lisp_Object Vpath_separator;
|
|
124
|
284
|
125 /* Set nonzero after Emacs has started up the first time.
|
|
126 Prevents reinitialization of the Lisp world and keymaps
|
|
127 on subsequent starts. */
|
|
128 int initialized;
|
|
129
|
17346
|
130 #ifdef DOUG_LEA_MALLOC
|
|
131 /* Preserves a pointer to the memory allocated that copies that
|
|
132 static data inside glibc's malloc. */
|
|
133 void *malloc_state_ptr;
|
|
134 /* From glibc, a routine that returns a copy of the malloc internal state. */
|
|
135 extern void *malloc_get_state ();
|
|
136 /* From glibc, a routine that overwrites the malloc internal state. */
|
|
137 extern void malloc_set_state ();
|
24405
|
138 /* Non-zero if the MALLOC_CHECK_ enviroment variable was set while
|
|
139 dumping. Used to work around a bug in glibc's malloc. */
|
|
140 int malloc_using_checking;
|
17346
|
141 #endif
|
|
142
|
5236
|
143 /* Variable whose value is symbol giving operating system type. */
|
284
|
144 Lisp_Object Vsystem_type;
|
5236
|
145
|
|
146 /* Variable whose value is string giving configuration built for. */
|
|
147 Lisp_Object Vsystem_configuration;
|
8843
|
148
|
|
149 /* Variable whose value is string giving configuration options,
|
|
150 for use when reporting bugs. */
|
|
151 Lisp_Object Vsystem_configuration_options;
|
|
152
|
16386
|
153 Lisp_Object Qfile_name_handler_alist;
|
|
154
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
155 /* Current and previous system locales for messages and time. */
|
26526
|
156 Lisp_Object Vsystem_messages_locale;
|
|
157 Lisp_Object Vprevious_system_messages_locale;
|
|
158 Lisp_Object Vsystem_time_locale;
|
|
159 Lisp_Object Vprevious_system_time_locale;
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
160
|
284
|
161 /* If non-zero, emacs should not attempt to use an window-specific code,
|
40372
|
162 but instead should use the virtual terminal under which it was started. */
|
284
|
163 int inhibit_window_system;
|
|
164
|
1202
|
165 /* If nonzero, set Emacs to run at this priority. This is also used
|
|
166 in child_setup and sys_suspend to make sure subshells run at normal
|
40372
|
167 priority; those functions have their own extern declaration. */
|
1141
|
168 int emacs_priority;
|
|
169
|
40372
|
170 /* If non-zero, a filter or a sentinel is running. Tested to save the match
|
|
171 data on the first attempt to change it inside asynchronous code. */
|
10032
|
172 int running_asynch_code;
|
|
173
|
6863
|
174 #ifdef BSD_PGRPS
|
3655
|
175 /* See sysdep.c. */
|
|
176 extern int inherited_pgroup;
|
|
177 #endif
|
|
178
|
284
|
179 #ifdef HAVE_X_WINDOWS
|
40372
|
180 /* If non-zero, -d was specified, meaning we're using some window system. */
|
284
|
181 int display_arg;
|
|
182 #endif
|
|
183
|
|
184 /* An address near the bottom of the stack.
|
|
185 Tells GC how to save a copy of the stack. */
|
|
186 char *stack_bottom;
|
|
187
|
13409
|
188 #ifdef HAVE_WINDOW_SYSTEM
|
284
|
189 extern Lisp_Object Vwindow_system;
|
13409
|
190 #endif /* HAVE_WINDOW_SYSTEM */
|
284
|
191
|
11720
|
192 extern Lisp_Object Vauto_save_list_file_name;
|
|
193
|
284
|
194 #ifdef USG_SHARED_LIBRARIES
|
|
195 /* If nonzero, this is the place to put the end of the writable segment
|
|
196 at startup. */
|
|
197
|
|
198 unsigned int bss_end = 0;
|
|
199 #endif
|
|
200
|
|
201 /* Nonzero means running Emacs without interactive terminal. */
|
|
202
|
|
203 int noninteractive;
|
|
204
|
|
205 /* Value of Lisp variable `noninteractive'.
|
|
206 Normally same as C variable `noninteractive'
|
|
207 but nothing terrible happens if user sets this one. */
|
|
208
|
|
209 int noninteractive1;
|
7869
|
210
|
|
211 /* Save argv and argc. */
|
|
212 char **initial_argv;
|
|
213 int initial_argc;
|
10029
|
214
|
|
215 static void sort_args ();
|
21514
|
216 void syms_of_emacs ();
|
27472
|
217
|
27627
|
218 #define USAGE1 "\
|
27472
|
219 Usage: %s [OPTION-OR-FILENAME]...\n\
|
|
220 \n\
|
|
221 Run Emacs, the extensible, customizable, self-documenting real-time\n\
|
|
222 display editor. The recommended way to start Emacs for normal editing\n\
|
|
223 is with no options at all.\n\
|
|
224 \n\
|
|
225 Run M-x info RET m emacs RET m command arguments RET inside Emacs to\n\
|
|
226 read the main documentation for these command-line arguments.\n\
|
|
227 \n\
|
|
228 Initialization options:\n\
|
|
229 \n\
|
|
230 --batch do not do interactive display; implies -q\n\
|
|
231 --debug-init enable Emacs Lisp debugger during init file\n\
|
|
232 --help display this help message and exit\n\
|
|
233 --multibyte, --no-unibyte run Emacs in multibyte mode\n\
|
|
234 --no-init-file, -q load neither ~/.emacs nor default.el\n\
|
|
235 --no-shared-memory, -nl do not use shared memory\n\
|
|
236 --no-site-file do not load site-start.el\n\
|
40572
|
237 --no-window-system, -nw don't communicate with X, ignoring $DISPLAY\n\
|
27472
|
238 --terminal, -t DEVICE use DEVICE for terminal I/O\n\
|
|
239 --unibyte, --no-multibyte run Emacs in unibyte mode\n\
|
|
240 --user, -u USER load ~USER/.emacs instead of your own\n\
|
|
241 --version display version information and exit\n\
|
|
242 \n\
|
|
243 Action options:\n\
|
|
244 \n\
|
|
245 FILE visit FILE using find-file\n\
|
38458
|
246 +LINE FILE visit FILE using find-file, then go to line LINE\n\
|
|
247 +LINE:COLUMN FILE visit FILE using find-file, then go to line LINE,\n\
|
|
248 column COLUMN\n\
|
27472
|
249 --directory, -L DIR add DIR to variable load-path\n\
|
|
250 --eval EXPR evaluate Emacs Lisp expression EXPR\n\
|
|
251 --execute EXPR evaluate Emacs Lisp expression EXPR\n\
|
|
252 --find-file FILE visit FILE\n\
|
|
253 --funcall, -f FUNC call Emacs function FUNC with no arguments\n\
|
|
254 --insert FILE insert contents of FILE into current buffer\n\
|
|
255 --kill exit without asking for confirmation\n\
|
|
256 --load, -l FILE load FILE of Emacs Lisp code using the load function\n\
|
|
257 --visit FILE visit FILE\n\
|
27627
|
258 \n"
|
|
259
|
|
260 #define USAGE2 "\
|
27538
|
261 Display options:\n\
|
27472
|
262 \n\
|
|
263 --background-color, -bg COLOR window background color\n\
|
|
264 --border-color, -bd COLOR main border color\n\
|
|
265 --border-width, -bw WIDTH width of main border\n\
|
|
266 --cursor-color, -cr COLOR color of the Emacs cursor indicating point\n\
|
|
267 --display, -d DISPLAY use X server DISPLAY\n\
|
40372
|
268 --font, -fn FONT default font; must be fixed-width\n\
|
27472
|
269 --foreground-color, -fg COLOR window foreground color\n\
|
|
270 --geometry, -g GEOMETRY window geometry\n\
|
|
271 --iconic start Emacs in iconified state\n\
|
|
272 --icon-type, -i use picture of gnu for Emacs icon\n\
|
|
273 --internal-border, -ib WIDTH width between text and main border\n\
|
28689
|
274 --line-spacing, -lsp PIXELS additional space to put between lines\n\
|
27472
|
275 --mouse-color, -ms COLOR mouse cursor color in Emacs window\n\
|
|
276 --name NAME title of main Emacs window\n\
|
|
277 --reverse-video, -r, -rv switch foreground and background\n\
|
40372
|
278 --title, -T, -wn TITLE title for Emacs windows\n\
|
27472
|
279 --vertical-scroll-bars, -vb enable vertical scroll bars\n\
|
|
280 --xrm XRESOURCES set additional X resources\n\
|
|
281 \n\
|
|
282 You can generally also specify long option names with a single -; for\n\
|
|
283 example, -batch as well as --batch. You can use any unambiguous\n\
|
|
284 abbreviation for a --option.\n\
|
|
285 \n\
|
|
286 Various environment variables and window system resources also affect\n\
|
|
287 Emacs' operation. See the main documentation.\n\
|
40405
|
288 \n"
|
|
289
|
|
290 #define USAGE3 "\
|
|
291 Report bugs to %s. First, please see the Bugs\n\
|
27472
|
292 section of the Emacs manual or the file BUGS.\n"
|
|
293
|
284
|
294
|
40372
|
295 /* Signal code for the fatal signal that was received. */
|
284
|
296 int fatal_error_code;
|
|
297
|
40372
|
298 /* Nonzero if handling a fatal error already. */
|
284
|
299 int fatal_error_in_progress;
|
|
300
|
40372
|
301 /* If non-null, call this function from fatal_error_signal before
|
39576
|
302 committing suicide. */
|
|
303
|
|
304 void (*fatal_error_signal_hook) P_ ((void));
|
|
305
|
|
306
|
20489
|
307 #ifdef SIGUSR1
|
|
308 SIGTYPE
|
|
309 handle_USR1_signal (sig)
|
|
310 int sig;
|
|
311 {
|
24348
|
312 struct input_event buf;
|
|
313
|
30036
|
314 bzero (&buf, sizeof buf);
|
30176
|
315 buf.kind = USER_SIGNAL_EVENT;
|
25667
|
316 buf.frame_or_window = selected_frame;
|
24348
|
317
|
|
318 kbd_buffer_store_event (&buf);
|
20489
|
319 }
|
24348
|
320 #endif /* SIGUSR1 */
|
20527
|
321
|
20489
|
322 #ifdef SIGUSR2
|
|
323 SIGTYPE
|
|
324 handle_USR2_signal (sig)
|
|
325 int sig;
|
|
326 {
|
24348
|
327 struct input_event buf;
|
|
328
|
30036
|
329 bzero (&buf, sizeof buf);
|
30176
|
330 buf.kind = USER_SIGNAL_EVENT;
|
24374
|
331 buf.code = 1;
|
25667
|
332 buf.frame_or_window = selected_frame;
|
24348
|
333
|
|
334 kbd_buffer_store_event (&buf);
|
20489
|
335 }
|
24348
|
336 #endif /* SIGUSR2 */
|
20489
|
337
|
40372
|
338 /* Handle bus errors, invalid instruction, etc. */
|
505
|
339 SIGTYPE
|
284
|
340 fatal_error_signal (sig)
|
|
341 int sig;
|
|
342 {
|
|
343 fatal_error_code = sig;
|
|
344 signal (sig, SIG_DFL);
|
|
345
|
14497
|
346 TOTALLY_UNBLOCK_INPUT;
|
|
347
|
284
|
348 /* If fatal error occurs in code below, avoid infinite recursion. */
|
1945
|
349 if (! fatal_error_in_progress)
|
|
350 {
|
|
351 fatal_error_in_progress = 1;
|
284
|
352
|
3711
|
353 shut_down_emacs (sig, 0, Qnil);
|
1945
|
354 }
|
284
|
355
|
|
356 #ifdef VMS
|
|
357 LIB$STOP (SS$_ABORT);
|
|
358 #else
|
1945
|
359 /* Signal the same code; this time it will really be fatal.
|
|
360 Remember that since we're in a signal handler, the signal we're
|
|
361 going to send is probably blocked, so we have to unblock it if we
|
|
362 want to really receive it. */
|
5493
|
363 #ifndef MSDOS
|
2118
|
364 sigunblock (sigmask (fatal_error_code));
|
5493
|
365 #endif
|
39576
|
366
|
|
367 if (fatal_error_signal_hook)
|
|
368 fatal_error_signal_hook ();
|
40372
|
369
|
284
|
370 kill (getpid (), fatal_error_code);
|
|
371 #endif /* not VMS */
|
|
372 }
|
5236
|
373
|
|
374 #ifdef SIGDANGER
|
|
375
|
6171
|
376 /* Handler for SIGDANGER. */
|
5236
|
377 SIGTYPE
|
|
378 memory_warning_signal (sig)
|
|
379 int sig;
|
|
380 {
|
|
381 signal (sig, memory_warning_signal);
|
|
382
|
|
383 malloc_warning ("Operating system warns that virtual memory is running low.\n");
|
7223
|
384
|
|
385 /* It might be unsafe to call do_auto_save now. */
|
|
386 force_auto_save_soon ();
|
5236
|
387 }
|
|
388 #endif
|
20527
|
389
|
|
390 /* We define abort, rather than using it from the library,
|
21418
|
391 so that GDB can return from a breakpoint here.
|
40372
|
392 MSDOS has its own definition in msdos.c. */
|
20527
|
393
|
21832
|
394 #if ! defined (DOS_NT) && ! defined (NO_ABORT)
|
26526
|
395
|
|
396 #ifndef ABORT_RETURN_TYPE
|
|
397 #define ABORT_RETURN_TYPE void
|
|
398 #endif
|
|
399
|
|
400 ABORT_RETURN_TYPE
|
20527
|
401 abort ()
|
|
402 {
|
|
403 kill (getpid (), SIGABRT);
|
21832
|
404 /* This shouldn't be executed, but it prevents a warning. */
|
|
405 exit (1);
|
20527
|
406 }
|
21418
|
407 #endif
|
20527
|
408
|
284
|
409
|
40372
|
410 /* Code for dealing with Lisp access to the Unix command line. */
|
284
|
411
|
21514
|
412 static void
|
284
|
413 init_cmdargs (argc, argv, skip_args)
|
|
414 int argc;
|
|
415 char **argv;
|
|
416 int skip_args;
|
|
417 {
|
|
418 register int i;
|
16386
|
419 Lisp_Object name, dir, tem;
|
|
420 int count = specpdl_ptr - specpdl;
|
|
421 Lisp_Object raw_name;
|
284
|
422
|
7869
|
423 initial_argv = argv;
|
|
424 initial_argc = argc;
|
|
425
|
16386
|
426 raw_name = build_string (argv[0]);
|
|
427
|
|
428 /* Add /: to the front of the name
|
|
429 if it would otherwise be treated as magic. */
|
|
430 tem = Ffind_file_name_handler (raw_name, Qt);
|
|
431 if (! NILP (tem))
|
|
432 raw_name = concat2 (build_string ("/:"), raw_name);
|
|
433
|
|
434 Vinvocation_name = Ffile_name_nondirectory (raw_name);
|
|
435 Vinvocation_directory = Ffile_name_directory (raw_name);
|
|
436
|
4484
|
437 /* If we got no directory in argv[0], search PATH to find where
|
|
438 Emacs actually came from. */
|
|
439 if (NILP (Vinvocation_directory))
|
|
440 {
|
|
441 Lisp_Object found;
|
|
442 int yes = openp (Vexec_path, Vinvocation_name,
|
39812
|
443 Vexec_suffixes, &found, 1);
|
4632
|
444 if (yes == 1)
|
16386
|
445 {
|
|
446 /* Add /: to the front of the name
|
|
447 if it would otherwise be treated as magic. */
|
|
448 tem = Ffind_file_name_handler (found, Qt);
|
|
449 if (! NILP (tem))
|
|
450 found = concat2 (build_string ("/:"), found);
|
|
451 Vinvocation_directory = Ffile_name_directory (found);
|
|
452 }
|
4484
|
453 }
|
2279
|
454
|
12383
|
455 if (!NILP (Vinvocation_directory)
|
|
456 && NILP (Ffile_name_absolute_p (Vinvocation_directory)))
|
16386
|
457 /* Emacs was started with relative path, like ./emacs.
|
|
458 Make it absolute. */
|
12383
|
459 Vinvocation_directory = Fexpand_file_name (Vinvocation_directory, Qnil);
|
|
460
|
5763
|
461 Vinstallation_directory = Qnil;
|
|
462
|
|
463 if (!NILP (Vinvocation_directory))
|
|
464 {
|
|
465 dir = Vinvocation_directory;
|
|
466 name = Fexpand_file_name (Vinvocation_name, dir);
|
|
467 while (1)
|
|
468 {
|
7002
|
469 Lisp_Object tem, lib_src_exists;
|
5763
|
470 Lisp_Object etc_exists, info_exists;
|
|
471
|
7002
|
472 /* See if dir contains subdirs for use by Emacs.
|
|
473 Check for the ones that would exist in a build directory,
|
|
474 not including lisp and info. */
|
|
475 tem = Fexpand_file_name (build_string ("lib-src"), dir);
|
|
476 lib_src_exists = Ffile_exists_p (tem);
|
16865
|
477
|
17312
|
478 #ifdef MSDOS
|
16865
|
479 /* MSDOS installations frequently remove lib-src, but we still
|
|
480 must set installation-directory, or else info won't find
|
|
481 its files (it uses the value of installation-directory). */
|
|
482 tem = Fexpand_file_name (build_string ("info"), dir);
|
|
483 info_exists = Ffile_exists_p (tem);
|
17312
|
484 #else
|
|
485 info_exists = Qnil;
|
|
486 #endif
|
16865
|
487
|
|
488 if (!NILP (lib_src_exists) || !NILP (info_exists))
|
5763
|
489 {
|
7002
|
490 tem = Fexpand_file_name (build_string ("etc"), dir);
|
|
491 etc_exists = Ffile_exists_p (tem);
|
|
492 if (!NILP (etc_exists))
|
5763
|
493 {
|
7002
|
494 Vinstallation_directory
|
|
495 = Ffile_name_as_directory (dir);
|
|
496 break;
|
5763
|
497 }
|
|
498 }
|
|
499
|
|
500 /* See if dir's parent contains those subdirs. */
|
7002
|
501 tem = Fexpand_file_name (build_string ("../lib-src"), dir);
|
|
502 lib_src_exists = Ffile_exists_p (tem);
|
16865
|
503
|
17312
|
504
|
|
505 #ifdef MSDOS
|
|
506 /* See the MSDOS commentary above. */
|
16865
|
507 tem = Fexpand_file_name (build_string ("../info"), dir);
|
|
508 info_exists = Ffile_exists_p (tem);
|
17312
|
509 #else
|
|
510 info_exists = Qnil;
|
|
511 #endif
|
16865
|
512
|
|
513 if (!NILP (lib_src_exists) || !NILP (info_exists))
|
5763
|
514 {
|
7002
|
515 tem = Fexpand_file_name (build_string ("../etc"), dir);
|
|
516 etc_exists = Ffile_exists_p (tem);
|
|
517 if (!NILP (etc_exists))
|
5763
|
518 {
|
7002
|
519 tem = Fexpand_file_name (build_string (".."), dir);
|
|
520 Vinstallation_directory
|
|
521 = Ffile_name_as_directory (tem);
|
|
522 break;
|
5763
|
523 }
|
|
524 }
|
|
525
|
|
526 /* If the Emacs executable is actually a link,
|
|
527 next try the dir that the link points into. */
|
|
528 tem = Ffile_symlink_p (name);
|
|
529 if (!NILP (tem))
|
|
530 {
|
8704
ec7ec0e35e5e
(init_cmdargs): After chasing link, use only the expanded name.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
531 name = Fexpand_file_name (tem, dir);
|
5763
|
532 dir = Ffile_name_directory (name);
|
|
533 }
|
|
534 else
|
|
535 break;
|
|
536 }
|
|
537 }
|
|
538
|
284
|
539 Vcommand_line_args = Qnil;
|
|
540
|
|
541 for (i = argc - 1; i >= 0; i--)
|
|
542 {
|
|
543 if (i == 0 || i > skip_args)
|
|
544 Vcommand_line_args
|
|
545 = Fcons (build_string (argv[i]), Vcommand_line_args);
|
|
546 }
|
16386
|
547
|
|
548 unbind_to (count, Qnil);
|
284
|
549 }
|
2279
|
550
|
|
551 DEFUN ("invocation-name", Finvocation_name, Sinvocation_name, 0, 0, 0,
|
40372
|
552 doc: /* Return the program name that was used to run Emacs.
|
|
553 Any directory names are omitted. */)
|
|
554 ()
|
2279
|
555 {
|
|
556 return Fcopy_sequence (Vinvocation_name);
|
|
557 }
|
|
558
|
4484
|
559 DEFUN ("invocation-directory", Finvocation_directory, Sinvocation_directory,
|
40372
|
560 0, 0, 0,
|
|
561 doc: /* Return the directory name in which the Emacs executable was located. */)
|
|
562 ()
|
4484
|
563 {
|
|
564 return Fcopy_sequence (Vinvocation_directory);
|
|
565 }
|
|
566
|
284
|
567
|
|
568 #ifdef VMS
|
|
569 #ifdef LINK_CRTL_SHARE
|
14035
|
570 #ifdef SHARABLE_LIB_BUG
|
284
|
571 extern noshare char **environ;
|
14035
|
572 #endif /* SHARABLE_LIB_BUG */
|
284
|
573 #endif /* LINK_CRTL_SHARE */
|
|
574 #endif /* VMS */
|
|
575
|
14202
|
576 #ifdef HAVE_TZSET
|
|
577 /* A valid but unlikely value for the TZ environment value.
|
|
578 It is OK (though a bit slower) if the user actually chooses this value. */
|
|
579 static char dump_tz[] = "UtC0";
|
|
580 #endif
|
|
581
|
2118
|
582 #ifndef ORDINARY_LINK
|
1061
|
583 /* We don't include crtbegin.o and crtend.o in the link,
|
|
584 so these functions and variables might be missed.
|
|
585 Provide dummy definitions to avoid error.
|
|
586 (We don't have any real constructors or destructors.) */
|
|
587 #ifdef __GNUC__
|
6467
|
588 #ifndef GCC_CTORS_IN_LIBC
|
21514
|
589 void __do_global_ctors ()
|
1070
|
590 {}
|
21514
|
591 void __do_global_ctors_aux ()
|
1061
|
592 {}
|
21514
|
593 void __do_global_dtors ()
|
1074
|
594 {}
|
4619
|
595 /* Linux has a bug in its library; avoid an error. */
|
41969
|
596 #ifndef GNU_LINUX
|
1070
|
597 char * __CTOR_LIST__[2] = { (char *) (-1), 0 };
|
4619
|
598 #endif
|
1070
|
599 char * __DTOR_LIST__[2] = { (char *) (-1), 0 };
|
6467
|
600 #endif /* GCC_CTORS_IN_LIBC */
|
21514
|
601 void __main ()
|
1061
|
602 {}
|
|
603 #endif /* __GNUC__ */
|
2118
|
604 #endif /* ORDINARY_LINK */
|
1061
|
605
|
9094
|
606 /* Test whether the next argument in ARGV matches SSTR or a prefix of
|
|
607 LSTR (at least MINLEN characters). If so, then if VALPTR is non-null
|
|
608 (the argument is supposed to have a value) store in *VALPTR either
|
|
609 the next argument or the portion of this one after the equal sign.
|
|
610 ARGV is read starting at position *SKIPPTR; this index is advanced
|
|
611 by the number of arguments used.
|
|
612
|
|
613 Too bad we can't just use getopt for all of this, but we don't have
|
|
614 enough information to do it right. */
|
10029
|
615
|
9094
|
616 static int
|
10111
|
617 argmatch (argv, argc, sstr, lstr, minlen, valptr, skipptr)
|
9094
|
618 char **argv;
|
10111
|
619 int argc;
|
9094
|
620 char *sstr;
|
|
621 char *lstr;
|
|
622 int minlen;
|
|
623 char **valptr;
|
|
624 int *skipptr;
|
|
625 {
|
31829
|
626 char *p = NULL;
|
9094
|
627 int arglen;
|
10111
|
628 char *arg;
|
|
629
|
|
630 /* Don't access argv[argc]; give up in advance. */
|
|
631 if (argc <= *skipptr + 1)
|
|
632 return 0;
|
|
633
|
|
634 arg = argv[*skipptr+1];
|
9094
|
635 if (arg == NULL)
|
|
636 return 0;
|
|
637 if (strcmp (arg, sstr) == 0)
|
|
638 {
|
|
639 if (valptr != NULL)
|
|
640 {
|
|
641 *valptr = argv[*skipptr+2];
|
|
642 *skipptr += 2;
|
|
643 }
|
|
644 else
|
|
645 *skipptr += 1;
|
|
646 return 1;
|
|
647 }
|
|
648 arglen = (valptr != NULL && (p = index (arg, '=')) != NULL
|
|
649 ? p - arg : strlen (arg));
|
10102
|
650 if (lstr == 0 || arglen < minlen || strncmp (arg, lstr, arglen) != 0)
|
9094
|
651 return 0;
|
|
652 else if (valptr == NULL)
|
|
653 {
|
|
654 *skipptr += 1;
|
|
655 return 1;
|
|
656 }
|
|
657 else if (p != NULL)
|
|
658 {
|
|
659 *valptr = p+1;
|
|
660 *skipptr += 1;
|
|
661 return 1;
|
|
662 }
|
|
663 else if (argv[*skipptr+2] != NULL)
|
|
664 {
|
|
665 *valptr = argv[*skipptr+2];
|
|
666 *skipptr += 2;
|
|
667 return 1;
|
|
668 }
|
|
669 else
|
|
670 {
|
|
671 return 0;
|
|
672 }
|
|
673 }
|
|
674
|
24900
|
675 #ifdef DOUG_LEA_MALLOC
|
|
676
|
|
677 /* malloc can be invoked even before main (e.g. by the dynamic
|
|
678 linker), so the dumped malloc state must be restored as early as
|
|
679 possible using this special hook. */
|
|
680
|
|
681 static void
|
|
682 malloc_initialize_hook ()
|
|
683 {
|
31094
|
684 #ifndef USE_CRT_DLL
|
24900
|
685 extern char **environ;
|
31094
|
686 #endif
|
24900
|
687
|
|
688 if (initialized)
|
|
689 {
|
|
690 if (!malloc_using_checking)
|
|
691 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
|
|
692 ignored if the heap to be restored was constructed without
|
|
693 malloc checking. Can't use unsetenv, since that calls malloc. */
|
|
694 {
|
|
695 char **p;
|
|
696
|
36189
|
697 for (p = environ; p && *p; p++)
|
24900
|
698 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
|
|
699 {
|
|
700 do
|
|
701 *p = p[1];
|
|
702 while (*++p);
|
|
703 break;
|
|
704 }
|
|
705 }
|
|
706
|
|
707 malloc_set_state (malloc_state_ptr);
|
|
708 free (malloc_state_ptr);
|
|
709 }
|
|
710 else
|
|
711 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
|
|
712 }
|
|
713
|
|
714 void (*__malloc_initialize_hook) () = malloc_initialize_hook;
|
|
715
|
|
716 #endif /* DOUG_LEA_MALLOC */
|
|
717
|
40405
|
718
|
|
719 #define REPORT_EMACS_BUG_ADDRESS "bug-gnu-emacs@gnu.org"
|
|
720 #define REPORT_EMACS_BUG_PRETEST_ADDRESS "emacs-pretest-bug@gnu.org"
|
|
721
|
|
722 /* This function is used to determine an address to which bug report should
|
|
723 be sent. */
|
|
724
|
40572
|
725 char *
|
|
726 bug_reporting_address ()
|
40405
|
727 {
|
40572
|
728 int count = 0;
|
40405
|
729 Lisp_Object temp;
|
|
730 char *string;
|
|
731
|
|
732 temp = Fsymbol_value (intern ("emacs-version"));
|
|
733
|
|
734 /* When `emacs-version' is invalid, use normal address. */
|
|
735 if (!STRINGP(temp))
|
|
736 return REPORT_EMACS_BUG_ADDRESS;
|
|
737
|
|
738 string = XSTRING (temp)->data;
|
|
739
|
40572
|
740 /* Count dots in `emacs-version'. */
|
|
741 while (*string)
|
|
742 {
|
|
743 if (*string == '.')
|
|
744 count++;
|
|
745 string++;
|
|
746 }
|
40405
|
747
|
|
748 /* When `emacs-version' has at least three dots, it is development or
|
|
749 pretest version of Emacs. */
|
40572
|
750 return count >= 3 ? REPORT_EMACS_BUG_PRETEST_ADDRESS : REPORT_EMACS_BUG_ADDRESS;
|
40405
|
751 }
|
|
752
|
|
753
|
284
|
754 /* ARGSUSED */
|
21514
|
755 int
|
284
|
756 main (argc, argv, envp)
|
|
757 int argc;
|
|
758 char **argv;
|
|
759 char **envp;
|
|
760 {
|
27748
|
761 #if GC_MARK_STACK
|
27740
|
762 Lisp_Object dummy;
|
|
763 #endif
|
284
|
764 char stack_bottom_variable;
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
765 int do_initial_setlocale;
|
284
|
766 int skip_args = 0;
|
31094
|
767 #ifndef USE_CRT_DLL
|
284
|
768 extern int errno;
|
31094
|
769 #endif
|
16046
|
770 #ifdef HAVE_SETRLIMIT
|
|
771 struct rlimit rlim;
|
|
772 #endif
|
22553
|
773 int no_loadup = 0;
|
284
|
774
|
27748
|
775 #if GC_MARK_STACK
|
27740
|
776 extern Lisp_Object *stack_base;
|
|
777 stack_base = &dummy;
|
|
778 #endif
|
|
779
|
13617
|
780 #ifdef LINUX_SBRK_BUG
|
|
781 __sbrk (1);
|
|
782 #endif
|
|
783
|
19729
|
784 #ifdef RUN_TIME_REMAP
|
|
785 if (initialized)
|
|
786 run_time_remap (argv[0]);
|
|
787 #endif
|
|
788
|
10029
|
789 sort_args (argc, argv);
|
22553
|
790 argc = 0;
|
|
791 while (argv[argc]) argc++;
|
10029
|
792
|
22349
|
793 if (argmatch (argv, argc, "-version", "--version", 3, NULL, &skip_args)
|
|
794 /* We don't know the version number unless this is a dumped Emacs.
|
|
795 So ignore --version otherwise. */
|
|
796 && initialized)
|
10172
|
797 {
|
|
798 Lisp_Object tem;
|
|
799 tem = Fsymbol_value (intern ("emacs-version"));
|
|
800 if (!STRINGP (tem))
|
|
801 {
|
|
802 fprintf (stderr, "Invalid value of `emacs-version'\n");
|
|
803 exit (1);
|
|
804 }
|
|
805 else
|
|
806 {
|
15572
|
807 printf ("GNU Emacs %s\n", XSTRING (tem)->data);
|
36982
|
808 printf ("Copyright (C) 2001 Free Software Foundation, Inc.\n");
|
16278
|
809 printf ("GNU Emacs comes with ABSOLUTELY NO WARRANTY.\n");
|
|
810 printf ("You may redistribute copies of Emacs\n");
|
|
811 printf ("under the terms of the GNU General Public License.\n");
|
|
812 printf ("For more information about these matters, ");
|
22529
|
813 printf ("see the file named COPYING.\n");
|
10172
|
814 exit (0);
|
|
815 }
|
|
816 }
|
|
817
|
284
|
818 /* Map in shared memory, if we are using that. */
|
|
819 #ifdef HAVE_SHM
|
10111
|
820 if (argmatch (argv, argc, "-nl", "--no-shared-memory", 6, NULL, &skip_args))
|
284
|
821 {
|
|
822 map_in_data (0);
|
|
823 /* The shared memory was just restored, which clobbered this. */
|
|
824 skip_args = 1;
|
|
825 }
|
|
826 else
|
|
827 {
|
|
828 map_in_data (1);
|
|
829 /* The shared memory was just restored, which clobbered this. */
|
|
830 skip_args = 0;
|
|
831 }
|
|
832 #endif
|
|
833
|
1350
|
834 #ifdef NeXT
|
11806
|
835 {
|
|
836 extern int malloc_cookie;
|
|
837 /* This helps out unexnext.c. */
|
|
838 if (initialized)
|
|
839 if (malloc_jumpstart (malloc_cookie) != 0)
|
|
840 printf ("malloc jumpstart failed!\n");
|
|
841 }
|
1350
|
842 #endif /* NeXT */
|
|
843
|
284
|
844 #ifdef VMS
|
40372
|
845 /* If -map specified, map the data file in. */
|
9094
|
846 {
|
|
847 char *file;
|
10111
|
848 if (argmatch (argv, argc, "-map", "--map-data", 3, &mapin_file, &skip_args))
|
9094
|
849 mapin_data (file);
|
|
850 }
|
284
|
851
|
|
852 #ifdef LINK_CRTL_SHARE
|
14035
|
853 #ifdef SHARABLE_LIB_BUG
|
40372
|
854 /* Bletcherous shared libraries! */
|
284
|
855 if (!stdin)
|
|
856 stdin = fdopen (0, "r");
|
|
857 if (!stdout)
|
|
858 stdout = fdopen (1, "w");
|
|
859 if (!stderr)
|
|
860 stderr = fdopen (2, "w");
|
|
861 if (!environ)
|
|
862 environ = envp;
|
14035
|
863 #endif /* SHARABLE_LIB_BUG */
|
284
|
864 #endif /* LINK_CRTL_SHARE */
|
|
865 #endif /* VMS */
|
|
866
|
18758
|
867 #if defined (HAVE_SETRLIMIT) && defined (RLIMIT_STACK)
|
19354
|
868 /* Extend the stack space available.
|
|
869 Don't do that if dumping, since some systems (e.g. DJGPP)
|
|
870 might define a smaller stack limit at that time. */
|
|
871 if (1
|
|
872 #ifndef CANNOT_DUMP
|
|
873 && (!noninteractive || initialized)
|
|
874 #endif
|
|
875 && !getrlimit (RLIMIT_STACK, &rlim))
|
16046
|
876 {
|
16968
|
877 long newlim;
|
19354
|
878 extern int re_max_failures;
|
20412
|
879 /* Approximate the amount regex.c needs per unit of re_max_failures. */
|
|
880 int ratio = 20 * sizeof (char *);
|
|
881 /* Then add 33% to cover the size of the smaller stacks that regex.c
|
|
882 successively allocates and discards, on its way to the maximum. */
|
|
883 ratio += ratio / 3;
|
|
884 /* Add in some extra to cover
|
|
885 what we're likely to use for other reasons. */
|
|
886 newlim = re_max_failures * ratio + 200000;
|
18683
|
887 #ifdef __NetBSD__
|
|
888 /* NetBSD (at least NetBSD 1.2G and former) has a bug in its
|
|
889 stack allocation routine for new process that the allocation
|
|
890 fails if stack limit is not on page boundary. So, round up the
|
|
891 new limit to page boundary. */
|
|
892 newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize();
|
|
893 #endif
|
16968
|
894 if (newlim > rlim.rlim_max)
|
19354
|
895 {
|
|
896 newlim = rlim.rlim_max;
|
20412
|
897 /* Don't let regex.c overflow the stack we have. */
|
|
898 re_max_failures = (newlim - 200000) / ratio;
|
19354
|
899 }
|
16968
|
900 if (rlim.rlim_cur < newlim)
|
|
901 rlim.rlim_cur = newlim;
|
|
902
|
16046
|
903 setrlimit (RLIMIT_STACK, &rlim);
|
|
904 }
|
18758
|
905 #endif /* HAVE_SETRLIMIT and RLIMIT_STACK */
|
16046
|
906
|
284
|
907 /* Record (approximately) where the stack begins. */
|
|
908 stack_bottom = &stack_bottom_variable;
|
|
909
|
|
910 #ifdef USG_SHARED_LIBRARIES
|
|
911 if (bss_end)
|
11233
|
912 brk ((void *)bss_end);
|
284
|
913 #endif
|
|
914
|
|
915 clearerr (stdin);
|
3655
|
916
|
284
|
917 #ifndef SYSTEM_MALLOC
|
23954
|
918 /* Arrange to get warning messages as memory fills up. */
|
|
919 memory_warnings (0, malloc_warning);
|
2439
|
920
|
24364
|
921 /* Call malloc at least once, to run the initial __malloc_hook.
|
|
922 Also call realloc and free for consistency. */
|
|
923 free (realloc (malloc (4), 4));
|
23954
|
924
|
|
925 /* Arrange to disable interrupt input inside malloc etc. */
|
|
926 uninterrupt_malloc ();
|
284
|
927 #endif /* not SYSTEM_MALLOC */
|
|
928
|
5493
|
929 #ifdef MSDOS
|
|
930 /* We do all file input/output as binary files. When we need to translate
|
|
931 newlines, we do that manually. */
|
|
932 _fmode = O_BINARY;
|
14968
|
933
|
|
934 #if __DJGPP__ >= 2
|
|
935 if (!isatty (fileno (stdin)))
|
|
936 setmode (fileno (stdin), O_BINARY);
|
|
937 if (!isatty (fileno (stdout)))
|
|
938 {
|
|
939 fflush (stdout);
|
|
940 setmode (fileno (stdout), O_BINARY);
|
|
941 }
|
|
942 #else /* not __DJGPP__ >= 2 */
|
5493
|
943 (stdin)->_flag &= ~_IOTEXT;
|
|
944 (stdout)->_flag &= ~_IOTEXT;
|
|
945 (stderr)->_flag &= ~_IOTEXT;
|
14968
|
946 #endif /* not __DJGPP__ >= 2 */
|
5493
|
947 #endif /* MSDOS */
|
|
948
|
7480
|
949 #ifdef SET_EMACS_PRIORITY
|
1141
|
950 if (emacs_priority)
|
1202
|
951 nice (emacs_priority);
|
284
|
952 setuid (getuid ());
|
7480
|
953 #endif /* SET_EMACS_PRIORITY */
|
284
|
954
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
955 /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
956 The build procedure uses this while dumping, to ensure that the
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
957 dumped Emacs does not have its system locale tables initialized,
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
958 as that might cause screwups when the dumped Emacs starts up. */
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
959 {
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
960 char *lc_all = getenv ("LC_ALL");
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
961 do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
962 }
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
963
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
964 /* Set locale now, so that initial error messages are localized properly.
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
965 fixup_locale must wait until later, since it builds strings. */
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
966 if (do_initial_setlocale)
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
967 setlocale (LC_ALL, "");
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
968
|
6778
|
969 #ifdef EXTRA_INITIALIZE
|
6814
|
970 EXTRA_INITIALIZE;
|
6778
|
971 #endif
|
|
972
|
284
|
973 inhibit_window_system = 0;
|
|
974
|
40372
|
975 /* Handle the -t switch, which specifies filename to use as terminal. */
|
22553
|
976 while (1)
|
|
977 {
|
|
978 char *term;
|
|
979 if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
|
|
980 {
|
|
981 int result;
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
982 emacs_close (0);
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
983 emacs_close (1);
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
984 result = emacs_open (term, O_RDWR, 0);
|
22553
|
985 if (result < 0)
|
|
986 {
|
|
987 char *errstring = strerror (errno);
|
40418
|
988 fprintf (stderr, "%s: %s: %s\n", argv[0], term, errstring);
|
22553
|
989 exit (1);
|
|
990 }
|
|
991 dup (0);
|
|
992 if (! isatty (0))
|
|
993 {
|
40418
|
994 fprintf (stderr, "%s: %s: not a tty\n", argv[0], term);
|
22553
|
995 exit (1);
|
|
996 }
|
|
997 fprintf (stderr, "Using %s\n", term);
|
13409
|
998 #ifdef HAVE_WINDOW_SYSTEM
|
22553
|
999 inhibit_window_system = 1; /* -t => -nw */
|
9094
|
1000 #endif
|
22553
|
1001 }
|
|
1002 else
|
|
1003 break;
|
|
1004 }
|
|
1005
|
40572
|
1006 /* Command line option --no-windows is deprecated and thus not mentioned
|
|
1007 in the manual and usage informations. */
|
|
1008 if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args)
|
|
1009 || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args))
|
9094
|
1010 inhibit_window_system = 1;
|
|
1011
|
|
1012 /* Handle the -batch switch, which means don't do interactive display. */
|
|
1013 noninteractive = 0;
|
10111
|
1014 if (argmatch (argv, argc, "-batch", "--batch", 5, NULL, &skip_args))
|
9094
|
1015 noninteractive = 1;
|
|
1016
|
40372
|
1017 /* Handle the --help option, which gives a usage message. */
|
10111
|
1018 if (argmatch (argv, argc, "-help", "--help", 3, NULL, &skip_args))
|
284
|
1019 {
|
27627
|
1020 printf (USAGE1, argv[0]);
|
|
1021 printf (USAGE2);
|
40572
|
1022 printf (USAGE3, bug_reporting_address ());
|
9094
|
1023 exit (0);
|
284
|
1024 }
|
|
1025
|
7788
|
1026 if (! noninteractive)
|
|
1027 {
|
|
1028 #ifdef BSD_PGRPS
|
|
1029 if (initialized)
|
|
1030 {
|
|
1031 inherited_pgroup = EMACS_GETPGRP (0);
|
|
1032 setpgrp (0, getpid ());
|
|
1033 }
|
|
1034 #else
|
|
1035 #if defined (USG5) && defined (INTERRUPT_INPUT)
|
|
1036 setpgrp ();
|
|
1037 #endif
|
|
1038 #endif
|
|
1039 }
|
|
1040
|
348
|
1041 init_signals ();
|
|
1042
|
14127
|
1043 /* Don't catch SIGHUP if dumping. */
|
|
1044 if (1
|
|
1045 #ifndef CANNOT_DUMP
|
|
1046 && initialized
|
|
1047 #endif
|
|
1048 )
|
|
1049 {
|
15423
|
1050 sigblock (sigmask (SIGHUP));
|
14127
|
1051 /* In --batch mode, don't catch SIGHUP if already ignored.
|
|
1052 That makes nohup work. */
|
|
1053 if (! noninteractive
|
|
1054 || signal (SIGHUP, SIG_IGN) != SIG_IGN)
|
|
1055 signal (SIGHUP, fatal_error_signal);
|
15423
|
1056 sigunblock (sigmask (SIGHUP));
|
14127
|
1057 }
|
|
1058
|
284
|
1059 if (
|
|
1060 #ifndef CANNOT_DUMP
|
|
1061 ! noninteractive || initialized
|
|
1062 #else
|
|
1063 1
|
|
1064 #endif
|
|
1065 )
|
|
1066 {
|
14127
|
1067 /* Don't catch these signals in batch mode if dumping.
|
284
|
1068 On some machines, this sets static data that would make
|
|
1069 signal fail to work right when the dumped Emacs is run. */
|
|
1070 signal (SIGQUIT, fatal_error_signal);
|
|
1071 signal (SIGILL, fatal_error_signal);
|
|
1072 signal (SIGTRAP, fatal_error_signal);
|
20489
|
1073 #ifdef SIGUSR1
|
|
1074 signal (SIGUSR1, handle_USR1_signal);
|
|
1075 #ifdef SIGUSR2
|
|
1076 signal (SIGUSR2, handle_USR2_signal);
|
|
1077 #endif
|
|
1078 #endif
|
10388
|
1079 #ifdef SIGABRT
|
|
1080 signal (SIGABRT, fatal_error_signal);
|
|
1081 #endif
|
|
1082 #ifdef SIGHWE
|
|
1083 signal (SIGHWE, fatal_error_signal);
|
|
1084 #endif
|
|
1085 #ifdef SIGPRE
|
|
1086 signal (SIGPRE, fatal_error_signal);
|
|
1087 #endif
|
|
1088 #ifdef SIGORE
|
|
1089 signal (SIGORE, fatal_error_signal);
|
|
1090 #endif
|
|
1091 #ifdef SIGUME
|
|
1092 signal (SIGUME, fatal_error_signal);
|
|
1093 #endif
|
|
1094 #ifdef SIGDLK
|
|
1095 signal (SIGDLK, fatal_error_signal);
|
|
1096 #endif
|
|
1097 #ifdef SIGCPULIM
|
|
1098 signal (SIGCPULIM, fatal_error_signal);
|
|
1099 #endif
|
2118
|
1100 #ifdef SIGIOT
|
|
1101 /* This is missing on some systems - OS/2, for example. */
|
284
|
1102 signal (SIGIOT, fatal_error_signal);
|
2118
|
1103 #endif
|
284
|
1104 #ifdef SIGEMT
|
|
1105 signal (SIGEMT, fatal_error_signal);
|
|
1106 #endif
|
|
1107 signal (SIGFPE, fatal_error_signal);
|
2913
|
1108 #ifdef SIGBUS
|
284
|
1109 signal (SIGBUS, fatal_error_signal);
|
2913
|
1110 #endif
|
284
|
1111 signal (SIGSEGV, fatal_error_signal);
|
2913
|
1112 #ifdef SIGSYS
|
284
|
1113 signal (SIGSYS, fatal_error_signal);
|
2913
|
1114 #endif
|
284
|
1115 signal (SIGTERM, fatal_error_signal);
|
|
1116 #ifdef SIGXCPU
|
|
1117 signal (SIGXCPU, fatal_error_signal);
|
|
1118 #endif
|
|
1119 #ifdef SIGXFSZ
|
|
1120 signal (SIGXFSZ, fatal_error_signal);
|
|
1121 #endif /* SIGXFSZ */
|
|
1122
|
5236
|
1123 #ifdef SIGDANGER
|
|
1124 /* This just means available memory is getting low. */
|
|
1125 signal (SIGDANGER, memory_warning_signal);
|
|
1126 #endif
|
|
1127
|
284
|
1128 #ifdef AIX
|
5794
|
1129 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
|
|
1130 signal (SIGXCPU, fatal_error_signal);
|
3320
|
1131 #ifndef _I386
|
284
|
1132 signal (SIGIOINT, fatal_error_signal);
|
3320
|
1133 #endif
|
284
|
1134 signal (SIGGRANT, fatal_error_signal);
|
|
1135 signal (SIGRETRACT, fatal_error_signal);
|
|
1136 signal (SIGSOUND, fatal_error_signal);
|
|
1137 signal (SIGMSG, fatal_error_signal);
|
|
1138 #endif /* AIX */
|
|
1139 }
|
|
1140
|
|
1141 noninteractive1 = noninteractive;
|
|
1142
|
40372
|
1143 /* Perform basic initializations (not merely interning symbols). */
|
284
|
1144
|
|
1145 if (!initialized)
|
|
1146 {
|
|
1147 init_alloc_once ();
|
|
1148 init_obarray ();
|
|
1149 init_eval_once ();
|
17060
|
1150 init_charset_once ();
|
|
1151 init_coding_once ();
|
284
|
1152 init_syntax_once (); /* Create standard syntax table. */
|
17060
|
1153 init_category_once (); /* Create standard category table. */
|
40372
|
1154 /* Must be done before init_buffer. */
|
284
|
1155 init_casetab_once ();
|
40372
|
1156 init_buffer_once (); /* Create buffer table and some buffers. */
|
|
1157 init_minibuf_once (); /* Create list of minibuffers. */
|
|
1158 /* Must precede init_window_once. */
|
|
1159
|
25010
|
1160 /* Call syms_of_xfaces before init_window_once because that
|
|
1161 function creates Vterminal_frame. Termcap frames now use
|
|
1162 faces, and the face implementation uses some symbols as
|
|
1163 face names. */
|
|
1164 syms_of_xfaces ();
|
29198
|
1165 /* Call syms_of_keyboard before init_window_once because
|
|
1166 keyboard sets up symbols that include some face names that
|
|
1167 the X support will want to use. This can happen when
|
|
1168 CANNOT_DUMP is defined. */
|
|
1169 syms_of_keyboard ();
|
25010
|
1170
|
32752
|
1171 #ifdef macintosh
|
33886
ff4ddf873081
* src/macterm.c (x_handle_tool_bar_click, note_tool_bar_highlight):
Andrew Choi <akochoi@shaw.ca>
diff
changeset
|
1172 /* init_window_once calls make_terminal_frame which on Mac OS
|
ff4ddf873081
* src/macterm.c (x_handle_tool_bar_click, note_tool_bar_highlight):
Andrew Choi <akochoi@shaw.ca>
diff
changeset
|
1173 creates a full-fledge output_mac type frame. This does not
|
ff4ddf873081
* src/macterm.c (x_handle_tool_bar_click, note_tool_bar_highlight):
Andrew Choi <akochoi@shaw.ca>
diff
changeset
|
1174 work correctly before syms_of_textprop, syms_of_macfns,
|
ff4ddf873081
* src/macterm.c (x_handle_tool_bar_click, note_tool_bar_highlight):
Andrew Choi <akochoi@shaw.ca>
diff
changeset
|
1175 syms_of_ccl, syms_of_fontset, syms_of_xterm, syms_of_search,
|
ff4ddf873081
* src/macterm.c (x_handle_tool_bar_click, note_tool_bar_highlight):
Andrew Choi <akochoi@shaw.ca>
diff
changeset
|
1176 syms_of_frame, x_term_init, and init_keyboard have already
|
ff4ddf873081
* src/macterm.c (x_handle_tool_bar_click, note_tool_bar_highlight):
Andrew Choi <akochoi@shaw.ca>
diff
changeset
|
1177 been called. */
|
32752
|
1178 syms_of_textprop ();
|
|
1179 syms_of_macfns ();
|
|
1180 syms_of_ccl ();
|
|
1181 syms_of_fontset ();
|
|
1182 syms_of_macterm ();
|
|
1183 syms_of_macmenu ();
|
|
1184 syms_of_data ();
|
|
1185 syms_of_search ();
|
33886
ff4ddf873081
* src/macterm.c (x_handle_tool_bar_click, note_tool_bar_highlight):
Andrew Choi <akochoi@shaw.ca>
diff
changeset
|
1186 syms_of_frame ();
|
40372
|
1187
|
32752
|
1188 x_term_init ();
|
|
1189 init_keyboard ();
|
|
1190 #endif
|
|
1191
|
40372
|
1192 init_window_once (); /* Init the window system. */
|
23568
|
1193 init_fileio_once (); /* Must precede any path manipulation. */
|
284
|
1194 }
|
|
1195
|
|
1196 init_alloc ();
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
1197
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
1198 if (do_initial_setlocale)
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
1199 {
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
1200 fixup_locale ();
|
26526
|
1201 Vsystem_messages_locale = Vprevious_system_messages_locale;
|
|
1202 Vsystem_time_locale = Vprevious_system_time_locale;
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
1203 }
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
1204
|
284
|
1205 init_eval ();
|
|
1206 init_data ();
|
24464
|
1207 #ifdef CLASH_DETECTION
|
39673
|
1208 init_filelock ();
|
24464
|
1209 #endif
|
27429
|
1210 init_atimer ();
|
10032
|
1211 running_asynch_code = 0;
|
1917
|
1212
|
21722
|
1213 /* Handle --unibyte and the EMACS_UNIBYTE envvar,
|
|
1214 but not while dumping. */
|
|
1215 if (
|
|
1216 #ifndef CANNOT_DUMP
|
|
1217 ! noninteractive || initialized
|
|
1218 #else
|
|
1219 1
|
|
1220 #endif
|
|
1221 )
|
|
1222 {
|
|
1223 int inhibit_unibyte = 0;
|
|
1224
|
|
1225 /* --multibyte overrides EMACS_UNIBYTE. */
|
|
1226 if (argmatch (argv, argc, "-no-unibyte", "--no-unibyte", 4, NULL, &skip_args)
|
|
1227 || argmatch (argv, argc, "-multibyte", "--multibyte", 4, NULL, &skip_args))
|
|
1228 inhibit_unibyte = 1;
|
|
1229
|
|
1230 /* --unibyte requests that we set up to do everything with single-byte
|
|
1231 buffers and strings. We need to handle this before calling
|
|
1232 init_lread, init_editfns and other places that generate Lisp strings
|
|
1233 from text in the environment. */
|
24168
|
1234 /* Actually this shouldn't be needed as of 20.4 in a generally
|
|
1235 unibyte environment. As handa says, environment values
|
|
1236 aren't now decoded; also existing buffers are now made
|
|
1237 unibyte during startup if .emacs sets unibyte. Tested with
|
|
1238 8-bit data in environment variables and /etc/passwd, setting
|
40372
|
1239 unibyte and Latin-1 in .emacs. -- Dave Love */
|
21722
|
1240 if (argmatch (argv, argc, "-unibyte", "--unibyte", 4, NULL, &skip_args)
|
|
1241 || argmatch (argv, argc, "-no-multibyte", "--no-multibyte", 4, NULL, &skip_args)
|
|
1242 || (getenv ("EMACS_UNIBYTE") && !inhibit_unibyte))
|
|
1243 {
|
|
1244 Lisp_Object old_log_max;
|
|
1245 Lisp_Object symbol, tail;
|
|
1246
|
|
1247 symbol = intern ("default-enable-multibyte-characters");
|
|
1248 Fset (symbol, Qnil);
|
|
1249
|
22323
|
1250 if (initialized)
|
|
1251 {
|
|
1252 /* Erase pre-dump messages in *Messages* now so no abort. */
|
|
1253 old_log_max = Vmessage_log_max;
|
|
1254 XSETFASTINT (Vmessage_log_max, 0);
|
|
1255 message_dolog ("", 0, 1, 0);
|
|
1256 Vmessage_log_max = old_log_max;
|
|
1257 }
|
21722
|
1258
|
21840
|
1259 for (tail = Vbuffer_alist; CONSP (tail);
|
26164
|
1260 tail = XCDR (tail))
|
21722
|
1261 {
|
|
1262 Lisp_Object buffer;
|
|
1263
|
26164
|
1264 buffer = Fcdr (XCAR (tail));
|
21722
|
1265 /* Verify that all buffers are empty now, as they
|
|
1266 ought to be. */
|
|
1267 if (BUF_Z (XBUFFER (buffer)) > BUF_BEG (XBUFFER (buffer)))
|
|
1268 abort ();
|
|
1269 /* It is safe to do this crudely in an empty buffer. */
|
|
1270 XBUFFER (buffer)->enable_multibyte_characters = Qnil;
|
|
1271 }
|
|
1272 }
|
|
1273 }
|
|
1274
|
22553
|
1275 no_loadup
|
28407
|
1276 = argmatch (argv, argc, "-nl", "--no-loadup", 6, NULL, &skip_args);
|
22553
|
1277
|
|
1278
|
|
1279 #ifdef HAVE_X_WINDOWS
|
|
1280 /* Stupid kludge to catch command-line display spec. We can't
|
|
1281 handle this argument entirely in window system dependent code
|
|
1282 because we don't even know which window system dependent code
|
|
1283 to run until we've recognized this argument. */
|
|
1284 {
|
|
1285 char *displayname = 0;
|
|
1286 int count_before = skip_args;
|
|
1287
|
|
1288 /* Skip any number of -d options, but only use the last one. */
|
|
1289 while (1)
|
|
1290 {
|
|
1291 int count_before_this = skip_args;
|
|
1292
|
|
1293 if (argmatch (argv, argc, "-d", "--display", 3, &displayname, &skip_args))
|
|
1294 display_arg = 1;
|
|
1295 else if (argmatch (argv, argc, "-display", 0, 3, &displayname, &skip_args))
|
|
1296 display_arg = 1;
|
|
1297 else
|
|
1298 break;
|
|
1299
|
|
1300 count_before = count_before_this;
|
|
1301 }
|
|
1302
|
|
1303 /* If we have the form --display=NAME,
|
|
1304 convert it into -d name.
|
|
1305 This requires inserting a new element into argv. */
|
|
1306 if (displayname != 0 && skip_args - count_before == 1)
|
|
1307 {
|
|
1308 char **new = (char **) xmalloc (sizeof (char *) * (argc + 2));
|
|
1309 int j;
|
|
1310
|
|
1311 for (j = 0; j < count_before + 1; j++)
|
|
1312 new[j] = argv[j];
|
|
1313 new[count_before + 1] = "-d";
|
|
1314 new[count_before + 2] = displayname;
|
|
1315 for (j = count_before + 2; j <argc; j++)
|
|
1316 new[j + 1] = argv[j];
|
|
1317 argv = new;
|
|
1318 argc++;
|
|
1319 }
|
|
1320 /* Change --display to -d, when its arg is separate. */
|
|
1321 else if (displayname != 0 && skip_args > count_before
|
|
1322 && argv[count_before + 1][1] == '-')
|
|
1323 argv[count_before + 1] = "-d";
|
|
1324
|
|
1325 /* Don't actually discard this arg. */
|
|
1326 skip_args = count_before;
|
|
1327 }
|
|
1328 #endif
|
|
1329
|
|
1330 /* argmatch must not be used after here,
|
|
1331 except when bulding temacs
|
|
1332 because the -d argument has not been skipped in skip_args. */
|
|
1333
|
5493
|
1334 #ifdef MSDOS
|
|
1335 /* Call early 'cause init_environment needs it. */
|
|
1336 init_dosfns ();
|
|
1337 /* Set defaults for several environment variables. */
|
14968
|
1338 if (initialized)
|
|
1339 init_environment (argc, argv, skip_args);
|
|
1340 else
|
15012
|
1341 tzset ();
|
14968
|
1342 #endif /* MSDOS */
|
5493
|
1343
|
13409
|
1344 #ifdef WINDOWSNT
|
|
1345 /* Initialize environment from registry settings. */
|
24228
|
1346 init_environment (argv);
|
40372
|
1347 init_ntproc (); /* must precede init_editfns. */
|
13409
|
1348 #endif
|
|
1349
|
1917
|
1350 /* egetenv is a pretty low-level facility, which may get called in
|
|
1351 many circumstances; it seems flimsy to put off initializing it
|
|
1352 until calling init_callproc. */
|
|
1353 set_process_environment ();
|
5364
|
1354 /* AIX crashes are reported in system versions 3.2.3 and 3.2.4
|
|
1355 if this is not done. Do it after set_process_environment so that we
|
|
1356 don't pollute Vprocess_environment. */
|
26669
|
1357 /* Setting LANG here will defeat the startup locale processing... */
|
|
1358 #ifdef AIX3_2
|
5364
|
1359 putenv ("LANG=C");
|
|
1360 #endif
|
1917
|
1361
|
40372
|
1362 init_buffer (); /* Init default directory of main buffer. */
|
4484
|
1363
|
5155
|
1364 init_callproc_1 (); /* Must precede init_cmdargs and init_sys_modes. */
|
4484
|
1365 init_cmdargs (argc, argv, skip_args); /* Must precede init_lread. */
|
16488
|
1366
|
|
1367 if (initialized)
|
|
1368 {
|
40372
|
1369 /* Erase any pre-dump messages in the message log, to avoid confusion. */
|
16488
|
1370 Lisp_Object old_log_max;
|
|
1371 old_log_max = Vmessage_log_max;
|
|
1372 XSETFASTINT (Vmessage_log_max, 0);
|
20620
|
1373 message_dolog ("", 0, 1, 0);
|
16488
|
1374 Vmessage_log_max = old_log_max;
|
|
1375 }
|
|
1376
|
5155
|
1377 init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
|
348
|
1378 init_lread ();
|
284
|
1379
|
21962
|
1380 /* Intern the names of all standard functions and variables;
|
|
1381 define standard keys. */
|
284
|
1382
|
|
1383 if (!initialized)
|
|
1384 {
|
40372
|
1385 /* The basic levels of Lisp must come first. */
|
284
|
1386 /* And data must come first of all
|
40372
|
1387 for the sake of symbols like error-message. */
|
32752
|
1388 #ifndef macintosh
|
|
1389 /* Called before init_window_once for Mac OS. */
|
284
|
1390 syms_of_data ();
|
32752
|
1391 #endif
|
284
|
1392 syms_of_alloc ();
|
348
|
1393 syms_of_lread ();
|
284
|
1394 syms_of_print ();
|
|
1395 syms_of_eval ();
|
|
1396 syms_of_fns ();
|
|
1397 syms_of_floatfns ();
|
|
1398
|
|
1399 syms_of_abbrev ();
|
|
1400 syms_of_buffer ();
|
|
1401 syms_of_bytecode ();
|
|
1402 syms_of_callint ();
|
|
1403 syms_of_casefiddle ();
|
|
1404 syms_of_casetab ();
|
|
1405 syms_of_callproc ();
|
17060
|
1406 syms_of_category ();
|
32752
|
1407 #ifndef macintosh
|
|
1408 /* Called before init_window_once for Mac OS. */
|
17060
|
1409 syms_of_ccl ();
|
32752
|
1410 #endif
|
17060
|
1411 syms_of_charset ();
|
284
|
1412 syms_of_cmds ();
|
|
1413 #ifndef NO_DIR_LIBRARY
|
|
1414 syms_of_dired ();
|
|
1415 #endif /* not NO_DIR_LIBRARY */
|
|
1416 syms_of_display ();
|
|
1417 syms_of_doc ();
|
|
1418 syms_of_editfns ();
|
|
1419 syms_of_emacs ();
|
|
1420 syms_of_fileio ();
|
17060
|
1421 syms_of_coding (); /* This should be after syms_of_fileio. */
|
284
|
1422 #ifdef CLASH_DETECTION
|
|
1423 syms_of_filelock ();
|
|
1424 #endif /* CLASH_DETECTION */
|
|
1425 syms_of_indent ();
|
16548
|
1426 syms_of_insdel ();
|
284
|
1427 syms_of_keymap ();
|
|
1428 syms_of_macros ();
|
|
1429 syms_of_marker ();
|
|
1430 syms_of_minibuf ();
|
|
1431 syms_of_process ();
|
32752
|
1432 #ifndef macintosh
|
|
1433 /* Called before init_window_once for Mac OS. */
|
284
|
1434 syms_of_search ();
|
33886
ff4ddf873081
* src/macterm.c (x_handle_tool_bar_click, note_tool_bar_highlight):
Andrew Choi <akochoi@shaw.ca>
diff
changeset
|
1435 syms_of_frame ();
|
32752
|
1436 #endif
|
284
|
1437 syms_of_syntax ();
|
6751
|
1438 syms_of_term ();
|
284
|
1439 syms_of_undo ();
|
25010
|
1440 #ifdef HAVE_SOUND
|
|
1441 syms_of_sound ();
|
|
1442 #endif
|
32752
|
1443 #ifndef macintosh
|
|
1444 /* Called before init_window_once for Mac OS. */
|
1284
|
1445 syms_of_textprop ();
|
32752
|
1446 #endif
|
26854
|
1447 syms_of_composite ();
|
284
|
1448 #ifdef VMS
|
|
1449 syms_of_vmsproc ();
|
|
1450 #endif /* VMS */
|
15202
|
1451 #ifdef WINDOWSNT
|
|
1452 syms_of_ntproc ();
|
|
1453 #endif /* WINDOWSNT */
|
284
|
1454 syms_of_window ();
|
|
1455 syms_of_xdisp ();
|
|
1456 #ifdef HAVE_X_WINDOWS
|
375
|
1457 syms_of_xterm ();
|
284
|
1458 syms_of_xfns ();
|
17060
|
1459 syms_of_fontset ();
|
375
|
1460 #ifdef HAVE_X11
|
|
1461 syms_of_xselect ();
|
|
1462 #endif
|
284
|
1463 #endif /* HAVE_X_WINDOWS */
|
|
1464
|
18062
|
1465 #ifndef HAVE_NTGUI
|
32752
|
1466 #ifndef macintosh
|
9572
|
1467 syms_of_xmenu ();
|
14788
|
1468 #endif
|
32752
|
1469 #endif
|
9572
|
1470
|
13409
|
1471 #ifdef HAVE_NTGUI
|
16588
|
1472 syms_of_w32term ();
|
|
1473 syms_of_w32fns ();
|
|
1474 syms_of_w32select ();
|
|
1475 syms_of_w32menu ();
|
23540
|
1476 syms_of_fontset ();
|
13409
|
1477 #endif /* HAVE_NTGUI */
|
|
1478
|
284
|
1479 #ifdef SYMS_SYSTEM
|
|
1480 SYMS_SYSTEM;
|
|
1481 #endif
|
|
1482
|
|
1483 #ifdef SYMS_MACHINE
|
|
1484 SYMS_MACHINE;
|
|
1485 #endif
|
|
1486
|
|
1487 keys_of_casefiddle ();
|
|
1488 keys_of_cmds ();
|
|
1489 keys_of_buffer ();
|
|
1490 keys_of_keyboard ();
|
|
1491 keys_of_keymap ();
|
|
1492 keys_of_minibuf ();
|
|
1493 keys_of_window ();
|
|
1494 }
|
|
1495
|
21962
|
1496 if (!noninteractive)
|
|
1497 {
|
|
1498 #ifdef VMS
|
40372
|
1499 init_vms_input ();/* init_display calls get_frame_size, that needs this. */
|
21962
|
1500 #endif /* VMS */
|
40372
|
1501 init_display (); /* Determine terminal type. init_sys_modes uses results. */
|
21962
|
1502 }
|
32752
|
1503 #ifndef macintosh
|
|
1504 /* Called before init_window_once for Mac OS. */
|
40372
|
1505 init_keyboard (); /* This too must precede init_sys_modes. */
|
32752
|
1506 #endif
|
21962
|
1507 #ifdef VMS
|
40372
|
1508 init_vmsproc (); /* And this too. */
|
21962
|
1509 #endif /* VMS */
|
40372
|
1510 init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.). */
|
25010
|
1511 #ifdef HAVE_X_WINDOWS
|
|
1512 init_xfns ();
|
|
1513 #endif /* HAVE_X_WINDOWS */
|
|
1514 init_fns ();
|
21962
|
1515 init_xdisp ();
|
|
1516 init_macros ();
|
|
1517 init_editfns ();
|
|
1518 init_floatfns ();
|
|
1519 #ifdef VMS
|
|
1520 init_vmsfns ();
|
|
1521 #endif /* VMS */
|
|
1522 init_process ();
|
25010
|
1523 #ifdef HAVE_SOUND
|
|
1524 init_sound ();
|
|
1525 #endif
|
30036
|
1526 init_window ();
|
21962
|
1527
|
284
|
1528 if (!initialized)
|
|
1529 {
|
9094
|
1530 char *file;
|
40372
|
1531 /* Handle -l loadup, args passed by Makefile. */
|
10111
|
1532 if (argmatch (argv, argc, "-l", "--load", 3, &file, &skip_args))
|
284
|
1533 Vtop_level = Fcons (intern ("load"),
|
9094
|
1534 Fcons (build_string (file), Qnil));
|
284
|
1535 #ifdef CANNOT_DUMP
|
|
1536 /* Unless next switch is -nl, load "loadup.el" first thing. */
|
22553
|
1537 if (! no_loadup)
|
284
|
1538 Vtop_level = Fcons (intern ("load"),
|
|
1539 Fcons (build_string ("loadup.el"), Qnil));
|
|
1540 #endif /* CANNOT_DUMP */
|
|
1541 }
|
|
1542
|
11195
|
1543 if (initialized)
|
|
1544 {
|
14202
|
1545 #ifdef HAVE_TZSET
|
|
1546 {
|
|
1547 /* If the execution TZ happens to be the same as the dump TZ,
|
|
1548 change it to some other value and then change it back,
|
|
1549 to force the underlying implementation to reload the TZ info.
|
|
1550 This is needed on implementations that load TZ info from files,
|
|
1551 since the TZ file contents may differ between dump and execution. */
|
|
1552 char *tz = getenv ("TZ");
|
|
1553 if (tz && !strcmp (tz, dump_tz))
|
|
1554 {
|
|
1555 ++*tz;
|
|
1556 tzset ();
|
|
1557 --*tz;
|
|
1558 }
|
|
1559 }
|
|
1560 #endif
|
11195
|
1561 }
|
|
1562
|
37205
|
1563 /* Set up for profiling. This is known to work on FreeBSD and
|
|
1564 GNU/Linux. It might work on some other systems too. Give it a
|
|
1565 try and tell us if it works on your system. To compile for
|
40372
|
1566 profiling use something like `make CFLAGS="-pg -g -O -DPROFILING=1'. */
|
26131
|
1567 #if defined (__FreeBSD__) || defined (__linux)
|
19291
|
1568 #ifdef PROFILING
|
|
1569 if (initialized)
|
|
1570 {
|
40372
|
1571 extern void _mcleanup ();
|
19291
|
1572 extern char etext;
|
25010
|
1573 extern void safe_bcopy ();
|
26193
|
1574 extern void dump_opcode_frequencies ();
|
|
1575
|
19291
|
1576 atexit (_mcleanup);
|
25010
|
1577 /* This uses safe_bcopy because that function comes first in the
|
|
1578 Emacs executable. It might be better to use something that
|
|
1579 gives the start of the text segment, but start_of_text is not
|
|
1580 defined on all systems now. */
|
|
1581 monstartup (safe_bcopy, &etext);
|
19291
|
1582 }
|
|
1583 else
|
|
1584 moncontrol (0);
|
|
1585 #endif
|
|
1586 #endif
|
|
1587
|
284
|
1588 initialized = 1;
|
|
1589
|
13016
|
1590 #ifdef LOCALTIME_CACHE
|
|
1591 /* Some versions of localtime have a bug. They cache the value of the time
|
815
|
1592 zone rather than looking it up every time. Since localtime() is
|
|
1593 called to bolt the undumping time into the undumped emacs, this
|
4303
|
1594 results in localtime ignoring the TZ environment variable.
|
40372
|
1595 This flushes the new TZ value into localtime. */
|
4303
|
1596 tzset ();
|
13016
|
1597 #endif /* defined (LOCALTIME_CACHE) */
|
815
|
1598
|
284
|
1599 /* Enter editor command loop. This never returns. */
|
|
1600 Frecursive_edit ();
|
|
1601 /* NOTREACHED */
|
31829
|
1602 return 0;
|
284
|
1603 }
|
|
1604
|
10029
|
1605 /* Sort the args so we can find the most important ones
|
|
1606 at the beginning of argv. */
|
|
1607
|
|
1608 /* First, here's a table of all the standard options. */
|
|
1609
|
|
1610 struct standard_args
|
|
1611 {
|
|
1612 char *name;
|
|
1613 char *longname;
|
|
1614 int priority;
|
|
1615 int nargs;
|
|
1616 };
|
|
1617
|
|
1618 struct standard_args standard_args[] =
|
|
1619 {
|
22455
|
1620 { "-version", "--version", 150, 0 },
|
|
1621 #ifdef HAVE_SHM
|
|
1622 { "-nl", "--no-shared-memory", 140, 0 },
|
|
1623 #endif
|
11629
|
1624 #ifdef VMS
|
22455
|
1625 { "-map", "--map-data", 130, 0 },
|
11629
|
1626 #endif
|
22455
|
1627 { "-t", "--terminal", 120, 1 },
|
40572
|
1628 { "-nw", "--no-window-system", 110, 0 },
|
22455
|
1629 { "-nw", "--no-windows", 110, 0 },
|
|
1630 { "-batch", "--batch", 100, 0 },
|
|
1631 { "-help", "--help", 90, 0 },
|
22553
|
1632 { "-no-unibyte", "--no-unibyte", 83, 0 },
|
|
1633 { "-multibyte", "--multibyte", 82, 0 },
|
|
1634 { "-unibyte", "--unibyte", 81, 0 },
|
|
1635 { "-no-multibyte", "--no-multibyte", 80, 0 },
|
22455
|
1636 #ifdef CANNOT_DUMP
|
22553
|
1637 { "-nl", "--no-loadup", 70, 0 },
|
22455
|
1638 #endif
|
22553
|
1639 /* -d must come last before the options handled in startup.el. */
|
|
1640 { "-d", "--display", 60, 1 },
|
|
1641 { "-display", 0, 60, 1 },
|
22455
|
1642 /* Now for the options handled in startup.el. */
|
10029
|
1643 { "-q", "--no-init-file", 50, 0 },
|
|
1644 { "-no-init-file", 0, 50, 0 },
|
|
1645 { "-no-site-file", "--no-site-file", 40, 0 },
|
|
1646 { "-u", "--user", 30, 1 },
|
|
1647 { "-user", 0, 30, 1 },
|
|
1648 { "-debug-init", "--debug-init", 20, 0 },
|
11931
|
1649 { "-i", "--icon-type", 15, 0 },
|
|
1650 { "-itype", 0, 15, 0 },
|
11596
|
1651 { "-iconic", "--iconic", 15, 0 },
|
10029
|
1652 { "-bg", "--background-color", 10, 1 },
|
|
1653 { "-background", 0, 10, 1 },
|
|
1654 { "-fg", "--foreground-color", 10, 1 },
|
|
1655 { "-foreground", 0, 10, 1 },
|
|
1656 { "-bd", "--border-color", 10, 1 },
|
|
1657 { "-bw", "--border-width", 10, 1 },
|
|
1658 { "-ib", "--internal-border", 10, 1 },
|
|
1659 { "-ms", "--mouse-color", 10, 1 },
|
|
1660 { "-cr", "--cursor-color", 10, 1 },
|
|
1661 { "-fn", "--font", 10, 1 },
|
|
1662 { "-font", 0, 10, 1 },
|
|
1663 { "-g", "--geometry", 10, 1 },
|
|
1664 { "-geometry", 0, 10, 1 },
|
|
1665 { "-T", "--title", 10, 1 },
|
14993
|
1666 { "-title", 0, 10, 1 },
|
10029
|
1667 { "-name", "--name", 10, 1 },
|
|
1668 { "-xrm", "--xrm", 10, 1 },
|
10517
|
1669 { "-r", "--reverse-video", 5, 0 },
|
|
1670 { "-rv", 0, 5, 0 },
|
|
1671 { "-reverse", 0, 5, 0 },
|
14993
|
1672 { "-hb", "--horizontal-scroll-bars", 5, 0 },
|
10517
|
1673 { "-vb", "--vertical-scroll-bars", 5, 0 },
|
|
1674 /* These have the same priority as ordinary file name args,
|
|
1675 so they are not reordered with respect to those. */
|
11623
|
1676 { "-L", "--directory", 0, 1 },
|
|
1677 { "-directory", 0, 0, 1 },
|
10517
|
1678 { "-l", "--load", 0, 1 },
|
|
1679 { "-load", 0, 0, 1 },
|
|
1680 { "-f", "--funcall", 0, 1 },
|
|
1681 { "-funcall", 0, 0, 1 },
|
12851
|
1682 { "-eval", "--eval", 0, 1 },
|
26193
|
1683 { "-execute", "--execute", 0, 1 },
|
16749
|
1684 { "-find-file", "--find-file", 0, 1 },
|
|
1685 { "-visit", "--visit", 0, 1 },
|
26193
|
1686 { "-file", "--file", 0, 1 },
|
10517
|
1687 { "-insert", "--insert", 0, 1 },
|
11596
|
1688 /* This should be processed after ordinary file name args and the like. */
|
10517
|
1689 { "-kill", "--kill", -10, 0 },
|
10029
|
1690 };
|
|
1691
|
|
1692 /* Reorder the elements of ARGV (assumed to have ARGC elements)
|
|
1693 so that the highest priority ones come first.
|
|
1694 Do not change the order of elements of equal priority.
|
22553
|
1695 If an option takes an argument, keep it and its argument together.
|
|
1696
|
|
1697 If an option that takes no argument appears more
|
|
1698 than once, eliminate all but one copy of it. */
|
10029
|
1699
|
|
1700 static void
|
|
1701 sort_args (argc, argv)
|
|
1702 int argc;
|
|
1703 char **argv;
|
|
1704 {
|
|
1705 char **new = (char **) xmalloc (sizeof (char *) * argc);
|
|
1706 /* For each element of argv,
|
|
1707 the corresponding element of options is:
|
|
1708 0 for an option that takes no arguments,
|
|
1709 1 for an option that takes one argument, etc.
|
|
1710 -1 for an ordinary non-option argument. */
|
10150
|
1711 int *options = (int *) xmalloc (sizeof (int) * argc);
|
10029
|
1712 int *priority = (int *) xmalloc (sizeof (int) * argc);
|
|
1713 int to = 1;
|
22553
|
1714 int incoming_used = 1;
|
10029
|
1715 int from;
|
|
1716 int i;
|
|
1717
|
|
1718 /* Categorize all the options,
|
|
1719 and figure out which argv elts are option arguments. */
|
|
1720 for (from = 1; from < argc; from++)
|
|
1721 {
|
|
1722 options[from] = -1;
|
10517
|
1723 priority[from] = 0;
|
10029
|
1724 if (argv[from][0] == '-')
|
|
1725 {
|
|
1726 int match, thislen;
|
|
1727 char *equals;
|
|
1728
|
16091
|
1729 /* If we have found "--", don't consider
|
|
1730 any more arguments as options. */
|
19030
|
1731 if (argv[from][1] == '-' && argv[from][2] == 0)
|
16091
|
1732 {
|
|
1733 /* Leave the "--", and everything following it, at the end. */
|
|
1734 for (; from < argc; from++)
|
|
1735 {
|
|
1736 priority[from] = -100;
|
|
1737 options[from] = -1;
|
|
1738 }
|
|
1739 break;
|
|
1740 }
|
|
1741
|
10029
|
1742 /* Look for a match with a known old-fashioned option. */
|
|
1743 for (i = 0; i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
|
|
1744 if (!strcmp (argv[from], standard_args[i].name))
|
|
1745 {
|
|
1746 options[from] = standard_args[i].nargs;
|
|
1747 priority[from] = standard_args[i].priority;
|
14399
|
1748 if (from + standard_args[i].nargs >= argc)
|
|
1749 fatal ("Option `%s' requires an argument\n", argv[from]);
|
10029
|
1750 from += standard_args[i].nargs;
|
|
1751 goto done;
|
|
1752 }
|
|
1753
|
|
1754 /* Look for a match with a known long option.
|
|
1755 MATCH is -1 if no match so far, -2 if two or more matches so far,
|
|
1756 >= 0 (the table index of the match) if just one match so far. */
|
|
1757 if (argv[from][1] == '-')
|
|
1758 {
|
|
1759 match = -1;
|
|
1760 thislen = strlen (argv[from]);
|
|
1761 equals = index (argv[from], '=');
|
|
1762 if (equals != 0)
|
|
1763 thislen = equals - argv[from];
|
|
1764
|
11157
|
1765 for (i = 0;
|
|
1766 i < sizeof (standard_args) / sizeof (standard_args[0]); i++)
|
|
1767 if (standard_args[i].longname
|
|
1768 && !strncmp (argv[from], standard_args[i].longname,
|
|
1769 thislen))
|
10029
|
1770 {
|
|
1771 if (match == -1)
|
|
1772 match = i;
|
|
1773 else
|
|
1774 match = -2;
|
|
1775 }
|
|
1776
|
|
1777 /* If we found exactly one match, use that. */
|
|
1778 if (match >= 0)
|
|
1779 {
|
|
1780 options[from] = standard_args[match].nargs;
|
|
1781 priority[from] = standard_args[match].priority;
|
|
1782 /* If --OPTION=VALUE syntax is used,
|
|
1783 this option uses just one argv element. */
|
|
1784 if (equals != 0)
|
|
1785 options[from] = 0;
|
14399
|
1786 if (from + options[from] >= argc)
|
|
1787 fatal ("Option `%s' requires an argument\n", argv[from]);
|
10029
|
1788 from += options[from];
|
|
1789 }
|
|
1790 }
|
|
1791 done: ;
|
|
1792 }
|
|
1793 }
|
|
1794
|
|
1795 /* Copy the arguments, in order of decreasing priority, to NEW. */
|
|
1796 new[0] = argv[0];
|
22553
|
1797 while (incoming_used < argc)
|
10029
|
1798 {
|
|
1799 int best = -1;
|
12861
|
1800 int best_priority = -9999;
|
10029
|
1801
|
|
1802 /* Find the highest priority remaining option.
|
|
1803 If several have equal priority, take the first of them. */
|
|
1804 for (from = 1; from < argc; from++)
|
|
1805 {
|
|
1806 if (argv[from] != 0 && priority[from] > best_priority)
|
|
1807 {
|
|
1808 best_priority = priority[from];
|
|
1809 best = from;
|
|
1810 }
|
|
1811 /* Skip option arguments--they are tied to the options. */
|
|
1812 if (options[from] > 0)
|
|
1813 from += options[from];
|
|
1814 }
|
40372
|
1815
|
10029
|
1816 if (best < 0)
|
|
1817 abort ();
|
|
1818
|
22553
|
1819 /* Copy the highest priority remaining option, with its args, to NEW.
|
|
1820 Unless it is a duplicate of the previous one. */
|
|
1821 if (! (options[best] == 0
|
|
1822 && ! strcmp (new[to - 1], argv[best])))
|
|
1823 {
|
|
1824 new[to++] = argv[best];
|
|
1825 for (i = 0; i < options[best]; i++)
|
|
1826 new[to++] = argv[best + i + 1];
|
|
1827 }
|
|
1828
|
|
1829 incoming_used += 1 + (options[best] > 0 ? options[best] : 0);
|
10029
|
1830
|
|
1831 /* Clear out this option in ARGV. */
|
|
1832 argv[best] = 0;
|
|
1833 for (i = 0; i < options[best]; i++)
|
|
1834 argv[best + i + 1] = 0;
|
|
1835 }
|
|
1836
|
23327
|
1837 /* If duplicate options were deleted, fill up extra space with null ptrs. */
|
|
1838 while (to < argc)
|
|
1839 new[to++] = 0;
|
|
1840
|
10150
|
1841 bcopy (new, argv, sizeof (char *) * argc);
|
17563
|
1842
|
|
1843 free (options);
|
|
1844 free (new);
|
|
1845 free (priority);
|
10029
|
1846 }
|
|
1847
|
284
|
1848 DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P",
|
40372
|
1849 doc: /* Exit the Emacs job and kill it.
|
|
1850 If ARG is an integer, return ARG as the exit program code.
|
|
1851 If ARG is a string, stuff it as keyboard input.
|
|
1852
|
|
1853 The value of `kill-emacs-hook', if not void,
|
|
1854 is a list of functions (of no args),
|
|
1855 all of which are called before Emacs is actually killed. */)
|
|
1856 (arg)
|
284
|
1857 Lisp_Object arg;
|
|
1858 {
|
|
1859 struct gcpro gcpro1;
|
|
1860
|
|
1861 GCPRO1 (arg);
|
|
1862
|
|
1863 if (feof (stdin))
|
|
1864 arg = Qt;
|
|
1865
|
505
|
1866 if (!NILP (Vrun_hooks) && !noninteractive)
|
284
|
1867 call1 (Vrun_hooks, intern ("kill-emacs-hook"));
|
|
1868
|
|
1869 UNGCPRO;
|
|
1870
|
|
1871 /* Is it really necessary to do this deassign
|
|
1872 when we are going to exit anyway? */
|
|
1873 /* #ifdef VMS
|
|
1874 stop_vms_input ();
|
|
1875 #endif */
|
1774
|
1876
|
3837
|
1877 shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
|
1774
|
1878
|
11846
|
1879 /* If we have an auto-save list file,
|
|
1880 kill it because we are exiting Emacs deliberately (not crashing).
|
|
1881 Do it after shut_down_emacs, which does an auto-save. */
|
|
1882 if (STRINGP (Vauto_save_list_file_name))
|
|
1883 unlink (XSTRING (Vauto_save_list_file_name)->data);
|
|
1884
|
9132
|
1885 exit (INTEGERP (arg) ? XINT (arg)
|
284
|
1886 #ifdef VMS
|
|
1887 : 1
|
|
1888 #else
|
|
1889 : 0
|
|
1890 #endif
|
|
1891 );
|
|
1892 /* NOTREACHED */
|
|
1893 }
|
1774
|
1894
|
|
1895
|
|
1896 /* Perform an orderly shutdown of Emacs. Autosave any modified
|
|
1897 buffers, kill any child processes, clean up the terminal modes (if
|
|
1898 we're in the foreground), and other stuff like that. Don't perform
|
|
1899 any redisplay; this may be called when Emacs is shutting down in
|
|
1900 the background, or after its X connection has died.
|
|
1901
|
|
1902 If SIG is a signal number, print a message for it.
|
|
1903
|
|
1904 This is called by fatal signal handlers, X protocol error handlers,
|
|
1905 and Fkill_emacs. */
|
3711
|
1906
|
1774
|
1907 void
|
3711
|
1908 shut_down_emacs (sig, no_x, stuff)
|
3273
|
1909 int sig, no_x;
|
3711
|
1910 Lisp_Object stuff;
|
1774
|
1911 {
|
6210
|
1912 /* Prevent running of hooks from now on. */
|
|
1913 Vrun_hooks = Qnil;
|
|
1914
|
40372
|
1915 /* If we are controlling the terminal, reset terminal modes. */
|
1774
|
1916 #ifdef EMACS_HAVE_TTY_PGRP
|
|
1917 {
|
4957
|
1918 int pgrp = EMACS_GETPGRP (0);
|
|
1919
|
1774
|
1920 int tpgrp;
|
|
1921 if (EMACS_GET_TTY_PGRP (0, &tpgrp) != -1
|
3826
|
1922 && tpgrp == pgrp)
|
1774
|
1923 {
|
|
1924 fflush (stdout);
|
|
1925 reset_sys_modes ();
|
|
1926 if (sig && sig != SIGTERM)
|
|
1927 fprintf (stderr, "Fatal error (%d).", sig);
|
|
1928 }
|
|
1929 }
|
|
1930 #else
|
|
1931 fflush (stdout);
|
|
1932 reset_sys_modes ();
|
|
1933 #endif
|
|
1934
|
3711
|
1935 stuff_buffered_input (stuff);
|
|
1936
|
1774
|
1937 kill_buffer_processes (Qnil);
|
|
1938 Fdo_auto_save (Qt, Qnil);
|
|
1939
|
|
1940 #ifdef CLASH_DETECTION
|
|
1941 unlock_all_files ();
|
|
1942 #endif
|
|
1943
|
|
1944 #ifdef VMS
|
|
1945 kill_vms_processes ();
|
|
1946 #endif
|
|
1947
|
8815
|
1948 #if 0 /* This triggers a bug in XCloseDisplay and is not needed. */
|
3273
|
1949 #ifdef HAVE_X_WINDOWS
|
7538
c4d128d26fc9
(syms_of_emacs): EMACS_CONFIGURATION renamed from CONFIGURATION.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1950 /* It's not safe to call intern here. Maybe we are crashing. */
|
c4d128d26fc9
(syms_of_emacs): EMACS_CONFIGURATION renamed from CONFIGURATION.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1951 if (!noninteractive && SYMBOLP (Vwindow_system)
|
c4d128d26fc9
(syms_of_emacs): EMACS_CONFIGURATION renamed from CONFIGURATION.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1952 && XSYMBOL (Vwindow_system)->name->size == 1
|
c4d128d26fc9
(syms_of_emacs): EMACS_CONFIGURATION renamed from CONFIGURATION.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1953 && XSYMBOL (Vwindow_system)->name->data[0] == 'x'
|
c4d128d26fc9
(syms_of_emacs): EMACS_CONFIGURATION renamed from CONFIGURATION.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
1954 && ! no_x)
|
3273
|
1955 Fx_close_current_connection ();
|
|
1956 #endif /* HAVE_X_WINDOWS */
|
8815
|
1957 #endif
|
3273
|
1958
|
1774
|
1959 #ifdef SIGIO
|
|
1960 /* There is a tendency for a SIGIO signal to arrive within exit,
|
|
1961 and cause a SIGHUP because the input descriptor is already closed. */
|
|
1962 unrequest_sigio ();
|
|
1963 signal (SIGIO, SIG_IGN);
|
|
1964 #endif
|
15089
|
1965
|
|
1966 #ifdef WINDOWSNT
|
|
1967 term_ntproc ();
|
|
1968 #endif
|
20037
|
1969
|
39035
|
1970 /* Do this only if terminating normally, we want glyph matrices
|
|
1971 etc. in a core dump. */
|
39036
|
1972 if (sig == 0 || sig == SIGTERM)
|
39035
|
1973 {
|
|
1974 check_glyph_memory ();
|
|
1975 check_message_stack ();
|
|
1976 }
|
25010
|
1977
|
20037
|
1978 #ifdef MSDOS
|
|
1979 dos_cleanup ();
|
|
1980 #endif
|
1774
|
1981 }
|
|
1982
|
|
1983
|
284
|
1984
|
|
1985 #ifndef CANNOT_DUMP
|
|
1986
|
|
1987 #ifdef HAVE_SHM
|
|
1988
|
|
1989 DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0,
|
40372
|
1990 doc: /* Dump current state of Emacs into data file FILENAME.
|
|
1991 This function exists on systems that use HAVE_SHM. */)
|
|
1992 (filename)
|
14072
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
1993 Lisp_Object filename;
|
284
|
1994 {
|
11076
|
1995 extern char my_edata[];
|
284
|
1996 Lisp_Object tem;
|
|
1997
|
39576
|
1998 check_pure_size ();
|
40656
|
1999 CHECK_STRING (filename);
|
14072
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2000 filename = Fexpand_file_name (filename, Qnil);
|
284
|
2001
|
|
2002 tem = Vpurify_flag;
|
|
2003 Vpurify_flag = Qnil;
|
|
2004
|
|
2005 fflush (stdout);
|
40372
|
2006 /* Tell malloc where start of impure now is. */
|
284
|
2007 /* Also arrange for warnings when nearly out of space. */
|
|
2008 #ifndef SYSTEM_MALLOC
|
11720
|
2009 memory_warnings (my_edata, malloc_warning);
|
284
|
2010 #endif
|
14072
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2011 map_out_data (XSTRING (filename)->data);
|
284
|
2012
|
|
2013 Vpurify_flag = tem;
|
|
2014
|
|
2015 return Qnil;
|
|
2016 }
|
|
2017
|
|
2018 #else /* not HAVE_SHM */
|
|
2019
|
|
2020 DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0,
|
40372
|
2021 doc: /* Dump current state of Emacs into executable file FILENAME.
|
|
2022 Take symbols from SYMFILE (presumably the file you executed to run Emacs).
|
|
2023 This is used in the file `loadup.el' when building Emacs.
|
|
2024
|
|
2025 You must run Emacs in batch mode in order to dump it. */)
|
|
2026 (filename, symfile)
|
14072
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2027 Lisp_Object filename, symfile;
|
284
|
2028 {
|
11076
|
2029 extern char my_edata[];
|
284
|
2030 Lisp_Object tem;
|
18395
|
2031 Lisp_Object symbol;
|
39576
|
2032 int count = BINDING_STACK_SIZE ();
|
|
2033
|
|
2034 check_pure_size ();
|
284
|
2035
|
18394
|
2036 if (! noninteractive)
|
|
2037 error ("Dumping Emacs works only in batch mode");
|
|
2038
|
18395
|
2039 /* Bind `command-line-processed' to nil before dumping,
|
|
2040 so that the dumped Emacs will process its command line
|
|
2041 and set up to work with X windows if appropriate. */
|
|
2042 symbol = intern ("command-line-process");
|
|
2043 specbind (symbol, Qnil);
|
|
2044
|
40656
|
2045 CHECK_STRING (filename);
|
14072
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2046 filename = Fexpand_file_name (filename, Qnil);
|
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2047 if (!NILP (symfile))
|
284
|
2048 {
|
40656
|
2049 CHECK_STRING (symfile);
|
14072
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2050 if (XSTRING (symfile)->size)
|
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2051 symfile = Fexpand_file_name (symfile, Qnil);
|
284
|
2052 }
|
|
2053
|
|
2054 tem = Vpurify_flag;
|
|
2055 Vpurify_flag = Qnil;
|
|
2056
|
14202
|
2057 #ifdef HAVE_TZSET
|
|
2058 set_time_zone_rule (dump_tz);
|
|
2059 #ifndef LOCALTIME_CACHE
|
|
2060 /* Force a tz reload, since set_time_zone_rule doesn't. */
|
|
2061 tzset ();
|
|
2062 #endif
|
|
2063 #endif
|
|
2064
|
284
|
2065 fflush (stdout);
|
|
2066 #ifdef VMS
|
14072
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2067 mapout_data (XSTRING (filename)->data);
|
284
|
2068 #else
|
40372
|
2069 /* Tell malloc where start of impure now is. */
|
284
|
2070 /* Also arrange for warnings when nearly out of space. */
|
|
2071 #ifndef SYSTEM_MALLOC
|
9788
|
2072 #ifndef WINDOWSNT
|
|
2073 /* On Windows, this was done before dumping, and that once suffices.
|
|
2074 Meanwhile, my_edata is not valid on Windows. */
|
11756
|
2075 memory_warnings (my_edata, malloc_warning);
|
9788
|
2076 #endif /* not WINDOWSNT */
|
284
|
2077 #endif
|
17346
|
2078 #ifdef DOUG_LEA_MALLOC
|
|
2079 malloc_state_ptr = malloc_get_state ();
|
|
2080 #endif
|
31413
|
2081
|
31602
|
2082 #ifdef USE_MMAP_FOR_BUFFERS
|
31413
|
2083 mmap_set_vars (0);
|
|
2084 #endif
|
14072
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2085 unexec (XSTRING (filename)->data,
|
d6f46c53f2aa
(Fdump_emacs_data, Fdump_emacs): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
diff
changeset
|
2086 !NILP (symfile) ? XSTRING (symfile)->data : 0, my_edata, 0, 0);
|
31602
|
2087 #ifdef USE_MMAP_FOR_BUFFERS
|
31413
|
2088 mmap_set_vars (1);
|
|
2089 #endif
|
17346
|
2090 #ifdef DOUG_LEA_MALLOC
|
|
2091 free (malloc_state_ptr);
|
|
2092 #endif
|
284
|
2093 #endif /* not VMS */
|
|
2094
|
|
2095 Vpurify_flag = tem;
|
|
2096
|
18395
|
2097 return unbind_to (count, Qnil);
|
284
|
2098 }
|
|
2099
|
|
2100 #endif /* not HAVE_SHM */
|
|
2101
|
|
2102 #endif /* not CANNOT_DUMP */
|
|
2103
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2104 #if HAVE_SETLOCALE
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2105 /* Recover from setlocale (LC_ALL, ""). */
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2106 void
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2107 fixup_locale ()
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2108 {
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2109 /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2110 so that numbers are read and printed properly for Emacs Lisp. */
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2111 setlocale (LC_NUMERIC, "C");
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2112 }
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2113
|
26590
301daf47e723
* emacs.c (fixup_locale): Don't bother to record initial locale.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2114 /* Set system locale CATEGORY, with previous locale *PLOCALE, to
|
301daf47e723
* emacs.c (fixup_locale): Don't bother to record initial locale.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2115 DESIRED_LOCALE. */
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2116 static void
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2117 synchronize_locale (category, plocale, desired_locale)
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2118 int category;
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2119 Lisp_Object *plocale;
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2120 Lisp_Object desired_locale;
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2121 {
|
26590
301daf47e723
* emacs.c (fixup_locale): Don't bother to record initial locale.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2122 if (! EQ (*plocale, desired_locale))
|
301daf47e723
* emacs.c (fixup_locale): Don't bother to record initial locale.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2123 {
|
301daf47e723
* emacs.c (fixup_locale): Don't bother to record initial locale.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2124 *plocale = desired_locale;
|
301daf47e723
* emacs.c (fixup_locale): Don't bother to record initial locale.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2125 setlocale (category, (STRINGP (desired_locale)
|
26631
|
2126 ? (char *)(XSTRING (desired_locale)->data)
|
26590
301daf47e723
* emacs.c (fixup_locale): Don't bother to record initial locale.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2127 : ""));
|
301daf47e723
* emacs.c (fixup_locale): Don't bother to record initial locale.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2128 }
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2129 }
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2130
|
26526
|
2131 /* Set system time locale to match Vsystem_time_locale, if possible. */
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2132 void
|
26526
|
2133 synchronize_system_time_locale ()
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2134 {
|
26526
|
2135 synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
|
|
2136 Vsystem_time_locale);
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2137 }
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2138
|
26526
|
2139 /* Set system messages locale to match Vsystem_messages_locale, if
|
|
2140 possible. */
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2141 void
|
26526
|
2142 synchronize_system_messages_locale ()
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2143 {
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2144 #ifdef LC_MESSAGES
|
26526
|
2145 synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
|
|
2146 Vsystem_messages_locale);
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2147 #endif
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2148 }
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2149 #endif /* HAVE_SETLOCALE */
|
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2150
|
2649
|
2151 #ifndef SEPCHAR
|
284
|
2152 #define SEPCHAR ':'
|
|
2153 #endif
|
|
2154
|
|
2155 Lisp_Object
|
|
2156 decode_env_path (evarname, defalt)
|
|
2157 char *evarname, *defalt;
|
|
2158 {
|
|
2159 register char *path, *p;
|
16386
|
2160 Lisp_Object lpath, element, tem;
|
284
|
2161
|
505
|
2162 /* It's okay to use getenv here, because this function is only used
|
|
2163 to initialize variables when Emacs starts up, and isn't called
|
|
2164 after that. */
|
638
|
2165 if (evarname != 0)
|
|
2166 path = (char *) getenv (evarname);
|
|
2167 else
|
|
2168 path = 0;
|
284
|
2169 if (!path)
|
|
2170 path = defalt;
|
18514
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2171 #ifdef DOS_NT
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2172 /* Ensure values from the environment use the proper directory separator. */
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2173 if (path)
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2174 {
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2175 p = alloca (strlen (path) + 1);
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2176 strcpy (p, path);
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2177 path = p;
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2178
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2179 if ('/' == DIRECTORY_SEP)
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2180 dostounix_filename (path);
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2181 else
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2182 unixtodos_filename (path);
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2183 }
|
38e3a189ed1d
(decode_env_path): Ensure path elements use proper directory separator.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2184 #endif
|
284
|
2185 lpath = Qnil;
|
|
2186 while (1)
|
|
2187 {
|
|
2188 p = index (path, SEPCHAR);
|
|
2189 if (!p) p = path + strlen (path);
|
16386
|
2190 element = (p - path ? make_string (path, p - path)
|
|
2191 : build_string ("."));
|
|
2192
|
|
2193 /* Add /: to the front of the name
|
|
2194 if it would otherwise be treated as magic. */
|
|
2195 tem = Ffind_file_name_handler (element, Qt);
|
|
2196 if (! NILP (tem))
|
|
2197 element = concat2 (build_string ("/:"), element);
|
|
2198
|
|
2199 lpath = Fcons (element, lpath);
|
284
|
2200 if (*p)
|
|
2201 path = p + 1;
|
|
2202 else
|
|
2203 break;
|
|
2204 }
|
|
2205 return Fnreverse (lpath);
|
|
2206 }
|
|
2207
|
21514
|
2208 void
|
284
|
2209 syms_of_emacs ()
|
|
2210 {
|
16386
|
2211 Qfile_name_handler_alist = intern ("file-name-handler-alist");
|
|
2212 staticpro (&Qfile_name_handler_alist);
|
|
2213
|
3187
|
2214 #ifndef CANNOT_DUMP
|
284
|
2215 #ifdef HAVE_SHM
|
|
2216 defsubr (&Sdump_emacs_data);
|
|
2217 #else
|
|
2218 defsubr (&Sdump_emacs);
|
|
2219 #endif
|
3187
|
2220 #endif
|
284
|
2221
|
|
2222 defsubr (&Skill_emacs);
|
|
2223
|
2279
|
2224 defsubr (&Sinvocation_name);
|
4484
|
2225 defsubr (&Sinvocation_directory);
|
2279
|
2226
|
284
|
2227 DEFVAR_LISP ("command-line-args", &Vcommand_line_args,
|
40372
|
2228 doc: /* Args passed by shell to Emacs, as a list of strings. */);
|
284
|
2229
|
|
2230 DEFVAR_LISP ("system-type", &Vsystem_type,
|
40372
|
2231 doc: /* Value is symbol indicating type of operating system you are using. */);
|
284
|
2232 Vsystem_type = intern (SYSTEM_TYPE);
|
|
2233
|
5236
|
2234 DEFVAR_LISP ("system-configuration", &Vsystem_configuration,
|
40372
|
2235 doc: /* Value is string indicating configuration Emacs was built for.
|
|
2236 On MS-Windows, the value reflects the OS flavor and version on which
|
|
2237 Emacs is running. */);
|
7538
c4d128d26fc9
(syms_of_emacs): EMACS_CONFIGURATION renamed from CONFIGURATION.
Richard M. Stallman <rms@gnu.org>
diff
changeset
|
2238 Vsystem_configuration = build_string (EMACS_CONFIGURATION);
|
5236
|
2239
|
8843
|
2240 DEFVAR_LISP ("system-configuration-options", &Vsystem_configuration_options,
|
40372
|
2241 doc: /* String containing the configuration options Emacs was built with. */);
|
8843
|
2242 Vsystem_configuration_options = build_string (EMACS_CONFIG_OPTIONS);
|
|
2243
|
284
|
2244 DEFVAR_BOOL ("noninteractive", &noninteractive1,
|
40372
|
2245 doc: /* Non-nil means Emacs is running without interactive terminal. */);
|
732
|
2246
|
1043
|
2247 DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook,
|
40372
|
2248 doc: /* Hook to be run whenever kill-emacs is called.
|
|
2249 Since kill-emacs may be invoked when the terminal is disconnected (or
|
|
2250 in other similar situations), functions placed on this hook should not
|
|
2251 expect to be able to interact with the user. To ask for confirmation,
|
|
2252 see `kill-emacs-query-functions' instead. */);
|
732
|
2253 Vkill_emacs_hook = Qnil;
|
1141
|
2254
|
39803
|
2255 empty_string = build_string ("");
|
|
2256 staticpro (&empty_string);
|
|
2257
|
20489
|
2258 #ifdef SIGUSR1
|
|
2259 DEFVAR_LISP ("signal-USR1-hook", &Vsignal_USR1_hook,
|
40372
|
2260 doc: /* Hook to be run whenever emacs receives a USR1 signal. */);
|
20489
|
2261 Vsignal_USR1_hook = Qnil;
|
|
2262 #ifdef SIGUSR2
|
|
2263 DEFVAR_LISP ("signal-USR2-hook", &Vsignal_USR2_hook,
|
40372
|
2264 doc: /* Hook to be run whenever emacs receives a USR2 signal. */);
|
20489
|
2265 Vsignal_USR2_hook = Qnil;
|
|
2266 #endif
|
|
2267 #endif
|
|
2268
|
|
2269
|
1141
|
2270 DEFVAR_INT ("emacs-priority", &emacs_priority,
|
40372
|
2271 doc: /* Priority for Emacs to run at.
|
|
2272 This value is effective only if set before Emacs is dumped,
|
|
2273 and only if the Emacs executable is installed with setuid to permit
|
|
2274 it to change priority. (Emacs sets its uid back to the real uid.)
|
|
2275 Currently, you need to define SET_EMACS_PRIORITY in `config.h'
|
|
2276 before you compile Emacs, to enable the code for this feature. */);
|
21637
|
2277 emacs_priority = 0;
|
21622
|
2278
|
|
2279 DEFVAR_LISP ("path-separator", &Vpath_separator,
|
41006
|
2280 doc: /* The directory separator in search paths, as a string. */);
|
21622
|
2281 {
|
|
2282 char c = SEPCHAR;
|
|
2283 Vpath_separator = make_string (&c, 1);
|
|
2284 }
|
2279
|
2285
|
7003
|
2286 DEFVAR_LISP ("invocation-name", &Vinvocation_name,
|
40372
|
2287 doc: /* The program name that was used to run Emacs.
|
|
2288 Any directory names are omitted. */);
|
7003
|
2289
|
|
2290 DEFVAR_LISP ("invocation-directory", &Vinvocation_directory,
|
40372
|
2291 doc: /* The directory in which the Emacs executable was found, to run it.
|
|
2292 The value is nil if that directory's name is not known. */);
|
6428
|
2293
|
7003
|
2294 DEFVAR_LISP ("installation-directory", &Vinstallation_directory,
|
40372
|
2295 doc: /* A directory within which to look for the `lib-src' and `etc' directories.
|
|
2296 This is non-nil when we can't find those directories in their standard
|
|
2297 installed locations, but we can find them
|
|
2298 near where the Emacs executable was found. */);
|
7003
|
2299 Vinstallation_directory = Qnil;
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2300
|
26526
|
2301 DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
|
40372
|
2302 doc: /* System locale for messages. */);
|
26526
|
2303 Vsystem_messages_locale = Qnil;
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2304
|
26526
|
2305 DEFVAR_LISP ("previous-system-messages-locale",
|
40372
|
2306 &Vprevious_system_messages_locale,
|
|
2307 doc: /* Most recently used system locale for messages. */);
|
26526
|
2308 Vprevious_system_messages_locale = Qnil;
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2309
|
26526
|
2310 DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
|
40372
|
2311 doc: /* System locale for time. */);
|
26526
|
2312 Vsystem_time_locale = Qnil;
|
26088
b7aa6ac26872
Add support for large files, 64-bit Solaris, system locale codings.
Paul Eggert <eggert@twinsun.com>
diff
changeset
|
2313
|
26526
|
2314 DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
|
40372
|
2315 doc: /* Most recently used system locale for time. */);
|
26526
|
2316 Vprevious_system_time_locale = Qnil;
|
284
|
2317 }
|