]> code.delx.au - gnu-emacs/blobdiff - src/emacs.c
(adjust_markers_for_delete): Fix last change.
[gnu-emacs] / src / emacs.c
index 34ab179dfde36c57e67cfd4d766ede619154bccd..521225687dfdfeedab75e145e8b1b2239cf0015e 100644 (file)
@@ -1,5 +1,5 @@
 /* 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.
 
@@ -19,10 +19,9 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
 
+#include <config.h>
 #include <signal.h>
 #include <errno.h>
-
-#include <config.h>
 #include <stdio.h>
 
 #include <sys/types.h>
@@ -32,6 +31,10 @@ Boston, MA 02111-1307, USA.  */
 #include <ssdef.h>
 #endif
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 #ifdef BSD_SYSTEM
 #include <sys/ioctl.h>
 #endif
@@ -48,6 +51,10 @@ Boston, MA 02111-1307, USA.  */
 #include "termhooks.h"
 #include "keyboard.h"
 
+#ifdef HAVE_SETLOCALE
+#include <locale.h>
+#endif
+
 #ifdef HAVE_SETRLIMIT
 #include <sys/time.h>
 #include <sys/resource.h>
@@ -60,7 +67,18 @@ Boston, MA 02111-1307, USA.  */
 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;
@@ -120,6 +138,12 @@ Lisp_Object Vsystem_configuration_options;
 
 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;
@@ -192,7 +216,7 @@ handle_USR1_signal (sig)
 
   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;
 
@@ -209,7 +233,7 @@ handle_USR2_signal (sig)
 
   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;
 
@@ -270,7 +294,12 @@ memory_warning_signal (sig)
    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);
@@ -594,6 +623,7 @@ main (argc, argv, envp)
      char **envp;
 {
   char stack_bottom_variable;
+  int do_initial_setlocale;
   int skip_args = 0;
   extern int errno;
   extern int sys_nerr;
@@ -777,6 +807,20 @@ main (argc, argv, envp)
   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
@@ -790,9 +834,9 @@ main (argc, argv, envp)
       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);
@@ -831,7 +875,8 @@ Usage: %s [--batch]  [-t term] [--terminal term]\n\
       [-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);
@@ -852,9 +897,7 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
 #endif
     }
 
-#ifdef POSIX_SIGNALS
   init_signals ();
-#endif
 
   /* Don't catch SIGHUP if dumping.  */
   if (1
@@ -986,6 +1029,14 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
     }
 
   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 ();
@@ -1041,11 +1092,11 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
            }
 
          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)))
@@ -1067,7 +1118,6 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
      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.  */
@@ -1139,7 +1189,8 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
   /* 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
 
@@ -1218,7 +1269,6 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
       syms_of_sound ();
 #endif
 
-      /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
       syms_of_textprop ();
 #ifdef VMS
       syms_of_vmsproc ();
@@ -1337,14 +1387,17 @@ the Bugs section of the Emacs manual or the file BUGS.\n", argv[0]);
   /* 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
@@ -1449,8 +1502,10 @@ struct standard_args standard_args[] =
   { "-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 },
@@ -1481,7 +1536,6 @@ sort_args (argc, argv)
   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.  */
@@ -1623,8 +1677,6 @@ all of which are called before Emacs is actually killed.")
   (arg)
      Lisp_Object arg;
 {
-  Lisp_Object hook, hook1;
-  int i;
   struct gcpro gcpro1;
 
   GCPRO1 (arg);
@@ -1855,6 +1907,53 @@ You must run Emacs in batch mode in order to dump it.")
 
 #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
@@ -1999,4 +2098,21 @@ This is non-nil when we can't find those directories in their standard\n\
 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;
 }