/* Fully extensible Emacs, running on Unix, intended for GNU.
-Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2011
+Copyright (C) 1985-1987, 1993-1995, 1997-1999, 2001-2012
Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include "commands.h"
#include "intervals.h"
+#include "character.h"
#include "buffer.h"
#include "window.h"
#include "nsterm.h"
#endif
+#if (defined PROFILING \
+ && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__))
+# include <sys/gmon.h>
+extern void moncontrol (int mode);
+#endif
+
#ifdef HAVE_X_WINDOWS
#include "xterm.h"
#endif
#include <sys/personality.h>
#endif
-#ifdef HAVE_LIBXML2
-#include <libxml/parser.h>
-#endif
-
#ifndef O_RDWR
#define O_RDWR 2
#endif
-#ifdef HAVE_SETPGID
-#if !defined (USG)
-#undef setpgrp
-#define setpgrp setpgid
-#endif
-#endif
-
static const char emacs_version[] = VERSION;
-static const char emacs_copyright[] = "Copyright (C) 2011 Free Software Foundation, Inc.";
-
-/* Make these values available in GDB, which doesn't see macros. */
-
-#ifdef USE_LSB_TAG
-int gdb_use_lsb EXTERNALLY_VISIBLE = 1;
-#else
-int gdb_use_lsb EXTERNALLY_VISIBLE = 0;
-#endif
-#ifndef USE_LISP_UNION_TYPE
-int gdb_use_union EXTERNALLY_VISIBLE = 0;
-#else
-int gdb_use_union EXTERNALLY_VISIBLE = 1;
-#endif
-int gdb_valbits EXTERNALLY_VISIBLE = VALBITS;
-int gdb_gctypebits EXTERNALLY_VISIBLE = GCTYPEBITS;
-#if defined (DATA_SEG_BITS) && ! defined (USE_LSB_TAG)
-uintptr_t gdb_data_seg_bits EXTERNALLY_VISIBLE = DATA_SEG_BITS;
-#else
-uintptr_t gdb_data_seg_bits EXTERNALLY_VISIBLE = 0;
-#endif
-ptrdiff_t PVEC_FLAG EXTERNALLY_VISIBLE = PSEUDOVECTOR_FLAG;
-ptrdiff_t gdb_array_mark_flag EXTERNALLY_VISIBLE = ARRAY_MARK_FLAG;
-/* GDB might say "No enum type named pvec_type" if we don't have at
- least one symbol with that type, and then xbacktrace could fail. */
-enum pvec_type gdb_pvec_type EXTERNALLY_VISIBLE = PVEC_TYPE_MASK;
+static const char emacs_copyright[] = "Copyright (C) 2012 Free Software Foundation, Inc.";
/* Empty lisp strings. To avoid having to build any others. */
Lisp_Object empty_unibyte_string, empty_multibyte_string;
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;
pthread_t main_thread;
#endif
+#ifdef HAVE_NS
+/* NS autrelease pool, for memory management. */
+static void *ns_pool;
+#endif
+
+
/* Handle bus errors, invalid instruction, etc. */
#ifndef FLOAT_CATCH_SIGILL
if (!NILP (Vinvocation_directory))
{
dir = Vinvocation_directory;
+#ifdef WINDOWSNT
+ /* If we are running from the build directory, set DIR to the
+ src subdirectory of the Emacs tree, like on Posix
+ platforms. */
+ if (SBYTES (dir) > sizeof ("/i386/") - 1
+ && 0 == strcmp (SSDATA (dir) + SBYTES (dir) - sizeof ("/i386/") + 1,
+ "/i386/"))
+ dir = Fexpand_file_name (build_string ("../.."), dir);
+#else /* !WINDOWSNT */
+#endif
name = Fexpand_file_name (Vinvocation_name, dir);
while (1)
{
/* Define a dummy function F. Declare F too, to pacify gcc
-Wmissing-prototypes. */
#define DEFINE_DUMMY_FUNCTION(f) \
- void f (void) EXTERNALLY_VISIBLE; void f (void) {}
+ void f (void) ATTRIBUTE_CONST EXTERNALLY_VISIBLE; void f (void) {}
#ifndef GCC_CTORS_IN_LIBC
DEFINE_DUMMY_FUNCTION (__do_global_ctors)
}
/* 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;
init_alloc_once ();
init_obarray ();
init_eval_once ();
- init_character_once ();
init_charset_once ();
init_coding_once ();
init_syntax_once (); /* Create standard syntax table. */
init_eval ();
init_data ();
-#ifdef CLASH_DETECTION
- init_filelock ();
-#endif
init_atimer ();
running_asynch_code = 0;
= argmatch (argv, argc, "-nsl", "--no-site-lisp", 11, NULL, &skip_args);
#ifdef HAVE_NS
- ns_alloc_autorelease_pool ();
+ ns_pool = ns_alloc_autorelease_pool ();
if (!noninteractive)
{
#ifdef NS_IMPL_COCOA
#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
init_ntproc (); /* must precede init_editfns. */
#endif
-#ifdef HAVE_NS
-#ifndef CANNOT_DUMP
- if (initialized)
-#endif
- ns_init_paths ();
-#endif
-
/* Initialize and GC-protect Vinitial_environment and
Vprocess_environment before set_initial_environment fills them
in. */
init_callproc (); /* Must follow init_cmdargs but not init_sys_modes. */
init_lread ();
+#ifdef WINDOWSNT
+ /* Check to see if Emacs has been installed correctly. */
+ check_windows_init_file ();
+#endif
/* Intern the names of all standard functions and variables;
define standard keys. */
/* 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 ();
init_charset ();
- init_editfns (); /* init_process uses Voperating_system_release. */
- init_process (); /* init_display uses add_keyboard_wait_descriptor. */
+ init_editfns (); /* init_process_emacs uses Voperating_system_release. */
+ init_process_emacs (); /* init_display uses add_keyboard_wait_descriptor. */
init_keyboard (); /* This too must precede init_sys_modes. */
if (!noninteractive)
init_display (); /* Determine terminal type. Calls init_sys_modes. */
- init_fns ();
init_xdisp ();
#ifdef HAVE_WINDOW_SYSTEM
init_fringe ();
- init_image ();
#endif /* HAVE_WINDOW_SYSTEM */
init_macros ();
init_floatfns ();
-#ifdef HAVE_SOUND
- init_sound ();
-#endif
init_window ();
init_font ();
#ifdef PROFILING
if (initialized)
{
- extern void _mcleanup ();
#ifdef __MINGW32__
extern unsigned char etext asm ("etext");
#else
extern char etext;
#endif
-#ifdef HAVE___EXECUTABLE_START
- /* This symbol is defined by GNU ld to the start of the text
- segment. */
- extern char __executable_start[];
-#else
- extern void safe_bcopy ();
-#endif
atexit (_mcleanup);
-#ifdef HAVE___EXECUTABLE_START
- monstartup (__executable_start, &etext);
-#else
- /* This uses safe_bcopy because that function comes first in the
- Emacs executable. It might be better to use something that
- gives the start of the text segment, but start_of_text is not
- defined on all systems now. */
- /* FIXME: Does not work on architectures with function
- descriptors. */
- monstartup (safe_bcopy, &etext);
-#endif
+ monstartup ((uintptr_t) __executable_start, (uintptr_t) &etext);
}
else
moncontrol (0);
static void
sort_args (int argc, char **argv)
{
- char **new = (char **) xmalloc (sizeof (char *) * argc);
+ char **new = xmalloc (argc * sizeof *new);
/* For each element of argv,
the corresponding element of options is:
0 for an option that takes no arguments,
shut_down_emacs (0, 0, STRINGP (arg) ? arg : Qnil);
+#ifdef HAVE_NS
+ ns_release_autorelease_pool (ns_pool);
+#endif
+
/* If we have an auto-save list file,
kill it because we are exiting Emacs deliberately (not crashing).
Do it after shut_down_emacs, which does an auto-save. */
#endif
#ifdef HAVE_LIBXML2
- xmlCleanupParser ();
+ xml_cleanup_parser ();
#endif
}
}
#endif /* HAVE_SETLOCALE */
\f
-#ifndef SEPCHAR
-#define SEPCHAR ':'
-#endif
Lisp_Object
decode_env_path (const char *evarname, const char *defalt)
{
const char *path, *p;
Lisp_Object lpath, element, tem;
+ int defaulted = 0;
+#ifdef WINDOWSNT
+ const char *emacs_dir = egetenv ("emacs_dir");
+ static const char *emacs_dir_env = "%emacs_dir%/";
+ const size_t emacs_dir_len = strlen (emacs_dir_env);
+#endif
/* It's okay to use getenv here, because this function is only used
to initialize variables when Emacs starts up, and isn't called
else
path = 0;
if (!path)
- path = defalt;
+ {
+ path = defalt;
+ defaulted = 1;
+ }
#ifdef DOS_NT
/* Ensure values from the environment use the proper directory separator. */
if (path)
p = path + strlen (path);
element = (p - path ? make_string (path, p - path)
: build_string ("."));
+#ifdef WINDOWSNT
+ /* Relative file names in the default path are interpreted as
+ being relative to $emacs_dir. */
+ if (emacs_dir && defaulted
+ && strncmp (path, emacs_dir_env, emacs_dir_len) == 0)
+ element = Fexpand_file_name (Fsubstring (element,
+ make_number (emacs_dir_len),
+ Qnil),
+ build_string (emacs_dir));
+#endif
/* Add /: to the front of the name
if it would otherwise be treated as magic. */
{
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);
Anything else (in Emacs 24.1, the possibilities are: aix, berkeley-unix,
hpux, irix, usg-unix-v) indicates some sort of Unix system. */);
Vsystem_type = intern_c_string (SYSTEM_TYPE);
- /* The above values are from SYSTEM_TYPE in include files under src/s. */
+ /* See configure.ac (and config.nt) for the possible SYSTEM_TYPEs. */
DEFVAR_LISP ("system-configuration", Vsystem_configuration,
doc: /* Value is string indicating configuration Emacs was built for.
DEFVAR_LISP ("installation-directory", Vinstallation_directory,
doc: /* A directory within which to look for the `lib-src' and `etc' directories.
-This is non-nil when we can't find those directories in their standard
-installed locations, but we can find them near where the Emacs executable
-was found. */);
+In an installed Emacs, this is normally nil. It is non-nil if
+both `lib-src' (on MS-DOS, `info') and `etc' directories are found
+within the variable `invocation-directory' or its parent. For example,
+this is the case when running an uninstalled Emacs executable from its
+build directory. */);
Vinstallation_directory = Qnil;
DEFVAR_LISP ("system-messages-locale", Vsystem_messages_locale,