* tramp.texi (Multi-hops): Introduce `tramp-restricted-shell-hosts-alist'.
[emacs/old-mirror.git] / src / editfns.c
blobe40bea44e9c7e8ec169393f3084672892a66f78b
1 /* Lisp functions pertaining to editing.
3 Copyright (C) 1985-1987, 1989, 1993-2012 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
22 #include <sys/types.h>
23 #include <stdio.h>
24 #include <setjmp.h>
26 #ifdef HAVE_PWD_H
27 #include <pwd.h>
28 #endif
30 #include <unistd.h>
32 #ifdef HAVE_SYS_UTSNAME_H
33 #include <sys/utsname.h>
34 #endif
36 #include "lisp.h"
38 /* systime.h includes <sys/time.h> which, on some systems, is required
39 for <sys/resource.h>; thus systime.h must be included before
40 <sys/resource.h> */
41 #include "systime.h"
43 #if defined HAVE_SYS_RESOURCE_H
44 #include <sys/resource.h>
45 #endif
47 #include <ctype.h>
48 #include <float.h>
49 #include <limits.h>
50 #include <intprops.h>
51 #include <strftime.h>
52 #include <verify.h>
54 #include "intervals.h"
55 #include "character.h"
56 #include "buffer.h"
57 #include "coding.h"
58 #include "frame.h"
59 #include "window.h"
60 #include "blockinput.h"
62 #ifndef USER_FULL_NAME
63 #define USER_FULL_NAME pw->pw_gecos
64 #endif
66 #ifndef USE_CRT_DLL
67 extern char **environ;
68 #endif
70 #define TM_YEAR_BASE 1900
72 #ifdef WINDOWSNT
73 extern Lisp_Object w32_get_internal_run_time (void);
74 #endif
76 static Lisp_Object format_time_string (char const *, ptrdiff_t, EMACS_TIME,
77 int, struct tm *);
78 static int tm_diff (struct tm *, struct tm *);
79 static void update_buffer_properties (ptrdiff_t, ptrdiff_t);
81 static Lisp_Object Qbuffer_access_fontify_functions;
83 /* Symbol for the text property used to mark fields. */
85 Lisp_Object Qfield;
87 /* A special value for Qfield properties. */
89 static Lisp_Object Qboundary;
92 void
93 init_editfns (void)
95 const char *user_name;
96 register char *p;
97 struct passwd *pw; /* password entry for the current user */
98 Lisp_Object tem;
100 /* Set up system_name even when dumping. */
101 init_system_name ();
103 #ifndef CANNOT_DUMP
104 /* Don't bother with this on initial start when just dumping out */
105 if (!initialized)
106 return;
107 #endif /* not CANNOT_DUMP */
109 pw = getpwuid (getuid ());
110 #ifdef MSDOS
111 /* We let the real user name default to "root" because that's quite
112 accurate on MSDOG and because it lets Emacs find the init file.
113 (The DVX libraries override the Djgpp libraries here.) */
114 Vuser_real_login_name = build_string (pw ? pw->pw_name : "root");
115 #else
116 Vuser_real_login_name = build_string (pw ? pw->pw_name : "unknown");
117 #endif
119 /* Get the effective user name, by consulting environment variables,
120 or the effective uid if those are unset. */
121 user_name = getenv ("LOGNAME");
122 if (!user_name)
123 #ifdef WINDOWSNT
124 user_name = getenv ("USERNAME"); /* it's USERNAME on NT */
125 #else /* WINDOWSNT */
126 user_name = getenv ("USER");
127 #endif /* WINDOWSNT */
128 if (!user_name)
130 pw = getpwuid (geteuid ());
131 user_name = pw ? pw->pw_name : "unknown";
133 Vuser_login_name = build_string (user_name);
135 /* If the user name claimed in the environment vars differs from
136 the real uid, use the claimed name to find the full name. */
137 tem = Fstring_equal (Vuser_login_name, Vuser_real_login_name);
138 if (! NILP (tem))
139 tem = Vuser_login_name;
140 else
142 uid_t euid = geteuid ();
143 tem = make_fixnum_or_float (euid);
145 Vuser_full_name = Fuser_full_name (tem);
147 p = getenv ("NAME");
148 if (p)
149 Vuser_full_name = build_string (p);
150 else if (NILP (Vuser_full_name))
151 Vuser_full_name = build_string ("unknown");
153 #ifdef HAVE_SYS_UTSNAME_H
155 struct utsname uts;
156 uname (&uts);
157 Voperating_system_release = build_string (uts.release);
159 #else
160 Voperating_system_release = Qnil;
161 #endif
164 DEFUN ("char-to-string", Fchar_to_string, Schar_to_string, 1, 1, 0,
165 doc: /* Convert arg CHAR to a string containing that character.
166 usage: (char-to-string CHAR) */)
167 (Lisp_Object character)
169 int c, len;
170 unsigned char str[MAX_MULTIBYTE_LENGTH];
172 CHECK_CHARACTER (character);
173 c = XFASTINT (character);
175 len = CHAR_STRING (c, str);
176 return make_string_from_bytes ((char *) str, 1, len);
179 DEFUN ("byte-to-string", Fbyte_to_string, Sbyte_to_string, 1, 1, 0,
180 doc: /* Convert arg BYTE to a unibyte string containing that byte. */)
181 (Lisp_Object byte)
183 unsigned char b;
184 CHECK_NUMBER (byte);
185 if (XINT (byte) < 0 || XINT (byte) > 255)
186 error ("Invalid byte");
187 b = XINT (byte);
188 return make_string_from_bytes ((char *) &b, 1, 1);
191 DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
192 doc: /* Return the first character in STRING. */)
193 (register Lisp_Object string)
195 register Lisp_Object val;
196 CHECK_STRING (string);
197 if (SCHARS (string))
199 if (STRING_MULTIBYTE (string))
200 XSETFASTINT (val, STRING_CHAR (SDATA (string)));
201 else
202 XSETFASTINT (val, SREF (string, 0));
204 else
205 XSETFASTINT (val, 0);
206 return val;
209 DEFUN ("point", Fpoint, Spoint, 0, 0, 0,
210 doc: /* Return value of point, as an integer.
211 Beginning of buffer is position (point-min). */)
212 (void)
214 Lisp_Object temp;
215 XSETFASTINT (temp, PT);
216 return temp;
219 DEFUN ("point-marker", Fpoint_marker, Spoint_marker, 0, 0, 0,
220 doc: /* Return value of point, as a marker object. */)
221 (void)
223 return build_marker (current_buffer, PT, PT_BYTE);
226 DEFUN ("goto-char", Fgoto_char, Sgoto_char, 1, 1, "NGoto char: ",
227 doc: /* Set point to POSITION, a number or marker.
228 Beginning of buffer is position (point-min), end is (point-max).
230 The return value is POSITION. */)
231 (register Lisp_Object position)
233 ptrdiff_t pos;
235 if (MARKERP (position)
236 && current_buffer == XMARKER (position)->buffer)
238 pos = marker_position (position);
239 if (pos < BEGV)
240 SET_PT_BOTH (BEGV, BEGV_BYTE);
241 else if (pos > ZV)
242 SET_PT_BOTH (ZV, ZV_BYTE);
243 else
244 SET_PT_BOTH (pos, marker_byte_position (position));
246 return position;
249 CHECK_NUMBER_COERCE_MARKER (position);
251 pos = clip_to_bounds (BEGV, XINT (position), ZV);
252 SET_PT (pos);
253 return position;
257 /* Return the start or end position of the region.
258 BEGINNINGP non-zero means return the start.
259 If there is no region active, signal an error. */
261 static Lisp_Object
262 region_limit (int beginningp)
264 Lisp_Object m;
266 if (!NILP (Vtransient_mark_mode)
267 && NILP (Vmark_even_if_inactive)
268 && NILP (BVAR (current_buffer, mark_active)))
269 xsignal0 (Qmark_inactive);
271 m = Fmarker_position (BVAR (current_buffer, mark));
272 if (NILP (m))
273 error ("The mark is not set now, so there is no region");
275 /* Clip to the current narrowing (bug#11770). */
276 return make_number ((PT < XFASTINT (m)) == (beginningp != 0)
277 ? PT
278 : clip_to_bounds (BEGV, XFASTINT (m), ZV));
281 DEFUN ("region-beginning", Fregion_beginning, Sregion_beginning, 0, 0, 0,
282 doc: /* Return the integer value of point or mark, whichever is smaller. */)
283 (void)
285 return region_limit (1);
288 DEFUN ("region-end", Fregion_end, Sregion_end, 0, 0, 0,
289 doc: /* Return the integer value of point or mark, whichever is larger. */)
290 (void)
292 return region_limit (0);
295 DEFUN ("mark-marker", Fmark_marker, Smark_marker, 0, 0, 0,
296 doc: /* Return this buffer's mark, as a marker object.
297 Watch out! Moving this marker changes the mark position.
298 If you set the marker not to point anywhere, the buffer will have no mark. */)
299 (void)
301 return BVAR (current_buffer, mark);
305 /* Find all the overlays in the current buffer that touch position POS.
306 Return the number found, and store them in a vector in VEC
307 of length LEN. */
309 static ptrdiff_t
310 overlays_around (EMACS_INT pos, Lisp_Object *vec, ptrdiff_t len)
312 Lisp_Object overlay, start, end;
313 struct Lisp_Overlay *tail;
314 ptrdiff_t startpos, endpos;
315 ptrdiff_t idx = 0;
317 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
319 XSETMISC (overlay, tail);
321 end = OVERLAY_END (overlay);
322 endpos = OVERLAY_POSITION (end);
323 if (endpos < pos)
324 break;
325 start = OVERLAY_START (overlay);
326 startpos = OVERLAY_POSITION (start);
327 if (startpos <= pos)
329 if (idx < len)
330 vec[idx] = overlay;
331 /* Keep counting overlays even if we can't return them all. */
332 idx++;
336 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
338 XSETMISC (overlay, tail);
340 start = OVERLAY_START (overlay);
341 startpos = OVERLAY_POSITION (start);
342 if (pos < startpos)
343 break;
344 end = OVERLAY_END (overlay);
345 endpos = OVERLAY_POSITION (end);
346 if (pos <= endpos)
348 if (idx < len)
349 vec[idx] = overlay;
350 idx++;
354 return idx;
357 /* Return the value of property PROP, in OBJECT at POSITION.
358 It's the value of PROP that a char inserted at POSITION would get.
359 OBJECT is optional and defaults to the current buffer.
360 If OBJECT is a buffer, then overlay properties are considered as well as
361 text properties.
362 If OBJECT is a window, then that window's buffer is used, but
363 window-specific overlays are considered only if they are associated
364 with OBJECT. */
365 Lisp_Object
366 get_pos_property (Lisp_Object position, register Lisp_Object prop, Lisp_Object object)
368 CHECK_NUMBER_COERCE_MARKER (position);
370 if (NILP (object))
371 XSETBUFFER (object, current_buffer);
372 else if (WINDOWP (object))
373 object = XWINDOW (object)->buffer;
375 if (!BUFFERP (object))
376 /* pos-property only makes sense in buffers right now, since strings
377 have no overlays and no notion of insertion for which stickiness
378 could be obeyed. */
379 return Fget_text_property (position, prop, object);
380 else
382 EMACS_INT posn = XINT (position);
383 ptrdiff_t noverlays;
384 Lisp_Object *overlay_vec, tem;
385 struct buffer *obuf = current_buffer;
387 set_buffer_temp (XBUFFER (object));
389 /* First try with room for 40 overlays. */
390 noverlays = 40;
391 overlay_vec = alloca (noverlays * sizeof *overlay_vec);
392 noverlays = overlays_around (posn, overlay_vec, noverlays);
394 /* If there are more than 40,
395 make enough space for all, and try again. */
396 if (noverlays > 40)
398 overlay_vec = alloca (noverlays * sizeof *overlay_vec);
399 noverlays = overlays_around (posn, overlay_vec, noverlays);
401 noverlays = sort_overlays (overlay_vec, noverlays, NULL);
403 set_buffer_temp (obuf);
405 /* Now check the overlays in order of decreasing priority. */
406 while (--noverlays >= 0)
408 Lisp_Object ol = overlay_vec[noverlays];
409 tem = Foverlay_get (ol, prop);
410 if (!NILP (tem))
412 /* Check the overlay is indeed active at point. */
413 Lisp_Object start = OVERLAY_START (ol), finish = OVERLAY_END (ol);
414 if ((OVERLAY_POSITION (start) == posn
415 && XMARKER (start)->insertion_type == 1)
416 || (OVERLAY_POSITION (finish) == posn
417 && XMARKER (finish)->insertion_type == 0))
418 ; /* The overlay will not cover a char inserted at point. */
419 else
421 return tem;
426 { /* Now check the text properties. */
427 int stickiness = text_property_stickiness (prop, position, object);
428 if (stickiness > 0)
429 return Fget_text_property (position, prop, object);
430 else if (stickiness < 0
431 && XINT (position) > BUF_BEGV (XBUFFER (object)))
432 return Fget_text_property (make_number (XINT (position) - 1),
433 prop, object);
434 else
435 return Qnil;
440 /* Find the field surrounding POS in *BEG and *END. If POS is nil,
441 the value of point is used instead. If BEG or END is null,
442 means don't store the beginning or end of the field.
444 BEG_LIMIT and END_LIMIT serve to limit the ranged of the returned
445 results; they do not effect boundary behavior.
447 If MERGE_AT_BOUNDARY is nonzero, then if POS is at the very first
448 position of a field, then the beginning of the previous field is
449 returned instead of the beginning of POS's field (since the end of a
450 field is actually also the beginning of the next input field, this
451 behavior is sometimes useful). Additionally in the MERGE_AT_BOUNDARY
452 true case, if two fields are separated by a field with the special
453 value `boundary', and POS lies within it, then the two separated
454 fields are considered to be adjacent, and POS between them, when
455 finding the beginning and ending of the "merged" field.
457 Either BEG or END may be 0, in which case the corresponding value
458 is not stored. */
460 static void
461 find_field (Lisp_Object pos, Lisp_Object merge_at_boundary,
462 Lisp_Object beg_limit,
463 ptrdiff_t *beg, Lisp_Object end_limit, ptrdiff_t *end)
465 /* Fields right before and after the point. */
466 Lisp_Object before_field, after_field;
467 /* 1 if POS counts as the start of a field. */
468 int at_field_start = 0;
469 /* 1 if POS counts as the end of a field. */
470 int at_field_end = 0;
472 if (NILP (pos))
473 XSETFASTINT (pos, PT);
474 else
475 CHECK_NUMBER_COERCE_MARKER (pos);
477 after_field
478 = get_char_property_and_overlay (pos, Qfield, Qnil, NULL);
479 before_field
480 = (XFASTINT (pos) > BEGV
481 ? get_char_property_and_overlay (make_number (XINT (pos) - 1),
482 Qfield, Qnil, NULL)
483 /* Using nil here would be a more obvious choice, but it would
484 fail when the buffer starts with a non-sticky field. */
485 : after_field);
487 /* See if we need to handle the case where MERGE_AT_BOUNDARY is nil
488 and POS is at beginning of a field, which can also be interpreted
489 as the end of the previous field. Note that the case where if
490 MERGE_AT_BOUNDARY is non-nil (see function comment) is actually the
491 more natural one; then we avoid treating the beginning of a field
492 specially. */
493 if (NILP (merge_at_boundary))
495 Lisp_Object field = get_pos_property (pos, Qfield, Qnil);
496 if (!EQ (field, after_field))
497 at_field_end = 1;
498 if (!EQ (field, before_field))
499 at_field_start = 1;
500 if (NILP (field) && at_field_start && at_field_end)
501 /* If an inserted char would have a nil field while the surrounding
502 text is non-nil, we're probably not looking at a
503 zero-length field, but instead at a non-nil field that's
504 not intended for editing (such as comint's prompts). */
505 at_field_end = at_field_start = 0;
508 /* Note about special `boundary' fields:
510 Consider the case where the point (`.') is between the fields `x' and `y':
512 xxxx.yyyy
514 In this situation, if merge_at_boundary is true, we consider the
515 `x' and `y' fields as forming one big merged field, and so the end
516 of the field is the end of `y'.
518 However, if `x' and `y' are separated by a special `boundary' field
519 (a field with a `field' char-property of 'boundary), then we ignore
520 this special field when merging adjacent fields. Here's the same
521 situation, but with a `boundary' field between the `x' and `y' fields:
523 xxx.BBBByyyy
525 Here, if point is at the end of `x', the beginning of `y', or
526 anywhere in-between (within the `boundary' field), we merge all
527 three fields and consider the beginning as being the beginning of
528 the `x' field, and the end as being the end of the `y' field. */
530 if (beg)
532 if (at_field_start)
533 /* POS is at the edge of a field, and we should consider it as
534 the beginning of the following field. */
535 *beg = XFASTINT (pos);
536 else
537 /* Find the previous field boundary. */
539 Lisp_Object p = pos;
540 if (!NILP (merge_at_boundary) && EQ (before_field, Qboundary))
541 /* Skip a `boundary' field. */
542 p = Fprevious_single_char_property_change (p, Qfield, Qnil,
543 beg_limit);
545 p = Fprevious_single_char_property_change (p, Qfield, Qnil,
546 beg_limit);
547 *beg = NILP (p) ? BEGV : XFASTINT (p);
551 if (end)
553 if (at_field_end)
554 /* POS is at the edge of a field, and we should consider it as
555 the end of the previous field. */
556 *end = XFASTINT (pos);
557 else
558 /* Find the next field boundary. */
560 if (!NILP (merge_at_boundary) && EQ (after_field, Qboundary))
561 /* Skip a `boundary' field. */
562 pos = Fnext_single_char_property_change (pos, Qfield, Qnil,
563 end_limit);
565 pos = Fnext_single_char_property_change (pos, Qfield, Qnil,
566 end_limit);
567 *end = NILP (pos) ? ZV : XFASTINT (pos);
573 DEFUN ("delete-field", Fdelete_field, Sdelete_field, 0, 1, 0,
574 doc: /* Delete the field surrounding POS.
575 A field is a region of text with the same `field' property.
576 If POS is nil, the value of point is used for POS. */)
577 (Lisp_Object pos)
579 ptrdiff_t beg, end;
580 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
581 if (beg != end)
582 del_range (beg, end);
583 return Qnil;
586 DEFUN ("field-string", Ffield_string, Sfield_string, 0, 1, 0,
587 doc: /* Return the contents of the field surrounding POS as a string.
588 A field is a region of text with the same `field' property.
589 If POS is nil, the value of point is used for POS. */)
590 (Lisp_Object pos)
592 ptrdiff_t beg, end;
593 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
594 return make_buffer_string (beg, end, 1);
597 DEFUN ("field-string-no-properties", Ffield_string_no_properties, Sfield_string_no_properties, 0, 1, 0,
598 doc: /* Return the contents of the field around POS, without text properties.
599 A field is a region of text with the same `field' property.
600 If POS is nil, the value of point is used for POS. */)
601 (Lisp_Object pos)
603 ptrdiff_t beg, end;
604 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
605 return make_buffer_string (beg, end, 0);
608 DEFUN ("field-beginning", Ffield_beginning, Sfield_beginning, 0, 3, 0,
609 doc: /* Return the beginning of the field surrounding POS.
610 A field is a region of text with the same `field' property.
611 If POS is nil, the value of point is used for POS.
612 If ESCAPE-FROM-EDGE is non-nil and POS is at the beginning of its
613 field, then the beginning of the *previous* field is returned.
614 If LIMIT is non-nil, it is a buffer position; if the beginning of the field
615 is before LIMIT, then LIMIT will be returned instead. */)
616 (Lisp_Object pos, Lisp_Object escape_from_edge, Lisp_Object limit)
618 ptrdiff_t beg;
619 find_field (pos, escape_from_edge, limit, &beg, Qnil, 0);
620 return make_number (beg);
623 DEFUN ("field-end", Ffield_end, Sfield_end, 0, 3, 0,
624 doc: /* Return the end of the field surrounding POS.
625 A field is a region of text with the same `field' property.
626 If POS is nil, the value of point is used for POS.
627 If ESCAPE-FROM-EDGE is non-nil and POS is at the end of its field,
628 then the end of the *following* field is returned.
629 If LIMIT is non-nil, it is a buffer position; if the end of the field
630 is after LIMIT, then LIMIT will be returned instead. */)
631 (Lisp_Object pos, Lisp_Object escape_from_edge, Lisp_Object limit)
633 ptrdiff_t end;
634 find_field (pos, escape_from_edge, Qnil, 0, limit, &end);
635 return make_number (end);
638 DEFUN ("constrain-to-field", Fconstrain_to_field, Sconstrain_to_field, 2, 5, 0,
639 doc: /* Return the position closest to NEW-POS that is in the same field as OLD-POS.
640 A field is a region of text with the same `field' property.
642 If NEW-POS is nil, then use the current point instead, and move point
643 to the resulting constrained position, in addition to returning that
644 position.
646 If OLD-POS is at the boundary of two fields, then the allowable
647 positions for NEW-POS depends on the value of the optional argument
648 ESCAPE-FROM-EDGE: If ESCAPE-FROM-EDGE is nil, then NEW-POS is
649 constrained to the field that has the same `field' char-property
650 as any new characters inserted at OLD-POS, whereas if ESCAPE-FROM-EDGE
651 is non-nil, NEW-POS is constrained to the union of the two adjacent
652 fields. Additionally, if two fields are separated by another field with
653 the special value `boundary', then any point within this special field is
654 also considered to be `on the boundary'.
656 If the optional argument ONLY-IN-LINE is non-nil and constraining
657 NEW-POS would move it to a different line, NEW-POS is returned
658 unconstrained. This useful for commands that move by line, like
659 \\[next-line] or \\[beginning-of-line], which should generally respect field boundaries
660 only in the case where they can still move to the right line.
662 If the optional argument INHIBIT-CAPTURE-PROPERTY is non-nil, and OLD-POS has
663 a non-nil property of that name, then any field boundaries are ignored.
665 Field boundaries are not noticed if `inhibit-field-text-motion' is non-nil. */)
666 (Lisp_Object new_pos, Lisp_Object old_pos, Lisp_Object escape_from_edge, Lisp_Object only_in_line, Lisp_Object inhibit_capture_property)
668 /* If non-zero, then the original point, before re-positioning. */
669 ptrdiff_t orig_point = 0;
670 int fwd;
671 Lisp_Object prev_old, prev_new;
673 if (NILP (new_pos))
674 /* Use the current point, and afterwards, set it. */
676 orig_point = PT;
677 XSETFASTINT (new_pos, PT);
680 CHECK_NUMBER_COERCE_MARKER (new_pos);
681 CHECK_NUMBER_COERCE_MARKER (old_pos);
683 fwd = (XINT (new_pos) > XINT (old_pos));
685 prev_old = make_number (XINT (old_pos) - 1);
686 prev_new = make_number (XINT (new_pos) - 1);
688 if (NILP (Vinhibit_field_text_motion)
689 && !EQ (new_pos, old_pos)
690 && (!NILP (Fget_char_property (new_pos, Qfield, Qnil))
691 || !NILP (Fget_char_property (old_pos, Qfield, Qnil))
692 /* To recognize field boundaries, we must also look at the
693 previous positions; we could use `get_pos_property'
694 instead, but in itself that would fail inside non-sticky
695 fields (like comint prompts). */
696 || (XFASTINT (new_pos) > BEGV
697 && !NILP (Fget_char_property (prev_new, Qfield, Qnil)))
698 || (XFASTINT (old_pos) > BEGV
699 && !NILP (Fget_char_property (prev_old, Qfield, Qnil))))
700 && (NILP (inhibit_capture_property)
701 /* Field boundaries are again a problem; but now we must
702 decide the case exactly, so we need to call
703 `get_pos_property' as well. */
704 || (NILP (get_pos_property (old_pos, inhibit_capture_property, Qnil))
705 && (XFASTINT (old_pos) <= BEGV
706 || NILP (Fget_char_property (old_pos, inhibit_capture_property, Qnil))
707 || NILP (Fget_char_property (prev_old, inhibit_capture_property, Qnil))))))
708 /* It is possible that NEW_POS is not within the same field as
709 OLD_POS; try to move NEW_POS so that it is. */
711 ptrdiff_t shortage;
712 Lisp_Object field_bound;
714 if (fwd)
715 field_bound = Ffield_end (old_pos, escape_from_edge, new_pos);
716 else
717 field_bound = Ffield_beginning (old_pos, escape_from_edge, new_pos);
719 if (/* See if ESCAPE_FROM_EDGE caused FIELD_BOUND to jump to the
720 other side of NEW_POS, which would mean that NEW_POS is
721 already acceptable, and it's not necessary to constrain it
722 to FIELD_BOUND. */
723 ((XFASTINT (field_bound) < XFASTINT (new_pos)) ? fwd : !fwd)
724 /* NEW_POS should be constrained, but only if either
725 ONLY_IN_LINE is nil (in which case any constraint is OK),
726 or NEW_POS and FIELD_BOUND are on the same line (in which
727 case the constraint is OK even if ONLY_IN_LINE is non-nil). */
728 && (NILP (only_in_line)
729 /* This is the ONLY_IN_LINE case, check that NEW_POS and
730 FIELD_BOUND are on the same line by seeing whether
731 there's an intervening newline or not. */
732 || (scan_buffer ('\n',
733 XFASTINT (new_pos), XFASTINT (field_bound),
734 fwd ? -1 : 1, &shortage, 1),
735 shortage != 0)))
736 /* Constrain NEW_POS to FIELD_BOUND. */
737 new_pos = field_bound;
739 if (orig_point && XFASTINT (new_pos) != orig_point)
740 /* The NEW_POS argument was originally nil, so automatically set PT. */
741 SET_PT (XFASTINT (new_pos));
744 return new_pos;
748 DEFUN ("line-beginning-position",
749 Fline_beginning_position, Sline_beginning_position, 0, 1, 0,
750 doc: /* Return the character position of the first character on the current line.
751 With argument N not nil or 1, move forward N - 1 lines first.
752 If scan reaches end of buffer, return that position.
754 The returned position is of the first character in the logical order,
755 i.e. the one that has the smallest character position.
757 This function constrains the returned position to the current field
758 unless that would be on a different line than the original,
759 unconstrained result. If N is nil or 1, and a front-sticky field
760 starts at point, the scan stops as soon as it starts. To ignore field
761 boundaries bind `inhibit-field-text-motion' to t.
763 This function does not move point. */)
764 (Lisp_Object n)
766 ptrdiff_t orig, orig_byte, end;
767 ptrdiff_t count = SPECPDL_INDEX ();
768 specbind (Qinhibit_point_motion_hooks, Qt);
770 if (NILP (n))
771 XSETFASTINT (n, 1);
772 else
773 CHECK_NUMBER (n);
775 orig = PT;
776 orig_byte = PT_BYTE;
777 Fforward_line (make_number (XINT (n) - 1));
778 end = PT;
780 SET_PT_BOTH (orig, orig_byte);
782 unbind_to (count, Qnil);
784 /* Return END constrained to the current input field. */
785 return Fconstrain_to_field (make_number (end), make_number (orig),
786 XINT (n) != 1 ? Qt : Qnil,
787 Qt, Qnil);
790 DEFUN ("line-end-position", Fline_end_position, Sline_end_position, 0, 1, 0,
791 doc: /* Return the character position of the last character on the current line.
792 With argument N not nil or 1, move forward N - 1 lines first.
793 If scan reaches end of buffer, return that position.
795 The returned position is of the last character in the logical order,
796 i.e. the character whose buffer position is the largest one.
798 This function constrains the returned position to the current field
799 unless that would be on a different line than the original,
800 unconstrained result. If N is nil or 1, and a rear-sticky field ends
801 at point, the scan stops as soon as it starts. To ignore field
802 boundaries bind `inhibit-field-text-motion' to t.
804 This function does not move point. */)
805 (Lisp_Object n)
807 ptrdiff_t clipped_n;
808 ptrdiff_t end_pos;
809 ptrdiff_t orig = PT;
811 if (NILP (n))
812 XSETFASTINT (n, 1);
813 else
814 CHECK_NUMBER (n);
816 clipped_n = clip_to_bounds (PTRDIFF_MIN + 1, XINT (n), PTRDIFF_MAX);
817 end_pos = find_before_next_newline (orig, 0, clipped_n - (clipped_n <= 0));
819 /* Return END_POS constrained to the current input field. */
820 return Fconstrain_to_field (make_number (end_pos), make_number (orig),
821 Qnil, Qt, Qnil);
825 Lisp_Object
826 save_excursion_save (void)
828 int visible = (XBUFFER (XWINDOW (selected_window)->buffer)
829 == current_buffer);
831 return Fcons (Fpoint_marker (),
832 Fcons (Fcopy_marker (BVAR (current_buffer, mark), Qnil),
833 Fcons (visible ? Qt : Qnil,
834 Fcons (BVAR (current_buffer, mark_active),
835 selected_window))));
838 Lisp_Object
839 save_excursion_restore (Lisp_Object info)
841 Lisp_Object tem, tem1, omark, nmark;
842 struct gcpro gcpro1, gcpro2, gcpro3;
843 int visible_p;
845 tem = Fmarker_buffer (XCAR (info));
846 /* If buffer being returned to is now deleted, avoid error */
847 /* Otherwise could get error here while unwinding to top level
848 and crash */
849 /* In that case, Fmarker_buffer returns nil now. */
850 if (NILP (tem))
851 return Qnil;
853 omark = nmark = Qnil;
854 GCPRO3 (info, omark, nmark);
856 Fset_buffer (tem);
858 /* Point marker. */
859 tem = XCAR (info);
860 Fgoto_char (tem);
861 unchain_marker (XMARKER (tem));
863 /* Mark marker. */
864 info = XCDR (info);
865 tem = XCAR (info);
866 omark = Fmarker_position (BVAR (current_buffer, mark));
867 Fset_marker (BVAR (current_buffer, mark), tem, Fcurrent_buffer ());
868 nmark = Fmarker_position (tem);
869 unchain_marker (XMARKER (tem));
871 /* visible */
872 info = XCDR (info);
873 visible_p = !NILP (XCAR (info));
875 #if 0 /* We used to make the current buffer visible in the selected window
876 if that was true previously. That avoids some anomalies.
877 But it creates others, and it wasn't documented, and it is simpler
878 and cleaner never to alter the window/buffer connections. */
879 tem1 = Fcar (tem);
880 if (!NILP (tem1)
881 && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer))
882 Fswitch_to_buffer (Fcurrent_buffer (), Qnil);
883 #endif /* 0 */
885 /* Mark active */
886 info = XCDR (info);
887 tem = XCAR (info);
888 tem1 = BVAR (current_buffer, mark_active);
889 BVAR (current_buffer, mark_active) = tem;
891 /* If mark is active now, and either was not active
892 or was at a different place, run the activate hook. */
893 if (! NILP (tem))
895 if (! EQ (omark, nmark))
897 tem = intern ("activate-mark-hook");
898 Frun_hooks (1, &tem);
901 /* If mark has ceased to be active, run deactivate hook. */
902 else if (! NILP (tem1))
904 tem = intern ("deactivate-mark-hook");
905 Frun_hooks (1, &tem);
908 /* If buffer was visible in a window, and a different window was
909 selected, and the old selected window is still showing this
910 buffer, restore point in that window. */
911 tem = XCDR (info);
912 if (visible_p
913 && !EQ (tem, selected_window)
914 && (tem1 = XWINDOW (tem)->buffer,
915 (/* Window is live... */
916 BUFFERP (tem1)
917 /* ...and it shows the current buffer. */
918 && XBUFFER (tem1) == current_buffer)))
919 Fset_window_point (tem, make_number (PT));
921 UNGCPRO;
922 return Qnil;
925 DEFUN ("save-excursion", Fsave_excursion, Ssave_excursion, 0, UNEVALLED, 0,
926 doc: /* Save point, mark, and current buffer; execute BODY; restore those things.
927 Executes BODY just like `progn'.
928 The values of point, mark and the current buffer are restored
929 even in case of abnormal exit (throw or error).
930 The state of activation of the mark is also restored.
932 This construct does not save `deactivate-mark', and therefore
933 functions that change the buffer will still cause deactivation
934 of the mark at the end of the command. To prevent that, bind
935 `deactivate-mark' with `let'.
937 If you only want to save the current buffer but not point nor mark,
938 then just use `save-current-buffer', or even `with-current-buffer'.
940 usage: (save-excursion &rest BODY) */)
941 (Lisp_Object args)
943 register Lisp_Object val;
944 ptrdiff_t count = SPECPDL_INDEX ();
946 record_unwind_protect (save_excursion_restore, save_excursion_save ());
948 val = Fprogn (args);
949 return unbind_to (count, val);
952 DEFUN ("save-current-buffer", Fsave_current_buffer, Ssave_current_buffer, 0, UNEVALLED, 0,
953 doc: /* Save the current buffer; execute BODY; restore the current buffer.
954 Executes BODY just like `progn'.
955 usage: (save-current-buffer &rest BODY) */)
956 (Lisp_Object args)
958 Lisp_Object val;
959 ptrdiff_t count = SPECPDL_INDEX ();
961 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
963 val = Fprogn (args);
964 return unbind_to (count, val);
967 DEFUN ("buffer-size", Fbufsize, Sbufsize, 0, 1, 0,
968 doc: /* Return the number of characters in the current buffer.
969 If BUFFER, return the number of characters in that buffer instead. */)
970 (Lisp_Object buffer)
972 if (NILP (buffer))
973 return make_number (Z - BEG);
974 else
976 CHECK_BUFFER (buffer);
977 return make_number (BUF_Z (XBUFFER (buffer))
978 - BUF_BEG (XBUFFER (buffer)));
982 DEFUN ("point-min", Fpoint_min, Spoint_min, 0, 0, 0,
983 doc: /* Return the minimum permissible value of point in the current buffer.
984 This is 1, unless narrowing (a buffer restriction) is in effect. */)
985 (void)
987 Lisp_Object temp;
988 XSETFASTINT (temp, BEGV);
989 return temp;
992 DEFUN ("point-min-marker", Fpoint_min_marker, Spoint_min_marker, 0, 0, 0,
993 doc: /* Return a marker to the minimum permissible value of point in this buffer.
994 This is the beginning, unless narrowing (a buffer restriction) is in effect. */)
995 (void)
997 return build_marker (current_buffer, BEGV, BEGV_BYTE);
1000 DEFUN ("point-max", Fpoint_max, Spoint_max, 0, 0, 0,
1001 doc: /* Return the maximum permissible value of point in the current buffer.
1002 This is (1+ (buffer-size)), unless narrowing (a buffer restriction)
1003 is in effect, in which case it is less. */)
1004 (void)
1006 Lisp_Object temp;
1007 XSETFASTINT (temp, ZV);
1008 return temp;
1011 DEFUN ("point-max-marker", Fpoint_max_marker, Spoint_max_marker, 0, 0, 0,
1012 doc: /* Return a marker to the maximum permissible value of point in this buffer.
1013 This is (1+ (buffer-size)), unless narrowing (a buffer restriction)
1014 is in effect, in which case it is less. */)
1015 (void)
1017 return build_marker (current_buffer, ZV, ZV_BYTE);
1020 DEFUN ("gap-position", Fgap_position, Sgap_position, 0, 0, 0,
1021 doc: /* Return the position of the gap, in the current buffer.
1022 See also `gap-size'. */)
1023 (void)
1025 Lisp_Object temp;
1026 XSETFASTINT (temp, GPT);
1027 return temp;
1030 DEFUN ("gap-size", Fgap_size, Sgap_size, 0, 0, 0,
1031 doc: /* Return the size of the current buffer's gap.
1032 See also `gap-position'. */)
1033 (void)
1035 Lisp_Object temp;
1036 XSETFASTINT (temp, GAP_SIZE);
1037 return temp;
1040 DEFUN ("position-bytes", Fposition_bytes, Sposition_bytes, 1, 1, 0,
1041 doc: /* Return the byte position for character position POSITION.
1042 If POSITION is out of range, the value is nil. */)
1043 (Lisp_Object position)
1045 CHECK_NUMBER_COERCE_MARKER (position);
1046 if (XINT (position) < BEG || XINT (position) > Z)
1047 return Qnil;
1048 return make_number (CHAR_TO_BYTE (XINT (position)));
1051 DEFUN ("byte-to-position", Fbyte_to_position, Sbyte_to_position, 1, 1, 0,
1052 doc: /* Return the character position for byte position BYTEPOS.
1053 If BYTEPOS is out of range, the value is nil. */)
1054 (Lisp_Object bytepos)
1056 CHECK_NUMBER (bytepos);
1057 if (XINT (bytepos) < BEG_BYTE || XINT (bytepos) > Z_BYTE)
1058 return Qnil;
1059 return make_number (BYTE_TO_CHAR (XINT (bytepos)));
1062 DEFUN ("following-char", Ffollowing_char, Sfollowing_char, 0, 0, 0,
1063 doc: /* Return the character following point, as a number.
1064 At the end of the buffer or accessible region, return 0. */)
1065 (void)
1067 Lisp_Object temp;
1068 if (PT >= ZV)
1069 XSETFASTINT (temp, 0);
1070 else
1071 XSETFASTINT (temp, FETCH_CHAR (PT_BYTE));
1072 return temp;
1075 DEFUN ("preceding-char", Fprevious_char, Sprevious_char, 0, 0, 0,
1076 doc: /* Return the character preceding point, as a number.
1077 At the beginning of the buffer or accessible region, return 0. */)
1078 (void)
1080 Lisp_Object temp;
1081 if (PT <= BEGV)
1082 XSETFASTINT (temp, 0);
1083 else if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
1085 ptrdiff_t pos = PT_BYTE;
1086 DEC_POS (pos);
1087 XSETFASTINT (temp, FETCH_CHAR (pos));
1089 else
1090 XSETFASTINT (temp, FETCH_BYTE (PT_BYTE - 1));
1091 return temp;
1094 DEFUN ("bobp", Fbobp, Sbobp, 0, 0, 0,
1095 doc: /* Return t if point is at the beginning of the buffer.
1096 If the buffer is narrowed, this means the beginning of the narrowed part. */)
1097 (void)
1099 if (PT == BEGV)
1100 return Qt;
1101 return Qnil;
1104 DEFUN ("eobp", Feobp, Seobp, 0, 0, 0,
1105 doc: /* Return t if point is at the end of the buffer.
1106 If the buffer is narrowed, this means the end of the narrowed part. */)
1107 (void)
1109 if (PT == ZV)
1110 return Qt;
1111 return Qnil;
1114 DEFUN ("bolp", Fbolp, Sbolp, 0, 0, 0,
1115 doc: /* Return t if point is at the beginning of a line. */)
1116 (void)
1118 if (PT == BEGV || FETCH_BYTE (PT_BYTE - 1) == '\n')
1119 return Qt;
1120 return Qnil;
1123 DEFUN ("eolp", Feolp, Seolp, 0, 0, 0,
1124 doc: /* Return t if point is at the end of a line.
1125 `End of a line' includes point being at the end of the buffer. */)
1126 (void)
1128 if (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n')
1129 return Qt;
1130 return Qnil;
1133 DEFUN ("char-after", Fchar_after, Schar_after, 0, 1, 0,
1134 doc: /* Return character in current buffer at position POS.
1135 POS is an integer or a marker and defaults to point.
1136 If POS is out of range, the value is nil. */)
1137 (Lisp_Object pos)
1139 register ptrdiff_t pos_byte;
1141 if (NILP (pos))
1143 pos_byte = PT_BYTE;
1144 XSETFASTINT (pos, PT);
1147 if (MARKERP (pos))
1149 pos_byte = marker_byte_position (pos);
1150 if (pos_byte < BEGV_BYTE || pos_byte >= ZV_BYTE)
1151 return Qnil;
1153 else
1155 CHECK_NUMBER_COERCE_MARKER (pos);
1156 if (XINT (pos) < BEGV || XINT (pos) >= ZV)
1157 return Qnil;
1159 pos_byte = CHAR_TO_BYTE (XINT (pos));
1162 return make_number (FETCH_CHAR (pos_byte));
1165 DEFUN ("char-before", Fchar_before, Schar_before, 0, 1, 0,
1166 doc: /* Return character in current buffer preceding position POS.
1167 POS is an integer or a marker and defaults to point.
1168 If POS is out of range, the value is nil. */)
1169 (Lisp_Object pos)
1171 register Lisp_Object val;
1172 register ptrdiff_t pos_byte;
1174 if (NILP (pos))
1176 pos_byte = PT_BYTE;
1177 XSETFASTINT (pos, PT);
1180 if (MARKERP (pos))
1182 pos_byte = marker_byte_position (pos);
1184 if (pos_byte <= BEGV_BYTE || pos_byte > ZV_BYTE)
1185 return Qnil;
1187 else
1189 CHECK_NUMBER_COERCE_MARKER (pos);
1191 if (XINT (pos) <= BEGV || XINT (pos) > ZV)
1192 return Qnil;
1194 pos_byte = CHAR_TO_BYTE (XINT (pos));
1197 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
1199 DEC_POS (pos_byte);
1200 XSETFASTINT (val, FETCH_CHAR (pos_byte));
1202 else
1204 pos_byte--;
1205 XSETFASTINT (val, FETCH_BYTE (pos_byte));
1207 return val;
1210 DEFUN ("user-login-name", Fuser_login_name, Suser_login_name, 0, 1, 0,
1211 doc: /* Return the name under which the user logged in, as a string.
1212 This is based on the effective uid, not the real uid.
1213 Also, if the environment variables LOGNAME or USER are set,
1214 that determines the value of this function.
1216 If optional argument UID is an integer or a float, return the login name
1217 of the user with that uid, or nil if there is no such user. */)
1218 (Lisp_Object uid)
1220 struct passwd *pw;
1221 uid_t id;
1223 /* Set up the user name info if we didn't do it before.
1224 (That can happen if Emacs is dumpable
1225 but you decide to run `temacs -l loadup' and not dump. */
1226 if (INTEGERP (Vuser_login_name))
1227 init_editfns ();
1229 if (NILP (uid))
1230 return Vuser_login_name;
1232 CONS_TO_INTEGER (uid, uid_t, id);
1233 BLOCK_INPUT;
1234 pw = getpwuid (id);
1235 UNBLOCK_INPUT;
1236 return (pw ? build_string (pw->pw_name) : Qnil);
1239 DEFUN ("user-real-login-name", Fuser_real_login_name, Suser_real_login_name,
1240 0, 0, 0,
1241 doc: /* Return the name of the user's real uid, as a string.
1242 This ignores the environment variables LOGNAME and USER, so it differs from
1243 `user-login-name' when running under `su'. */)
1244 (void)
1246 /* Set up the user name info if we didn't do it before.
1247 (That can happen if Emacs is dumpable
1248 but you decide to run `temacs -l loadup' and not dump. */
1249 if (INTEGERP (Vuser_login_name))
1250 init_editfns ();
1251 return Vuser_real_login_name;
1254 DEFUN ("user-uid", Fuser_uid, Suser_uid, 0, 0, 0,
1255 doc: /* Return the effective uid of Emacs.
1256 Value is an integer or a float, depending on the value. */)
1257 (void)
1259 uid_t euid = geteuid ();
1260 return make_fixnum_or_float (euid);
1263 DEFUN ("user-real-uid", Fuser_real_uid, Suser_real_uid, 0, 0, 0,
1264 doc: /* Return the real uid of Emacs.
1265 Value is an integer or a float, depending on the value. */)
1266 (void)
1268 uid_t uid = getuid ();
1269 return make_fixnum_or_float (uid);
1272 DEFUN ("user-full-name", Fuser_full_name, Suser_full_name, 0, 1, 0,
1273 doc: /* Return the full name of the user logged in, as a string.
1274 If the full name corresponding to Emacs's userid is not known,
1275 return "unknown".
1277 If optional argument UID is an integer or float, return the full name
1278 of the user with that uid, or nil if there is no such user.
1279 If UID is a string, return the full name of the user with that login
1280 name, or nil if there is no such user. */)
1281 (Lisp_Object uid)
1283 struct passwd *pw;
1284 register char *p, *q;
1285 Lisp_Object full;
1287 if (NILP (uid))
1288 return Vuser_full_name;
1289 else if (NUMBERP (uid))
1291 uid_t u;
1292 CONS_TO_INTEGER (uid, uid_t, u);
1293 BLOCK_INPUT;
1294 pw = getpwuid (u);
1295 UNBLOCK_INPUT;
1297 else if (STRINGP (uid))
1299 BLOCK_INPUT;
1300 pw = getpwnam (SSDATA (uid));
1301 UNBLOCK_INPUT;
1303 else
1304 error ("Invalid UID specification");
1306 if (!pw)
1307 return Qnil;
1309 p = USER_FULL_NAME;
1310 /* Chop off everything after the first comma. */
1311 q = strchr (p, ',');
1312 full = make_string (p, q ? q - p : strlen (p));
1314 #ifdef AMPERSAND_FULL_NAME
1315 p = SSDATA (full);
1316 q = strchr (p, '&');
1317 /* Substitute the login name for the &, upcasing the first character. */
1318 if (q)
1320 register char *r;
1321 Lisp_Object login;
1323 login = Fuser_login_name (make_number (pw->pw_uid));
1324 r = alloca (strlen (p) + SCHARS (login) + 1);
1325 memcpy (r, p, q - p);
1326 r[q - p] = 0;
1327 strcat (r, SSDATA (login));
1328 r[q - p] = upcase ((unsigned char) r[q - p]);
1329 strcat (r, q + 1);
1330 full = build_string (r);
1332 #endif /* AMPERSAND_FULL_NAME */
1334 return full;
1337 DEFUN ("system-name", Fsystem_name, Ssystem_name, 0, 0, 0,
1338 doc: /* Return the host name of the machine you are running on, as a string. */)
1339 (void)
1341 return Vsystem_name;
1344 const char *
1345 get_system_name (void)
1347 if (STRINGP (Vsystem_name))
1348 return SSDATA (Vsystem_name);
1349 else
1350 return "";
1353 DEFUN ("emacs-pid", Femacs_pid, Semacs_pid, 0, 0, 0,
1354 doc: /* Return the process ID of Emacs, as a number. */)
1355 (void)
1357 pid_t pid = getpid ();
1358 return make_fixnum_or_float (pid);
1363 #ifndef TIME_T_MIN
1364 # define TIME_T_MIN TYPE_MINIMUM (time_t)
1365 #endif
1366 #ifndef TIME_T_MAX
1367 # define TIME_T_MAX TYPE_MAXIMUM (time_t)
1368 #endif
1370 /* Report that a time value is out of range for Emacs. */
1371 void
1372 time_overflow (void)
1374 error ("Specified time is not representable");
1377 /* Return the upper part of the time T (everything but the bottom 16 bits). */
1378 static EMACS_INT
1379 hi_time (time_t t)
1381 time_t hi = t >> 16;
1383 /* Check for overflow, helping the compiler for common cases where
1384 no runtime check is needed, and taking care not to convert
1385 negative numbers to unsigned before comparing them. */
1386 if (! ((! TYPE_SIGNED (time_t)
1387 || MOST_NEGATIVE_FIXNUM <= TIME_T_MIN >> 16
1388 || MOST_NEGATIVE_FIXNUM <= hi)
1389 && (TIME_T_MAX >> 16 <= MOST_POSITIVE_FIXNUM
1390 || hi <= MOST_POSITIVE_FIXNUM)))
1391 time_overflow ();
1393 return hi;
1396 /* Return the bottom 16 bits of the time T. */
1397 static int
1398 lo_time (time_t t)
1400 return t & ((1 << 16) - 1);
1403 DEFUN ("current-time", Fcurrent_time, Scurrent_time, 0, 0, 0,
1404 doc: /* Return the current time, as the number of seconds since 1970-01-01 00:00:00.
1405 The time is returned as a list of integers (HIGH LOW USEC PSEC).
1406 HIGH has the most significant bits of the seconds, while LOW has the
1407 least significant 16 bits. USEC and PSEC are the microsecond and
1408 picosecond counts. */)
1409 (void)
1411 EMACS_TIME t;
1413 EMACS_GET_TIME (t);
1414 return make_lisp_time (t);
1417 DEFUN ("get-internal-run-time", Fget_internal_run_time, Sget_internal_run_time,
1418 0, 0, 0,
1419 doc: /* Return the current run time used by Emacs.
1420 The time is returned as a list (HIGH LOW USEC PSEC), using the same
1421 style as (current-time).
1423 On systems that can't determine the run time, `get-internal-run-time'
1424 does the same thing as `current-time'. */)
1425 (void)
1427 #ifdef HAVE_GETRUSAGE
1428 struct rusage usage;
1429 time_t secs;
1430 int usecs;
1431 EMACS_TIME t;
1433 if (getrusage (RUSAGE_SELF, &usage) < 0)
1434 /* This shouldn't happen. What action is appropriate? */
1435 xsignal0 (Qerror);
1437 /* Sum up user time and system time. */
1438 secs = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec;
1439 usecs = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
1440 if (usecs >= 1000000)
1442 usecs -= 1000000;
1443 secs++;
1445 EMACS_SET_SECS_USECS (t, secs, usecs);
1446 return make_lisp_time (t);
1447 #else /* ! HAVE_GETRUSAGE */
1448 #ifdef WINDOWSNT
1449 return w32_get_internal_run_time ();
1450 #else /* ! WINDOWSNT */
1451 return Fcurrent_time ();
1452 #endif /* WINDOWSNT */
1453 #endif /* HAVE_GETRUSAGE */
1457 /* Make a Lisp list that represents the time T with fraction TAIL. */
1458 static Lisp_Object
1459 make_time_tail (time_t t, Lisp_Object tail)
1461 return Fcons (make_number (hi_time (t)),
1462 Fcons (make_number (lo_time (t)), tail));
1465 /* Make a Lisp list that represents the system time T. */
1466 static Lisp_Object
1467 make_time (time_t t)
1469 return make_time_tail (t, Qnil);
1472 /* Make a Lisp list that represents the Emacs time T. T may be an
1473 invalid time, with a slightly negative tv_nsec value such as
1474 UNKNOWN_MODTIME_NSECS; in that case, the Lisp list contains a
1475 correspondingly negative picosecond count. */
1476 Lisp_Object
1477 make_lisp_time (EMACS_TIME t)
1479 int ns = EMACS_NSECS (t);
1480 return make_time_tail (EMACS_SECS (t),
1481 list2 (make_number (ns / 1000),
1482 make_number (ns % 1000 * 1000)));
1485 /* Decode a Lisp list SPECIFIED_TIME that represents a time.
1486 Set *PHIGH, *PLOW, *PUSEC, *PPSEC to its parts; do not check their values.
1487 Return nonzero if successful. */
1488 static int
1489 disassemble_lisp_time (Lisp_Object specified_time, Lisp_Object *phigh,
1490 Lisp_Object *plow, Lisp_Object *pusec,
1491 Lisp_Object *ppsec)
1493 if (CONSP (specified_time))
1495 Lisp_Object low = XCDR (specified_time);
1496 Lisp_Object usec = make_number (0);
1497 Lisp_Object psec = make_number (0);
1498 if (CONSP (low))
1500 Lisp_Object low_tail = XCDR (low);
1501 low = XCAR (low);
1502 if (CONSP (low_tail))
1504 usec = XCAR (low_tail);
1505 low_tail = XCDR (low_tail);
1506 if (CONSP (low_tail))
1507 psec = XCAR (low_tail);
1509 else if (!NILP (low_tail))
1510 usec = low_tail;
1513 *phigh = XCAR (specified_time);
1514 *plow = low;
1515 *pusec = usec;
1516 *ppsec = psec;
1517 return 1;
1520 return 0;
1523 /* From the time components HIGH, LOW, USEC and PSEC taken from a Lisp
1524 list, generate the corresponding EMACS_TIME value *RESULT, and
1525 if RESULT_PSEC is not null store into *RESULT_PSEC the
1526 (nonnegative) difference in picoseconds between the input time and
1527 the returned time. Return nonzero if successful. */
1529 decode_time_components (Lisp_Object high, Lisp_Object low, Lisp_Object usec,
1530 Lisp_Object psec, EMACS_TIME *result, int *result_psec)
1532 EMACS_INT hi, lo, us, ps;
1533 time_t sec;
1534 if (! (INTEGERP (high) && INTEGERP (low)
1535 && INTEGERP (usec) && INTEGERP (psec)))
1536 return 0;
1537 hi = XINT (high);
1538 lo = XINT (low);
1539 us = XINT (usec);
1540 ps = XINT (psec);
1542 /* Normalize out-of-range lower-order components by carrying
1543 each overflow into the next higher-order component. */
1544 us += ps / 1000000 - (ps % 1000000 < 0);
1545 lo += us / 1000000 - (us % 1000000 < 0);
1546 hi += lo >> 16;
1547 ps = ps % 1000000 + 1000000 * (ps % 1000000 < 0);
1548 us = us % 1000000 + 1000000 * (us % 1000000 < 0);
1549 lo &= (1 << 16) - 1;
1551 /* Check for overflow in the highest-order component. */
1552 if (! ((TYPE_SIGNED (time_t) ? TIME_T_MIN >> 16 <= hi : 0 <= hi)
1553 && hi <= TIME_T_MAX >> 16))
1554 return 0;
1556 sec = hi;
1557 EMACS_SET_SECS_NSECS (*result, (sec << 16) + lo, us * 1000 + ps / 1000);
1558 if (result_psec)
1559 *result_psec = ps % 1000;
1560 return 1;
1563 /* Decode a Lisp list SPECIFIED_TIME that represents a time.
1564 If SPECIFIED_TIME is nil, use the current time.
1565 Round the time down to the nearest EMACS_TIME value, and
1566 if PPSEC is not null store into *PPSEC the (nonnegative) difference in
1567 picoseconds between the input time and the returned time.
1568 Return seconds since the Epoch.
1569 Signal an error if unsuccessful. */
1570 EMACS_TIME
1571 lisp_time_argument (Lisp_Object specified_time, int *ppsec)
1573 EMACS_TIME t;
1574 if (NILP (specified_time))
1575 EMACS_GET_TIME (t);
1576 else
1578 Lisp_Object high, low, usec, psec;
1579 if (! (disassemble_lisp_time (specified_time, &high, &low, &usec, &psec)
1580 && decode_time_components (high, low, usec, psec, &t, ppsec)))
1581 error ("Invalid time specification");
1583 return t;
1586 /* Like lisp_time_argument, except decode only the seconds part,
1587 and do not check the subseconds part, and always round down. */
1588 static time_t
1589 lisp_seconds_argument (Lisp_Object specified_time)
1591 if (NILP (specified_time))
1592 return time (NULL);
1593 else
1595 Lisp_Object high, low, usec, psec;
1596 EMACS_TIME t;
1597 if (! (disassemble_lisp_time (specified_time, &high, &low, &usec, &psec)
1598 && decode_time_components (high, low, make_number (0),
1599 make_number (0), &t, 0)))
1600 error ("Invalid time specification");
1601 return EMACS_SECS (t);
1605 DEFUN ("float-time", Ffloat_time, Sfloat_time, 0, 1, 0,
1606 doc: /* Return the current time, as a float number of seconds since the epoch.
1607 If SPECIFIED-TIME is given, it is the time to convert to float
1608 instead of the current time. The argument should have the form
1609 (HIGH LOW) or (HIGH LOW USEC) or (HIGH LOW USEC PSEC). Thus,
1610 you can use times from `current-time' and from `file-attributes'.
1611 SPECIFIED-TIME can also have the form (HIGH . LOW), but this is
1612 considered obsolete.
1614 WARNING: Since the result is floating point, it may not be exact.
1615 If precise time stamps are required, use either `current-time',
1616 or (if you need time as a string) `format-time-string'. */)
1617 (Lisp_Object specified_time)
1619 int psec;
1620 EMACS_TIME t = lisp_time_argument (specified_time, &psec);
1621 double ps = (1000 * 1000 * 1000 <= INTMAX_MAX / 1000
1622 ? EMACS_NSECS (t) * (intmax_t) 1000 + psec
1623 : EMACS_NSECS (t) * 1e3 + psec);
1624 return make_float (EMACS_SECS (t) + ps / 1e12);
1627 /* Write information into buffer S of size MAXSIZE, according to the
1628 FORMAT of length FORMAT_LEN, using time information taken from *TP.
1629 Default to Universal Time if UT is nonzero, local time otherwise.
1630 Use NS as the number of nanoseconds in the %N directive.
1631 Return the number of bytes written, not including the terminating
1632 '\0'. If S is NULL, nothing will be written anywhere; so to
1633 determine how many bytes would be written, use NULL for S and
1634 ((size_t) -1) for MAXSIZE.
1636 This function behaves like nstrftime, except it allows null
1637 bytes in FORMAT and it does not support nanoseconds. */
1638 static size_t
1639 emacs_nmemftime (char *s, size_t maxsize, const char *format,
1640 size_t format_len, const struct tm *tp, int ut, int ns)
1642 size_t total = 0;
1644 /* Loop through all the null-terminated strings in the format
1645 argument. Normally there's just one null-terminated string, but
1646 there can be arbitrarily many, concatenated together, if the
1647 format contains '\0' bytes. nstrftime stops at the first
1648 '\0' byte so we must invoke it separately for each such string. */
1649 for (;;)
1651 size_t len;
1652 size_t result;
1654 if (s)
1655 s[0] = '\1';
1657 result = nstrftime (s, maxsize, format, tp, ut, ns);
1659 if (s)
1661 if (result == 0 && s[0] != '\0')
1662 return 0;
1663 s += result + 1;
1666 maxsize -= result + 1;
1667 total += result;
1668 len = strlen (format);
1669 if (len == format_len)
1670 return total;
1671 total++;
1672 format += len + 1;
1673 format_len -= len + 1;
1677 DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0,
1678 doc: /* Use FORMAT-STRING to format the time TIME, or now if omitted.
1679 TIME is specified as (HIGH LOW USEC PSEC), as returned by
1680 `current-time' or `file-attributes'. The obsolete form (HIGH . LOW)
1681 is also still accepted.
1682 The third, optional, argument UNIVERSAL, if non-nil, means describe TIME
1683 as Universal Time; nil means describe TIME in the local time zone.
1684 The value is a copy of FORMAT-STRING, but with certain constructs replaced
1685 by text that describes the specified date and time in TIME:
1687 %Y is the year, %y within the century, %C the century.
1688 %G is the year corresponding to the ISO week, %g within the century.
1689 %m is the numeric month.
1690 %b and %h are the locale's abbreviated month name, %B the full name.
1691 %d is the day of the month, zero-padded, %e is blank-padded.
1692 %u is the numeric day of week from 1 (Monday) to 7, %w from 0 (Sunday) to 6.
1693 %a is the locale's abbreviated name of the day of week, %A the full name.
1694 %U is the week number starting on Sunday, %W starting on Monday,
1695 %V according to ISO 8601.
1696 %j is the day of the year.
1698 %H is the hour on a 24-hour clock, %I is on a 12-hour clock, %k is like %H
1699 only blank-padded, %l is like %I blank-padded.
1700 %p is the locale's equivalent of either AM or PM.
1701 %M is the minute.
1702 %S is the second.
1703 %N is the nanosecond, %6N the microsecond, %3N the millisecond, etc.
1704 %Z is the time zone name, %z is the numeric form.
1705 %s is the number of seconds since 1970-01-01 00:00:00 +0000.
1707 %c is the locale's date and time format.
1708 %x is the locale's "preferred" date format.
1709 %D is like "%m/%d/%y".
1711 %R is like "%H:%M", %T is like "%H:%M:%S", %r is like "%I:%M:%S %p".
1712 %X is the locale's "preferred" time format.
1714 Finally, %n is a newline, %t is a tab, %% is a literal %.
1716 Certain flags and modifiers are available with some format controls.
1717 The flags are `_', `-', `^' and `#'. For certain characters X,
1718 %_X is like %X, but padded with blanks; %-X is like %X,
1719 but without padding. %^X is like %X, but with all textual
1720 characters up-cased; %#X is like %X, but with letter-case of
1721 all textual characters reversed.
1722 %NX (where N stands for an integer) is like %X,
1723 but takes up at least N (a number) positions.
1724 The modifiers are `E' and `O'. For certain characters X,
1725 %EX is a locale's alternative version of %X;
1726 %OX is like %X, but uses the locale's number symbols.
1728 For example, to produce full ISO 8601 format, use "%Y-%m-%dT%T%z".
1730 usage: (format-time-string FORMAT-STRING &optional TIME UNIVERSAL) */)
1731 (Lisp_Object format_string, Lisp_Object timeval, Lisp_Object universal)
1733 EMACS_TIME t = lisp_time_argument (timeval, 0);
1734 struct tm tm;
1736 CHECK_STRING (format_string);
1737 format_string = code_convert_string_norecord (format_string,
1738 Vlocale_coding_system, 1);
1739 return format_time_string (SSDATA (format_string), SBYTES (format_string),
1740 t, ! NILP (universal), &tm);
1743 static Lisp_Object
1744 format_time_string (char const *format, ptrdiff_t formatlen,
1745 EMACS_TIME t, int ut, struct tm *tmp)
1747 char buffer[4000];
1748 char *buf = buffer;
1749 ptrdiff_t size = sizeof buffer;
1750 size_t len;
1751 Lisp_Object bufstring;
1752 int ns = EMACS_NSECS (t);
1753 struct tm *tm;
1754 USE_SAFE_ALLOCA;
1756 while (1)
1758 BLOCK_INPUT;
1760 synchronize_system_time_locale ();
1762 tm = ut ? gmtime (EMACS_SECS_ADDR (t)) : localtime (EMACS_SECS_ADDR (t));
1763 if (! tm)
1765 UNBLOCK_INPUT;
1766 time_overflow ();
1768 *tmp = *tm;
1770 buf[0] = '\1';
1771 len = emacs_nmemftime (buf, size, format, formatlen, tm, ut, ns);
1772 if ((0 < len && len < size) || (len == 0 && buf[0] == '\0'))
1773 break;
1775 /* Buffer was too small, so make it bigger and try again. */
1776 len = emacs_nmemftime (NULL, SIZE_MAX, format, formatlen, tm, ut, ns);
1777 UNBLOCK_INPUT;
1778 if (STRING_BYTES_BOUND <= len)
1779 string_overflow ();
1780 size = len + 1;
1781 SAFE_ALLOCA (buf, char *, size);
1784 UNBLOCK_INPUT;
1785 bufstring = make_unibyte_string (buf, len);
1786 SAFE_FREE ();
1787 return code_convert_string_norecord (bufstring, Vlocale_coding_system, 0);
1790 DEFUN ("decode-time", Fdecode_time, Sdecode_time, 0, 1, 0,
1791 doc: /* Decode a time value as (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE).
1792 The optional SPECIFIED-TIME should be a list of (HIGH LOW . IGNORED),
1793 as from `current-time' and `file-attributes', or nil to use the
1794 current time. The obsolete form (HIGH . LOW) is also still accepted.
1795 The list has the following nine members: SEC is an integer between 0
1796 and 60; SEC is 60 for a leap second, which only some operating systems
1797 support. MINUTE is an integer between 0 and 59. HOUR is an integer
1798 between 0 and 23. DAY is an integer between 1 and 31. MONTH is an
1799 integer between 1 and 12. YEAR is an integer indicating the
1800 four-digit year. DOW is the day of week, an integer between 0 and 6,
1801 where 0 is Sunday. DST is t if daylight saving time is in effect,
1802 otherwise nil. ZONE is an integer indicating the number of seconds
1803 east of Greenwich. (Note that Common Lisp has different meanings for
1804 DOW and ZONE.) */)
1805 (Lisp_Object specified_time)
1807 time_t time_spec = lisp_seconds_argument (specified_time);
1808 struct tm save_tm;
1809 struct tm *decoded_time;
1810 Lisp_Object list_args[9];
1812 BLOCK_INPUT;
1813 decoded_time = localtime (&time_spec);
1814 if (decoded_time)
1815 save_tm = *decoded_time;
1816 UNBLOCK_INPUT;
1817 if (! (decoded_time
1818 && MOST_NEGATIVE_FIXNUM - TM_YEAR_BASE <= save_tm.tm_year
1819 && save_tm.tm_year <= MOST_POSITIVE_FIXNUM - TM_YEAR_BASE))
1820 time_overflow ();
1821 XSETFASTINT (list_args[0], save_tm.tm_sec);
1822 XSETFASTINT (list_args[1], save_tm.tm_min);
1823 XSETFASTINT (list_args[2], save_tm.tm_hour);
1824 XSETFASTINT (list_args[3], save_tm.tm_mday);
1825 XSETFASTINT (list_args[4], save_tm.tm_mon + 1);
1826 /* On 64-bit machines an int is narrower than EMACS_INT, thus the
1827 cast below avoids overflow in int arithmetics. */
1828 XSETINT (list_args[5], TM_YEAR_BASE + (EMACS_INT) save_tm.tm_year);
1829 XSETFASTINT (list_args[6], save_tm.tm_wday);
1830 list_args[7] = save_tm.tm_isdst ? Qt : Qnil;
1832 BLOCK_INPUT;
1833 decoded_time = gmtime (&time_spec);
1834 if (decoded_time == 0)
1835 list_args[8] = Qnil;
1836 else
1837 XSETINT (list_args[8], tm_diff (&save_tm, decoded_time));
1838 UNBLOCK_INPUT;
1839 return Flist (9, list_args);
1842 /* Return OBJ - OFFSET, checking that OBJ is a valid fixnum and that
1843 the result is representable as an int. Assume OFFSET is small and
1844 nonnegative. */
1845 static int
1846 check_tm_member (Lisp_Object obj, int offset)
1848 EMACS_INT n;
1849 CHECK_NUMBER (obj);
1850 n = XINT (obj);
1851 if (! (INT_MIN + offset <= n && n - offset <= INT_MAX))
1852 time_overflow ();
1853 return n - offset;
1856 DEFUN ("encode-time", Fencode_time, Sencode_time, 6, MANY, 0,
1857 doc: /* Convert SECOND, MINUTE, HOUR, DAY, MONTH, YEAR and ZONE to internal time.
1858 This is the reverse operation of `decode-time', which see.
1859 ZONE defaults to the current time zone rule. This can
1860 be a string or t (as from `set-time-zone-rule'), or it can be a list
1861 \(as from `current-time-zone') or an integer (as from `decode-time')
1862 applied without consideration for daylight saving time.
1864 You can pass more than 7 arguments; then the first six arguments
1865 are used as SECOND through YEAR, and the *last* argument is used as ZONE.
1866 The intervening arguments are ignored.
1867 This feature lets (apply 'encode-time (decode-time ...)) work.
1869 Out-of-range values for SECOND, MINUTE, HOUR, DAY, or MONTH are allowed;
1870 for example, a DAY of 0 means the day preceding the given month.
1871 Year numbers less than 100 are treated just like other year numbers.
1872 If you want them to stand for years in this century, you must do that yourself.
1874 Years before 1970 are not guaranteed to work. On some systems,
1875 year values as low as 1901 do work.
1877 usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE) */)
1878 (ptrdiff_t nargs, Lisp_Object *args)
1880 time_t value;
1881 struct tm tm;
1882 Lisp_Object zone = (nargs > 6 ? args[nargs - 1] : Qnil);
1884 tm.tm_sec = check_tm_member (args[0], 0);
1885 tm.tm_min = check_tm_member (args[1], 0);
1886 tm.tm_hour = check_tm_member (args[2], 0);
1887 tm.tm_mday = check_tm_member (args[3], 0);
1888 tm.tm_mon = check_tm_member (args[4], 1);
1889 tm.tm_year = check_tm_member (args[5], TM_YEAR_BASE);
1890 tm.tm_isdst = -1;
1892 if (CONSP (zone))
1893 zone = Fcar (zone);
1894 if (NILP (zone))
1896 BLOCK_INPUT;
1897 value = mktime (&tm);
1898 UNBLOCK_INPUT;
1900 else
1902 char tzbuf[100];
1903 const char *tzstring;
1904 char **oldenv = environ, **newenv;
1906 if (EQ (zone, Qt))
1907 tzstring = "UTC0";
1908 else if (STRINGP (zone))
1909 tzstring = SSDATA (zone);
1910 else if (INTEGERP (zone))
1912 EMACS_INT abszone = eabs (XINT (zone));
1913 EMACS_INT zone_hr = abszone / (60*60);
1914 int zone_min = (abszone/60) % 60;
1915 int zone_sec = abszone % 60;
1916 sprintf (tzbuf, "XXX%s%"pI"d:%02d:%02d", "-" + (XINT (zone) < 0),
1917 zone_hr, zone_min, zone_sec);
1918 tzstring = tzbuf;
1920 else
1921 error ("Invalid time zone specification");
1923 BLOCK_INPUT;
1925 /* Set TZ before calling mktime; merely adjusting mktime's returned
1926 value doesn't suffice, since that would mishandle leap seconds. */
1927 set_time_zone_rule (tzstring);
1929 value = mktime (&tm);
1931 /* Restore TZ to previous value. */
1932 newenv = environ;
1933 environ = oldenv;
1934 #ifdef LOCALTIME_CACHE
1935 tzset ();
1936 #endif
1937 UNBLOCK_INPUT;
1939 xfree (newenv);
1942 if (value == (time_t) -1)
1943 time_overflow ();
1945 return make_time (value);
1948 DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0,
1949 doc: /* Return the current local time, as a human-readable string.
1950 Programs can use this function to decode a time,
1951 since the number of columns in each field is fixed
1952 if the year is in the range 1000-9999.
1953 The format is `Sun Sep 16 01:03:52 1973'.
1954 However, see also the functions `decode-time' and `format-time-string'
1955 which provide a much more powerful and general facility.
1957 If SPECIFIED-TIME is given, it is a time to format instead of the
1958 current time. The argument should have the form (HIGH LOW . IGNORED).
1959 Thus, you can use times obtained from `current-time' and from
1960 `file-attributes'. SPECIFIED-TIME can also have the form (HIGH . LOW),
1961 but this is considered obsolete. */)
1962 (Lisp_Object specified_time)
1964 time_t value = lisp_seconds_argument (specified_time);
1965 struct tm *tm;
1966 char buf[sizeof "Mon Apr 30 12:49:17 " + INT_STRLEN_BOUND (int) + 1];
1967 int len IF_LINT (= 0);
1969 /* Convert to a string in ctime format, except without the trailing
1970 newline, and without the 4-digit year limit. Don't use asctime
1971 or ctime, as they might dump core if the year is outside the
1972 range -999 .. 9999. */
1973 BLOCK_INPUT;
1974 tm = localtime (&value);
1975 if (tm)
1977 static char const wday_name[][4] =
1978 { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
1979 static char const mon_name[][4] =
1980 { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
1981 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
1982 printmax_t year_base = TM_YEAR_BASE;
1984 len = sprintf (buf, "%s %s%3d %02d:%02d:%02d %"pMd,
1985 wday_name[tm->tm_wday], mon_name[tm->tm_mon], tm->tm_mday,
1986 tm->tm_hour, tm->tm_min, tm->tm_sec,
1987 tm->tm_year + year_base);
1989 UNBLOCK_INPUT;
1990 if (! tm)
1991 time_overflow ();
1993 return make_unibyte_string (buf, len);
1996 /* Yield A - B, measured in seconds.
1997 This function is copied from the GNU C Library. */
1998 static int
1999 tm_diff (struct tm *a, struct tm *b)
2001 /* Compute intervening leap days correctly even if year is negative.
2002 Take care to avoid int overflow in leap day calculations,
2003 but it's OK to assume that A and B are close to each other. */
2004 int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3);
2005 int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3);
2006 int a100 = a4 / 25 - (a4 % 25 < 0);
2007 int b100 = b4 / 25 - (b4 % 25 < 0);
2008 int a400 = a100 >> 2;
2009 int b400 = b100 >> 2;
2010 int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
2011 int years = a->tm_year - b->tm_year;
2012 int days = (365 * years + intervening_leap_days
2013 + (a->tm_yday - b->tm_yday));
2014 return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
2015 + (a->tm_min - b->tm_min))
2016 + (a->tm_sec - b->tm_sec));
2019 DEFUN ("current-time-zone", Fcurrent_time_zone, Scurrent_time_zone, 0, 1, 0,
2020 doc: /* Return the offset and name for the local time zone.
2021 This returns a list of the form (OFFSET NAME).
2022 OFFSET is an integer number of seconds ahead of UTC (east of Greenwich).
2023 A negative value means west of Greenwich.
2024 NAME is a string giving the name of the time zone.
2025 If SPECIFIED-TIME is given, the time zone offset is determined from it
2026 instead of using the current time. The argument should have the form
2027 (HIGH LOW . IGNORED). Thus, you can use times obtained from
2028 `current-time' and from `file-attributes'. SPECIFIED-TIME can also
2029 have the form (HIGH . LOW), but this is considered obsolete.
2031 Some operating systems cannot provide all this information to Emacs;
2032 in this case, `current-time-zone' returns a list containing nil for
2033 the data it can't find. */)
2034 (Lisp_Object specified_time)
2036 EMACS_TIME value;
2037 int offset;
2038 struct tm *t;
2039 struct tm localtm;
2040 Lisp_Object zone_offset, zone_name;
2042 zone_offset = Qnil;
2043 EMACS_SET_SECS_NSECS (value, lisp_seconds_argument (specified_time), 0);
2044 zone_name = format_time_string ("%Z", sizeof "%Z" - 1, value, 0, &localtm);
2045 BLOCK_INPUT;
2046 t = gmtime (EMACS_SECS_ADDR (value));
2047 if (t)
2048 offset = tm_diff (&localtm, t);
2049 UNBLOCK_INPUT;
2051 if (t)
2053 zone_offset = make_number (offset);
2054 if (SCHARS (zone_name) == 0)
2056 /* No local time zone name is available; use "+-NNNN" instead. */
2057 int m = offset / 60;
2058 int am = offset < 0 ? - m : m;
2059 char buf[sizeof "+00" + INT_STRLEN_BOUND (int)];
2060 sprintf (buf, "%c%02d%02d", (offset < 0 ? '-' : '+'), am/60, am%60);
2061 zone_name = build_string (buf);
2065 return list2 (zone_offset, zone_name);
2068 /* This holds the value of `environ' produced by the previous
2069 call to Fset_time_zone_rule, or 0 if Fset_time_zone_rule
2070 has never been called. */
2071 static char **environbuf;
2073 /* This holds the startup value of the TZ environment variable so it
2074 can be restored if the user calls set-time-zone-rule with a nil
2075 argument. */
2076 static char *initial_tz;
2078 DEFUN ("set-time-zone-rule", Fset_time_zone_rule, Sset_time_zone_rule, 1, 1, 0,
2079 doc: /* Set the local time zone using TZ, a string specifying a time zone rule.
2080 If TZ is nil, use implementation-defined default time zone information.
2081 If TZ is t, use Universal Time.
2083 Instead of calling this function, you typically want (setenv "TZ" TZ).
2084 That changes both the environment of the Emacs process and the
2085 variable `process-environment', whereas `set-time-zone-rule' affects
2086 only the former. */)
2087 (Lisp_Object tz)
2089 const char *tzstring;
2090 char **old_environbuf;
2092 if (! (NILP (tz) || EQ (tz, Qt)))
2093 CHECK_STRING (tz);
2095 BLOCK_INPUT;
2097 /* When called for the first time, save the original TZ. */
2098 old_environbuf = environbuf;
2099 if (!old_environbuf)
2100 initial_tz = (char *) getenv ("TZ");
2102 if (NILP (tz))
2103 tzstring = initial_tz;
2104 else if (EQ (tz, Qt))
2105 tzstring = "UTC0";
2106 else
2107 tzstring = SSDATA (tz);
2109 set_time_zone_rule (tzstring);
2110 environbuf = environ;
2112 UNBLOCK_INPUT;
2114 xfree (old_environbuf);
2115 return Qnil;
2118 #ifdef LOCALTIME_CACHE
2120 /* These two values are known to load tz files in buggy implementations,
2121 i.e. Solaris 1 executables running under either Solaris 1 or Solaris 2.
2122 Their values shouldn't matter in non-buggy implementations.
2123 We don't use string literals for these strings,
2124 since if a string in the environment is in readonly
2125 storage, it runs afoul of bugs in SVR4 and Solaris 2.3.
2126 See Sun bugs 1113095 and 1114114, ``Timezone routines
2127 improperly modify environment''. */
2129 static char set_time_zone_rule_tz1[] = "TZ=GMT+0";
2130 static char set_time_zone_rule_tz2[] = "TZ=GMT+1";
2132 #endif
2134 /* Set the local time zone rule to TZSTRING.
2135 This allocates memory into `environ', which it is the caller's
2136 responsibility to free. */
2138 void
2139 set_time_zone_rule (const char *tzstring)
2141 ptrdiff_t envptrs;
2142 char **from, **to, **newenv;
2144 /* Make the ENVIRON vector longer with room for TZSTRING. */
2145 for (from = environ; *from; from++)
2146 continue;
2147 envptrs = from - environ + 2;
2148 newenv = to = xmalloc (envptrs * sizeof *newenv
2149 + (tzstring ? strlen (tzstring) + 4 : 0));
2151 /* Add TZSTRING to the end of environ, as a value for TZ. */
2152 if (tzstring)
2154 char *t = (char *) (to + envptrs);
2155 strcpy (t, "TZ=");
2156 strcat (t, tzstring);
2157 *to++ = t;
2160 /* Copy the old environ vector elements into NEWENV,
2161 but don't copy the TZ variable.
2162 So we have only one definition of TZ, which came from TZSTRING. */
2163 for (from = environ; *from; from++)
2164 if (strncmp (*from, "TZ=", 3) != 0)
2165 *to++ = *from;
2166 *to = 0;
2168 environ = newenv;
2170 /* If we do have a TZSTRING, NEWENV points to the vector slot where
2171 the TZ variable is stored. If we do not have a TZSTRING,
2172 TO points to the vector slot which has the terminating null. */
2174 #ifdef LOCALTIME_CACHE
2176 /* In SunOS 4.1.3_U1 and 4.1.4, if TZ has a value like
2177 "US/Pacific" that loads a tz file, then changes to a value like
2178 "XXX0" that does not load a tz file, and then changes back to
2179 its original value, the last change is (incorrectly) ignored.
2180 Also, if TZ changes twice in succession to values that do
2181 not load a tz file, tzset can dump core (see Sun bug#1225179).
2182 The following code works around these bugs. */
2184 if (tzstring)
2186 /* Temporarily set TZ to a value that loads a tz file
2187 and that differs from tzstring. */
2188 char *tz = *newenv;
2189 *newenv = (strcmp (tzstring, set_time_zone_rule_tz1 + 3) == 0
2190 ? set_time_zone_rule_tz2 : set_time_zone_rule_tz1);
2191 tzset ();
2192 *newenv = tz;
2194 else
2196 /* The implied tzstring is unknown, so temporarily set TZ to
2197 two different values that each load a tz file. */
2198 *to = set_time_zone_rule_tz1;
2199 to[1] = 0;
2200 tzset ();
2201 *to = set_time_zone_rule_tz2;
2202 tzset ();
2203 *to = 0;
2206 /* Now TZ has the desired value, and tzset can be invoked safely. */
2209 tzset ();
2210 #endif
2213 /* Insert NARGS Lisp objects in the array ARGS by calling INSERT_FUNC
2214 (if a type of object is Lisp_Int) or INSERT_FROM_STRING_FUNC (if a
2215 type of object is Lisp_String). INHERIT is passed to
2216 INSERT_FROM_STRING_FUNC as the last argument. */
2218 static void
2219 general_insert_function (void (*insert_func)
2220 (const char *, ptrdiff_t),
2221 void (*insert_from_string_func)
2222 (Lisp_Object, ptrdiff_t, ptrdiff_t,
2223 ptrdiff_t, ptrdiff_t, int),
2224 int inherit, ptrdiff_t nargs, Lisp_Object *args)
2226 ptrdiff_t argnum;
2227 register Lisp_Object val;
2229 for (argnum = 0; argnum < nargs; argnum++)
2231 val = args[argnum];
2232 if (CHARACTERP (val))
2234 int c = XFASTINT (val);
2235 unsigned char str[MAX_MULTIBYTE_LENGTH];
2236 int len;
2238 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
2239 len = CHAR_STRING (c, str);
2240 else
2242 str[0] = ASCII_CHAR_P (c) ? c : multibyte_char_to_unibyte (c);
2243 len = 1;
2245 (*insert_func) ((char *) str, len);
2247 else if (STRINGP (val))
2249 (*insert_from_string_func) (val, 0, 0,
2250 SCHARS (val),
2251 SBYTES (val),
2252 inherit);
2254 else
2255 wrong_type_argument (Qchar_or_string_p, val);
2259 void
2260 insert1 (Lisp_Object arg)
2262 Finsert (1, &arg);
2266 /* Callers passing one argument to Finsert need not gcpro the
2267 argument "array", since the only element of the array will
2268 not be used after calling insert or insert_from_string, so
2269 we don't care if it gets trashed. */
2271 DEFUN ("insert", Finsert, Sinsert, 0, MANY, 0,
2272 doc: /* Insert the arguments, either strings or characters, at point.
2273 Point and before-insertion markers move forward to end up
2274 after the inserted text.
2275 Any other markers at the point of insertion remain before the text.
2277 If the current buffer is multibyte, unibyte strings are converted
2278 to multibyte for insertion (see `string-make-multibyte').
2279 If the current buffer is unibyte, multibyte strings are converted
2280 to unibyte for insertion (see `string-make-unibyte').
2282 When operating on binary data, it may be necessary to preserve the
2283 original bytes of a unibyte string when inserting it into a multibyte
2284 buffer; to accomplish this, apply `string-as-multibyte' to the string
2285 and insert the result.
2287 usage: (insert &rest ARGS) */)
2288 (ptrdiff_t nargs, Lisp_Object *args)
2290 general_insert_function (insert, insert_from_string, 0, nargs, args);
2291 return Qnil;
2294 DEFUN ("insert-and-inherit", Finsert_and_inherit, Sinsert_and_inherit,
2295 0, MANY, 0,
2296 doc: /* Insert the arguments at point, inheriting properties from adjoining text.
2297 Point and before-insertion markers move forward to end up
2298 after the inserted text.
2299 Any other markers at the point of insertion remain before the text.
2301 If the current buffer is multibyte, unibyte strings are converted
2302 to multibyte for insertion (see `unibyte-char-to-multibyte').
2303 If the current buffer is unibyte, multibyte strings are converted
2304 to unibyte for insertion.
2306 usage: (insert-and-inherit &rest ARGS) */)
2307 (ptrdiff_t nargs, Lisp_Object *args)
2309 general_insert_function (insert_and_inherit, insert_from_string, 1,
2310 nargs, args);
2311 return Qnil;
2314 DEFUN ("insert-before-markers", Finsert_before_markers, Sinsert_before_markers, 0, MANY, 0,
2315 doc: /* Insert strings or characters at point, relocating markers after the text.
2316 Point and markers move forward to end up after the inserted text.
2318 If the current buffer is multibyte, unibyte strings are converted
2319 to multibyte for insertion (see `unibyte-char-to-multibyte').
2320 If the current buffer is unibyte, multibyte strings are converted
2321 to unibyte for insertion.
2323 usage: (insert-before-markers &rest ARGS) */)
2324 (ptrdiff_t nargs, Lisp_Object *args)
2326 general_insert_function (insert_before_markers,
2327 insert_from_string_before_markers, 0,
2328 nargs, args);
2329 return Qnil;
2332 DEFUN ("insert-before-markers-and-inherit", Finsert_and_inherit_before_markers,
2333 Sinsert_and_inherit_before_markers, 0, MANY, 0,
2334 doc: /* Insert text at point, relocating markers and inheriting properties.
2335 Point and markers move forward to end up after the inserted text.
2337 If the current buffer is multibyte, unibyte strings are converted
2338 to multibyte for insertion (see `unibyte-char-to-multibyte').
2339 If the current buffer is unibyte, multibyte strings are converted
2340 to unibyte for insertion.
2342 usage: (insert-before-markers-and-inherit &rest ARGS) */)
2343 (ptrdiff_t nargs, Lisp_Object *args)
2345 general_insert_function (insert_before_markers_and_inherit,
2346 insert_from_string_before_markers, 1,
2347 nargs, args);
2348 return Qnil;
2351 DEFUN ("insert-char", Finsert_char, Sinsert_char, 2, 3, 0,
2352 doc: /* Insert COUNT copies of CHARACTER.
2353 Point, and before-insertion markers, are relocated as in the function `insert'.
2354 The optional third arg INHERIT, if non-nil, says to inherit text properties
2355 from adjoining text, if those properties are sticky. */)
2356 (Lisp_Object character, Lisp_Object count, Lisp_Object inherit)
2358 int i, stringlen;
2359 register ptrdiff_t n;
2360 int c, len;
2361 unsigned char str[MAX_MULTIBYTE_LENGTH];
2362 char string[4000];
2364 CHECK_CHARACTER (character);
2365 CHECK_NUMBER (count);
2366 c = XFASTINT (character);
2368 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
2369 len = CHAR_STRING (c, str);
2370 else
2371 str[0] = c, len = 1;
2372 if (XINT (count) <= 0)
2373 return Qnil;
2374 if (BUF_BYTES_MAX / len < XINT (count))
2375 buffer_overflow ();
2376 n = XINT (count) * len;
2377 stringlen = min (n, sizeof string - sizeof string % len);
2378 for (i = 0; i < stringlen; i++)
2379 string[i] = str[i % len];
2380 while (n > stringlen)
2382 QUIT;
2383 if (!NILP (inherit))
2384 insert_and_inherit (string, stringlen);
2385 else
2386 insert (string, stringlen);
2387 n -= stringlen;
2389 if (!NILP (inherit))
2390 insert_and_inherit (string, n);
2391 else
2392 insert (string, n);
2393 return Qnil;
2396 DEFUN ("insert-byte", Finsert_byte, Sinsert_byte, 2, 3, 0,
2397 doc: /* Insert COUNT (second arg) copies of BYTE (first arg).
2398 Both arguments are required.
2399 BYTE is a number of the range 0..255.
2401 If BYTE is 128..255 and the current buffer is multibyte, the
2402 corresponding eight-bit character is inserted.
2404 Point, and before-insertion markers, are relocated as in the function `insert'.
2405 The optional third arg INHERIT, if non-nil, says to inherit text properties
2406 from adjoining text, if those properties are sticky. */)
2407 (Lisp_Object byte, Lisp_Object count, Lisp_Object inherit)
2409 CHECK_NUMBER (byte);
2410 if (XINT (byte) < 0 || XINT (byte) > 255)
2411 args_out_of_range_3 (byte, make_number (0), make_number (255));
2412 if (XINT (byte) >= 128
2413 && ! NILP (BVAR (current_buffer, enable_multibyte_characters)))
2414 XSETFASTINT (byte, BYTE8_TO_CHAR (XINT (byte)));
2415 return Finsert_char (byte, count, inherit);
2419 /* Making strings from buffer contents. */
2421 /* Return a Lisp_String containing the text of the current buffer from
2422 START to END. If text properties are in use and the current buffer
2423 has properties in the range specified, the resulting string will also
2424 have them, if PROPS is nonzero.
2426 We don't want to use plain old make_string here, because it calls
2427 make_uninit_string, which can cause the buffer arena to be
2428 compacted. make_string has no way of knowing that the data has
2429 been moved, and thus copies the wrong data into the string. This
2430 doesn't effect most of the other users of make_string, so it should
2431 be left as is. But we should use this function when conjuring
2432 buffer substrings. */
2434 Lisp_Object
2435 make_buffer_string (ptrdiff_t start, ptrdiff_t end, int props)
2437 ptrdiff_t start_byte = CHAR_TO_BYTE (start);
2438 ptrdiff_t end_byte = CHAR_TO_BYTE (end);
2440 return make_buffer_string_both (start, start_byte, end, end_byte, props);
2443 /* Return a Lisp_String containing the text of the current buffer from
2444 START / START_BYTE to END / END_BYTE.
2446 If text properties are in use and the current buffer
2447 has properties in the range specified, the resulting string will also
2448 have them, if PROPS is nonzero.
2450 We don't want to use plain old make_string here, because it calls
2451 make_uninit_string, which can cause the buffer arena to be
2452 compacted. make_string has no way of knowing that the data has
2453 been moved, and thus copies the wrong data into the string. This
2454 doesn't effect most of the other users of make_string, so it should
2455 be left as is. But we should use this function when conjuring
2456 buffer substrings. */
2458 Lisp_Object
2459 make_buffer_string_both (ptrdiff_t start, ptrdiff_t start_byte,
2460 ptrdiff_t end, ptrdiff_t end_byte, int props)
2462 Lisp_Object result, tem, tem1;
2464 if (start < GPT && GPT < end)
2465 move_gap (start);
2467 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
2468 result = make_uninit_multibyte_string (end - start, end_byte - start_byte);
2469 else
2470 result = make_uninit_string (end - start);
2471 memcpy (SDATA (result), BYTE_POS_ADDR (start_byte), end_byte - start_byte);
2473 /* If desired, update and copy the text properties. */
2474 if (props)
2476 update_buffer_properties (start, end);
2478 tem = Fnext_property_change (make_number (start), Qnil, make_number (end));
2479 tem1 = Ftext_properties_at (make_number (start), Qnil);
2481 if (XINT (tem) != end || !NILP (tem1))
2482 copy_intervals_to_string (result, current_buffer, start,
2483 end - start);
2486 return result;
2489 /* Call Vbuffer_access_fontify_functions for the range START ... END
2490 in the current buffer, if necessary. */
2492 static void
2493 update_buffer_properties (ptrdiff_t start, ptrdiff_t end)
2495 /* If this buffer has some access functions,
2496 call them, specifying the range of the buffer being accessed. */
2497 if (!NILP (Vbuffer_access_fontify_functions))
2499 Lisp_Object args[3];
2500 Lisp_Object tem;
2502 args[0] = Qbuffer_access_fontify_functions;
2503 XSETINT (args[1], start);
2504 XSETINT (args[2], end);
2506 /* But don't call them if we can tell that the work
2507 has already been done. */
2508 if (!NILP (Vbuffer_access_fontified_property))
2510 tem = Ftext_property_any (args[1], args[2],
2511 Vbuffer_access_fontified_property,
2512 Qnil, Qnil);
2513 if (! NILP (tem))
2514 Frun_hook_with_args (3, args);
2516 else
2517 Frun_hook_with_args (3, args);
2521 DEFUN ("buffer-substring", Fbuffer_substring, Sbuffer_substring, 2, 2, 0,
2522 doc: /* Return the contents of part of the current buffer as a string.
2523 The two arguments START and END are character positions;
2524 they can be in either order.
2525 The string returned is multibyte if the buffer is multibyte.
2527 This function copies the text properties of that part of the buffer
2528 into the result string; if you don't want the text properties,
2529 use `buffer-substring-no-properties' instead. */)
2530 (Lisp_Object start, Lisp_Object end)
2532 register ptrdiff_t b, e;
2534 validate_region (&start, &end);
2535 b = XINT (start);
2536 e = XINT (end);
2538 return make_buffer_string (b, e, 1);
2541 DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties,
2542 Sbuffer_substring_no_properties, 2, 2, 0,
2543 doc: /* Return the characters of part of the buffer, without the text properties.
2544 The two arguments START and END are character positions;
2545 they can be in either order. */)
2546 (Lisp_Object start, Lisp_Object end)
2548 register ptrdiff_t b, e;
2550 validate_region (&start, &end);
2551 b = XINT (start);
2552 e = XINT (end);
2554 return make_buffer_string (b, e, 0);
2557 DEFUN ("buffer-string", Fbuffer_string, Sbuffer_string, 0, 0, 0,
2558 doc: /* Return the contents of the current buffer as a string.
2559 If narrowing is in effect, this function returns only the visible part
2560 of the buffer. */)
2561 (void)
2563 return make_buffer_string (BEGV, ZV, 1);
2566 DEFUN ("insert-buffer-substring", Finsert_buffer_substring, Sinsert_buffer_substring,
2567 1, 3, 0,
2568 doc: /* Insert before point a substring of the contents of BUFFER.
2569 BUFFER may be a buffer or a buffer name.
2570 Arguments START and END are character positions specifying the substring.
2571 They default to the values of (point-min) and (point-max) in BUFFER. */)
2572 (Lisp_Object buffer, Lisp_Object start, Lisp_Object end)
2574 register EMACS_INT b, e, temp;
2575 register struct buffer *bp, *obuf;
2576 Lisp_Object buf;
2578 buf = Fget_buffer (buffer);
2579 if (NILP (buf))
2580 nsberror (buffer);
2581 bp = XBUFFER (buf);
2582 if (NILP (BVAR (bp, name)))
2583 error ("Selecting deleted buffer");
2585 if (NILP (start))
2586 b = BUF_BEGV (bp);
2587 else
2589 CHECK_NUMBER_COERCE_MARKER (start);
2590 b = XINT (start);
2592 if (NILP (end))
2593 e = BUF_ZV (bp);
2594 else
2596 CHECK_NUMBER_COERCE_MARKER (end);
2597 e = XINT (end);
2600 if (b > e)
2601 temp = b, b = e, e = temp;
2603 if (!(BUF_BEGV (bp) <= b && e <= BUF_ZV (bp)))
2604 args_out_of_range (start, end);
2606 obuf = current_buffer;
2607 set_buffer_internal_1 (bp);
2608 update_buffer_properties (b, e);
2609 set_buffer_internal_1 (obuf);
2611 insert_from_buffer (bp, b, e - b, 0);
2612 return Qnil;
2615 DEFUN ("compare-buffer-substrings", Fcompare_buffer_substrings, Scompare_buffer_substrings,
2616 6, 6, 0,
2617 doc: /* Compare two substrings of two buffers; return result as number.
2618 the value is -N if first string is less after N-1 chars,
2619 +N if first string is greater after N-1 chars, or 0 if strings match.
2620 Each substring is represented as three arguments: BUFFER, START and END.
2621 That makes six args in all, three for each substring.
2623 The value of `case-fold-search' in the current buffer
2624 determines whether case is significant or ignored. */)
2625 (Lisp_Object buffer1, Lisp_Object start1, Lisp_Object end1, Lisp_Object buffer2, Lisp_Object start2, Lisp_Object end2)
2627 register EMACS_INT begp1, endp1, begp2, endp2, temp;
2628 register struct buffer *bp1, *bp2;
2629 register Lisp_Object trt
2630 = (!NILP (BVAR (current_buffer, case_fold_search))
2631 ? BVAR (current_buffer, case_canon_table) : Qnil);
2632 ptrdiff_t chars = 0;
2633 ptrdiff_t i1, i2, i1_byte, i2_byte;
2635 /* Find the first buffer and its substring. */
2637 if (NILP (buffer1))
2638 bp1 = current_buffer;
2639 else
2641 Lisp_Object buf1;
2642 buf1 = Fget_buffer (buffer1);
2643 if (NILP (buf1))
2644 nsberror (buffer1);
2645 bp1 = XBUFFER (buf1);
2646 if (NILP (BVAR (bp1, name)))
2647 error ("Selecting deleted buffer");
2650 if (NILP (start1))
2651 begp1 = BUF_BEGV (bp1);
2652 else
2654 CHECK_NUMBER_COERCE_MARKER (start1);
2655 begp1 = XINT (start1);
2657 if (NILP (end1))
2658 endp1 = BUF_ZV (bp1);
2659 else
2661 CHECK_NUMBER_COERCE_MARKER (end1);
2662 endp1 = XINT (end1);
2665 if (begp1 > endp1)
2666 temp = begp1, begp1 = endp1, endp1 = temp;
2668 if (!(BUF_BEGV (bp1) <= begp1
2669 && begp1 <= endp1
2670 && endp1 <= BUF_ZV (bp1)))
2671 args_out_of_range (start1, end1);
2673 /* Likewise for second substring. */
2675 if (NILP (buffer2))
2676 bp2 = current_buffer;
2677 else
2679 Lisp_Object buf2;
2680 buf2 = Fget_buffer (buffer2);
2681 if (NILP (buf2))
2682 nsberror (buffer2);
2683 bp2 = XBUFFER (buf2);
2684 if (NILP (BVAR (bp2, name)))
2685 error ("Selecting deleted buffer");
2688 if (NILP (start2))
2689 begp2 = BUF_BEGV (bp2);
2690 else
2692 CHECK_NUMBER_COERCE_MARKER (start2);
2693 begp2 = XINT (start2);
2695 if (NILP (end2))
2696 endp2 = BUF_ZV (bp2);
2697 else
2699 CHECK_NUMBER_COERCE_MARKER (end2);
2700 endp2 = XINT (end2);
2703 if (begp2 > endp2)
2704 temp = begp2, begp2 = endp2, endp2 = temp;
2706 if (!(BUF_BEGV (bp2) <= begp2
2707 && begp2 <= endp2
2708 && endp2 <= BUF_ZV (bp2)))
2709 args_out_of_range (start2, end2);
2711 i1 = begp1;
2712 i2 = begp2;
2713 i1_byte = buf_charpos_to_bytepos (bp1, i1);
2714 i2_byte = buf_charpos_to_bytepos (bp2, i2);
2716 while (i1 < endp1 && i2 < endp2)
2718 /* When we find a mismatch, we must compare the
2719 characters, not just the bytes. */
2720 int c1, c2;
2722 QUIT;
2724 if (! NILP (BVAR (bp1, enable_multibyte_characters)))
2726 c1 = BUF_FETCH_MULTIBYTE_CHAR (bp1, i1_byte);
2727 BUF_INC_POS (bp1, i1_byte);
2728 i1++;
2730 else
2732 c1 = BUF_FETCH_BYTE (bp1, i1);
2733 MAKE_CHAR_MULTIBYTE (c1);
2734 i1++;
2737 if (! NILP (BVAR (bp2, enable_multibyte_characters)))
2739 c2 = BUF_FETCH_MULTIBYTE_CHAR (bp2, i2_byte);
2740 BUF_INC_POS (bp2, i2_byte);
2741 i2++;
2743 else
2745 c2 = BUF_FETCH_BYTE (bp2, i2);
2746 MAKE_CHAR_MULTIBYTE (c2);
2747 i2++;
2750 if (!NILP (trt))
2752 c1 = CHAR_TABLE_TRANSLATE (trt, c1);
2753 c2 = CHAR_TABLE_TRANSLATE (trt, c2);
2755 if (c1 < c2)
2756 return make_number (- 1 - chars);
2757 if (c1 > c2)
2758 return make_number (chars + 1);
2760 chars++;
2763 /* The strings match as far as they go.
2764 If one is shorter, that one is less. */
2765 if (chars < endp1 - begp1)
2766 return make_number (chars + 1);
2767 else if (chars < endp2 - begp2)
2768 return make_number (- chars - 1);
2770 /* Same length too => they are equal. */
2771 return make_number (0);
2774 static Lisp_Object
2775 subst_char_in_region_unwind (Lisp_Object arg)
2777 return BVAR (current_buffer, undo_list) = arg;
2780 static Lisp_Object
2781 subst_char_in_region_unwind_1 (Lisp_Object arg)
2783 return BVAR (current_buffer, filename) = arg;
2786 DEFUN ("subst-char-in-region", Fsubst_char_in_region,
2787 Ssubst_char_in_region, 4, 5, 0,
2788 doc: /* From START to END, replace FROMCHAR with TOCHAR each time it occurs.
2789 If optional arg NOUNDO is non-nil, don't record this change for undo
2790 and don't mark the buffer as really changed.
2791 Both characters must have the same length of multi-byte form. */)
2792 (Lisp_Object start, Lisp_Object end, Lisp_Object fromchar, Lisp_Object tochar, Lisp_Object noundo)
2794 register ptrdiff_t pos, pos_byte, stop, i, len, end_byte;
2795 /* Keep track of the first change in the buffer:
2796 if 0 we haven't found it yet.
2797 if < 0 we've found it and we've run the before-change-function.
2798 if > 0 we've actually performed it and the value is its position. */
2799 ptrdiff_t changed = 0;
2800 unsigned char fromstr[MAX_MULTIBYTE_LENGTH], tostr[MAX_MULTIBYTE_LENGTH];
2801 unsigned char *p;
2802 ptrdiff_t count = SPECPDL_INDEX ();
2803 #define COMBINING_NO 0
2804 #define COMBINING_BEFORE 1
2805 #define COMBINING_AFTER 2
2806 #define COMBINING_BOTH (COMBINING_BEFORE | COMBINING_AFTER)
2807 int maybe_byte_combining = COMBINING_NO;
2808 ptrdiff_t last_changed = 0;
2809 int multibyte_p = !NILP (BVAR (current_buffer, enable_multibyte_characters));
2810 int fromc, toc;
2812 restart:
2814 validate_region (&start, &end);
2815 CHECK_CHARACTER (fromchar);
2816 CHECK_CHARACTER (tochar);
2817 fromc = XFASTINT (fromchar);
2818 toc = XFASTINT (tochar);
2820 if (multibyte_p)
2822 len = CHAR_STRING (fromc, fromstr);
2823 if (CHAR_STRING (toc, tostr) != len)
2824 error ("Characters in `subst-char-in-region' have different byte-lengths");
2825 if (!ASCII_BYTE_P (*tostr))
2827 /* If *TOSTR is in the range 0x80..0x9F and TOCHAR is not a
2828 complete multibyte character, it may be combined with the
2829 after bytes. If it is in the range 0xA0..0xFF, it may be
2830 combined with the before and after bytes. */
2831 if (!CHAR_HEAD_P (*tostr))
2832 maybe_byte_combining = COMBINING_BOTH;
2833 else if (BYTES_BY_CHAR_HEAD (*tostr) > len)
2834 maybe_byte_combining = COMBINING_AFTER;
2837 else
2839 len = 1;
2840 fromstr[0] = fromc;
2841 tostr[0] = toc;
2844 pos = XINT (start);
2845 pos_byte = CHAR_TO_BYTE (pos);
2846 stop = CHAR_TO_BYTE (XINT (end));
2847 end_byte = stop;
2849 /* If we don't want undo, turn off putting stuff on the list.
2850 That's faster than getting rid of things,
2851 and it prevents even the entry for a first change.
2852 Also inhibit locking the file. */
2853 if (!changed && !NILP (noundo))
2855 record_unwind_protect (subst_char_in_region_unwind,
2856 BVAR (current_buffer, undo_list));
2857 BVAR (current_buffer, undo_list) = Qt;
2858 /* Don't do file-locking. */
2859 record_unwind_protect (subst_char_in_region_unwind_1,
2860 BVAR (current_buffer, filename));
2861 BVAR (current_buffer, filename) = Qnil;
2864 if (pos_byte < GPT_BYTE)
2865 stop = min (stop, GPT_BYTE);
2866 while (1)
2868 ptrdiff_t pos_byte_next = pos_byte;
2870 if (pos_byte >= stop)
2872 if (pos_byte >= end_byte) break;
2873 stop = end_byte;
2875 p = BYTE_POS_ADDR (pos_byte);
2876 if (multibyte_p)
2877 INC_POS (pos_byte_next);
2878 else
2879 ++pos_byte_next;
2880 if (pos_byte_next - pos_byte == len
2881 && p[0] == fromstr[0]
2882 && (len == 1
2883 || (p[1] == fromstr[1]
2884 && (len == 2 || (p[2] == fromstr[2]
2885 && (len == 3 || p[3] == fromstr[3]))))))
2887 if (changed < 0)
2888 /* We've already seen this and run the before-change-function;
2889 this time we only need to record the actual position. */
2890 changed = pos;
2891 else if (!changed)
2893 changed = -1;
2894 modify_region (current_buffer, pos, XINT (end), 0);
2896 if (! NILP (noundo))
2898 if (MODIFF - 1 == SAVE_MODIFF)
2899 SAVE_MODIFF++;
2900 if (MODIFF - 1 == BUF_AUTOSAVE_MODIFF (current_buffer))
2901 BUF_AUTOSAVE_MODIFF (current_buffer)++;
2904 /* The before-change-function may have moved the gap
2905 or even modified the buffer so we should start over. */
2906 goto restart;
2909 /* Take care of the case where the new character
2910 combines with neighboring bytes. */
2911 if (maybe_byte_combining
2912 && (maybe_byte_combining == COMBINING_AFTER
2913 ? (pos_byte_next < Z_BYTE
2914 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
2915 : ((pos_byte_next < Z_BYTE
2916 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
2917 || (pos_byte > BEG_BYTE
2918 && ! ASCII_BYTE_P (FETCH_BYTE (pos_byte - 1))))))
2920 Lisp_Object tem, string;
2922 struct gcpro gcpro1;
2924 tem = BVAR (current_buffer, undo_list);
2925 GCPRO1 (tem);
2927 /* Make a multibyte string containing this single character. */
2928 string = make_multibyte_string ((char *) tostr, 1, len);
2929 /* replace_range is less efficient, because it moves the gap,
2930 but it handles combining correctly. */
2931 replace_range (pos, pos + 1, string,
2932 0, 0, 1);
2933 pos_byte_next = CHAR_TO_BYTE (pos);
2934 if (pos_byte_next > pos_byte)
2935 /* Before combining happened. We should not increment
2936 POS. So, to cancel the later increment of POS,
2937 decrease it now. */
2938 pos--;
2939 else
2940 INC_POS (pos_byte_next);
2942 if (! NILP (noundo))
2943 BVAR (current_buffer, undo_list) = tem;
2945 UNGCPRO;
2947 else
2949 if (NILP (noundo))
2950 record_change (pos, 1);
2951 for (i = 0; i < len; i++) *p++ = tostr[i];
2953 last_changed = pos + 1;
2955 pos_byte = pos_byte_next;
2956 pos++;
2959 if (changed > 0)
2961 signal_after_change (changed,
2962 last_changed - changed, last_changed - changed);
2963 update_compositions (changed, last_changed, CHECK_ALL);
2966 unbind_to (count, Qnil);
2967 return Qnil;
2971 static Lisp_Object check_translation (ptrdiff_t, ptrdiff_t, ptrdiff_t,
2972 Lisp_Object);
2974 /* Helper function for Ftranslate_region_internal.
2976 Check if a character sequence at POS (POS_BYTE) matches an element
2977 of VAL. VAL is a list (([FROM-CHAR ...] . TO) ...). If a matching
2978 element is found, return it. Otherwise return Qnil. */
2980 static Lisp_Object
2981 check_translation (ptrdiff_t pos, ptrdiff_t pos_byte, ptrdiff_t end,
2982 Lisp_Object val)
2984 int buf_size = 16, buf_used = 0;
2985 int *buf = alloca (sizeof (int) * buf_size);
2987 for (; CONSP (val); val = XCDR (val))
2989 Lisp_Object elt;
2990 ptrdiff_t len, i;
2992 elt = XCAR (val);
2993 if (! CONSP (elt))
2994 continue;
2995 elt = XCAR (elt);
2996 if (! VECTORP (elt))
2997 continue;
2998 len = ASIZE (elt);
2999 if (len <= end - pos)
3001 for (i = 0; i < len; i++)
3003 if (buf_used <= i)
3005 unsigned char *p = BYTE_POS_ADDR (pos_byte);
3006 int len1;
3008 if (buf_used == buf_size)
3010 int *newbuf;
3012 buf_size += 16;
3013 newbuf = alloca (sizeof (int) * buf_size);
3014 memcpy (newbuf, buf, sizeof (int) * buf_used);
3015 buf = newbuf;
3017 buf[buf_used++] = STRING_CHAR_AND_LENGTH (p, len1);
3018 pos_byte += len1;
3020 if (XINT (AREF (elt, i)) != buf[i])
3021 break;
3023 if (i == len)
3024 return XCAR (val);
3027 return Qnil;
3031 DEFUN ("translate-region-internal", Ftranslate_region_internal,
3032 Stranslate_region_internal, 3, 3, 0,
3033 doc: /* Internal use only.
3034 From START to END, translate characters according to TABLE.
3035 TABLE is a string or a char-table; the Nth character in it is the
3036 mapping for the character with code N.
3037 It returns the number of characters changed. */)
3038 (Lisp_Object start, Lisp_Object end, register Lisp_Object table)
3040 register unsigned char *tt; /* Trans table. */
3041 register int nc; /* New character. */
3042 int cnt; /* Number of changes made. */
3043 ptrdiff_t size; /* Size of translate table. */
3044 ptrdiff_t pos, pos_byte, end_pos;
3045 int multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters));
3046 int string_multibyte IF_LINT (= 0);
3048 validate_region (&start, &end);
3049 if (CHAR_TABLE_P (table))
3051 if (! EQ (XCHAR_TABLE (table)->purpose, Qtranslation_table))
3052 error ("Not a translation table");
3053 size = MAX_CHAR;
3054 tt = NULL;
3056 else
3058 CHECK_STRING (table);
3060 if (! multibyte && (SCHARS (table) < SBYTES (table)))
3061 table = string_make_unibyte (table);
3062 string_multibyte = SCHARS (table) < SBYTES (table);
3063 size = SBYTES (table);
3064 tt = SDATA (table);
3067 pos = XINT (start);
3068 pos_byte = CHAR_TO_BYTE (pos);
3069 end_pos = XINT (end);
3070 modify_region (current_buffer, pos, end_pos, 0);
3072 cnt = 0;
3073 for (; pos < end_pos; )
3075 register unsigned char *p = BYTE_POS_ADDR (pos_byte);
3076 unsigned char *str, buf[MAX_MULTIBYTE_LENGTH];
3077 int len, str_len;
3078 int oc;
3079 Lisp_Object val;
3081 if (multibyte)
3082 oc = STRING_CHAR_AND_LENGTH (p, len);
3083 else
3084 oc = *p, len = 1;
3085 if (oc < size)
3087 if (tt)
3089 /* Reload as signal_after_change in last iteration may GC. */
3090 tt = SDATA (table);
3091 if (string_multibyte)
3093 str = tt + string_char_to_byte (table, oc);
3094 nc = STRING_CHAR_AND_LENGTH (str, str_len);
3096 else
3098 nc = tt[oc];
3099 if (! ASCII_BYTE_P (nc) && multibyte)
3101 str_len = BYTE8_STRING (nc, buf);
3102 str = buf;
3104 else
3106 str_len = 1;
3107 str = tt + oc;
3111 else
3113 nc = oc;
3114 val = CHAR_TABLE_REF (table, oc);
3115 if (CHARACTERP (val))
3117 nc = XFASTINT (val);
3118 str_len = CHAR_STRING (nc, buf);
3119 str = buf;
3121 else if (VECTORP (val) || (CONSP (val)))
3123 /* VAL is [TO_CHAR ...] or (([FROM-CHAR ...] . TO) ...)
3124 where TO is TO-CHAR or [TO-CHAR ...]. */
3125 nc = -1;
3129 if (nc != oc && nc >= 0)
3131 /* Simple one char to one char translation. */
3132 if (len != str_len)
3134 Lisp_Object string;
3136 /* This is less efficient, because it moves the gap,
3137 but it should handle multibyte characters correctly. */
3138 string = make_multibyte_string ((char *) str, 1, str_len);
3139 replace_range (pos, pos + 1, string, 1, 0, 1);
3140 len = str_len;
3142 else
3144 record_change (pos, 1);
3145 while (str_len-- > 0)
3146 *p++ = *str++;
3147 signal_after_change (pos, 1, 1);
3148 update_compositions (pos, pos + 1, CHECK_BORDER);
3150 ++cnt;
3152 else if (nc < 0)
3154 Lisp_Object string;
3156 if (CONSP (val))
3158 val = check_translation (pos, pos_byte, end_pos, val);
3159 if (NILP (val))
3161 pos_byte += len;
3162 pos++;
3163 continue;
3165 /* VAL is ([FROM-CHAR ...] . TO). */
3166 len = ASIZE (XCAR (val));
3167 val = XCDR (val);
3169 else
3170 len = 1;
3172 if (VECTORP (val))
3174 string = Fconcat (1, &val);
3176 else
3178 string = Fmake_string (make_number (1), val);
3180 replace_range (pos, pos + len, string, 1, 0, 1);
3181 pos_byte += SBYTES (string);
3182 pos += SCHARS (string);
3183 cnt += SCHARS (string);
3184 end_pos += SCHARS (string) - len;
3185 continue;
3188 pos_byte += len;
3189 pos++;
3192 return make_number (cnt);
3195 DEFUN ("delete-region", Fdelete_region, Sdelete_region, 2, 2, "r",
3196 doc: /* Delete the text between START and END.
3197 If called interactively, delete the region between point and mark.
3198 This command deletes buffer text without modifying the kill ring. */)
3199 (Lisp_Object start, Lisp_Object end)
3201 validate_region (&start, &end);
3202 del_range (XINT (start), XINT (end));
3203 return Qnil;
3206 DEFUN ("delete-and-extract-region", Fdelete_and_extract_region,
3207 Sdelete_and_extract_region, 2, 2, 0,
3208 doc: /* Delete the text between START and END and return it. */)
3209 (Lisp_Object start, Lisp_Object end)
3211 validate_region (&start, &end);
3212 if (XINT (start) == XINT (end))
3213 return empty_unibyte_string;
3214 return del_range_1 (XINT (start), XINT (end), 1, 1);
3217 DEFUN ("widen", Fwiden, Swiden, 0, 0, "",
3218 doc: /* Remove restrictions (narrowing) from current buffer.
3219 This allows the buffer's full text to be seen and edited. */)
3220 (void)
3222 if (BEG != BEGV || Z != ZV)
3223 current_buffer->clip_changed = 1;
3224 BEGV = BEG;
3225 BEGV_BYTE = BEG_BYTE;
3226 SET_BUF_ZV_BOTH (current_buffer, Z, Z_BYTE);
3227 /* Changing the buffer bounds invalidates any recorded current column. */
3228 invalidate_current_column ();
3229 return Qnil;
3232 DEFUN ("narrow-to-region", Fnarrow_to_region, Snarrow_to_region, 2, 2, "r",
3233 doc: /* Restrict editing in this buffer to the current region.
3234 The rest of the text becomes temporarily invisible and untouchable
3235 but is not deleted; if you save the buffer in a file, the invisible
3236 text is included in the file. \\[widen] makes all visible again.
3237 See also `save-restriction'.
3239 When calling from a program, pass two arguments; positions (integers
3240 or markers) bounding the text that should remain visible. */)
3241 (register Lisp_Object start, Lisp_Object end)
3243 CHECK_NUMBER_COERCE_MARKER (start);
3244 CHECK_NUMBER_COERCE_MARKER (end);
3246 if (XINT (start) > XINT (end))
3248 Lisp_Object tem;
3249 tem = start; start = end; end = tem;
3252 if (!(BEG <= XINT (start) && XINT (start) <= XINT (end) && XINT (end) <= Z))
3253 args_out_of_range (start, end);
3255 if (BEGV != XFASTINT (start) || ZV != XFASTINT (end))
3256 current_buffer->clip_changed = 1;
3258 SET_BUF_BEGV (current_buffer, XFASTINT (start));
3259 SET_BUF_ZV (current_buffer, XFASTINT (end));
3260 if (PT < XFASTINT (start))
3261 SET_PT (XFASTINT (start));
3262 if (PT > XFASTINT (end))
3263 SET_PT (XFASTINT (end));
3264 /* Changing the buffer bounds invalidates any recorded current column. */
3265 invalidate_current_column ();
3266 return Qnil;
3269 Lisp_Object
3270 save_restriction_save (void)
3272 if (BEGV == BEG && ZV == Z)
3273 /* The common case that the buffer isn't narrowed.
3274 We return just the buffer object, which save_restriction_restore
3275 recognizes as meaning `no restriction'. */
3276 return Fcurrent_buffer ();
3277 else
3278 /* We have to save a restriction, so return a pair of markers, one
3279 for the beginning and one for the end. */
3281 Lisp_Object beg, end;
3283 beg = build_marker (current_buffer, BEGV, BEGV_BYTE);
3284 end = build_marker (current_buffer, ZV, ZV_BYTE);
3286 /* END must move forward if text is inserted at its exact location. */
3287 XMARKER (end)->insertion_type = 1;
3289 return Fcons (beg, end);
3293 Lisp_Object
3294 save_restriction_restore (Lisp_Object data)
3296 struct buffer *cur = NULL;
3297 struct buffer *buf = (CONSP (data)
3298 ? XMARKER (XCAR (data))->buffer
3299 : XBUFFER (data));
3301 if (buf && buf != current_buffer && !NILP (BVAR (buf, pt_marker)))
3302 { /* If `buf' uses markers to keep track of PT, BEGV, and ZV (as
3303 is the case if it is or has an indirect buffer), then make
3304 sure it is current before we update BEGV, so
3305 set_buffer_internal takes care of managing those markers. */
3306 cur = current_buffer;
3307 set_buffer_internal (buf);
3310 if (CONSP (data))
3311 /* A pair of marks bounding a saved restriction. */
3313 struct Lisp_Marker *beg = XMARKER (XCAR (data));
3314 struct Lisp_Marker *end = XMARKER (XCDR (data));
3315 eassert (buf == end->buffer);
3317 if (buf /* Verify marker still points to a buffer. */
3318 && (beg->charpos != BUF_BEGV (buf) || end->charpos != BUF_ZV (buf)))
3319 /* The restriction has changed from the saved one, so restore
3320 the saved restriction. */
3322 ptrdiff_t pt = BUF_PT (buf);
3324 SET_BUF_BEGV_BOTH (buf, beg->charpos, beg->bytepos);
3325 SET_BUF_ZV_BOTH (buf, end->charpos, end->bytepos);
3327 if (pt < beg->charpos || pt > end->charpos)
3328 /* The point is outside the new visible range, move it inside. */
3329 SET_BUF_PT_BOTH (buf,
3330 clip_to_bounds (beg->charpos, pt, end->charpos),
3331 clip_to_bounds (beg->bytepos, BUF_PT_BYTE (buf),
3332 end->bytepos));
3334 buf->clip_changed = 1; /* Remember that the narrowing changed. */
3337 else
3338 /* A buffer, which means that there was no old restriction. */
3340 if (buf /* Verify marker still points to a buffer. */
3341 && (BUF_BEGV (buf) != BUF_BEG (buf) || BUF_ZV (buf) != BUF_Z (buf)))
3342 /* The buffer has been narrowed, get rid of the narrowing. */
3344 SET_BUF_BEGV_BOTH (buf, BUF_BEG (buf), BUF_BEG_BYTE (buf));
3345 SET_BUF_ZV_BOTH (buf, BUF_Z (buf), BUF_Z_BYTE (buf));
3347 buf->clip_changed = 1; /* Remember that the narrowing changed. */
3351 /* Changing the buffer bounds invalidates any recorded current column. */
3352 invalidate_current_column ();
3354 if (cur)
3355 set_buffer_internal (cur);
3357 return Qnil;
3360 DEFUN ("save-restriction", Fsave_restriction, Ssave_restriction, 0, UNEVALLED, 0,
3361 doc: /* Execute BODY, saving and restoring current buffer's restrictions.
3362 The buffer's restrictions make parts of the beginning and end invisible.
3363 \(They are set up with `narrow-to-region' and eliminated with `widen'.)
3364 This special form, `save-restriction', saves the current buffer's restrictions
3365 when it is entered, and restores them when it is exited.
3366 So any `narrow-to-region' within BODY lasts only until the end of the form.
3367 The old restrictions settings are restored
3368 even in case of abnormal exit (throw or error).
3370 The value returned is the value of the last form in BODY.
3372 Note: if you are using both `save-excursion' and `save-restriction',
3373 use `save-excursion' outermost:
3374 (save-excursion (save-restriction ...))
3376 usage: (save-restriction &rest BODY) */)
3377 (Lisp_Object body)
3379 register Lisp_Object val;
3380 ptrdiff_t count = SPECPDL_INDEX ();
3382 record_unwind_protect (save_restriction_restore, save_restriction_save ());
3383 val = Fprogn (body);
3384 return unbind_to (count, val);
3387 /* Buffer for the most recent text displayed by Fmessage_box. */
3388 static char *message_text;
3390 /* Allocated length of that buffer. */
3391 static ptrdiff_t message_length;
3393 DEFUN ("message", Fmessage, Smessage, 1, MANY, 0,
3394 doc: /* Display a message at the bottom of the screen.
3395 The message also goes into the `*Messages*' buffer.
3396 \(In keyboard macros, that's all it does.)
3397 Return the message.
3399 The first argument is a format control string, and the rest are data
3400 to be formatted under control of the string. See `format' for details.
3402 Note: Use (message "%s" VALUE) to print the value of expressions and
3403 variables to avoid accidentally interpreting `%' as format specifiers.
3405 If the first argument is nil or the empty string, the function clears
3406 any existing message; this lets the minibuffer contents show. See
3407 also `current-message'.
3409 usage: (message FORMAT-STRING &rest ARGS) */)
3410 (ptrdiff_t nargs, Lisp_Object *args)
3412 if (NILP (args[0])
3413 || (STRINGP (args[0])
3414 && SBYTES (args[0]) == 0))
3416 message (0);
3417 return args[0];
3419 else
3421 register Lisp_Object val;
3422 val = Fformat (nargs, args);
3423 message3 (val, SBYTES (val), STRING_MULTIBYTE (val));
3424 return val;
3428 DEFUN ("message-box", Fmessage_box, Smessage_box, 1, MANY, 0,
3429 doc: /* Display a message, in a dialog box if possible.
3430 If a dialog box is not available, use the echo area.
3431 The first argument is a format control string, and the rest are data
3432 to be formatted under control of the string. See `format' for details.
3434 If the first argument is nil or the empty string, clear any existing
3435 message; let the minibuffer contents show.
3437 usage: (message-box FORMAT-STRING &rest ARGS) */)
3438 (ptrdiff_t nargs, Lisp_Object *args)
3440 if (NILP (args[0]))
3442 message (0);
3443 return Qnil;
3445 else
3447 register Lisp_Object val;
3448 val = Fformat (nargs, args);
3449 #ifdef HAVE_MENUS
3450 /* The MS-DOS frames support popup menus even though they are
3451 not FRAME_WINDOW_P. */
3452 if (FRAME_WINDOW_P (XFRAME (selected_frame))
3453 || FRAME_MSDOS_P (XFRAME (selected_frame)))
3455 Lisp_Object pane, menu;
3456 struct gcpro gcpro1;
3457 pane = Fcons (Fcons (build_string ("OK"), Qt), Qnil);
3458 GCPRO1 (pane);
3459 menu = Fcons (val, pane);
3460 Fx_popup_dialog (Qt, menu, Qt);
3461 UNGCPRO;
3462 return val;
3464 #endif /* HAVE_MENUS */
3465 /* Copy the data so that it won't move when we GC. */
3466 if (SBYTES (val) > message_length)
3468 ptrdiff_t new_length = SBYTES (val) + 80;
3469 message_text = xrealloc (message_text, new_length);
3470 message_length = new_length;
3472 memcpy (message_text, SDATA (val), SBYTES (val));
3473 message2 (message_text, SBYTES (val),
3474 STRING_MULTIBYTE (val));
3475 return val;
3479 DEFUN ("message-or-box", Fmessage_or_box, Smessage_or_box, 1, MANY, 0,
3480 doc: /* Display a message in a dialog box or in the echo area.
3481 If this command was invoked with the mouse, use a dialog box if
3482 `use-dialog-box' is non-nil.
3483 Otherwise, use the echo area.
3484 The first argument is a format control string, and the rest are data
3485 to be formatted under control of the string. See `format' for details.
3487 If the first argument is nil or the empty string, clear any existing
3488 message; let the minibuffer contents show.
3490 usage: (message-or-box FORMAT-STRING &rest ARGS) */)
3491 (ptrdiff_t nargs, Lisp_Object *args)
3493 #ifdef HAVE_MENUS
3494 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3495 && use_dialog_box)
3496 return Fmessage_box (nargs, args);
3497 #endif
3498 return Fmessage (nargs, args);
3501 DEFUN ("current-message", Fcurrent_message, Scurrent_message, 0, 0, 0,
3502 doc: /* Return the string currently displayed in the echo area, or nil if none. */)
3503 (void)
3505 return current_message ();
3509 DEFUN ("propertize", Fpropertize, Spropertize, 1, MANY, 0,
3510 doc: /* Return a copy of STRING with text properties added.
3511 First argument is the string to copy.
3512 Remaining arguments form a sequence of PROPERTY VALUE pairs for text
3513 properties to add to the result.
3514 usage: (propertize STRING &rest PROPERTIES) */)
3515 (ptrdiff_t nargs, Lisp_Object *args)
3517 Lisp_Object properties, string;
3518 struct gcpro gcpro1, gcpro2;
3519 ptrdiff_t i;
3521 /* Number of args must be odd. */
3522 if ((nargs & 1) == 0)
3523 error ("Wrong number of arguments");
3525 properties = string = Qnil;
3526 GCPRO2 (properties, string);
3528 /* First argument must be a string. */
3529 CHECK_STRING (args[0]);
3530 string = Fcopy_sequence (args[0]);
3532 for (i = 1; i < nargs; i += 2)
3533 properties = Fcons (args[i], Fcons (args[i + 1], properties));
3535 Fadd_text_properties (make_number (0),
3536 make_number (SCHARS (string)),
3537 properties, string);
3538 RETURN_UNGCPRO (string);
3541 DEFUN ("format", Fformat, Sformat, 1, MANY, 0,
3542 doc: /* Format a string out of a format-string and arguments.
3543 The first argument is a format control string.
3544 The other arguments are substituted into it to make the result, a string.
3546 The format control string may contain %-sequences meaning to substitute
3547 the next available argument:
3549 %s means print a string argument. Actually, prints any object, with `princ'.
3550 %d means print as number in decimal (%o octal, %x hex).
3551 %X is like %x, but uses upper case.
3552 %e means print a number in exponential notation.
3553 %f means print a number in decimal-point notation.
3554 %g means print a number in exponential notation
3555 or decimal-point notation, whichever uses fewer characters.
3556 %c means print a number as a single character.
3557 %S means print any object as an s-expression (using `prin1').
3559 The argument used for %d, %o, %x, %e, %f, %g or %c must be a number.
3560 Use %% to put a single % into the output.
3562 A %-sequence may contain optional flag, width, and precision
3563 specifiers, as follows:
3565 %<flags><width><precision>character
3567 where flags is [+ #-0]+, width is [0-9]+, and precision is .[0-9]+
3569 The + flag character inserts a + before any positive number, while a
3570 space inserts a space before any positive number; these flags only
3571 affect %d, %e, %f, and %g sequences, and the + flag takes precedence.
3572 The # flag means to use an alternate display form for %o, %x, %X, %e,
3573 %f, and %g sequences. The - and 0 flags affect the width specifier,
3574 as described below.
3576 The width specifier supplies a lower limit for the length of the
3577 printed representation. The padding, if any, normally goes on the
3578 left, but it goes on the right if the - flag is present. The padding
3579 character is normally a space, but it is 0 if the 0 flag is present.
3580 The 0 flag is ignored if the - flag is present, or the format sequence
3581 is something other than %d, %e, %f, and %g.
3583 For %e, %f, and %g sequences, the number after the "." in the
3584 precision specifier says how many decimal places to show; if zero, the
3585 decimal point itself is omitted. For %s and %S, the precision
3586 specifier truncates the string to the given width.
3588 usage: (format STRING &rest OBJECTS) */)
3589 (ptrdiff_t nargs, Lisp_Object *args)
3591 ptrdiff_t n; /* The number of the next arg to substitute */
3592 char initial_buffer[4000];
3593 char *buf = initial_buffer;
3594 ptrdiff_t bufsize = sizeof initial_buffer;
3595 ptrdiff_t max_bufsize = STRING_BYTES_BOUND + 1;
3596 char *p;
3597 Lisp_Object buf_save_value IF_LINT (= {0});
3598 register char *format, *end, *format_start;
3599 ptrdiff_t formatlen, nchars;
3600 /* Nonzero if the format is multibyte. */
3601 int multibyte_format = 0;
3602 /* Nonzero if the output should be a multibyte string,
3603 which is true if any of the inputs is one. */
3604 int multibyte = 0;
3605 /* When we make a multibyte string, we must pay attention to the
3606 byte combining problem, i.e., a byte may be combined with a
3607 multibyte character of the previous string. This flag tells if we
3608 must consider such a situation or not. */
3609 int maybe_combine_byte;
3610 Lisp_Object val;
3611 int arg_intervals = 0;
3612 USE_SAFE_ALLOCA;
3614 /* discarded[I] is 1 if byte I of the format
3615 string was not copied into the output.
3616 It is 2 if byte I was not the first byte of its character. */
3617 char *discarded;
3619 /* Each element records, for one argument,
3620 the start and end bytepos in the output string,
3621 whether the argument has been converted to string (e.g., due to "%S"),
3622 and whether the argument is a string with intervals.
3623 info[0] is unused. Unused elements have -1 for start. */
3624 struct info
3626 ptrdiff_t start, end;
3627 int converted_to_string;
3628 int intervals;
3629 } *info = 0;
3631 /* It should not be necessary to GCPRO ARGS, because
3632 the caller in the interpreter should take care of that. */
3634 CHECK_STRING (args[0]);
3635 format_start = SSDATA (args[0]);
3636 formatlen = SBYTES (args[0]);
3638 /* Allocate the info and discarded tables. */
3640 ptrdiff_t i;
3641 if ((SIZE_MAX - formatlen) / sizeof (struct info) <= nargs)
3642 memory_full (SIZE_MAX);
3643 SAFE_ALLOCA (info, struct info *, (nargs + 1) * sizeof *info + formatlen);
3644 discarded = (char *) &info[nargs + 1];
3645 for (i = 0; i < nargs + 1; i++)
3647 info[i].start = -1;
3648 info[i].intervals = info[i].converted_to_string = 0;
3650 memset (discarded, 0, formatlen);
3653 /* Try to determine whether the result should be multibyte.
3654 This is not always right; sometimes the result needs to be multibyte
3655 because of an object that we will pass through prin1,
3656 and in that case, we won't know it here. */
3657 multibyte_format = STRING_MULTIBYTE (args[0]);
3658 multibyte = multibyte_format;
3659 for (n = 1; !multibyte && n < nargs; n++)
3660 if (STRINGP (args[n]) && STRING_MULTIBYTE (args[n]))
3661 multibyte = 1;
3663 /* If we start out planning a unibyte result,
3664 then discover it has to be multibyte, we jump back to retry. */
3665 retry:
3667 p = buf;
3668 nchars = 0;
3669 n = 0;
3671 /* Scan the format and store result in BUF. */
3672 format = format_start;
3673 end = format + formatlen;
3674 maybe_combine_byte = 0;
3676 while (format != end)
3678 /* The values of N and FORMAT when the loop body is entered. */
3679 ptrdiff_t n0 = n;
3680 char *format0 = format;
3682 /* Bytes needed to represent the output of this conversion. */
3683 ptrdiff_t convbytes;
3685 if (*format == '%')
3687 /* General format specifications look like
3689 '%' [flags] [field-width] [precision] format
3691 where
3693 flags ::= [-+0# ]+
3694 field-width ::= [0-9]+
3695 precision ::= '.' [0-9]*
3697 If a field-width is specified, it specifies to which width
3698 the output should be padded with blanks, if the output
3699 string is shorter than field-width.
3701 If precision is specified, it specifies the number of
3702 digits to print after the '.' for floats, or the max.
3703 number of chars to print from a string. */
3705 int minus_flag = 0;
3706 int plus_flag = 0;
3707 int space_flag = 0;
3708 int sharp_flag = 0;
3709 int zero_flag = 0;
3710 ptrdiff_t field_width;
3711 int precision_given;
3712 uintmax_t precision = UINTMAX_MAX;
3713 char *num_end;
3714 char conversion;
3716 while (1)
3718 switch (*++format)
3720 case '-': minus_flag = 1; continue;
3721 case '+': plus_flag = 1; continue;
3722 case ' ': space_flag = 1; continue;
3723 case '#': sharp_flag = 1; continue;
3724 case '0': zero_flag = 1; continue;
3726 break;
3729 /* Ignore flags when sprintf ignores them. */
3730 space_flag &= ~ plus_flag;
3731 zero_flag &= ~ minus_flag;
3734 uintmax_t w = strtoumax (format, &num_end, 10);
3735 if (max_bufsize <= w)
3736 string_overflow ();
3737 field_width = w;
3739 precision_given = *num_end == '.';
3740 if (precision_given)
3741 precision = strtoumax (num_end + 1, &num_end, 10);
3742 format = num_end;
3744 if (format == end)
3745 error ("Format string ends in middle of format specifier");
3747 memset (&discarded[format0 - format_start], 1, format - format0);
3748 conversion = *format;
3749 if (conversion == '%')
3750 goto copy_char;
3751 discarded[format - format_start] = 1;
3752 format++;
3754 ++n;
3755 if (! (n < nargs))
3756 error ("Not enough arguments for format string");
3758 /* For 'S', prin1 the argument, and then treat like 's'.
3759 For 's', princ any argument that is not a string or
3760 symbol. But don't do this conversion twice, which might
3761 happen after retrying. */
3762 if ((conversion == 'S'
3763 || (conversion == 's'
3764 && ! STRINGP (args[n]) && ! SYMBOLP (args[n]))))
3766 if (! info[n].converted_to_string)
3768 Lisp_Object noescape = conversion == 'S' ? Qnil : Qt;
3769 args[n] = Fprin1_to_string (args[n], noescape);
3770 info[n].converted_to_string = 1;
3771 if (STRING_MULTIBYTE (args[n]) && ! multibyte)
3773 multibyte = 1;
3774 goto retry;
3777 conversion = 's';
3779 else if (conversion == 'c')
3781 if (FLOATP (args[n]))
3783 double d = XFLOAT_DATA (args[n]);
3784 args[n] = make_number (FIXNUM_OVERFLOW_P (d) ? -1 : d);
3787 if (INTEGERP (args[n]) && ! ASCII_CHAR_P (XINT (args[n])))
3789 if (!multibyte)
3791 multibyte = 1;
3792 goto retry;
3794 args[n] = Fchar_to_string (args[n]);
3795 info[n].converted_to_string = 1;
3798 if (info[n].converted_to_string)
3799 conversion = 's';
3800 zero_flag = 0;
3803 if (SYMBOLP (args[n]))
3805 args[n] = SYMBOL_NAME (args[n]);
3806 if (STRING_MULTIBYTE (args[n]) && ! multibyte)
3808 multibyte = 1;
3809 goto retry;
3813 if (conversion == 's')
3815 /* handle case (precision[n] >= 0) */
3817 ptrdiff_t width, padding, nbytes;
3818 ptrdiff_t nchars_string;
3820 ptrdiff_t prec = -1;
3821 if (precision_given && precision <= TYPE_MAXIMUM (ptrdiff_t))
3822 prec = precision;
3824 /* lisp_string_width ignores a precision of 0, but GNU
3825 libc functions print 0 characters when the precision
3826 is 0. Imitate libc behavior here. Changing
3827 lisp_string_width is the right thing, and will be
3828 done, but meanwhile we work with it. */
3830 if (prec == 0)
3831 width = nchars_string = nbytes = 0;
3832 else
3834 ptrdiff_t nch, nby;
3835 width = lisp_string_width (args[n], prec, &nch, &nby);
3836 if (prec < 0)
3838 nchars_string = SCHARS (args[n]);
3839 nbytes = SBYTES (args[n]);
3841 else
3843 nchars_string = nch;
3844 nbytes = nby;
3848 convbytes = nbytes;
3849 if (convbytes && multibyte && ! STRING_MULTIBYTE (args[n]))
3850 convbytes = count_size_as_multibyte (SDATA (args[n]), nbytes);
3852 padding = width < field_width ? field_width - width : 0;
3854 if (max_bufsize - padding <= convbytes)
3855 string_overflow ();
3856 convbytes += padding;
3857 if (convbytes <= buf + bufsize - p)
3859 if (! minus_flag)
3861 memset (p, ' ', padding);
3862 p += padding;
3863 nchars += padding;
3866 if (p > buf
3867 && multibyte
3868 && !ASCII_BYTE_P (*((unsigned char *) p - 1))
3869 && STRING_MULTIBYTE (args[n])
3870 && !CHAR_HEAD_P (SREF (args[n], 0)))
3871 maybe_combine_byte = 1;
3873 p += copy_text (SDATA (args[n]), (unsigned char *) p,
3874 nbytes,
3875 STRING_MULTIBYTE (args[n]), multibyte);
3877 info[n].start = nchars;
3878 nchars += nchars_string;
3879 info[n].end = nchars;
3881 if (minus_flag)
3883 memset (p, ' ', padding);
3884 p += padding;
3885 nchars += padding;
3888 /* If this argument has text properties, record where
3889 in the result string it appears. */
3890 if (STRING_INTERVALS (args[n]))
3891 info[n].intervals = arg_intervals = 1;
3893 continue;
3896 else if (! (conversion == 'c' || conversion == 'd'
3897 || conversion == 'e' || conversion == 'f'
3898 || conversion == 'g' || conversion == 'i'
3899 || conversion == 'o' || conversion == 'x'
3900 || conversion == 'X'))
3901 error ("Invalid format operation %%%c",
3902 STRING_CHAR ((unsigned char *) format - 1));
3903 else if (! (INTEGERP (args[n]) || FLOATP (args[n])))
3904 error ("Format specifier doesn't match argument type");
3905 else
3907 enum
3909 /* Maximum precision for a %f conversion such that the
3910 trailing output digit might be nonzero. Any precision
3911 larger than this will not yield useful information. */
3912 USEFUL_PRECISION_MAX =
3913 ((1 - DBL_MIN_EXP)
3914 * (FLT_RADIX == 2 || FLT_RADIX == 10 ? 1
3915 : FLT_RADIX == 16 ? 4
3916 : -1)),
3918 /* Maximum number of bytes generated by any format, if
3919 precision is no more than USEFUL_PRECISION_MAX.
3920 On all practical hosts, %f is the worst case. */
3921 SPRINTF_BUFSIZE =
3922 sizeof "-." + (DBL_MAX_10_EXP + 1) + USEFUL_PRECISION_MAX,
3924 /* Length of pM (that is, of pMd without the
3925 trailing "d"). */
3926 pMlen = sizeof pMd - 2
3928 verify (0 < USEFUL_PRECISION_MAX);
3930 int prec;
3931 ptrdiff_t padding, sprintf_bytes;
3932 uintmax_t excess_precision, numwidth;
3933 uintmax_t leading_zeros = 0, trailing_zeros = 0;
3935 char sprintf_buf[SPRINTF_BUFSIZE];
3937 /* Copy of conversion specification, modified somewhat.
3938 At most three flags F can be specified at once. */
3939 char convspec[sizeof "%FFF.*d" + pMlen];
3941 /* Avoid undefined behavior in underlying sprintf. */
3942 if (conversion == 'd' || conversion == 'i')
3943 sharp_flag = 0;
3945 /* Create the copy of the conversion specification, with
3946 any width and precision removed, with ".*" inserted,
3947 and with pM inserted for integer formats. */
3949 char *f = convspec;
3950 *f++ = '%';
3951 *f = '-'; f += minus_flag;
3952 *f = '+'; f += plus_flag;
3953 *f = ' '; f += space_flag;
3954 *f = '#'; f += sharp_flag;
3955 *f = '0'; f += zero_flag;
3956 *f++ = '.';
3957 *f++ = '*';
3958 if (conversion == 'd' || conversion == 'i'
3959 || conversion == 'o' || conversion == 'x'
3960 || conversion == 'X')
3962 memcpy (f, pMd, pMlen);
3963 f += pMlen;
3964 zero_flag &= ~ precision_given;
3966 *f++ = conversion;
3967 *f = '\0';
3970 prec = -1;
3971 if (precision_given)
3972 prec = min (precision, USEFUL_PRECISION_MAX);
3974 /* Use sprintf to format this number into sprintf_buf. Omit
3975 padding and excess precision, though, because sprintf limits
3976 output length to INT_MAX.
3978 There are four types of conversion: double, unsigned
3979 char (passed as int), wide signed int, and wide
3980 unsigned int. Treat them separately because the
3981 sprintf ABI is sensitive to which type is passed. Be
3982 careful about integer overflow, NaNs, infinities, and
3983 conversions; for example, the min and max macros are
3984 not suitable here. */
3985 if (conversion == 'e' || conversion == 'f' || conversion == 'g')
3987 double x = (INTEGERP (args[n])
3988 ? XINT (args[n])
3989 : XFLOAT_DATA (args[n]));
3990 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
3992 else if (conversion == 'c')
3994 /* Don't use sprintf here, as it might mishandle prec. */
3995 sprintf_buf[0] = XINT (args[n]);
3996 sprintf_bytes = prec != 0;
3998 else if (conversion == 'd')
4000 /* For float, maybe we should use "%1.0f"
4001 instead so it also works for values outside
4002 the integer range. */
4003 printmax_t x;
4004 if (INTEGERP (args[n]))
4005 x = XINT (args[n]);
4006 else
4008 double d = XFLOAT_DATA (args[n]);
4009 if (d < 0)
4011 x = TYPE_MINIMUM (printmax_t);
4012 if (x < d)
4013 x = d;
4015 else
4017 x = TYPE_MAXIMUM (printmax_t);
4018 if (d < x)
4019 x = d;
4022 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
4024 else
4026 /* Don't sign-extend for octal or hex printing. */
4027 uprintmax_t x;
4028 if (INTEGERP (args[n]))
4029 x = XUINT (args[n]);
4030 else
4032 double d = XFLOAT_DATA (args[n]);
4033 if (d < 0)
4034 x = 0;
4035 else
4037 x = TYPE_MAXIMUM (uprintmax_t);
4038 if (d < x)
4039 x = d;
4042 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
4045 /* Now the length of the formatted item is known, except it omits
4046 padding and excess precision. Deal with excess precision
4047 first. This happens only when the format specifies
4048 ridiculously large precision. */
4049 excess_precision = precision - prec;
4050 if (excess_precision)
4052 if (conversion == 'e' || conversion == 'f'
4053 || conversion == 'g')
4055 if ((conversion == 'g' && ! sharp_flag)
4056 || ! ('0' <= sprintf_buf[sprintf_bytes - 1]
4057 && sprintf_buf[sprintf_bytes - 1] <= '9'))
4058 excess_precision = 0;
4059 else
4061 if (conversion == 'g')
4063 char *dot = strchr (sprintf_buf, '.');
4064 if (!dot)
4065 excess_precision = 0;
4068 trailing_zeros = excess_precision;
4070 else
4071 leading_zeros = excess_precision;
4074 /* Compute the total bytes needed for this item, including
4075 excess precision and padding. */
4076 numwidth = sprintf_bytes + excess_precision;
4077 padding = numwidth < field_width ? field_width - numwidth : 0;
4078 if (max_bufsize - sprintf_bytes <= excess_precision
4079 || max_bufsize - padding <= numwidth)
4080 string_overflow ();
4081 convbytes = numwidth + padding;
4083 if (convbytes <= buf + bufsize - p)
4085 /* Copy the formatted item from sprintf_buf into buf,
4086 inserting padding and excess-precision zeros. */
4088 char *src = sprintf_buf;
4089 char src0 = src[0];
4090 int exponent_bytes = 0;
4091 int signedp = src0 == '-' || src0 == '+' || src0 == ' ';
4092 int significand_bytes;
4093 if (zero_flag
4094 && ((src[signedp] >= '0' && src[signedp] <= '9')
4095 || (src[signedp] >= 'a' && src[signedp] <= 'f')
4096 || (src[signedp] >= 'A' && src[signedp] <= 'F')))
4098 leading_zeros += padding;
4099 padding = 0;
4102 if (excess_precision
4103 && (conversion == 'e' || conversion == 'g'))
4105 char *e = strchr (src, 'e');
4106 if (e)
4107 exponent_bytes = src + sprintf_bytes - e;
4110 if (! minus_flag)
4112 memset (p, ' ', padding);
4113 p += padding;
4114 nchars += padding;
4117 *p = src0;
4118 src += signedp;
4119 p += signedp;
4120 memset (p, '0', leading_zeros);
4121 p += leading_zeros;
4122 significand_bytes = sprintf_bytes - signedp - exponent_bytes;
4123 memcpy (p, src, significand_bytes);
4124 p += significand_bytes;
4125 src += significand_bytes;
4126 memset (p, '0', trailing_zeros);
4127 p += trailing_zeros;
4128 memcpy (p, src, exponent_bytes);
4129 p += exponent_bytes;
4131 info[n].start = nchars;
4132 nchars += leading_zeros + sprintf_bytes + trailing_zeros;
4133 info[n].end = nchars;
4135 if (minus_flag)
4137 memset (p, ' ', padding);
4138 p += padding;
4139 nchars += padding;
4142 continue;
4146 else
4147 copy_char:
4149 /* Copy a single character from format to buf. */
4151 char *src = format;
4152 unsigned char str[MAX_MULTIBYTE_LENGTH];
4154 if (multibyte_format)
4156 /* Copy a whole multibyte character. */
4157 if (p > buf
4158 && !ASCII_BYTE_P (*((unsigned char *) p - 1))
4159 && !CHAR_HEAD_P (*format))
4160 maybe_combine_byte = 1;
4163 format++;
4164 while (! CHAR_HEAD_P (*format));
4166 convbytes = format - src;
4167 memset (&discarded[src + 1 - format_start], 2, convbytes - 1);
4169 else
4171 unsigned char uc = *format++;
4172 if (! multibyte || ASCII_BYTE_P (uc))
4173 convbytes = 1;
4174 else
4176 int c = BYTE8_TO_CHAR (uc);
4177 convbytes = CHAR_STRING (c, str);
4178 src = (char *) str;
4182 if (convbytes <= buf + bufsize - p)
4184 memcpy (p, src, convbytes);
4185 p += convbytes;
4186 nchars++;
4187 continue;
4191 /* There wasn't enough room to store this conversion or single
4192 character. CONVBYTES says how much room is needed. Allocate
4193 enough room (and then some) and do it again. */
4195 ptrdiff_t used = p - buf;
4197 if (max_bufsize - used < convbytes)
4198 string_overflow ();
4199 bufsize = used + convbytes;
4200 bufsize = bufsize < max_bufsize / 2 ? bufsize * 2 : max_bufsize;
4202 if (buf == initial_buffer)
4204 buf = xmalloc (bufsize);
4205 sa_must_free = 1;
4206 buf_save_value = make_save_value (buf, 0);
4207 record_unwind_protect (safe_alloca_unwind, buf_save_value);
4208 memcpy (buf, initial_buffer, used);
4210 else
4211 XSAVE_VALUE (buf_save_value)->pointer = buf = xrealloc (buf, bufsize);
4213 p = buf + used;
4216 format = format0;
4217 n = n0;
4220 if (bufsize < p - buf)
4221 abort ();
4223 if (maybe_combine_byte)
4224 nchars = multibyte_chars_in_text ((unsigned char *) buf, p - buf);
4225 val = make_specified_string (buf, nchars, p - buf, multibyte);
4227 /* If we allocated BUF with malloc, free it too. */
4228 SAFE_FREE ();
4230 /* If the format string has text properties, or any of the string
4231 arguments has text properties, set up text properties of the
4232 result string. */
4234 if (STRING_INTERVALS (args[0]) || arg_intervals)
4236 Lisp_Object len, new_len, props;
4237 struct gcpro gcpro1;
4239 /* Add text properties from the format string. */
4240 len = make_number (SCHARS (args[0]));
4241 props = text_property_list (args[0], make_number (0), len, Qnil);
4242 GCPRO1 (props);
4244 if (CONSP (props))
4246 ptrdiff_t bytepos = 0, position = 0, translated = 0;
4247 ptrdiff_t argn = 1;
4248 Lisp_Object list;
4250 /* Adjust the bounds of each text property
4251 to the proper start and end in the output string. */
4253 /* Put the positions in PROPS in increasing order, so that
4254 we can do (effectively) one scan through the position
4255 space of the format string. */
4256 props = Fnreverse (props);
4258 /* BYTEPOS is the byte position in the format string,
4259 POSITION is the untranslated char position in it,
4260 TRANSLATED is the translated char position in BUF,
4261 and ARGN is the number of the next arg we will come to. */
4262 for (list = props; CONSP (list); list = XCDR (list))
4264 Lisp_Object item;
4265 ptrdiff_t pos;
4267 item = XCAR (list);
4269 /* First adjust the property start position. */
4270 pos = XINT (XCAR (item));
4272 /* Advance BYTEPOS, POSITION, TRANSLATED and ARGN
4273 up to this position. */
4274 for (; position < pos; bytepos++)
4276 if (! discarded[bytepos])
4277 position++, translated++;
4278 else if (discarded[bytepos] == 1)
4280 position++;
4281 if (translated == info[argn].start)
4283 translated += info[argn].end - info[argn].start;
4284 argn++;
4289 XSETCAR (item, make_number (translated));
4291 /* Likewise adjust the property end position. */
4292 pos = XINT (XCAR (XCDR (item)));
4294 for (; position < pos; bytepos++)
4296 if (! discarded[bytepos])
4297 position++, translated++;
4298 else if (discarded[bytepos] == 1)
4300 position++;
4301 if (translated == info[argn].start)
4303 translated += info[argn].end - info[argn].start;
4304 argn++;
4309 XSETCAR (XCDR (item), make_number (translated));
4312 add_text_properties_from_list (val, props, make_number (0));
4315 /* Add text properties from arguments. */
4316 if (arg_intervals)
4317 for (n = 1; n < nargs; ++n)
4318 if (info[n].intervals)
4320 len = make_number (SCHARS (args[n]));
4321 new_len = make_number (info[n].end - info[n].start);
4322 props = text_property_list (args[n], make_number (0), len, Qnil);
4323 props = extend_property_ranges (props, new_len);
4324 /* If successive arguments have properties, be sure that
4325 the value of `composition' property be the copy. */
4326 if (n > 1 && info[n - 1].end)
4327 make_composition_value_copy (props);
4328 add_text_properties_from_list (val, props,
4329 make_number (info[n].start));
4332 UNGCPRO;
4335 return val;
4338 Lisp_Object
4339 format2 (const char *string1, Lisp_Object arg0, Lisp_Object arg1)
4341 Lisp_Object args[3];
4342 args[0] = build_string (string1);
4343 args[1] = arg0;
4344 args[2] = arg1;
4345 return Fformat (3, args);
4348 DEFUN ("char-equal", Fchar_equal, Schar_equal, 2, 2, 0,
4349 doc: /* Return t if two characters match, optionally ignoring case.
4350 Both arguments must be characters (i.e. integers).
4351 Case is ignored if `case-fold-search' is non-nil in the current buffer. */)
4352 (register Lisp_Object c1, Lisp_Object c2)
4354 int i1, i2;
4355 /* Check they're chars, not just integers, otherwise we could get array
4356 bounds violations in downcase. */
4357 CHECK_CHARACTER (c1);
4358 CHECK_CHARACTER (c2);
4360 if (XINT (c1) == XINT (c2))
4361 return Qt;
4362 if (NILP (BVAR (current_buffer, case_fold_search)))
4363 return Qnil;
4365 i1 = XFASTINT (c1);
4366 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
4367 && ! ASCII_CHAR_P (i1))
4369 MAKE_CHAR_MULTIBYTE (i1);
4371 i2 = XFASTINT (c2);
4372 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
4373 && ! ASCII_CHAR_P (i2))
4375 MAKE_CHAR_MULTIBYTE (i2);
4377 return (downcase (i1) == downcase (i2) ? Qt : Qnil);
4380 /* Transpose the markers in two regions of the current buffer, and
4381 adjust the ones between them if necessary (i.e.: if the regions
4382 differ in size).
4384 START1, END1 are the character positions of the first region.
4385 START1_BYTE, END1_BYTE are the byte positions.
4386 START2, END2 are the character positions of the second region.
4387 START2_BYTE, END2_BYTE are the byte positions.
4389 Traverses the entire marker list of the buffer to do so, adding an
4390 appropriate amount to some, subtracting from some, and leaving the
4391 rest untouched. Most of this is copied from adjust_markers in insdel.c.
4393 It's the caller's job to ensure that START1 <= END1 <= START2 <= END2. */
4395 static void
4396 transpose_markers (ptrdiff_t start1, ptrdiff_t end1,
4397 ptrdiff_t start2, ptrdiff_t end2,
4398 ptrdiff_t start1_byte, ptrdiff_t end1_byte,
4399 ptrdiff_t start2_byte, ptrdiff_t end2_byte)
4401 register ptrdiff_t amt1, amt1_byte, amt2, amt2_byte, diff, diff_byte, mpos;
4402 register struct Lisp_Marker *marker;
4404 /* Update point as if it were a marker. */
4405 if (PT < start1)
4407 else if (PT < end1)
4408 TEMP_SET_PT_BOTH (PT + (end2 - end1),
4409 PT_BYTE + (end2_byte - end1_byte));
4410 else if (PT < start2)
4411 TEMP_SET_PT_BOTH (PT + (end2 - start2) - (end1 - start1),
4412 (PT_BYTE + (end2_byte - start2_byte)
4413 - (end1_byte - start1_byte)));
4414 else if (PT < end2)
4415 TEMP_SET_PT_BOTH (PT - (start2 - start1),
4416 PT_BYTE - (start2_byte - start1_byte));
4418 /* We used to adjust the endpoints here to account for the gap, but that
4419 isn't good enough. Even if we assume the caller has tried to move the
4420 gap out of our way, it might still be at start1 exactly, for example;
4421 and that places it `inside' the interval, for our purposes. The amount
4422 of adjustment is nontrivial if there's a `denormalized' marker whose
4423 position is between GPT and GPT + GAP_SIZE, so it's simpler to leave
4424 the dirty work to Fmarker_position, below. */
4426 /* The difference between the region's lengths */
4427 diff = (end2 - start2) - (end1 - start1);
4428 diff_byte = (end2_byte - start2_byte) - (end1_byte - start1_byte);
4430 /* For shifting each marker in a region by the length of the other
4431 region plus the distance between the regions. */
4432 amt1 = (end2 - start2) + (start2 - end1);
4433 amt2 = (end1 - start1) + (start2 - end1);
4434 amt1_byte = (end2_byte - start2_byte) + (start2_byte - end1_byte);
4435 amt2_byte = (end1_byte - start1_byte) + (start2_byte - end1_byte);
4437 for (marker = BUF_MARKERS (current_buffer); marker; marker = marker->next)
4439 mpos = marker->bytepos;
4440 if (mpos >= start1_byte && mpos < end2_byte)
4442 if (mpos < end1_byte)
4443 mpos += amt1_byte;
4444 else if (mpos < start2_byte)
4445 mpos += diff_byte;
4446 else
4447 mpos -= amt2_byte;
4448 marker->bytepos = mpos;
4450 mpos = marker->charpos;
4451 if (mpos >= start1 && mpos < end2)
4453 if (mpos < end1)
4454 mpos += amt1;
4455 else if (mpos < start2)
4456 mpos += diff;
4457 else
4458 mpos -= amt2;
4460 marker->charpos = mpos;
4464 DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5, 0,
4465 doc: /* Transpose region STARTR1 to ENDR1 with STARTR2 to ENDR2.
4466 The regions should not be overlapping, because the size of the buffer is
4467 never changed in a transposition.
4469 Optional fifth arg LEAVE-MARKERS, if non-nil, means don't update
4470 any markers that happen to be located in the regions.
4472 Transposing beyond buffer boundaries is an error. */)
4473 (Lisp_Object startr1, Lisp_Object endr1, Lisp_Object startr2, Lisp_Object endr2, Lisp_Object leave_markers)
4475 register ptrdiff_t start1, end1, start2, end2;
4476 ptrdiff_t start1_byte, start2_byte, len1_byte, len2_byte;
4477 ptrdiff_t gap, len1, len_mid, len2;
4478 unsigned char *start1_addr, *start2_addr, *temp;
4480 INTERVAL cur_intv, tmp_interval1, tmp_interval_mid, tmp_interval2, tmp_interval3;
4481 Lisp_Object buf;
4483 XSETBUFFER (buf, current_buffer);
4484 cur_intv = BUF_INTERVALS (current_buffer);
4486 validate_region (&startr1, &endr1);
4487 validate_region (&startr2, &endr2);
4489 start1 = XFASTINT (startr1);
4490 end1 = XFASTINT (endr1);
4491 start2 = XFASTINT (startr2);
4492 end2 = XFASTINT (endr2);
4493 gap = GPT;
4495 /* Swap the regions if they're reversed. */
4496 if (start2 < end1)
4498 register ptrdiff_t glumph = start1;
4499 start1 = start2;
4500 start2 = glumph;
4501 glumph = end1;
4502 end1 = end2;
4503 end2 = glumph;
4506 len1 = end1 - start1;
4507 len2 = end2 - start2;
4509 if (start2 < end1)
4510 error ("Transposed regions overlap");
4511 /* Nothing to change for adjacent regions with one being empty */
4512 else if ((start1 == end1 || start2 == end2) && end1 == start2)
4513 return Qnil;
4515 /* The possibilities are:
4516 1. Adjacent (contiguous) regions, or separate but equal regions
4517 (no, really equal, in this case!), or
4518 2. Separate regions of unequal size.
4520 The worst case is usually No. 2. It means that (aside from
4521 potential need for getting the gap out of the way), there also
4522 needs to be a shifting of the text between the two regions. So
4523 if they are spread far apart, we are that much slower... sigh. */
4525 /* It must be pointed out that the really studly thing to do would
4526 be not to move the gap at all, but to leave it in place and work
4527 around it if necessary. This would be extremely efficient,
4528 especially considering that people are likely to do
4529 transpositions near where they are working interactively, which
4530 is exactly where the gap would be found. However, such code
4531 would be much harder to write and to read. So, if you are
4532 reading this comment and are feeling squirrely, by all means have
4533 a go! I just didn't feel like doing it, so I will simply move
4534 the gap the minimum distance to get it out of the way, and then
4535 deal with an unbroken array. */
4537 /* Make sure the gap won't interfere, by moving it out of the text
4538 we will operate on. */
4539 if (start1 < gap && gap < end2)
4541 if (gap - start1 < end2 - gap)
4542 move_gap (start1);
4543 else
4544 move_gap (end2);
4547 start1_byte = CHAR_TO_BYTE (start1);
4548 start2_byte = CHAR_TO_BYTE (start2);
4549 len1_byte = CHAR_TO_BYTE (end1) - start1_byte;
4550 len2_byte = CHAR_TO_BYTE (end2) - start2_byte;
4552 #ifdef BYTE_COMBINING_DEBUG
4553 if (end1 == start2)
4555 if (count_combining_before (BYTE_POS_ADDR (start2_byte),
4556 len2_byte, start1, start1_byte)
4557 || count_combining_before (BYTE_POS_ADDR (start1_byte),
4558 len1_byte, end2, start2_byte + len2_byte)
4559 || count_combining_after (BYTE_POS_ADDR (start1_byte),
4560 len1_byte, end2, start2_byte + len2_byte))
4561 abort ();
4563 else
4565 if (count_combining_before (BYTE_POS_ADDR (start2_byte),
4566 len2_byte, start1, start1_byte)
4567 || count_combining_before (BYTE_POS_ADDR (start1_byte),
4568 len1_byte, start2, start2_byte)
4569 || count_combining_after (BYTE_POS_ADDR (start2_byte),
4570 len2_byte, end1, start1_byte + len1_byte)
4571 || count_combining_after (BYTE_POS_ADDR (start1_byte),
4572 len1_byte, end2, start2_byte + len2_byte))
4573 abort ();
4575 #endif
4577 /* Hmmm... how about checking to see if the gap is large
4578 enough to use as the temporary storage? That would avoid an
4579 allocation... interesting. Later, don't fool with it now. */
4581 /* Working without memmove, for portability (sigh), so must be
4582 careful of overlapping subsections of the array... */
4584 if (end1 == start2) /* adjacent regions */
4586 modify_region (current_buffer, start1, end2, 0);
4587 record_change (start1, len1 + len2);
4589 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4590 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4591 /* Don't use Fset_text_properties: that can cause GC, which can
4592 clobber objects stored in the tmp_intervals. */
4593 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4594 if (!NULL_INTERVAL_P (tmp_interval3))
4595 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4597 /* First region smaller than second. */
4598 if (len1_byte < len2_byte)
4600 USE_SAFE_ALLOCA;
4602 SAFE_ALLOCA (temp, unsigned char *, len2_byte);
4604 /* Don't precompute these addresses. We have to compute them
4605 at the last minute, because the relocating allocator might
4606 have moved the buffer around during the xmalloc. */
4607 start1_addr = BYTE_POS_ADDR (start1_byte);
4608 start2_addr = BYTE_POS_ADDR (start2_byte);
4610 memcpy (temp, start2_addr, len2_byte);
4611 memcpy (start1_addr + len2_byte, start1_addr, len1_byte);
4612 memcpy (start1_addr, temp, len2_byte);
4613 SAFE_FREE ();
4615 else
4616 /* First region not smaller than second. */
4618 USE_SAFE_ALLOCA;
4620 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4621 start1_addr = BYTE_POS_ADDR (start1_byte);
4622 start2_addr = BYTE_POS_ADDR (start2_byte);
4623 memcpy (temp, start1_addr, len1_byte);
4624 memcpy (start1_addr, start2_addr, len2_byte);
4625 memcpy (start1_addr + len2_byte, temp, len1_byte);
4626 SAFE_FREE ();
4628 graft_intervals_into_buffer (tmp_interval1, start1 + len2,
4629 len1, current_buffer, 0);
4630 graft_intervals_into_buffer (tmp_interval2, start1,
4631 len2, current_buffer, 0);
4632 update_compositions (start1, start1 + len2, CHECK_BORDER);
4633 update_compositions (start1 + len2, end2, CHECK_TAIL);
4635 /* Non-adjacent regions, because end1 != start2, bleagh... */
4636 else
4638 len_mid = start2_byte - (start1_byte + len1_byte);
4640 if (len1_byte == len2_byte)
4641 /* Regions are same size, though, how nice. */
4643 USE_SAFE_ALLOCA;
4645 modify_region (current_buffer, start1, end1, 0);
4646 modify_region (current_buffer, start2, end2, 0);
4647 record_change (start1, len1);
4648 record_change (start2, len2);
4649 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4650 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4652 tmp_interval3 = validate_interval_range (buf, &startr1, &endr1, 0);
4653 if (!NULL_INTERVAL_P (tmp_interval3))
4654 set_text_properties_1 (startr1, endr1, Qnil, buf, tmp_interval3);
4656 tmp_interval3 = validate_interval_range (buf, &startr2, &endr2, 0);
4657 if (!NULL_INTERVAL_P (tmp_interval3))
4658 set_text_properties_1 (startr2, endr2, Qnil, buf, tmp_interval3);
4660 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4661 start1_addr = BYTE_POS_ADDR (start1_byte);
4662 start2_addr = BYTE_POS_ADDR (start2_byte);
4663 memcpy (temp, start1_addr, len1_byte);
4664 memcpy (start1_addr, start2_addr, len2_byte);
4665 memcpy (start2_addr, temp, len1_byte);
4666 SAFE_FREE ();
4668 graft_intervals_into_buffer (tmp_interval1, start2,
4669 len1, current_buffer, 0);
4670 graft_intervals_into_buffer (tmp_interval2, start1,
4671 len2, current_buffer, 0);
4674 else if (len1_byte < len2_byte) /* Second region larger than first */
4675 /* Non-adjacent & unequal size, area between must also be shifted. */
4677 USE_SAFE_ALLOCA;
4679 modify_region (current_buffer, start1, end2, 0);
4680 record_change (start1, (end2 - start1));
4681 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4682 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4683 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4685 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4686 if (!NULL_INTERVAL_P (tmp_interval3))
4687 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4689 /* holds region 2 */
4690 SAFE_ALLOCA (temp, unsigned char *, len2_byte);
4691 start1_addr = BYTE_POS_ADDR (start1_byte);
4692 start2_addr = BYTE_POS_ADDR (start2_byte);
4693 memcpy (temp, start2_addr, len2_byte);
4694 memcpy (start1_addr + len_mid + len2_byte, start1_addr, len1_byte);
4695 memmove (start1_addr + len2_byte, start1_addr + len1_byte, len_mid);
4696 memcpy (start1_addr, temp, len2_byte);
4697 SAFE_FREE ();
4699 graft_intervals_into_buffer (tmp_interval1, end2 - len1,
4700 len1, current_buffer, 0);
4701 graft_intervals_into_buffer (tmp_interval_mid, start1 + len2,
4702 len_mid, current_buffer, 0);
4703 graft_intervals_into_buffer (tmp_interval2, start1,
4704 len2, current_buffer, 0);
4706 else
4707 /* Second region smaller than first. */
4709 USE_SAFE_ALLOCA;
4711 record_change (start1, (end2 - start1));
4712 modify_region (current_buffer, start1, end2, 0);
4714 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4715 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4716 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4718 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4719 if (!NULL_INTERVAL_P (tmp_interval3))
4720 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4722 /* holds region 1 */
4723 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4724 start1_addr = BYTE_POS_ADDR (start1_byte);
4725 start2_addr = BYTE_POS_ADDR (start2_byte);
4726 memcpy (temp, start1_addr, len1_byte);
4727 memcpy (start1_addr, start2_addr, len2_byte);
4728 memcpy (start1_addr + len2_byte, start1_addr + len1_byte, len_mid);
4729 memcpy (start1_addr + len2_byte + len_mid, temp, len1_byte);
4730 SAFE_FREE ();
4732 graft_intervals_into_buffer (tmp_interval1, end2 - len1,
4733 len1, current_buffer, 0);
4734 graft_intervals_into_buffer (tmp_interval_mid, start1 + len2,
4735 len_mid, current_buffer, 0);
4736 graft_intervals_into_buffer (tmp_interval2, start1,
4737 len2, current_buffer, 0);
4740 update_compositions (start1, start1 + len2, CHECK_BORDER);
4741 update_compositions (end2 - len1, end2, CHECK_BORDER);
4744 /* When doing multiple transpositions, it might be nice
4745 to optimize this. Perhaps the markers in any one buffer
4746 should be organized in some sorted data tree. */
4747 if (NILP (leave_markers))
4749 transpose_markers (start1, end1, start2, end2,
4750 start1_byte, start1_byte + len1_byte,
4751 start2_byte, start2_byte + len2_byte);
4752 fix_start_end_in_overlays (start1, end2);
4755 signal_after_change (start1, end2 - start1, end2 - start1);
4756 return Qnil;
4760 void
4761 syms_of_editfns (void)
4763 environbuf = 0;
4764 initial_tz = 0;
4766 DEFSYM (Qbuffer_access_fontify_functions, "buffer-access-fontify-functions");
4768 DEFVAR_LISP ("inhibit-field-text-motion", Vinhibit_field_text_motion,
4769 doc: /* Non-nil means text motion commands don't notice fields. */);
4770 Vinhibit_field_text_motion = Qnil;
4772 DEFVAR_LISP ("buffer-access-fontify-functions",
4773 Vbuffer_access_fontify_functions,
4774 doc: /* List of functions called by `buffer-substring' to fontify if necessary.
4775 Each function is called with two arguments which specify the range
4776 of the buffer being accessed. */);
4777 Vbuffer_access_fontify_functions = Qnil;
4780 Lisp_Object obuf;
4781 obuf = Fcurrent_buffer ();
4782 /* Do this here, because init_buffer_once is too early--it won't work. */
4783 Fset_buffer (Vprin1_to_string_buffer);
4784 /* Make sure buffer-access-fontify-functions is nil in this buffer. */
4785 Fset (Fmake_local_variable (intern_c_string ("buffer-access-fontify-functions")),
4786 Qnil);
4787 Fset_buffer (obuf);
4790 DEFVAR_LISP ("buffer-access-fontified-property",
4791 Vbuffer_access_fontified_property,
4792 doc: /* Property which (if non-nil) indicates text has been fontified.
4793 `buffer-substring' need not call the `buffer-access-fontify-functions'
4794 functions if all the text being accessed has this property. */);
4795 Vbuffer_access_fontified_property = Qnil;
4797 DEFVAR_LISP ("system-name", Vsystem_name,
4798 doc: /* The host name of the machine Emacs is running on. */);
4800 DEFVAR_LISP ("user-full-name", Vuser_full_name,
4801 doc: /* The full name of the user logged in. */);
4803 DEFVAR_LISP ("user-login-name", Vuser_login_name,
4804 doc: /* The user's name, taken from environment variables if possible. */);
4806 DEFVAR_LISP ("user-real-login-name", Vuser_real_login_name,
4807 doc: /* The user's name, based upon the real uid only. */);
4809 DEFVAR_LISP ("operating-system-release", Voperating_system_release,
4810 doc: /* The release of the operating system Emacs is running on. */);
4812 defsubr (&Spropertize);
4813 defsubr (&Schar_equal);
4814 defsubr (&Sgoto_char);
4815 defsubr (&Sstring_to_char);
4816 defsubr (&Schar_to_string);
4817 defsubr (&Sbyte_to_string);
4818 defsubr (&Sbuffer_substring);
4819 defsubr (&Sbuffer_substring_no_properties);
4820 defsubr (&Sbuffer_string);
4822 defsubr (&Spoint_marker);
4823 defsubr (&Smark_marker);
4824 defsubr (&Spoint);
4825 defsubr (&Sregion_beginning);
4826 defsubr (&Sregion_end);
4828 DEFSYM (Qfield, "field");
4829 DEFSYM (Qboundary, "boundary");
4830 defsubr (&Sfield_beginning);
4831 defsubr (&Sfield_end);
4832 defsubr (&Sfield_string);
4833 defsubr (&Sfield_string_no_properties);
4834 defsubr (&Sdelete_field);
4835 defsubr (&Sconstrain_to_field);
4837 defsubr (&Sline_beginning_position);
4838 defsubr (&Sline_end_position);
4840 /* defsubr (&Smark); */
4841 /* defsubr (&Sset_mark); */
4842 defsubr (&Ssave_excursion);
4843 defsubr (&Ssave_current_buffer);
4845 defsubr (&Sbufsize);
4846 defsubr (&Spoint_max);
4847 defsubr (&Spoint_min);
4848 defsubr (&Spoint_min_marker);
4849 defsubr (&Spoint_max_marker);
4850 defsubr (&Sgap_position);
4851 defsubr (&Sgap_size);
4852 defsubr (&Sposition_bytes);
4853 defsubr (&Sbyte_to_position);
4855 defsubr (&Sbobp);
4856 defsubr (&Seobp);
4857 defsubr (&Sbolp);
4858 defsubr (&Seolp);
4859 defsubr (&Sfollowing_char);
4860 defsubr (&Sprevious_char);
4861 defsubr (&Schar_after);
4862 defsubr (&Schar_before);
4863 defsubr (&Sinsert);
4864 defsubr (&Sinsert_before_markers);
4865 defsubr (&Sinsert_and_inherit);
4866 defsubr (&Sinsert_and_inherit_before_markers);
4867 defsubr (&Sinsert_char);
4868 defsubr (&Sinsert_byte);
4870 defsubr (&Suser_login_name);
4871 defsubr (&Suser_real_login_name);
4872 defsubr (&Suser_uid);
4873 defsubr (&Suser_real_uid);
4874 defsubr (&Suser_full_name);
4875 defsubr (&Semacs_pid);
4876 defsubr (&Scurrent_time);
4877 defsubr (&Sget_internal_run_time);
4878 defsubr (&Sformat_time_string);
4879 defsubr (&Sfloat_time);
4880 defsubr (&Sdecode_time);
4881 defsubr (&Sencode_time);
4882 defsubr (&Scurrent_time_string);
4883 defsubr (&Scurrent_time_zone);
4884 defsubr (&Sset_time_zone_rule);
4885 defsubr (&Ssystem_name);
4886 defsubr (&Smessage);
4887 defsubr (&Smessage_box);
4888 defsubr (&Smessage_or_box);
4889 defsubr (&Scurrent_message);
4890 defsubr (&Sformat);
4892 defsubr (&Sinsert_buffer_substring);
4893 defsubr (&Scompare_buffer_substrings);
4894 defsubr (&Ssubst_char_in_region);
4895 defsubr (&Stranslate_region_internal);
4896 defsubr (&Sdelete_region);
4897 defsubr (&Sdelete_and_extract_region);
4898 defsubr (&Swiden);
4899 defsubr (&Snarrow_to_region);
4900 defsubr (&Ssave_restriction);
4901 defsubr (&Stranspose_regions);