X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/89bfafe5d3e767c2f014b2738196411f8ba39d28..333f9019e29e9b6de3a7ec07448be1d364ba540b:/src/emacs.c diff --git a/src/emacs.c b/src/emacs.c index 39870ec007..12a48b2655 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -82,6 +82,10 @@ along with GNU Emacs. If not, see . */ #include #endif +#ifdef HAVE_LIBXML2 +#include +#endif + #ifndef O_RDWR #define O_RDWR 2 #endif @@ -150,6 +154,8 @@ Lisp_Object Qfile_name_handler_alist; Lisp_Object Qrisky_local_variable; +Lisp_Object Qkill_emacs; + /* If non-zero, Emacs should not attempt to use a window-specific code, but instead should use the virtual terminal under which it was started. */ int inhibit_window_system; @@ -158,7 +164,7 @@ int inhibit_window_system; data on the first attempt to change it inside asynchronous code. */ int running_asynch_code; -#if defined(HAVE_X_WINDOWS) || defined(HAVE_NS) +#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS) /* If non-zero, -d was specified, meaning we're using some window system. */ int display_arg; #endif @@ -167,8 +173,10 @@ int display_arg; Tells GC how to save a copy of the stack. */ char *stack_bottom; +#if defined (DOUG_LEA_MALLOC) || defined (GNU_LINUX) /* The address where the heap starts (from the first sbrk (0) call). */ static void *my_heap_start; +#endif #ifdef GNU_LINUX /* The gap between BSS end and heap start as far as we can tell. */ @@ -802,7 +810,7 @@ main (int argc, char **argv) { static char heapexec[] = "EMACS_HEAP_EXEC=true"; /* Set this so we only do this once. */ - putenv(heapexec); + putenv (heapexec); /* A flag to turn off address randomization which is introduced in linux kernel shipped with fedora core 4 */ @@ -842,7 +850,7 @@ main (int argc, char **argv) stack allocation routine for new process that the allocation fails if stack limit is not on page boundary. So, round up the new limit to page boundary. */ - newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize(); + newlim = (newlim + getpagesize () - 1) / getpagesize () * getpagesize (); #endif if (newlim > rlim.rlim_max) { @@ -943,7 +951,7 @@ main (int argc, char **argv) } /* Command line option --no-windows is deprecated and thus not mentioned - in the manual and usage informations. */ + in the manual and usage information. */ if (argmatch (argv, argc, "-nw", "--no-window-system", 6, NULL, &skip_args) || argmatch (argv, argc, "-nw", "--no-windows", 6, NULL, &skip_args)) inhibit_window_system = 1; @@ -1068,15 +1076,17 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem if (!dname_arg || !strchr (dname_arg, '\n')) { /* In orig, child: now exec w/special daemon name. */ char fdStr[80]; + int fdStrlen = + snprintf (fdStr, sizeof fdStr, + "--daemon=\n%d,%d\n%s", daemon_pipe[0], + daemon_pipe[1], dname_arg ? dname_arg : ""); - if (dname_arg && strlen (dname_arg) > 70) + if (! (0 <= fdStrlen && fdStrlen < sizeof fdStr)) { fprintf (stderr, "daemon: child name too long\n"); exit (1); } - sprintf (fdStr, "--daemon=\n%d,%d\n%s", daemon_pipe[0], - daemon_pipe[1], dname_arg ? dname_arg : ""); argv[skip_args] = fdStr; execv (argv[0], argv); @@ -1089,7 +1099,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem || strlen (dname_arg) < 1 || strlen (dname_arg) > 70) { fprintf (stderr, "emacs daemon: daemon name absent or too long\n"); - exit(1); + exit (1); } dname_arg2[0] = '\0'; sscanf (dname_arg, "\n%d,%d\n%s", &(daemon_pipe[0]), &(daemon_pipe[1]), @@ -1107,7 +1117,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem fcntl (daemon_pipe[1], F_SETFD, FD_CLOEXEC); #ifdef HAVE_SETSID - setsid(); + setsid (); #endif #else /* DOS_NT */ fprintf (stderr, "This platform does not support the -daemon flag.\n"); @@ -1120,7 +1130,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #if defined (USG5) && defined (INTERRUPT_INPUT) setpgrp (); #endif -#if defined (HAVE_GTK_AND_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) +#if defined (HAVE_PTHREAD) && !defined (SYSTEM_MALLOC) && !defined (DOUG_LEA_MALLOC) { extern void malloc_enable_thread (void); @@ -1308,7 +1318,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem = argmatch (argv, argc, "-nsl", "--no-site-lisp", 11, NULL, &skip_args); #ifdef HAVE_NS - ns_alloc_autorelease_pool(); + ns_alloc_autorelease_pool (); if (!noninteractive) { #ifdef NS_IMPL_COCOA @@ -1316,12 +1326,12 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem { /* FIXME: Do the right thing if getenv returns NULL, or if chdir fails. */ - if (!strncmp(argv[skip_args], "-psn", 4)) + if (!strncmp (argv[skip_args], "-psn", 4)) { skip_args += 1; chdir (getenv ("HOME")); } - else if (skip_args+1 < argc && !strncmp(argv[skip_args+1], "-psn", 4)) + else if (skip_args+1 < argc && !strncmp (argv[skip_args+1], "-psn", 4)) { skip_args += 2; chdir (getenv ("HOME")); @@ -1358,24 +1368,17 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* If we have the form --display=NAME, convert it into -d name. This requires inserting a new element into argv. */ - if (displayname != 0 && skip_args - count_before == 1) + if (displayname && count_before < skip_args) { - char **new = (char **) xmalloc (sizeof (char *) * (argc + 2)); - int j; - - for (j = 0; j < count_before + 1; j++) - new[j] = argv[j]; - new[count_before + 1] = (char *) "-d"; - new[count_before + 2] = displayname; - for (j = count_before + 2; j count_before - && argv[count_before + 1][1] == '-') - argv[count_before + 1] = (char *) "-d"; if (! no_site_lisp) { @@ -1401,7 +1404,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #endif /* argmatch must not be used after here, - except when bulding temacs + except when building temacs because the -d argument has not been skipped in skip_args. */ #ifdef MSDOS @@ -1553,9 +1556,9 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem #ifdef MSDOS syms_of_xmenu (); - syms_of_dosfns(); - syms_of_msdos(); - syms_of_win16select(); + syms_of_dosfns (); + syms_of_msdos (); + syms_of_win16select (); #endif /* MSDOS */ #ifdef HAVE_NS @@ -1590,6 +1593,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* Initialization that must be done even if the global variable initialized is non zero. */ #ifdef HAVE_NTGUI + globals_of_w32font (); globals_of_w32fns (); globals_of_w32menu (); globals_of_w32select (); @@ -1654,7 +1658,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem GNU/Linux and MinGW. It might work on some other systems too. Give it a try and tell us if it works on your system. To compile for profiling, use the configure option --enable-profiling. */ -#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined(__MINGW32__) +#if defined (__FreeBSD__) || defined (GNU_LINUX) || defined (__MINGW32__) #ifdef PROFILING if (initialized) { @@ -1838,8 +1842,8 @@ sort_args (int argc, char **argv) 0 for an option that takes no arguments, 1 for an option that takes one argument, etc. -1 for an ordinary non-option argument. */ - int *options = (int *) xmalloc (sizeof (int) * argc); - int *priority = (int *) xmalloc (sizeof (int) * argc); + int *options = xnmalloc (argc, sizeof *options); + int *priority = xnmalloc (argc, sizeof *priority); int to = 1; int incoming_used = 1; int from; @@ -1992,6 +1996,7 @@ all of which are called before Emacs is actually killed. */) { struct gcpro gcpro1; Lisp_Object hook; + int exit_code; GCPRO1 (arg); @@ -2016,7 +2021,10 @@ all of which are called before Emacs is actually killed. */) if (STRINGP (Vauto_save_list_file_name)) unlink (SSDATA (Vauto_save_list_file_name)); - exit (INTEGERP (arg) ? XINT (arg) : EXIT_SUCCESS); + exit_code = EXIT_SUCCESS; + if (noninteractive && (fflush (stdout) || ferror (stdout))) + exit_code = EXIT_FAILURE; + exit (INTEGERP (arg) ? XINT (arg) : exit_code); } @@ -2104,6 +2112,10 @@ shut_down_emacs (int sig, int no_x, Lisp_Object stuff) #ifdef HAVE_NS ns_term_shutdown (sig); #endif + +#ifdef HAVE_LIBXML2 + xmlCleanupParser (); +#endif } @@ -2185,7 +2197,7 @@ You must run Emacs in batch mode in order to dump it. */) memory_warnings (my_edata, malloc_warning); } #endif /* not WINDOWSNT */ -#if defined (HAVE_GTK_AND_PTHREAD) && !defined SYNC_INPUT +#if defined (HAVE_PTHREAD) && !defined SYNC_INPUT /* Pthread may call malloc before main, and then we will get an endless loop, because pthread_self (see alloc.c) calls malloc the first time it is called on some systems. */ @@ -2384,6 +2396,7 @@ syms_of_emacs (void) { DEFSYM (Qfile_name_handler_alist, "file-name-handler-alist"); DEFSYM (Qrisky_local_variable, "risky-local-variable"); + DEFSYM (Qkill_emacs, "kill-emacs"); #ifndef CANNOT_DUMP defsubr (&Sdump_emacs);