diff options
| author | Tom Tromey <tromey@redhat.com> | 2012-12-17 07:56:22 -0700 | 
|---|---|---|
| committer | Tom Tromey <tromey@redhat.com> | 2012-12-17 07:56:22 -0700 | 
| commit | 3d6eced1ae51ffd0a782130e7c334052277e2724 (patch) | |
| tree | 5d1d2ad7cd3374f922886c4a72062511a035c168 /src/editfns.c | |
| parent | bf69f522a9e135f9aa483cedd53e71e915f2bf75 (diff) | |
| parent | 7c3d167f48d6262ee4e5512aa50a07ee96bc1509 (diff) | |
| download | emacs-3d6eced1ae51ffd0a782130e7c334052277e2724.tar.gz | |
merge from trunk
Diffstat (limited to 'src/editfns.c')
| -rw-r--r-- | src/editfns.c | 434 | 
1 files changed, 219 insertions, 215 deletions
diff --git a/src/editfns.c b/src/editfns.c index a14e043c1bf..911cd416e80 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -21,10 +21,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */  #include <config.h>  #include <sys/types.h>  #include <stdio.h> -#include <setjmp.h>  #ifdef HAVE_PWD_H  #include <pwd.h> +#include <grp.h>  #endif  #include <unistd.h> @@ -79,6 +79,15 @@ Lisp_Object Qfield;  static Lisp_Object Qboundary; +/* The startup value of the TZ environment variable so it can be +   restored if the user calls set-time-zone-rule with a nil +   argument.  If null, the TZ environment variable was unset.  */ +static char const *initial_tz; + +/* True if the static variable tzvalbuf (defined in +   set_time_zone_rule) is part of 'environ'.  */ +static bool tzvalbuf_in_environ; +  void  init_editfns (void) @@ -97,6 +106,9 @@ init_editfns (void)      return;  #endif /* not CANNOT_DUMP */ +  initial_tz = getenv ("TZ"); +  tzvalbuf_in_environ = 0; +    pw = getpwuid (getuid ());  #ifdef MSDOS    /* We let the real user name default to "root" because that's quite @@ -739,17 +751,18 @@ Field boundaries are not noticed if `inhibit-field-text-motion' is non-nil.  */)  DEFUN ("line-beginning-position",         Fline_beginning_position, Sline_beginning_position, 0, 1, 0,         doc: /* Return the character position of the first character on the current line. -With argument N not nil or 1, move forward N - 1 lines first. -If scan reaches end of buffer, return that position. +With optional argument N, scan forward N - 1 lines first. +If the scan reaches the end of the buffer, return that position. -The returned position is of the first character in the logical order, -i.e. the one that has the smallest character position. +This function ignores text display directionality; it returns the +position of the first character in logical order, i.e. the smallest +character position on the line.  This function constrains the returned position to the current field -unless that would be on a different line than the original, +unless that position would be on a different line than the original,  unconstrained result.  If N is nil or 1, and a front-sticky field  starts at point, the scan stops as soon as it starts.  To ignore field -boundaries bind `inhibit-field-text-motion' to t. +boundaries, bind `inhibit-field-text-motion' to t.  This function does not move point.  */)    (Lisp_Object n) @@ -783,8 +796,9 @@ DEFUN ("line-end-position", Fline_end_position, Sline_end_position, 0, 1, 0,  With argument N not nil or 1, move forward N - 1 lines first.  If scan reaches end of buffer, return that position. -The returned position is of the last character in the logical order, -i.e. the character whose buffer position is the largest one. +This function ignores text display directionality; it returns the +position of the last character in logical order, i.e. the largest +character position on the line.  This function constrains the returned position to the current field  unless that would be on a different line than the original, @@ -812,34 +826,43 @@ This function does not move point.  */)  			      Qnil, Qt, Qnil);  } - +/* Save current buffer state for `save-excursion' special form. +   We (ab)use Lisp_Misc_Save_Value to allow explicit free and so +   offload some work from GC.  */ +  Lisp_Object  save_excursion_save (void)  { -  bool visible = (XBUFFER (XWINDOW (selected_window)->buffer) -		  == current_buffer); - -  return Fcons (Fpoint_marker (), -		Fcons (Fcopy_marker (BVAR (current_buffer, mark), Qnil), -		       Fcons (visible ? Qt : Qnil, -			      Fcons (BVAR (current_buffer, mark_active), -				     selected_window)))); +  Lisp_Object save, *data = xmalloc (word_size * 4); + +  data[0] = Fpoint_marker (); +  /* Do not copy the mark if it points to nowhere.  */ +  data[1] = (XMARKER (BVAR (current_buffer, mark))->buffer +	     ? Fcopy_marker (BVAR (current_buffer, mark), Qnil) +	     : Qnil); +  /* Selected window if current buffer is shown in it, nil otherwise.  */ +  data[2] = ((XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer) +	     ? selected_window : Qnil); +  data[3] = BVAR (current_buffer, mark_active); + +  save = make_save_value (data, 4); +  XSAVE_VALUE (save)->dogc = 1; +  return save;  } +/* Restore saved buffer before leaving `save-excursion' special form.  */ +  Lisp_Object  save_excursion_restore (Lisp_Object info)  { -  Lisp_Object tem, tem1, omark, nmark; +  Lisp_Object tem, tem1, omark, nmark, *data = XSAVE_VALUE (info)->pointer;    struct gcpro gcpro1, gcpro2, gcpro3; -  bool visible_p; -  tem = Fmarker_buffer (XCAR (info)); -  /* If buffer being returned to is now deleted, avoid error */ -  /* Otherwise could get error here while unwinding to top level -     and crash */ -  /* In that case, Fmarker_buffer returns nil now.  */ +  tem = Fmarker_buffer (data[0]); +  /* If we're unwinding to top level, saved buffer may be deleted.  This +     means that all of its markers are unchained and so tem is nil.  */    if (NILP (tem)) -    return Qnil; +    goto out;    omark = nmark = Qnil;    GCPRO3 (info, omark, nmark); @@ -847,35 +870,24 @@ save_excursion_restore (Lisp_Object info)    Fset_buffer (tem);    /* Point marker.  */ -  tem = XCAR (info); +  tem = data[0];    Fgoto_char (tem);    unchain_marker (XMARKER (tem));    /* Mark marker.  */ -  info = XCDR (info); -  tem = XCAR (info); +  tem = data[1];    omark = Fmarker_position (BVAR (current_buffer, mark)); -  Fset_marker (BVAR (current_buffer, mark), tem, Fcurrent_buffer ()); -  nmark = Fmarker_position (tem); -  unchain_marker (XMARKER (tem)); +  if (NILP (tem)) +    unchain_marker (XMARKER (BVAR (current_buffer, mark))); +  else +    { +      Fset_marker (BVAR (current_buffer, mark), tem, Fcurrent_buffer ()); +      nmark = Fmarker_position (tem); +      unchain_marker (XMARKER (tem)); +    } -  /* visible */ -  info = XCDR (info); -  visible_p = !NILP (XCAR (info)); - -#if 0 /* We used to make the current buffer visible in the selected window -	 if that was true previously.  That avoids some anomalies. -	 But it creates others, and it wasn't documented, and it is simpler -	 and cleaner never to alter the window/buffer connections.  */ -  tem1 = Fcar (tem); -  if (!NILP (tem1) -      && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer)) -    Fswitch_to_buffer (Fcurrent_buffer (), Qnil); -#endif /* 0 */ - -  /* Mark active */ -  info = XCDR (info); -  tem = XCAR (info); +  /* Mark active.  */ +  tem = data[3];    tem1 = BVAR (current_buffer, mark_active);    bset_mark_active (current_buffer, tem); @@ -899,8 +911,8 @@ save_excursion_restore (Lisp_Object info)    /* If buffer was visible in a window, and a different window was       selected, and the old selected window is still showing this       buffer, restore point in that window.  */ -  tem = XCDR (info); -  if (visible_p +  tem = data[2]; +  if (WINDOWP (tem)        && !EQ (tem, selected_window)        && (tem1 = XWINDOW (tem)->buffer,  	  (/* Window is live...  */ @@ -910,6 +922,10 @@ save_excursion_restore (Lisp_Object info)      Fset_window_point (tem, make_number (PT));    UNGCPRO; + + out: + +  free_save_value (info);    return Qnil;  } @@ -1218,9 +1234,9 @@ of the user with that uid, or nil if there is no such user.  */)      return Vuser_login_name;    CONS_TO_INTEGER (uid, uid_t, id); -  BLOCK_INPUT; +  block_input ();    pw = getpwuid (id); -  UNBLOCK_INPUT; +  unblock_input ();    return (pw ? build_string (pw->pw_name) : Qnil);  } @@ -1257,6 +1273,24 @@ Value is an integer or a float, depending on the value.  */)    return make_fixnum_or_float (uid);  } +DEFUN ("group-gid", Fgroup_gid, Sgroup_gid, 0, 0, 0, +       doc: /* Return the effective gid of Emacs. +Value is an integer or a float, depending on the value.  */) +  (void) +{ +  gid_t egid = getegid (); +  return make_fixnum_or_float (egid); +} + +DEFUN ("group-real-gid", Fgroup_real_gid, Sgroup_real_gid, 0, 0, 0, +       doc: /* Return the real gid of Emacs. +Value is an integer or a float, depending on the value.  */) +  (void) +{ +  gid_t gid = getgid (); +  return make_fixnum_or_float (gid); +} +  DEFUN ("user-full-name", Fuser_full_name, Suser_full_name, 0, 1, 0,         doc: /* Return the full name of the user logged in, as a string.  If the full name corresponding to Emacs's userid is not known, @@ -1278,15 +1312,15 @@ name, or nil if there is no such user.  */)      {        uid_t u;        CONS_TO_INTEGER (uid, uid_t, u); -      BLOCK_INPUT; +      block_input ();        pw = getpwuid (u); -      UNBLOCK_INPUT; +      unblock_input ();      }    else if (STRINGP (uid))      { -      BLOCK_INPUT; +      block_input ();        pw = getpwnam (SSDATA (uid)); -      UNBLOCK_INPUT; +      unblock_input ();      }    else      error ("Invalid UID specification"); @@ -1329,15 +1363,6 @@ DEFUN ("system-name", Fsystem_name, Ssystem_name, 0, 0, 0,    return Vsystem_name;  } -const char * -get_system_name (void) -{ -  if (STRINGP (Vsystem_name)) -    return SSDATA (Vsystem_name); -  else -    return ""; -} -  DEFUN ("emacs-pid", Femacs_pid, Semacs_pid, 0, 0, 0,         doc: /* Return the process ID of Emacs, as a number.  */)    (void) @@ -1762,14 +1787,14 @@ format_time_string (char const *format, ptrdiff_t formatlen,    while (1)      {        time_t *taddr = emacs_secs_addr (&t); -      BLOCK_INPUT; +      block_input ();        synchronize_system_time_locale ();        tm = ut ? gmtime (taddr) : localtime (taddr);        if (! tm)  	{ -	  UNBLOCK_INPUT; +	  unblock_input ();  	  time_overflow ();  	}        *tmp = *tm; @@ -1781,14 +1806,14 @@ format_time_string (char const *format, ptrdiff_t formatlen,        /* Buffer was too small, so make it bigger and try again.  */        len = emacs_nmemftime (NULL, SIZE_MAX, format, formatlen, tm, ut, ns); -      UNBLOCK_INPUT; +      unblock_input ();        if (STRING_BYTES_BOUND <= len)  	string_overflow ();        size = len + 1;        buf = SAFE_ALLOCA (size);      } -  UNBLOCK_INPUT; +  unblock_input ();    bufstring = make_unibyte_string (buf, len);    SAFE_FREE ();    return code_convert_string_norecord (bufstring, Vlocale_coding_system, 0); @@ -1816,11 +1841,11 @@ DOW and ZONE.)  */)    struct tm *decoded_time;    Lisp_Object list_args[9]; -  BLOCK_INPUT; +  block_input ();    decoded_time = localtime (&time_spec);    if (decoded_time)      save_tm = *decoded_time; -  UNBLOCK_INPUT; +  unblock_input ();    if (! (decoded_time  	 && MOST_NEGATIVE_FIXNUM - TM_YEAR_BASE <= save_tm.tm_year  	 && save_tm.tm_year <= MOST_POSITIVE_FIXNUM - TM_YEAR_BASE)) @@ -1836,13 +1861,13 @@ DOW and ZONE.)  */)    XSETFASTINT (list_args[6], save_tm.tm_wday);    list_args[7] = save_tm.tm_isdst ? Qt : Qnil; -  BLOCK_INPUT; +  block_input ();    decoded_time = gmtime (&time_spec);    if (decoded_time == 0)      list_args[8] = Qnil;    else      XSETINT (list_args[8], tm_diff (&save_tm, decoded_time)); -  UNBLOCK_INPUT; +  unblock_input ();    return Flist (9, list_args);  } @@ -1900,15 +1925,17 @@ usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE)  */)      zone = XCAR (zone);    if (NILP (zone))      { -      BLOCK_INPUT; +      block_input ();        value = mktime (&tm); -      UNBLOCK_INPUT; +      unblock_input ();      }    else      { -      char tzbuf[100]; +      static char const tzbuf_format[] = "XXX%s%"pI"d:%02d:%02d"; +      char tzbuf[sizeof tzbuf_format + INT_STRLEN_BOUND (EMACS_INT)]; +      char *old_tzstring;        const char *tzstring; -      char **oldenv = environ, **newenv; +      USE_SAFE_ALLOCA;        if (EQ (zone, Qt))  	tzstring = "UTC0"; @@ -1920,14 +1947,21 @@ usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE)  */)  	  EMACS_INT zone_hr = abszone / (60*60);  	  int zone_min = (abszone/60) % 60;  	  int zone_sec = abszone % 60; -	  sprintf (tzbuf, "XXX%s%"pI"d:%02d:%02d", "-" + (XINT (zone) < 0), +	  sprintf (tzbuf, tzbuf_format, "-" + (XINT (zone) < 0),  		   zone_hr, zone_min, zone_sec);  	  tzstring = tzbuf;  	}        else  	error ("Invalid time zone specification"); -      BLOCK_INPUT; +      old_tzstring = getenv ("TZ"); +      if (old_tzstring) +	{ +	  char *buf = SAFE_ALLOCA (strlen (old_tzstring) + 1); +	  old_tzstring = strcpy (buf, old_tzstring); +	} + +      block_input ();        /* Set TZ before calling mktime; merely adjusting mktime's returned  	 value doesn't suffice, since that would mishandle leap seconds.  */ @@ -1935,15 +1969,12 @@ usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE)  */)        value = mktime (&tm); -      /* Restore TZ to previous value.  */ -      newenv = environ; -      environ = oldenv; +      set_time_zone_rule (old_tzstring);  #ifdef LOCALTIME_CACHE        tzset ();  #endif -      UNBLOCK_INPUT; - -      xfree (newenv); +      unblock_input (); +      SAFE_FREE ();      }    if (value == (time_t) -1) @@ -1977,7 +2008,7 @@ but this is considered obsolete.  */)       newline, and without the 4-digit year limit.  Don't use asctime       or ctime, as they might dump core if the year is outside the       range -999 .. 9999.  */ -  BLOCK_INPUT; +  block_input ();    tm = localtime (&value);    if (tm)      { @@ -1993,7 +2024,7 @@ but this is considered obsolete.  */)  		     tm->tm_hour, tm->tm_min, tm->tm_sec,  		     tm->tm_year + year_base);      } -  UNBLOCK_INPUT; +  unblock_input ();    if (! tm)      time_overflow (); @@ -2049,11 +2080,11 @@ the data it can't find.  */)    zone_offset = Qnil;    value = make_emacs_time (lisp_seconds_argument (specified_time), 0);    zone_name = format_time_string ("%Z", sizeof "%Z" - 1, value, 0, &localtm); -  BLOCK_INPUT; +  block_input ();    t = gmtime (emacs_secs_addr (&value));    if (t)      offset = tm_diff (&localtm, t); -  UNBLOCK_INPUT; +  unblock_input ();    if (t)      { @@ -2073,16 +2104,6 @@ the data it can't find.  */)    return list2 (zone_offset, zone_name);  } -/* This holds the value of `environ' produced by the previous -   call to Fset_time_zone_rule, or 0 if Fset_time_zone_rule -   has never been called.  */ -static char **environbuf; - -/* This holds the startup value of the TZ environment variable so it -   can be restored if the user calls set-time-zone-rule with a nil -   argument.  */ -static char *initial_tz; -  DEFUN ("set-time-zone-rule", Fset_time_zone_rule, Sset_time_zone_rule, 1, 1, 0,         doc: /* Set the local time zone using TZ, a string specifying a time zone rule.  If TZ is nil, use implementation-defined default time zone information. @@ -2095,18 +2116,10 @@ only the former.  */)    (Lisp_Object tz)  {    const char *tzstring; -  char **old_environbuf;    if (! (NILP (tz) || EQ (tz, Qt)))      CHECK_STRING (tz); -  BLOCK_INPUT; - -  /* When called for the first time, save the original TZ.  */ -  old_environbuf = environbuf; -  if (!old_environbuf) -    initial_tz = (char *) getenv ("TZ"); -    if (NILP (tz))      tzstring = initial_tz;    else if (EQ (tz, Qt)) @@ -2114,106 +2127,97 @@ only the former.  */)    else      tzstring = SSDATA (tz); +  block_input ();    set_time_zone_rule (tzstring); -  environbuf = environ; - -  UNBLOCK_INPUT; +  unblock_input (); -  xfree (old_environbuf);    return Qnil;  } -#ifdef LOCALTIME_CACHE - -/* These two values are known to load tz files in buggy implementations, -   i.e. Solaris 1 executables running under either Solaris 1 or Solaris 2. -   Their values shouldn't matter in non-buggy implementations. -   We don't use string literals for these strings, -   since if a string in the environment is in readonly -   storage, it runs afoul of bugs in SVR4 and Solaris 2.3. -   See Sun bugs 1113095 and 1114114, ``Timezone routines -   improperly modify environment''.  */ - -static char set_time_zone_rule_tz1[] = "TZ=GMT+0"; -static char set_time_zone_rule_tz2[] = "TZ=GMT+1"; - -#endif -  /* Set the local time zone rule to TZSTRING. -   This allocates memory into `environ', which it is the caller's -   responsibility to free.  */ + +   This function is not thread-safe, partly because putenv, unsetenv +   and tzset are not, and partly because of the static storage it +   updates.  Other threads that invoke localtime etc. may be adversely +   affected while this function is executing.  */  void  set_time_zone_rule (const char *tzstring)  { -  ptrdiff_t envptrs; -  char **from, **to, **newenv; +  /* A buffer holding a string of the form "TZ=value", intended +     to be part of the environment.  */ +  static char *tzvalbuf; +  static ptrdiff_t tzvalbufsize; -  /* Make the ENVIRON vector longer with room for TZSTRING.  */ -  for (from = environ; *from; from++) -    continue; -  envptrs = from - environ + 2; -  newenv = to = xmalloc (envptrs * sizeof *newenv -			 + (tzstring ? strlen (tzstring) + 4 : 0)); +  int tzeqlen = sizeof "TZ=" - 1; + +#ifdef LOCALTIME_CACHE +  /* These two values are known to load tz files in buggy implementations, +     i.e., Solaris 1 executables running under either Solaris 1 or Solaris 2. +     Their values shouldn't matter in non-buggy implementations. +     We don't use string literals for these strings, +     since if a string in the environment is in readonly +     storage, it runs afoul of bugs in SVR4 and Solaris 2.3. +     See Sun bugs 1113095 and 1114114, ``Timezone routines +     improperly modify environment''.  */ + +  static char set_time_zone_rule_tz[][sizeof "TZ=GMT+0"] +    = { "TZ=GMT+0", "TZ=GMT+1" }; + +  /* In SunOS 4.1.3_U1 and 4.1.4, if TZ has a value like +     "US/Pacific" that loads a tz file, then changes to a value like +     "XXX0" that does not load a tz file, and then changes back to +     its original value, the last change is (incorrectly) ignored. +     Also, if TZ changes twice in succession to values that do +     not load a tz file, tzset can dump core (see Sun bug#1225179). +     The following code works around these bugs.  */ -  /* Add TZSTRING to the end of environ, as a value for TZ.  */    if (tzstring)      { -      char *t = (char *) (to + envptrs); -      strcpy (t, "TZ="); -      strcat (t, tzstring); -      *to++ = t; +      /* Temporarily set TZ to a value that loads a tz file +	 and that differs from tzstring.  */ +      bool eq0 = strcmp (tzstring, set_time_zone_rule_tz[0] + tzeqlen) == 0; +      xputenv (set_time_zone_rule_tz[eq0]);      } +  else +    { +      /* The implied tzstring is unknown, so temporarily set TZ to +	 two different values that each load a tz file.  */ +      xputenv (set_time_zone_rule_tz[0]); +      tzset (); +      xputenv (set_time_zone_rule_tz[1]); +    } +  tzset (); +#endif -  /* Copy the old environ vector elements into NEWENV, -     but don't copy the TZ variable. -     So we have only one definition of TZ, which came from TZSTRING.  */ -  for (from = environ; *from; from++) -    if (strncmp (*from, "TZ=", 3) != 0) -      *to++ = *from; -  *to = 0; - -  environ = newenv; +  if (!tzstring) +    { +      unsetenv ("TZ"); +      tzvalbuf_in_environ = 0; +    } +  else +    { +      ptrdiff_t tzstringlen = strlen (tzstring); -  /* If we do have a TZSTRING, NEWENV points to the vector slot where -     the TZ variable is stored.  If we do not have a TZSTRING, -     TO points to the vector slot which has the terminating null.  */ +      if (tzvalbufsize <= tzeqlen + tzstringlen) +	{ +	  unsetenv ("TZ"); +	  tzvalbuf_in_environ = 0; +	  tzvalbuf = xpalloc (tzvalbuf, &tzvalbufsize, +			      tzeqlen + tzstringlen - tzvalbufsize + 1, -1, 1); +	  memcpy (tzvalbuf, "TZ=", tzeqlen); +	} -#ifdef LOCALTIME_CACHE -  { -    /* In SunOS 4.1.3_U1 and 4.1.4, if TZ has a value like -       "US/Pacific" that loads a tz file, then changes to a value like -       "XXX0" that does not load a tz file, and then changes back to -       its original value, the last change is (incorrectly) ignored. -       Also, if TZ changes twice in succession to values that do -       not load a tz file, tzset can dump core (see Sun bug#1225179). -       The following code works around these bugs.  */ - -    if (tzstring) -      { -	/* Temporarily set TZ to a value that loads a tz file -	   and that differs from tzstring.  */ -	char *tz = *newenv; -	*newenv = (strcmp (tzstring, set_time_zone_rule_tz1 + 3) == 0 -		   ? set_time_zone_rule_tz2 : set_time_zone_rule_tz1); -	tzset (); -	*newenv = tz; -      } -    else -      { -	/* The implied tzstring is unknown, so temporarily set TZ to -	   two different values that each load a tz file.  */ -	*to = set_time_zone_rule_tz1; -	to[1] = 0; -	tzset (); -	*to = set_time_zone_rule_tz2; -	tzset (); -	*to = 0; -      } +      strcpy (tzvalbuf + tzeqlen, tzstring); -    /* Now TZ has the desired value, and tzset can be invoked safely.  */ -  } +      if (!tzvalbuf_in_environ) +	{ +	  xputenv (tzvalbuf); +	  tzvalbuf_in_environ = 1; +	} +    } +#ifdef LOCALTIME_CACHE    tzset ();  #endif  } @@ -2357,9 +2361,10 @@ usage: (insert-before-markers-and-inherit &rest ARGS)  */)  }  DEFUN ("insert-char", Finsert_char, Sinsert_char, 1, 3, -       "(list (read-char-by-name \"Insert character (Unicode name or hex): \")\ -	 (prefix-numeric-value current-prefix-arg)\ -	 t))", +       "(list (or (read-char-by-name \"Insert character (Unicode name or hex): \")\ +	  (error \"You did not specify a valid character\"))\ +      (prefix-numeric-value current-prefix-arg)\ +      t))",         doc: /* Insert COUNT copies of CHARACTER.  Interactively, prompt for CHARACTER.  You can specify CHARACTER in one  of these ways: @@ -2613,7 +2618,7 @@ They default to the values of (point-min) and (point-max) in BUFFER.  */)    if (NILP (buf))      nsberror (buffer);    bp = XBUFFER (buf); -  if (NILP (BVAR (bp, name))) +  if (!BUFFER_LIVE_P (bp))      error ("Selecting deleted buffer");    if (NILP (start)) @@ -2649,10 +2654,10 @@ They default to the values of (point-min) and (point-max) in BUFFER.  */)  DEFUN ("compare-buffer-substrings", Fcompare_buffer_substrings, Scompare_buffer_substrings,         6, 6, 0,         doc: /* Compare two substrings of two buffers; return result as number. -the value is -N if first string is less after N-1 chars, -+N if first string is greater after N-1 chars, or 0 if strings match. -Each substring is represented as three arguments: BUFFER, START and END. -That makes six args in all, three for each substring. +Return -N if first string is less after N-1 chars, +N if first string is +greater after N-1 chars, or 0 if strings match.  Each substring is +represented as three arguments: BUFFER, START and END.  That makes six +args in all, three for each substring.  The value of `case-fold-search' in the current buffer  determines whether case is significant or ignored.  */) @@ -2677,7 +2682,7 @@ determines whether case is significant or ignored.  */)        if (NILP (buf1))  	nsberror (buffer1);        bp1 = XBUFFER (buf1); -      if (NILP (BVAR (bp1, name))) +      if (!BUFFER_LIVE_P (bp1))  	error ("Selecting deleted buffer");      } @@ -2715,7 +2720,7 @@ determines whether case is significant or ignored.  */)        if (NILP (buf2))  	nsberror (buffer2);        bp2 = XBUFFER (buf2); -      if (NILP (BVAR (bp2, name))) +      if (!BUFFER_LIVE_P (bp2))  	error ("Selecting deleted buffer");      } @@ -2783,8 +2788,8 @@ determines whether case is significant or ignored.  */)        if (!NILP (trt))  	{ -	  c1 = CHAR_TABLE_TRANSLATE (trt, c1); -	  c2 = CHAR_TABLE_TRANSLATE (trt, c2); +	  c1 = char_table_translate (trt, c1); +	  c2 = char_table_translate (trt, c2);  	}        if (c1 < c2)  	return make_number (- 1 - chars); @@ -2928,7 +2933,7 @@ Both characters must have the same length of multi-byte form.  */)  	  else if (!changed)  	    {  	      changed = -1; -	      modify_region (current_buffer, pos, XINT (end), 0); +	      modify_region_1 (pos, XINT (end), false);  	      if (! NILP (noundo))  		{ @@ -3104,7 +3109,7 @@ It returns the number of characters changed.  */)    pos = XINT (start);    pos_byte = CHAR_TO_BYTE (pos);    end_pos = XINT (end); -  modify_region (current_buffer, pos, end_pos, 0); +  modify_region_1 (pos, end_pos, false);    cnt = 0;    for (; pos < end_pos; ) @@ -3433,8 +3438,8 @@ static ptrdiff_t message_length;  DEFUN ("message", Fmessage, Smessage, 1, MANY, 0,         doc: /* Display a message at the bottom of the screen. -The message also goes into the `*Messages*' buffer. -\(In keyboard macros, that's all it does.) +The message also goes into the `*Messages*' buffer, if `message-log-max' +is non-nil.  (In keyboard macros, that's all it does.)  Return the message.  The first argument is a format control string, and the rest are data @@ -4263,7 +4268,7 @@ usage: (format STRING &rest OBJECTS)  */)      }    if (bufsize < p - buf) -    abort (); +    emacs_abort ();    if (maybe_combine_byte)      nchars = multibyte_chars_in_text ((unsigned char *) buf, p - buf); @@ -4603,7 +4608,7 @@ Transposing beyond buffer boundaries is an error.  */)  				     len1_byte, end2, start2_byte + len2_byte)  	  || count_combining_after (BYTE_POS_ADDR (start1_byte),  				    len1_byte, end2, start2_byte + len2_byte)) -	abort (); +	emacs_abort ();      }    else      { @@ -4615,7 +4620,7 @@ Transposing beyond buffer boundaries is an error.  */)  				    len2_byte, end1, start1_byte + len1_byte)  	  || count_combining_after (BYTE_POS_ADDR (start1_byte),  				    len1_byte, end2, start2_byte + len2_byte)) -	abort (); +	emacs_abort ();      }  #endif @@ -4628,7 +4633,7 @@ Transposing beyond buffer boundaries is an error.  */)    if (end1 == start2)		/* adjacent regions */      { -      modify_region (current_buffer, start1, end2, 0); +      modify_region_1 (start1, end2, false);        record_change (start1, len1 + len2);        tmp_interval1 = copy_intervals (cur_intv, start1, len1); @@ -4687,8 +4692,8 @@ Transposing beyond buffer boundaries is an error.  */)          {  	  USE_SAFE_ALLOCA; -          modify_region (current_buffer, start1, end1, 0); -          modify_region (current_buffer, start2, end2, 0); +          modify_region_1 (start1, end1, false); +          modify_region_1 (start2, end2, false);            record_change (start1, len1);            record_change (start2, len2);            tmp_interval1 = copy_intervals (cur_intv, start1, len1); @@ -4721,7 +4726,7 @@ Transposing beyond buffer boundaries is an error.  */)          {  	  USE_SAFE_ALLOCA; -          modify_region (current_buffer, start1, end2, 0); +          modify_region_1 (start1, end2, false);            record_change (start1, (end2 - start1));            tmp_interval1 = copy_intervals (cur_intv, start1, len1);            tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); @@ -4754,7 +4759,7 @@ Transposing beyond buffer boundaries is an error.  */)  	  USE_SAFE_ALLOCA;            record_change (start1, (end2 - start1)); -          modify_region (current_buffer, start1, end2, 0); +          modify_region_1 (start1, end2, false);            tmp_interval1 = copy_intervals (cur_intv, start1, len1);            tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid); @@ -4805,9 +4810,6 @@ Transposing beyond buffer boundaries is an error.  */)  void  syms_of_editfns (void)  { -  environbuf = 0; -  initial_tz = 0; -    DEFSYM (Qbuffer_access_fontify_functions, "buffer-access-fontify-functions");    DEFVAR_LISP ("inhibit-field-text-motion", Vinhibit_field_text_motion, @@ -4916,6 +4918,8 @@ functions if all the text being accessed has this property.  */);    defsubr (&Suser_real_login_name);    defsubr (&Suser_uid);    defsubr (&Suser_real_uid); +  defsubr (&Sgroup_gid); +  defsubr (&Sgroup_real_gid);    defsubr (&Suser_full_name);    defsubr (&Semacs_pid);    defsubr (&Scurrent_time);  | 
