/* Fully extensible Emacs, running on Unix, intended for GNU.
- Copyright (C) 1985,86,87,93,94,95,97,1998 Free Software Foundation, Inc.
+ Copyright (C) 1985,86,87,93,94,95,97,98,1999 Free Software Foundation, Inc.
This file is part of GNU Emacs.
Boston, MA 02111-1307, USA. */
+#include <config.h>
#include <signal.h>
#include <errno.h>
-
-#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include <ssdef.h>
#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
#ifdef BSD_SYSTEM
#include <sys/ioctl.h>
#endif
#include "termhooks.h"
#include "keyboard.h"
+#ifdef HAVE_SETLOCALE
+#include <locale.h>
+#endif
+
#ifdef HAVE_SETRLIMIT
#include <sys/time.h>
#include <sys/resource.h>
extern void malloc_warning ();
extern void set_time_zone_rule ();
extern char *index ();
-extern char *strerror ();
+
+/* Make these values available in GDB, which doesn't see macros. */
+
+EMACS_INT gdb_valbits = VALBITS;
+EMACS_INT gdb_gctypebits = GCTYPEBITS;
+EMACS_INT gdb_emacs_intbits = sizeof (EMACS_INT) * BITS_PER_CHAR;
+#ifdef DATA_SEG_BITS
+EMACS_INT gdb_data_seg_bits = DATA_SEG_BITS;
+#else
+EMACS_INT gdb_data_seg_bits = 0;
+#endif
+EMACS_INT PVEC_FLAG = PSEUDOVECTOR_FLAG;
/* Command line args from shell, as list of strings */
Lisp_Object Vcommand_line_args;
Lisp_Object Qfile_name_handler_alist;
+/* Current and previous system locales for messages and time. */
+Lisp_Object Vsystem_messages_locale;
+Lisp_Object Vprevious_system_messages_locale;
+Lisp_Object Vsystem_time_locale;
+Lisp_Object Vprevious_system_time_locale;
+
/* If non-zero, emacs should not attempt to use an window-specific code,
but instead should use the virtual terminal under which it was started */
int inhibit_window_system;
buf.kind = user_signal;
buf.code = 0;
- buf.frame_or_window = Fselected_frame ();
+ buf.frame_or_window = selected_frame;
buf.modifiers = 0;
buf.timestamp = 0;
buf.kind = user_signal;
buf.code = 1;
- buf.frame_or_window = Fselected_frame ();
+ buf.frame_or_window = selected_frame;
buf.modifiers = 0;
buf.timestamp = 0;
MSDOS has its own definition on msdos.c */
#if ! defined (DOS_NT) && ! defined (NO_ABORT)
-void
+
+#ifndef ABORT_RETURN_TYPE
+#define ABORT_RETURN_TYPE void
+#endif
+
+ABORT_RETURN_TYPE
abort ()
{
kill (getpid (), SIGABRT);
char **envp;
{
char stack_bottom_variable;
+ int do_initial_setlocale;
int skip_args = 0;
extern int errno;
extern int sys_nerr;
setuid (getuid ());
#endif /* SET_EMACS_PRIORITY */
+ /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
+ The build procedure uses this while dumping, to ensure that the
+ dumped Emacs does not have its system locale tables initialized,
+ as that might cause screwups when the dumped Emacs starts up. */
+ {
+ char *lc_all = getenv ("LC_ALL");
+ do_initial_setlocale = ! lc_all || strcmp (lc_all, "C");
+ }
+
+ /* Set locale now, so that initial error messages are localized properly.
+ fixup_locale must wait until later, since it builds strings. */
+ if (do_initial_setlocale)
+ setlocale (LC_ALL, "");
+
#ifdef EXTRA_INITIALIZE
EXTRA_INITIALIZE;
#endif
if (argmatch (argv, argc, "-t", "--terminal", 4, &term, &skip_args))
{
int result;
- close (0);
- close (1);
- result = open (term, O_RDWR, 2 );
+ emacs_close (0);
+ emacs_close (1);
+ result = emacs_open (term, O_RDWR, 0);
if (result < 0)
{
char *errstring = strerror (errno);
[-q] [--no-init-file] [-u user] [--user user] [--debug-init]\n\
[--unibyte] [--multibyte] [--version] [--no-site-file]\n\
[-f func] [--funcall func] [-l file] [--load file] [--eval expr]\n\
- [--insert file] [+linenum] file-to-visit [--kill]\n\
+ [--execute expr] [--visit file] [--file file] [--insert file]\n\
+ [+linenum] file-to-visit [--kill]\n\
Report bugs to bug-gnu-emacs@gnu.org. First, please see\n\
the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
exit (0);
#endif
}
-#ifdef POSIX_SIGNALS
init_signals ();
-#endif
/* Don't catch SIGHUP if dumping. */
if (1
}
init_alloc ();
+
+ if (do_initial_setlocale)
+ {
+ fixup_locale ();
+ Vsystem_messages_locale = Vprevious_system_messages_locale;
+ Vsystem_time_locale = Vprevious_system_time_locale;
+ }
+
init_eval ();
init_coding ();
init_data ();
}
for (tail = Vbuffer_alist; CONSP (tail);
- tail = XCONS (tail)->cdr)
+ tail = XCDR (tail))
{
Lisp_Object buffer;
- buffer = Fcdr (XCONS (tail)->car);
+ buffer = Fcdr (XCAR (tail));
/* Verify that all buffers are empty now, as they
ought to be. */
if (BUF_Z (XBUFFER (buffer)) > BUF_BEG (XBUFFER (buffer)))
to run until we've recognized this argument. */
{
char *displayname = 0;
- int i;
int count_before = skip_args;
/* Skip any number of -d options, but only use the last one. */
/* AIX crashes are reported in system versions 3.2.3 and 3.2.4
if this is not done. Do it after set_process_environment so that we
don't pollute Vprocess_environment. */
-#ifdef AIX
+ /* Setting LANG here will defeat the startup locale processing... */
+#ifdef AIX3_2
putenv ("LANG=C");
#endif
syms_of_sound ();
#endif
- /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
syms_of_textprop ();
#ifdef VMS
syms_of_vmsproc ();
/* Gerd Moellmann <gerd@acm.org> says this makes profiling work on
FreeBSD. It might work on some other systems too.
Give it a try and tell me if it works on your system. */
-#ifdef __FreeBSD__
+#if defined (__FreeBSD__) || defined (__linux)
#ifdef PROFILING
if (initialized)
{
extern void _mcleanup ();
extern char etext;
extern void safe_bcopy ();
+ extern void dump_opcode_frequencies ();
+
atexit (_mcleanup);
+ // atexit (dump_opcode_frequencies);
/* 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
{ "-f", "--funcall", 0, 1 },
{ "-funcall", 0, 0, 1 },
{ "-eval", "--eval", 0, 1 },
+ { "-execute", "--execute", 0, 1 },
{ "-find-file", "--find-file", 0, 1 },
{ "-visit", "--visit", 0, 1 },
+ { "-file", "--file", 0, 1 },
{ "-insert", "--insert", 0, 1 },
/* This should be processed after ordinary file name args and the like. */
{ "-kill", "--kill", -10, 0 },
int incoming_used = 1;
int from;
int i;
- int end_of_options = argc;
/* Categorize all the options,
and figure out which argv elts are option arguments. */
(arg)
Lisp_Object arg;
{
- Lisp_Object hook, hook1;
- int i;
struct gcpro gcpro1;
GCPRO1 (arg);
#endif /* not CANNOT_DUMP */
\f
+#if HAVE_SETLOCALE
+/* Recover from setlocale (LC_ALL, ""). */
+void
+fixup_locale ()
+{
+ /* The Emacs Lisp reader needs LC_NUMERIC to be "C",
+ so that numbers are read and printed properly for Emacs Lisp. */
+ setlocale (LC_NUMERIC, "C");
+}
+
+/* Set system locale CATEGORY, with previous locale *PLOCALE, to
+ DESIRED_LOCALE. */
+static void
+synchronize_locale (category, plocale, desired_locale)
+ int category;
+ Lisp_Object *plocale;
+ Lisp_Object desired_locale;
+{
+ if (! EQ (*plocale, desired_locale))
+ {
+ *plocale = desired_locale;
+ setlocale (category, (STRINGP (desired_locale)
+ ? (char *)(XSTRING (desired_locale)->data)
+ : ""));
+ }
+}
+
+/* Set system time locale to match Vsystem_time_locale, if possible. */
+void
+synchronize_system_time_locale ()
+{
+ synchronize_locale (LC_TIME, &Vprevious_system_time_locale,
+ Vsystem_time_locale);
+}
+
+/* Set system messages locale to match Vsystem_messages_locale, if
+ possible. */
+void
+synchronize_system_messages_locale ()
+{
+#ifdef LC_MESSAGES
+ synchronize_locale (LC_MESSAGES, &Vprevious_system_messages_locale,
+ Vsystem_messages_locale);
+#endif
+}
+#endif /* HAVE_SETLOCALE */
+\f
#ifndef SEPCHAR
#define SEPCHAR ':'
#endif
installed locations, but we can find them\n\
near where the Emacs executable was found.");
Vinstallation_directory = Qnil;
+
+ DEFVAR_LISP ("system-messages-locale", &Vsystem_messages_locale,
+ "System locale for messages.");
+ Vsystem_messages_locale = Qnil;
+
+ DEFVAR_LISP ("previous-system-messages-locale",
+ &Vprevious_system_messages_locale,
+ "Most recently used system locale for messages.");
+ Vprevious_system_messages_locale = Qnil;
+
+ DEFVAR_LISP ("system-time-locale", &Vsystem_time_locale,
+ "System locale for time.");
+ Vsystem_time_locale = Qnil;
+
+ DEFVAR_LISP ("previous-system-time-locale", &Vprevious_system_time_locale,
+ "Most recently used system locale for time.");
+ Vprevious_system_time_locale = Qnil;
}