X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/738429d120b11cc60687f1ffc3a85427397348ea..18160b98ce2ce9f534a4aee6be181788322b6c01:/src/editfns.c diff --git a/src/editfns.c b/src/editfns.c index 352892199e..0a868abe76 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -20,7 +20,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include -#include "config.h" +#include #ifdef VMS #include "vms-pwd.h" @@ -197,9 +197,11 @@ static Lisp_Object region_limit (beginningp) int beginningp; { + extern Lisp_Object Vmark_even_if_inactive; /* Defined in callint.c. */ register Lisp_Object m; - if (!NILP (Vtransient_mark_mode) && NILP (current_buffer->mark_active)) - error ("There is no region now"); + if (!NILP (Vtransient_mark_mode) && NILP (Vmark_even_if_inactive) + && NILP (current_buffer->mark_active)) + Fsignal (Qmark_inactive, Qnil); m = Fmarker_position (current_buffer->mark); if (NILP (m)) error ("There is no region now"); if ((point < XFASTINT (m)) == beginningp) @@ -310,10 +312,15 @@ save_excursion_restore (info) Fset_marker (current_buffer->mark, tem, Fcurrent_buffer ()); unchain_marker (tem); tem = Fcdr (Fcdr (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 */ tem1 = current_buffer->mark_active; current_buffer->mark_active = Fcdr (tem); @@ -634,7 +641,7 @@ Thus, you can use times obtained from `current-time'\n\ and from `file-attributes'.\n\ \n\ Some operating systems cannot provide all this information to Emacs;\n\ -in this case, current-time-zone will return a list containing nil for\n\ +in this case, `current-time-zone' returns a list containing nil for\n\ the data it can't find.") (specified_time) Lisp_Object specified_time; @@ -643,22 +650,29 @@ the data it can't find.") struct tm *t; if (lisp_time_argument (specified_time, &value) - && (t = gmtime(&value)) != 0) + && (t = gmtime (&value)) != 0) { - struct tm gmt = *t; /* Make a copy, in case localtime modifies *t. */ + struct tm gmt; long offset; char *s, buf[6]; - t = localtime(&value); - offset = difftm(t, &gmt); + + gmt = *t; /* Make a copy, in case localtime modifies *t. */ + t = localtime (&value); + offset = difftm (t, &gmt); s = 0; #ifdef HAVE_TM_ZONE if (t->tm_zone) s = t->tm_zone; +#else /* not HAVE_TM_ZONE */ +#ifdef HAVE_TZNAME + if (t->tm_isdst == 0 || t->tm_isdst == 1) + s = tzname[t->tm_isdst]; #endif +#endif /* not HAVE_TM_ZONE */ if (!s) { /* No local time zone name is available; use "+-NNNN" instead. */ - long am = (offset < 0 ? -offset : offset) / 60; + int am = (offset < 0 ? -offset : offset) / 60; sprintf (buf, "%c%02d%02d", (offset < 0 ? '-' : '+'), am/60, am%60); s = buf; } @@ -788,7 +802,7 @@ Both arguments are required.") /* Return a Lisp_String containing the text of the current buffer from START to END. If text properties are in use and the current buffer - has properties in the range specifed, the resulting string will also + has properties in the range specified, the resulting string will also have them. We don't want to use plain old make_string here, because it calls @@ -842,7 +856,7 @@ DEFUN ("buffer-string", Fbuffer_string, Sbuffer_string, 0, 0, 0, DEFUN ("insert-buffer-substring", Finsert_buffer_substring, Sinsert_buffer_substring, 1, 3, 0, - "Insert before point a substring of the contents buffer BUFFER.\n\ + "Insert before point a substring of the contents of buffer BUFFER.\n\ BUFFER may be a buffer or a buffer name.\n\ Arguments START and END are character numbers specifying the substring.\n\ They default to the beginning and the end of BUFFER.") @@ -1358,7 +1372,7 @@ Use %% to put a single % into the output.") else if (XTYPE (args[n]) == Lisp_Int && *format != 's') { #ifdef LISP_FLOAT_TYPE - /* The following loop issumes the Lisp type indicates + /* The following loop assumes the Lisp type indicates the proper way to pass the argument. So make sure we have a flonum if the argument should be a double. */ @@ -1387,29 +1401,34 @@ Use %% to put a single % into the output.") { register int nstrings = n + 1; + + /* Allocate twice as many strings as we have %-escapes; floats occupy + two slots, and we're not sure how many of those we have. */ register unsigned char **strings - = (unsigned char **) alloca (nstrings * sizeof (unsigned char *)); + = (unsigned char **) alloca (2 * nstrings * sizeof (unsigned char *)); + int i; + i = 0; for (n = 0; n < nstrings; n++) { if (n >= nargs) - strings[n] = (unsigned char *) ""; + strings[i++] = (unsigned char *) ""; else if (XTYPE (args[n]) == Lisp_Int) /* We checked above that the corresponding format effector isn't %s, which would cause MPV. */ - strings[n] = (unsigned char *) XINT (args[n]); + strings[i++] = (unsigned char *) XINT (args[n]); #ifdef LISP_FLOAT_TYPE else if (XTYPE (args[n]) == Lisp_Float) { union { double d; int half[2]; } u; u.d = XFLOAT (args[n])->data; - strings[n++] = (unsigned char *) u.half[0]; - strings[n] = (unsigned char *) u.half[1]; + strings[i++] = (unsigned char *) u.half[0]; + strings[i++] = (unsigned char *) u.half[1]; } #endif else - strings[n] = XSTRING (args[n])->data; + strings[i++] = XSTRING (args[n])->data; } /* Format it in bigger and bigger buf's until it all fits. */ @@ -1418,7 +1437,7 @@ Use %% to put a single % into the output.") buf = (char *) alloca (total + 1); buf[total - 1] = 0; - length = doprnt (buf, total + 1, strings[0], end, nargs, strings + 1); + length = doprnt (buf, total + 1, strings[0], end, i-1, strings + 1); if (buf[total - 1] == 0) break; @@ -1478,17 +1497,10 @@ Case is ignored if `case-fold-search' is non-nil in the current buffer.") void syms_of_editfns () { - DEFVAR_LISP ("system-name", &Vsystem_name, - "The name of the machine Emacs is running on."); - - DEFVAR_LISP ("user-full-name", &Vuser_full_name, - "The full name of the user logged in."); - - DEFVAR_LISP ("user-name", &Vuser_name, - "The user's name, based on the effective uid."); - - DEFVAR_LISP ("user-real-name", &Vuser_real_name, - "The user's name, base upon the real uid."); + staticpro (&Vuser_name); + staticpro (&Vuser_full_name); + staticpro (&Vuser_real_name); + staticpro (&Vsystem_name); defsubr (&Schar_equal); defsubr (&Sgoto_char);