|
|
1.1 ! root 1: /* Fully extensible Emacs, running on Unix, intended for GNU. ! 2: Copyright (C) 1985, 1986, 1987, 1990 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GNU Emacs. ! 5: ! 6: GNU Emacs is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 1, or (at your option) ! 9: any later version. ! 10: ! 11: GNU Emacs is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GNU Emacs; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: ! 21: /* This must precede sys/signal.h on certain machines. */ ! 22: #include <sys/types.h> ! 23: #include <signal.h> ! 24: #include <errno.h> ! 25: ! 26: #include "config.h" ! 27: #ifdef NULL ! 28: #undef NULL ! 29: #endif ! 30: #include "lisp.h" ! 31: #undef NULL ! 32: #include "commands.h" ! 33: ! 34: /* Get FIONREAD, if it is available, ! 35: just to help decide whether SIGIO should be defined. */ ! 36: #ifdef USG ! 37: #include <termio.h> ! 38: #include <fcntl.h> ! 39: #else /* not USG */ ! 40: #ifndef VMS ! 41: #include <sys/ioctl.h> ! 42: #endif /* not VMS */ ! 43: #endif /* not USG */ ! 44: ! 45: /* Allow m- file to inhibit use of FIONREAD. */ ! 46: #ifdef BROKEN_FIONREAD ! 47: #undef FIONREAD ! 48: #endif ! 49: ! 50: /* We are unable to use interrupts if FIONREAD is not available, ! 51: so flush SIGIO so we won't try. */ ! 52: #ifndef FIONREAD ! 53: #ifdef SIGIO ! 54: #undef SIGIO ! 55: #endif ! 56: #endif ! 57: ! 58: #include <stdio.h> ! 59: #include <sys/file.h> ! 60: ! 61: #ifdef VMS ! 62: #include <ssdef.h> ! 63: #endif ! 64: ! 65: #if 0 /* fcntl.h was included above. */ ! 66: #ifdef USG5 ! 67: #include <fcntl.h> ! 68: #endif ! 69: #endif ! 70: ! 71: #ifdef BSD ! 72: #include <sys/ioctl.h> ! 73: #endif ! 74: ! 75: #ifdef APOLLO ! 76: #ifndef APOLLO_SR10 ! 77: #include <default_acl.h> ! 78: #endif ! 79: #endif ! 80: ! 81: #ifndef O_RDWR ! 82: #define O_RDWR 2 ! 83: #endif ! 84: ! 85: #define PRIO_PROCESS 0 ! 86: ! 87: /* Command line args from shell, as list of strings */ ! 88: Lisp_Object Vcommand_line_args; ! 89: ! 90: /* Hook run by `kill-emacs' before it does really anything. */ ! 91: Lisp_Object Vkill_emacs_hook; ! 92: ! 93: /* Set nonzero after Emacs has started up the first time. ! 94: Prevents reinitialization of the Lisp world and keymaps ! 95: on subsequent starts. */ ! 96: int initialized; ! 97: ! 98: /* Variable whose value is symbol giving operating system type */ ! 99: Lisp_Object Vsystem_type; ! 100: ! 101: /* If non-zero, emacs should not attempt to use an window-specific code, ! 102: but instead should use the virtual terminal under which it was started */ ! 103: int inhibit_window_system; ! 104: ! 105: #ifdef HAVE_X_WINDOWS ! 106: /* If -d option is used, this variable points to the name of ! 107: the display to use. */ ! 108: char *alternate_display; ! 109: char **xargv; ! 110: int xargc; ! 111: #endif /* HAVE_X_WINDOWS */ ! 112: ! 113: #ifdef USG_SHARED_LIBRARIES ! 114: /* If nonzero, this is the place to put the end of the writable segment ! 115: at startup. */ ! 116: ! 117: unsigned int bss_end = 0; ! 118: #endif ! 119: ! 120: /* Nonzero means running Emacs without interactive terminal. */ ! 121: ! 122: int noninteractive; ! 123: ! 124: /* Value of Lisp variable `noninteractive'. ! 125: Normally same as C variable `noninteractive' ! 126: but nothing terrible happens if user sets this one. */ ! 127: ! 128: int noninteractive1; ! 129: ! 130: /* Signal code for the fatal signal that was received */ ! 131: int fatal_error_code; ! 132: ! 133: /* Nonzero if handling a fatal error already */ ! 134: int fatal_error_in_progress; ! 135: ! 136: /* Handle bus errors, illegal instruction, etc. */ ! 137: fatal_error_signal (sig) ! 138: int sig; ! 139: { ! 140: #ifdef BSD ! 141: int tpgrp; ! 142: #endif /* BSD */ ! 143: ! 144: fatal_error_code = sig; ! 145: signal (sig, SIG_DFL); ! 146: ! 147: /* If fatal error occurs in code below, avoid infinite recursion. */ ! 148: if (fatal_error_in_progress) ! 149: kill (getpid (), fatal_error_code); ! 150: ! 151: fatal_error_in_progress = 1; ! 152: ! 153: /* If we are controlling the terminal, reset terminal modes */ ! 154: #ifdef BSD ! 155: if (ioctl(0, TIOCGPGRP, &tpgrp) == 0 ! 156: && tpgrp == getpgrp (0)) ! 157: #endif /* BSD */ ! 158: { ! 159: reset_sys_modes (); ! 160: if (sig != SIGTERM) ! 161: fprintf (stderr, "Fatal error (%d).", sig); ! 162: } ! 163: ! 164: /* Clean up */ ! 165: #ifdef subprocesses ! 166: kill_buffer_processes (Qnil); ! 167: #endif ! 168: Fdo_auto_save (Qt); ! 169: ! 170: #ifdef CLASH_DETECTION ! 171: unlock_all_files (); ! 172: #endif /* CLASH_DETECTION */ ! 173: ! 174: #ifdef VMS ! 175: kill_vms_processes (); ! 176: LIB$STOP (SS$_ABORT); ! 177: #else ! 178: /* Signal the same code; this time it will really be fatal. */ ! 179: kill (getpid (), fatal_error_code); ! 180: #endif /* not VMS */ ! 181: } ! 182: ! 183: /* Code for dealing with Lisp access to the Unix command line */ ! 184: ! 185: static ! 186: init_cmdargs (argc, argv, skip_args) ! 187: int argc; ! 188: char **argv; ! 189: int skip_args; ! 190: { ! 191: register int i; ! 192: ! 193: Vcommand_line_args = Qnil; ! 194: ! 195: for (i = argc - 1; i >= 0; i--) ! 196: { ! 197: if (i == 0 || i > skip_args) ! 198: Vcommand_line_args ! 199: = Fcons (build_string (argv[i]), Vcommand_line_args); ! 200: } ! 201: } ! 202: ! 203: #ifdef VMS ! 204: #ifdef LINK_CRTL_SHARE ! 205: #ifdef SHAREABLE_LIB_BUG ! 206: #ifdef __GNUC__ ! 207: #define environ $$PsectAttributes_NOSHR$$environ ! 208: extern char **environ; ! 209: #else ! 210: extern noshare char **environ; ! 211: #endif ! 212: #endif /* SHAREABLE_LIB_BUG */ ! 213: #endif /* LINK_CRTL_SHARE */ ! 214: #endif /* VMS */ ! 215: ! 216: /* We don't include crtbegin.o and crtend.o in the link, ! 217: so these functions and variables might be missed. ! 218: Provide dummy definitions to avoid error. ! 219: (We don't have any real constructors or destructors.) */ ! 220: #ifdef __GNUC__ ! 221: #ifndef ORDINARY_LINK ! 222: __do_clobal_ctors () ! 223: {} ! 224: __do_clobal_ctors_aux () ! 225: {} ! 226: __do_global_dtors () ! 227: {} ! 228: char * __CTOR_LIST__[2] = { (char *) (-1), 0 }; ! 229: char * __DTOR_LIST__[2] = { (char *) (-1), 0 }; ! 230: __main () ! 231: {} ! 232: #endif /* not ORDINARY_LINK */ ! 233: #endif /* __GNUC__ */ ! 234: ! 235: /* ARGSUSED */ ! 236: main (argc, argv, envp) ! 237: int argc; ! 238: char **argv; ! 239: char **envp; ! 240: { ! 241: int skip_args = 0; ! 242: extern int errno; ! 243: extern void malloc_warning (); ! 244: ! 245: /* Map in shared memory, if we are using that. */ ! 246: #ifdef HAVE_SHM ! 247: if (argc > 1 && !strcmp (argv[1], "-nl")) ! 248: { ! 249: map_in_data (0); ! 250: /* The shared memory was just restored, which clobbered this. */ ! 251: skip_args = 1; ! 252: } ! 253: else ! 254: { ! 255: map_in_data (1); ! 256: /* The shared memory was just restored, which clobbered this. */ ! 257: skip_args = 0; ! 258: } ! 259: #endif ! 260: ! 261: #ifdef VMS ! 262: /* If -map specified, map the data file in */ ! 263: if (argc > 2 && ! strcmp (argv[1], "-map")) ! 264: { ! 265: skip_args = 2; ! 266: mapin_data (argv[2]); ! 267: } ! 268: ! 269: #ifdef LINK_CRTL_SHARE ! 270: #ifdef SHAREABLE_LIB_BUG ! 271: /* Bletcherous shared libraries! */ ! 272: if (!stdin) ! 273: stdin = fdopen (0, "r"); ! 274: if (!stdout) ! 275: stdout = fdopen (1, "w"); ! 276: if (!stderr) ! 277: stderr = fdopen (2, "w"); ! 278: if (!environ) ! 279: environ = envp; ! 280: #endif /* SHAREABLE_LIB_BUG */ ! 281: #endif /* LINK_CRTL_SHARE */ ! 282: #endif /* VMS */ ! 283: ! 284: #ifdef USG_SHARED_LIBRARIES ! 285: if (bss_end) ! 286: brk (bss_end); ! 287: #endif ! 288: ! 289: #ifdef NeXT ! 290: extern int malloc_cookie; ! 291: ! 292: /* This helps out unexnext.c. */ ! 293: if (initialized) ! 294: if (malloc_jumpstart (malloc_cookie) != 0) ! 295: printf ("malloc jumpstart failed!\n"); ! 296: #endif /* NeXT */ ! 297: ! 298: clearerr (stdin); ! 299: ! 300: #ifdef APOLLO ! 301: #ifndef APOLLO_SR10 ! 302: /* If USE_DOMAIN_ACLS environment variable exists, ! 303: use ACLs rather than UNIX modes. */ ! 304: if (egetenv ("USE_DOMAIN_ACLS")) ! 305: default_acl (USE_DEFACL); ! 306: #endif ! 307: #endif /* APOLLO */ ! 308: ! 309: #ifndef SYSTEM_MALLOC ! 310: /* Arrange for warnings when nearly out of space. */ ! 311: malloc_init (0, malloc_warning); ! 312: #endif ! 313: ! 314: #ifdef HIGHPRI ! 315: setpriority (PRIO_PROCESS, getpid (), HIGHPRI); ! 316: setuid (getuid ()); ! 317: #endif HIGHPRI ! 318: ! 319: inhibit_window_system = 0; ! 320: ! 321: #ifdef HAVE_X_WINDOWS ! 322: xargv = argv; ! 323: xargc = argc; ! 324: #endif ! 325: ! 326: /* Handle the -t switch, which specifies filename to use as terminal */ ! 327: if (skip_args + 2 < argc && !strcmp (argv[skip_args + 1], "-t")) ! 328: { ! 329: skip_args += 2; ! 330: close (0); ! 331: close (1); ! 332: open (argv[skip_args], O_RDWR, 2 ); ! 333: dup (0); ! 334: fprintf (stderr, "Using %s\n", argv[skip_args]); ! 335: #ifdef HAVE_X_WINDOWS ! 336: inhibit_window_system = 1; /* -t => -nw */ ! 337: #endif ! 338: } ! 339: #ifdef HAVE_X_WINDOWS ! 340: /* Handle the -d switch, which means use a different display for X */ ! 341: if (skip_args + 2 < argc && (!strcmp (argv[skip_args + 1], "-d") || ! 342: !strcmp (argv[skip_args + 1], "-display"))) ! 343: { ! 344: skip_args += 2; ! 345: alternate_display = argv[skip_args]; ! 346: } ! 347: else ! 348: alternate_display = 0; ! 349: #endif /* HAVE_X_WINDOWS */ ! 350: ! 351: if (skip_args + 1 < argc ! 352: && (!strcmp (argv[skip_args + 1], "-nw"))) ! 353: { ! 354: skip_args += 1; ! 355: inhibit_window_system = 1; ! 356: } ! 357: ! 358: /* Handle the -batch switch, which means don't do interactive display. */ ! 359: noninteractive = 0; ! 360: if (skip_args + 1 < argc && !strcmp (argv[skip_args + 1], "-batch")) ! 361: { ! 362: skip_args += 1; ! 363: noninteractive = 1; ! 364: } ! 365: ! 366: #ifdef POSIX_SIGNALS ! 367: init_signals (); ! 368: #endif ! 369: ! 370: #ifdef HAVE_TZSET ! 371: /* Reinitialize the time zone if it was initialized before dumping Emacs. */ ! 372: if (initialized) ! 373: tzset (); ! 374: #endif ! 375: ! 376: if ( ! 377: #ifndef CANNOT_DUMP ! 378: ! noninteractive || initialized ! 379: #else ! 380: 1 ! 381: #endif ! 382: ) ! 383: { ! 384: /* Don't catch these signals in batch mode if not initialized. ! 385: On some machines, this sets static data that would make ! 386: signal fail to work right when the dumped Emacs is run. */ ! 387: signal (SIGHUP, fatal_error_signal); ! 388: signal (SIGQUIT, fatal_error_signal); ! 389: signal (SIGILL, fatal_error_signal); ! 390: signal (SIGTRAP, fatal_error_signal); ! 391: signal (SIGIOT, fatal_error_signal); ! 392: #ifdef SIGEMT ! 393: signal (SIGEMT, fatal_error_signal); ! 394: #endif ! 395: signal (SIGFPE, fatal_error_signal); ! 396: signal (SIGBUS, fatal_error_signal); ! 397: signal (SIGSEGV, fatal_error_signal); ! 398: signal (SIGSYS, fatal_error_signal); ! 399: signal (SIGTERM, fatal_error_signal); ! 400: #ifdef SIGXCPU ! 401: signal (SIGXCPU, fatal_error_signal); ! 402: #endif ! 403: #ifdef SIGXFSZ ! 404: signal (SIGXFSZ, fatal_error_signal); ! 405: #endif SIGXFSZ ! 406: ! 407: #ifdef AIX ! 408: /* This used to run fatal_error_signal, ! 409: but it isn't fatal. There's nothing Emacs can usefully do. ! 410: Might as well let the system kill us if it insists. */ ! 411: signal (SIGDANGER, SIG_IGN); ! 412: signal (20, fatal_error_signal); ! 413: signal (21, fatal_error_signal); ! 414: signal (22, fatal_error_signal); ! 415: signal (23, fatal_error_signal); ! 416: signal (24, fatal_error_signal); ! 417: #ifdef SIGIO ! 418: signal (SIGAIO, fatal_error_signal); ! 419: signal (SIGPTY, fatal_error_signal); ! 420: #endif ! 421: #ifdef SIGURG ! 422: /* Note that SIGIOINT is the same as SIGIO on some machines, ! 423: and the same as SIGURG on others. It seems ore reliable to use the ! 424: name with a uniform meaning. */ ! 425: signal (SIGURG, fatal_error_signal); ! 426: #endif ! 427: signal (SIGGRANT, fatal_error_signal); ! 428: signal (SIGRETRACT, fatal_error_signal); ! 429: signal (SIGSOUND, fatal_error_signal); ! 430: signal (SIGMSG, fatal_error_signal); ! 431: #endif /* AIX */ ! 432: } ! 433: ! 434: noninteractive1 = noninteractive; ! 435: ! 436: /* Perform basic initializations (not merely interning symbols) */ ! 437: ! 438: if (!initialized) ! 439: { ! 440: init_alloc_once (); ! 441: init_obarray (); ! 442: init_eval_once (); ! 443: init_syntax_once (); /* Create standard syntax table. */ ! 444: /* Must be done before init_buffer */ ! 445: init_buffer_once (); /* Create buffer table and some buffers */ ! 446: init_minibuf_once (); /* Create list of minibuffers */ ! 447: /* Must precede init_window_once */ ! 448: init_window_once (); /* Init the window system */ ! 449: } ! 450: ! 451: init_alloc (); ! 452: #ifdef MAINTAIN_ENVIRONMENT ! 453: init_environ (); ! 454: #endif ! 455: init_eval (); ! 456: init_data (); ! 457: init_read (); ! 458: ! 459: init_cmdargs (argc, argv, skip_args); /* Create list Vcommand_line_args */ ! 460: init_buffer (); /* Init default directory of main buffer */ ! 461: if (!noninteractive) ! 462: { ! 463: #ifdef VMS ! 464: init_vms_input ();/* init_display calls get_screen_size, that needs this */ ! 465: #endif /* VMS */ ! 466: init_display (); /* Determine terminal type. init_sys_modes uses results */ ! 467: } ! 468: init_keyboard (); /* This too must precede init_sys_modes */ ! 469: init_callproc (); /* And this too. */ ! 470: init_sys_modes (); /* Init system terminal modes (RAW or CBREAK, etc.) */ ! 471: init_xdisp (); ! 472: init_macros (); ! 473: init_editfns (); ! 474: #ifdef VMS ! 475: init_vmsfns (); ! 476: #endif /* VMS */ ! 477: #ifdef subprocesses ! 478: init_process (); ! 479: #endif /* subprocesses */ ! 480: ! 481: /* Intern the names of all standard functions and variables; define standard keys */ ! 482: ! 483: if (!initialized) ! 484: { ! 485: /* The basic levels of Lisp must come first */ ! 486: /* And data must come first of all ! 487: for the sake of symbols like error-message */ ! 488: syms_of_data (); ! 489: syms_of_alloc (); ! 490: #ifdef MAINTAIN_ENVIRONMENT ! 491: syms_of_environ (); ! 492: #endif MAINTAIN_ENVIRONMENT ! 493: syms_of_read (); ! 494: syms_of_print (); ! 495: syms_of_eval (); ! 496: syms_of_fns (); ! 497: ! 498: syms_of_abbrev (); ! 499: syms_of_buffer (); ! 500: syms_of_bytecode (); ! 501: syms_of_callint (); ! 502: syms_of_casefiddle (); ! 503: syms_of_callproc (); ! 504: syms_of_cmds (); ! 505: #ifndef NO_DIR_LIBRARY ! 506: syms_of_dired (); ! 507: #endif /* not NO_DIR_LIBRARY */ ! 508: syms_of_display (); ! 509: syms_of_doc (); ! 510: syms_of_editfns (); ! 511: syms_of_emacs (); ! 512: syms_of_fileio (); ! 513: #ifdef CLASH_DETECTION ! 514: syms_of_filelock (); ! 515: #endif /* CLASH_DETECTION */ ! 516: syms_of_indent (); ! 517: syms_of_keyboard (); ! 518: syms_of_keymap (); ! 519: syms_of_macros (); ! 520: syms_of_marker (); ! 521: syms_of_minibuf (); ! 522: syms_of_mocklisp (); ! 523: #ifdef subprocesses ! 524: syms_of_process (); ! 525: #endif /* subprocesses */ ! 526: syms_of_search (); ! 527: syms_of_syntax (); ! 528: syms_of_undo (); ! 529: syms_of_window (); ! 530: syms_of_xdisp (); ! 531: #ifdef HAVE_X_WINDOWS ! 532: syms_of_xfns (); ! 533: #ifdef HAVE_X_MENU ! 534: syms_of_xmenu (); ! 535: #endif /* HAVE_X_MENU */ ! 536: #endif /* HAVE_X_WINDOWS */ ! 537: ! 538: #ifdef SYMS_SYSTEM ! 539: SYMS_SYSTEM; ! 540: #endif ! 541: ! 542: #ifdef SYMS_MACHINE ! 543: SYMS_MACHINE; ! 544: #endif ! 545: ! 546: keys_of_casefiddle (); ! 547: keys_of_cmds (); ! 548: keys_of_buffer (); ! 549: keys_of_keyboard (); ! 550: keys_of_keymap (); ! 551: keys_of_macros (); ! 552: keys_of_minibuf (); ! 553: keys_of_window (); ! 554: } ! 555: ! 556: if (!initialized) ! 557: { ! 558: /* Handle -l loadup-and-dump, args passed by Makefile. */ ! 559: if (argc > 2 + skip_args && !strcmp (argv[1 + skip_args], "-l")) ! 560: Vtop_level = Fcons (intern ("load"), ! 561: Fcons (build_string (argv[2 + skip_args]), Qnil)); ! 562: #ifdef CANNOT_DUMP ! 563: /* Unless next switch is -nl, load "loadup.el" first thing. */ ! 564: if (!(argc > 1 + skip_args && !strcmp (argv[1 + skip_args], "-nl"))) ! 565: Vtop_level = Fcons (intern ("load"), ! 566: Fcons (build_string ("loadup.el"), Qnil)); ! 567: #endif /* CANNOT_DUMP */ ! 568: } ! 569: ! 570: initialized = 1; ! 571: ! 572: /* Enter editor command loop. This never returns. */ ! 573: Frecursive_edit (); ! 574: /* NOTREACHED */ ! 575: } ! 576: ! 577: DEFUN ("kill-emacs", Fkill_emacs, Skill_emacs, 0, 1, "P", ! 578: "Exit the Emacs job and kill it. ARG means no query.\n\ ! 579: If emacs is running noninteractively and ARG is an integer,\n\ ! 580: return ARG as the exit program code.") ! 581: (arg) ! 582: Lisp_Object arg; ! 583: { ! 584: Lisp_Object answer; ! 585: int i; ! 586: struct gcpro gcpro1; ! 587: ! 588: GCPRO1 (arg); ! 589: ! 590: if (!EQ (Vkill_emacs_hook, Qnil)) ! 591: call0 (Vkill_emacs_hook); ! 592: ! 593: if (feof (stdin)) ! 594: arg = Qt; ! 595: ! 596: #ifdef subprocesses ! 597: kill_buffer_processes (Qnil); ! 598: #endif /* subprocesses */ ! 599: ! 600: #ifdef VMS ! 601: kill_vms_processes (); ! 602: #endif /* VMS */ ! 603: ! 604: Fdo_auto_save (Qt); ! 605: ! 606: #ifdef CLASH_DETECTION ! 607: unlock_all_files (); ! 608: #endif /* CLASH_DETECTION */ ! 609: ! 610: fflush (stdout); ! 611: reset_sys_modes (); ! 612: UNGCPRO; ! 613: ! 614: /* Is it really necessary to do this deassign ! 615: when we are going to exit anyway? */ ! 616: /* #ifdef VMS ! 617: stop_vms_input (); ! 618: #endif */ ! 619: stuff_buffered_input (arg); ! 620: #ifdef SIGIO ! 621: /* There is a tendency for a SIGIO signal to arrive within exit, ! 622: and cause a SIGHUP because the input descriptor is already closed. */ ! 623: unrequest_sigio (); ! 624: signal (SIGIO, SIG_IGN); ! 625: #endif ! 626: exit ((XTYPE (arg) == Lisp_Int) ? XINT (arg) ! 627: #ifdef VMS ! 628: : 1 ! 629: #else ! 630: : 0 ! 631: #endif ! 632: ); ! 633: /* NOTREACHED */ ! 634: } ! 635: ! 636: #ifndef CANNOT_DUMP ! 637: /* Nothing like this can be implemented on an Apollo. ! 638: What a loss! */ ! 639: ! 640: #ifdef HAVE_SHM ! 641: ! 642: DEFUN ("dump-emacs-data", Fdump_emacs_data, Sdump_emacs_data, 1, 1, 0, ! 643: "Dump current state of Emacs into data file FILENAME.\n\ ! 644: This function exists on systems that use HAVE_SHM.") ! 645: (intoname) ! 646: Lisp_Object intoname; ! 647: { ! 648: extern int my_edata; ! 649: Lisp_Object tem; ! 650: extern void malloc_warning (); ! 651: ! 652: CHECK_STRING (intoname, 0); ! 653: intoname = Fexpand_file_name (intoname, Qnil); ! 654: ! 655: tem = Vpurify_flag; ! 656: Vpurify_flag = Qnil; ! 657: ! 658: fflush (stdout); ! 659: /* Tell malloc where start of impure now is */ ! 660: /* Also arrange for warnings when nearly out of space. */ ! 661: #ifndef SYSTEM_MALLOC ! 662: malloc_init (&my_edata, malloc_warning); ! 663: #endif ! 664: map_out_data (XSTRING (intoname)->data); ! 665: ! 666: Vpurify_flag = tem; ! 667: ! 668: return Qnil; ! 669: } ! 670: ! 671: #else /* not HAVE_SHM */ ! 672: ! 673: DEFUN ("dump-emacs", Fdump_emacs, Sdump_emacs, 2, 2, 0, ! 674: "Dump current state of Emacs into executable file FILENAME.\n\ ! 675: Take symbols from SYMFILE (presumably the file you executed to run Emacs).") ! 676: (intoname, symname) ! 677: Lisp_Object intoname, symname; ! 678: { ! 679: extern int my_edata; ! 680: Lisp_Object tem; ! 681: extern void malloc_warning (); ! 682: ! 683: CHECK_STRING (intoname, 0); ! 684: intoname = Fexpand_file_name (intoname, Qnil); ! 685: if (!EQ (symname, Qnil)) ! 686: { ! 687: CHECK_STRING (symname, 0); ! 688: if (XSTRING (symname)->size) ! 689: symname = Fexpand_file_name (symname, Qnil); ! 690: } ! 691: ! 692: tem = Vpurify_flag; ! 693: Vpurify_flag = Qnil; ! 694: ! 695: fflush (stdout); ! 696: #ifdef VMS ! 697: mapout_data (XSTRING (intoname)->data); ! 698: #else ! 699: /* Tell malloc where start of impure now is */ ! 700: /* Also arrange for warnings when nearly out of space. */ ! 701: #ifndef SYSTEM_MALLOC ! 702: malloc_init (&my_edata, malloc_warning); ! 703: #endif ! 704: unexec (XSTRING (intoname)->data, ! 705: !EQ (symname, Qnil) ? XSTRING (symname)->data : 0, &my_edata, 0, 0); ! 706: #endif /* not VMS */ ! 707: ! 708: Vpurify_flag = tem; ! 709: ! 710: return Qnil; ! 711: } ! 712: ! 713: #endif /* not HAVE_SHM */ ! 714: ! 715: #endif /* not CANNOT_DUMP */ ! 716: ! 717: #ifdef VMS ! 718: #define SEPCHAR ',' ! 719: #else ! 720: #define SEPCHAR ':' ! 721: #endif ! 722: ! 723: Lisp_Object ! 724: decode_env_path (evarname, defalt) ! 725: char *evarname, *defalt; ! 726: { ! 727: register char *path, *p; ! 728: extern char *index (); ! 729: ! 730: Lisp_Object lpath; ! 731: ! 732: if (evarname != 0) ! 733: path = (char *) egetenv (evarname); ! 734: else ! 735: path = 0; ! 736: if (!path) ! 737: path = defalt; ! 738: lpath = Qnil; ! 739: while (1) ! 740: { ! 741: p = index (path, SEPCHAR); ! 742: if (!p) p = path + strlen (path); ! 743: lpath = Fcons (p - path ? make_string (path, p - path) : Qnil, ! 744: lpath); ! 745: if (*p) ! 746: path = p + 1; ! 747: else ! 748: break; ! 749: } ! 750: return Fnreverse (lpath); ! 751: } ! 752: ! 753: syms_of_emacs () ! 754: { ! 755: #ifndef CANNOT_DUMP ! 756: #ifdef HAVE_SHM ! 757: defsubr (&Sdump_emacs_data); ! 758: #else ! 759: defsubr (&Sdump_emacs); ! 760: #endif ! 761: #endif /* not CANNOT_DUMP */ ! 762: ! 763: defsubr (&Skill_emacs); ! 764: ! 765: DEFVAR_LISP ("command-line-args", &Vcommand_line_args, ! 766: "Args passed by shell to Emacs, as a list of strings."); ! 767: ! 768: DEFVAR_LISP ("system-type", &Vsystem_type, ! 769: "Symbol indicating type of operating system you are using."); ! 770: Vsystem_type = intern (SYSTEM_TYPE); ! 771: ! 772: DEFVAR_BOOL ("noninteractive", &noninteractive1, ! 773: "Non-nil means Emacs is running without interactive terminal."); ! 774: ! 775: Vkill_emacs_hook = Qnil; ! 776: ! 777: DEFVAR_LISP ("kill-emacs-hook", &Vkill_emacs_hook, ! 778: "Function called, if non-nil, whenever kill-emacs is called."); ! 779: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.