* ftfont.c (ftfont_shape_by_flt): Use signed integers for lengths.
[emacs.git] / src / editfns.c
blob2d736bbc7e2233108c7838b3c75c1eef8744393a
1 /* Lisp functions pertaining to editing.
3 Copyright (C) 1985-1987, 1989, 1993-2011 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 "buffer.h"
56 #include "character.h"
57 #include "coding.h"
58 #include "frame.h"
59 #include "window.h"
60 #include "blockinput.h"
62 #ifndef NULL
63 #define NULL 0
64 #endif
66 #ifndef USER_FULL_NAME
67 #define USER_FULL_NAME pw->pw_gecos
68 #endif
70 #ifndef USE_CRT_DLL
71 extern char **environ;
72 #endif
74 #define TM_YEAR_BASE 1900
76 /* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
77 asctime to have well-defined behavior. */
78 #ifndef TM_YEAR_IN_ASCTIME_RANGE
79 # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
80 (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
81 #endif
83 #ifdef WINDOWSNT
84 extern Lisp_Object w32_get_internal_run_time (void);
85 #endif
87 static void time_overflow (void) NO_RETURN;
88 static int tm_diff (struct tm *, struct tm *);
89 static void find_field (Lisp_Object, Lisp_Object, Lisp_Object,
90 EMACS_INT *, Lisp_Object, EMACS_INT *);
91 static void update_buffer_properties (EMACS_INT, EMACS_INT);
92 static Lisp_Object region_limit (int);
93 static size_t emacs_nmemftime (char *, size_t, const char *,
94 size_t, const struct tm *, int, int);
95 static void general_insert_function (void (*) (const char *, EMACS_INT),
96 void (*) (Lisp_Object, EMACS_INT,
97 EMACS_INT, EMACS_INT,
98 EMACS_INT, int),
99 int, ptrdiff_t, Lisp_Object *);
100 static Lisp_Object subst_char_in_region_unwind (Lisp_Object);
101 static Lisp_Object subst_char_in_region_unwind_1 (Lisp_Object);
102 static void transpose_markers (EMACS_INT, EMACS_INT, EMACS_INT, EMACS_INT,
103 EMACS_INT, EMACS_INT, EMACS_INT, EMACS_INT);
105 static Lisp_Object Qbuffer_access_fontify_functions;
106 static Lisp_Object Fuser_full_name (Lisp_Object);
108 /* Symbol for the text property used to mark fields. */
110 Lisp_Object Qfield;
112 /* A special value for Qfield properties. */
114 static Lisp_Object Qboundary;
117 void
118 init_editfns (void)
120 const char *user_name;
121 register char *p;
122 struct passwd *pw; /* password entry for the current user */
123 Lisp_Object tem;
125 /* Set up system_name even when dumping. */
126 init_system_name ();
128 #ifndef CANNOT_DUMP
129 /* Don't bother with this on initial start when just dumping out */
130 if (!initialized)
131 return;
132 #endif /* not CANNOT_DUMP */
134 pw = getpwuid (getuid ());
135 #ifdef MSDOS
136 /* We let the real user name default to "root" because that's quite
137 accurate on MSDOG and because it lets Emacs find the init file.
138 (The DVX libraries override the Djgpp libraries here.) */
139 Vuser_real_login_name = build_string (pw ? pw->pw_name : "root");
140 #else
141 Vuser_real_login_name = build_string (pw ? pw->pw_name : "unknown");
142 #endif
144 /* Get the effective user name, by consulting environment variables,
145 or the effective uid if those are unset. */
146 user_name = getenv ("LOGNAME");
147 if (!user_name)
148 #ifdef WINDOWSNT
149 user_name = getenv ("USERNAME"); /* it's USERNAME on NT */
150 #else /* WINDOWSNT */
151 user_name = getenv ("USER");
152 #endif /* WINDOWSNT */
153 if (!user_name)
155 pw = getpwuid (geteuid ());
156 user_name = pw ? pw->pw_name : "unknown";
158 Vuser_login_name = build_string (user_name);
160 /* If the user name claimed in the environment vars differs from
161 the real uid, use the claimed name to find the full name. */
162 tem = Fstring_equal (Vuser_login_name, Vuser_real_login_name);
163 Vuser_full_name = Fuser_full_name (NILP (tem)? make_number (geteuid())
164 : Vuser_login_name);
166 p = getenv ("NAME");
167 if (p)
168 Vuser_full_name = build_string (p);
169 else if (NILP (Vuser_full_name))
170 Vuser_full_name = build_string ("unknown");
172 #ifdef HAVE_SYS_UTSNAME_H
174 struct utsname uts;
175 uname (&uts);
176 Voperating_system_release = build_string (uts.release);
178 #else
179 Voperating_system_release = Qnil;
180 #endif
183 DEFUN ("char-to-string", Fchar_to_string, Schar_to_string, 1, 1, 0,
184 doc: /* Convert arg CHAR to a string containing that character.
185 usage: (char-to-string CHAR) */)
186 (Lisp_Object character)
188 int c, len;
189 unsigned char str[MAX_MULTIBYTE_LENGTH];
191 CHECK_CHARACTER (character);
192 c = XFASTINT (character);
194 len = CHAR_STRING (c, str);
195 return make_string_from_bytes ((char *) str, 1, len);
198 DEFUN ("byte-to-string", Fbyte_to_string, Sbyte_to_string, 1, 1, 0,
199 doc: /* Convert arg BYTE to a unibyte string containing that byte. */)
200 (Lisp_Object byte)
202 unsigned char b;
203 CHECK_NUMBER (byte);
204 if (XINT (byte) < 0 || XINT (byte) > 255)
205 error ("Invalid byte");
206 b = XINT (byte);
207 return make_string_from_bytes ((char *) &b, 1, 1);
210 DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
211 doc: /* Convert arg STRING to a character, the first character of that string.
212 A multibyte character is handled correctly. */)
213 (register Lisp_Object string)
215 register Lisp_Object val;
216 CHECK_STRING (string);
217 if (SCHARS (string))
219 if (STRING_MULTIBYTE (string))
220 XSETFASTINT (val, STRING_CHAR (SDATA (string)));
221 else
222 XSETFASTINT (val, SREF (string, 0));
224 else
225 XSETFASTINT (val, 0);
226 return val;
229 static Lisp_Object
230 buildmark (EMACS_INT charpos, EMACS_INT bytepos)
232 register Lisp_Object mark;
233 mark = Fmake_marker ();
234 set_marker_both (mark, Qnil, charpos, bytepos);
235 return mark;
238 DEFUN ("point", Fpoint, Spoint, 0, 0, 0,
239 doc: /* Return value of point, as an integer.
240 Beginning of buffer is position (point-min). */)
241 (void)
243 Lisp_Object temp;
244 XSETFASTINT (temp, PT);
245 return temp;
248 DEFUN ("point-marker", Fpoint_marker, Spoint_marker, 0, 0, 0,
249 doc: /* Return value of point, as a marker object. */)
250 (void)
252 return buildmark (PT, PT_BYTE);
255 EMACS_INT
256 clip_to_bounds (EMACS_INT lower, EMACS_INT num, EMACS_INT upper)
258 if (num < lower)
259 return lower;
260 else if (num > upper)
261 return upper;
262 else
263 return num;
266 DEFUN ("goto-char", Fgoto_char, Sgoto_char, 1, 1, "NGoto char: ",
267 doc: /* Set point to POSITION, a number or marker.
268 Beginning of buffer is position (point-min), end is (point-max).
270 The return value is POSITION. */)
271 (register Lisp_Object position)
273 EMACS_INT pos;
275 if (MARKERP (position)
276 && current_buffer == XMARKER (position)->buffer)
278 pos = marker_position (position);
279 if (pos < BEGV)
280 SET_PT_BOTH (BEGV, BEGV_BYTE);
281 else if (pos > ZV)
282 SET_PT_BOTH (ZV, ZV_BYTE);
283 else
284 SET_PT_BOTH (pos, marker_byte_position (position));
286 return position;
289 CHECK_NUMBER_COERCE_MARKER (position);
291 pos = clip_to_bounds (BEGV, XINT (position), ZV);
292 SET_PT (pos);
293 return position;
297 /* Return the start or end position of the region.
298 BEGINNINGP non-zero means return the start.
299 If there is no region active, signal an error. */
301 static Lisp_Object
302 region_limit (int beginningp)
304 Lisp_Object m;
306 if (!NILP (Vtransient_mark_mode)
307 && NILP (Vmark_even_if_inactive)
308 && NILP (BVAR (current_buffer, mark_active)))
309 xsignal0 (Qmark_inactive);
311 m = Fmarker_position (BVAR (current_buffer, mark));
312 if (NILP (m))
313 error ("The mark is not set now, so there is no region");
315 if ((PT < XFASTINT (m)) == (beginningp != 0))
316 m = make_number (PT);
317 return m;
320 DEFUN ("region-beginning", Fregion_beginning, Sregion_beginning, 0, 0, 0,
321 doc: /* Return the integer value of point or mark, whichever is smaller. */)
322 (void)
324 return region_limit (1);
327 DEFUN ("region-end", Fregion_end, Sregion_end, 0, 0, 0,
328 doc: /* Return the integer value of point or mark, whichever is larger. */)
329 (void)
331 return region_limit (0);
334 DEFUN ("mark-marker", Fmark_marker, Smark_marker, 0, 0, 0,
335 doc: /* Return this buffer's mark, as a marker object.
336 Watch out! Moving this marker changes the mark position.
337 If you set the marker not to point anywhere, the buffer will have no mark. */)
338 (void)
340 return BVAR (current_buffer, mark);
344 /* Find all the overlays in the current buffer that touch position POS.
345 Return the number found, and store them in a vector in VEC
346 of length LEN. */
348 static int
349 overlays_around (EMACS_INT pos, Lisp_Object *vec, int len)
351 Lisp_Object overlay, start, end;
352 struct Lisp_Overlay *tail;
353 EMACS_INT startpos, endpos;
354 int idx = 0;
356 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
358 XSETMISC (overlay, tail);
360 end = OVERLAY_END (overlay);
361 endpos = OVERLAY_POSITION (end);
362 if (endpos < pos)
363 break;
364 start = OVERLAY_START (overlay);
365 startpos = OVERLAY_POSITION (start);
366 if (startpos <= pos)
368 if (idx < len)
369 vec[idx] = overlay;
370 /* Keep counting overlays even if we can't return them all. */
371 idx++;
375 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
377 XSETMISC (overlay, tail);
379 start = OVERLAY_START (overlay);
380 startpos = OVERLAY_POSITION (start);
381 if (pos < startpos)
382 break;
383 end = OVERLAY_END (overlay);
384 endpos = OVERLAY_POSITION (end);
385 if (pos <= endpos)
387 if (idx < len)
388 vec[idx] = overlay;
389 idx++;
393 return idx;
396 /* Return the value of property PROP, in OBJECT at POSITION.
397 It's the value of PROP that a char inserted at POSITION would get.
398 OBJECT is optional and defaults to the current buffer.
399 If OBJECT is a buffer, then overlay properties are considered as well as
400 text properties.
401 If OBJECT is a window, then that window's buffer is used, but
402 window-specific overlays are considered only if they are associated
403 with OBJECT. */
404 Lisp_Object
405 get_pos_property (Lisp_Object position, register Lisp_Object prop, Lisp_Object object)
407 CHECK_NUMBER_COERCE_MARKER (position);
409 if (NILP (object))
410 XSETBUFFER (object, current_buffer);
411 else if (WINDOWP (object))
412 object = XWINDOW (object)->buffer;
414 if (!BUFFERP (object))
415 /* pos-property only makes sense in buffers right now, since strings
416 have no overlays and no notion of insertion for which stickiness
417 could be obeyed. */
418 return Fget_text_property (position, prop, object);
419 else
421 EMACS_INT posn = XINT (position);
422 int noverlays;
423 Lisp_Object *overlay_vec, tem;
424 struct buffer *obuf = current_buffer;
426 set_buffer_temp (XBUFFER (object));
428 /* First try with room for 40 overlays. */
429 noverlays = 40;
430 overlay_vec = (Lisp_Object *) alloca (noverlays * sizeof (Lisp_Object));
431 noverlays = overlays_around (posn, overlay_vec, noverlays);
433 /* If there are more than 40,
434 make enough space for all, and try again. */
435 if (noverlays > 40)
437 overlay_vec = (Lisp_Object *) alloca (noverlays * sizeof (Lisp_Object));
438 noverlays = overlays_around (posn, overlay_vec, noverlays);
440 noverlays = sort_overlays (overlay_vec, noverlays, NULL);
442 set_buffer_temp (obuf);
444 /* Now check the overlays in order of decreasing priority. */
445 while (--noverlays >= 0)
447 Lisp_Object ol = overlay_vec[noverlays];
448 tem = Foverlay_get (ol, prop);
449 if (!NILP (tem))
451 /* Check the overlay is indeed active at point. */
452 Lisp_Object start = OVERLAY_START (ol), finish = OVERLAY_END (ol);
453 if ((OVERLAY_POSITION (start) == posn
454 && XMARKER (start)->insertion_type == 1)
455 || (OVERLAY_POSITION (finish) == posn
456 && XMARKER (finish)->insertion_type == 0))
457 ; /* The overlay will not cover a char inserted at point. */
458 else
460 return tem;
465 { /* Now check the text properties. */
466 int stickiness = text_property_stickiness (prop, position, object);
467 if (stickiness > 0)
468 return Fget_text_property (position, prop, object);
469 else if (stickiness < 0
470 && XINT (position) > BUF_BEGV (XBUFFER (object)))
471 return Fget_text_property (make_number (XINT (position) - 1),
472 prop, object);
473 else
474 return Qnil;
479 /* Find the field surrounding POS in *BEG and *END. If POS is nil,
480 the value of point is used instead. If BEG or END is null,
481 means don't store the beginning or end of the field.
483 BEG_LIMIT and END_LIMIT serve to limit the ranged of the returned
484 results; they do not effect boundary behavior.
486 If MERGE_AT_BOUNDARY is nonzero, then if POS is at the very first
487 position of a field, then the beginning of the previous field is
488 returned instead of the beginning of POS's field (since the end of a
489 field is actually also the beginning of the next input field, this
490 behavior is sometimes useful). Additionally in the MERGE_AT_BOUNDARY
491 true case, if two fields are separated by a field with the special
492 value `boundary', and POS lies within it, then the two separated
493 fields are considered to be adjacent, and POS between them, when
494 finding the beginning and ending of the "merged" field.
496 Either BEG or END may be 0, in which case the corresponding value
497 is not stored. */
499 static void
500 find_field (Lisp_Object pos, Lisp_Object merge_at_boundary,
501 Lisp_Object beg_limit,
502 EMACS_INT *beg, Lisp_Object end_limit, EMACS_INT *end)
504 /* Fields right before and after the point. */
505 Lisp_Object before_field, after_field;
506 /* 1 if POS counts as the start of a field. */
507 int at_field_start = 0;
508 /* 1 if POS counts as the end of a field. */
509 int at_field_end = 0;
511 if (NILP (pos))
512 XSETFASTINT (pos, PT);
513 else
514 CHECK_NUMBER_COERCE_MARKER (pos);
516 after_field
517 = get_char_property_and_overlay (pos, Qfield, Qnil, NULL);
518 before_field
519 = (XFASTINT (pos) > BEGV
520 ? get_char_property_and_overlay (make_number (XINT (pos) - 1),
521 Qfield, Qnil, NULL)
522 /* Using nil here would be a more obvious choice, but it would
523 fail when the buffer starts with a non-sticky field. */
524 : after_field);
526 /* See if we need to handle the case where MERGE_AT_BOUNDARY is nil
527 and POS is at beginning of a field, which can also be interpreted
528 as the end of the previous field. Note that the case where if
529 MERGE_AT_BOUNDARY is non-nil (see function comment) is actually the
530 more natural one; then we avoid treating the beginning of a field
531 specially. */
532 if (NILP (merge_at_boundary))
534 Lisp_Object field = get_pos_property (pos, Qfield, Qnil);
535 if (!EQ (field, after_field))
536 at_field_end = 1;
537 if (!EQ (field, before_field))
538 at_field_start = 1;
539 if (NILP (field) && at_field_start && at_field_end)
540 /* If an inserted char would have a nil field while the surrounding
541 text is non-nil, we're probably not looking at a
542 zero-length field, but instead at a non-nil field that's
543 not intended for editing (such as comint's prompts). */
544 at_field_end = at_field_start = 0;
547 /* Note about special `boundary' fields:
549 Consider the case where the point (`.') is between the fields `x' and `y':
551 xxxx.yyyy
553 In this situation, if merge_at_boundary is true, we consider the
554 `x' and `y' fields as forming one big merged field, and so the end
555 of the field is the end of `y'.
557 However, if `x' and `y' are separated by a special `boundary' field
558 (a field with a `field' char-property of 'boundary), then we ignore
559 this special field when merging adjacent fields. Here's the same
560 situation, but with a `boundary' field between the `x' and `y' fields:
562 xxx.BBBByyyy
564 Here, if point is at the end of `x', the beginning of `y', or
565 anywhere in-between (within the `boundary' field), we merge all
566 three fields and consider the beginning as being the beginning of
567 the `x' field, and the end as being the end of the `y' field. */
569 if (beg)
571 if (at_field_start)
572 /* POS is at the edge of a field, and we should consider it as
573 the beginning of the following field. */
574 *beg = XFASTINT (pos);
575 else
576 /* Find the previous field boundary. */
578 Lisp_Object p = pos;
579 if (!NILP (merge_at_boundary) && EQ (before_field, Qboundary))
580 /* Skip a `boundary' field. */
581 p = Fprevious_single_char_property_change (p, Qfield, Qnil,
582 beg_limit);
584 p = Fprevious_single_char_property_change (p, Qfield, Qnil,
585 beg_limit);
586 *beg = NILP (p) ? BEGV : XFASTINT (p);
590 if (end)
592 if (at_field_end)
593 /* POS is at the edge of a field, and we should consider it as
594 the end of the previous field. */
595 *end = XFASTINT (pos);
596 else
597 /* Find the next field boundary. */
599 if (!NILP (merge_at_boundary) && EQ (after_field, Qboundary))
600 /* Skip a `boundary' field. */
601 pos = Fnext_single_char_property_change (pos, Qfield, Qnil,
602 end_limit);
604 pos = Fnext_single_char_property_change (pos, Qfield, Qnil,
605 end_limit);
606 *end = NILP (pos) ? ZV : XFASTINT (pos);
612 DEFUN ("delete-field", Fdelete_field, Sdelete_field, 0, 1, 0,
613 doc: /* Delete the field surrounding POS.
614 A field is a region of text with the same `field' property.
615 If POS is nil, the value of point is used for POS. */)
616 (Lisp_Object pos)
618 EMACS_INT beg, end;
619 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
620 if (beg != end)
621 del_range (beg, end);
622 return Qnil;
625 DEFUN ("field-string", Ffield_string, Sfield_string, 0, 1, 0,
626 doc: /* Return the contents of the field surrounding POS as a string.
627 A field is a region of text with the same `field' property.
628 If POS is nil, the value of point is used for POS. */)
629 (Lisp_Object pos)
631 EMACS_INT beg, end;
632 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
633 return make_buffer_string (beg, end, 1);
636 DEFUN ("field-string-no-properties", Ffield_string_no_properties, Sfield_string_no_properties, 0, 1, 0,
637 doc: /* Return the contents of the field around POS, without text properties.
638 A field is a region of text with the same `field' property.
639 If POS is nil, the value of point is used for POS. */)
640 (Lisp_Object pos)
642 EMACS_INT beg, end;
643 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
644 return make_buffer_string (beg, end, 0);
647 DEFUN ("field-beginning", Ffield_beginning, Sfield_beginning, 0, 3, 0,
648 doc: /* Return the beginning of the field surrounding POS.
649 A field is a region of text with the same `field' property.
650 If POS is nil, the value of point is used for POS.
651 If ESCAPE-FROM-EDGE is non-nil and POS is at the beginning of its
652 field, then the beginning of the *previous* field is returned.
653 If LIMIT is non-nil, it is a buffer position; if the beginning of the field
654 is before LIMIT, then LIMIT will be returned instead. */)
655 (Lisp_Object pos, Lisp_Object escape_from_edge, Lisp_Object limit)
657 EMACS_INT beg;
658 find_field (pos, escape_from_edge, limit, &beg, Qnil, 0);
659 return make_number (beg);
662 DEFUN ("field-end", Ffield_end, Sfield_end, 0, 3, 0,
663 doc: /* Return the end of the field surrounding POS.
664 A field is a region of text with the same `field' property.
665 If POS is nil, the value of point is used for POS.
666 If ESCAPE-FROM-EDGE is non-nil and POS is at the end of its field,
667 then the end of the *following* field is returned.
668 If LIMIT is non-nil, it is a buffer position; if the end of the field
669 is after LIMIT, then LIMIT will be returned instead. */)
670 (Lisp_Object pos, Lisp_Object escape_from_edge, Lisp_Object limit)
672 EMACS_INT end;
673 find_field (pos, escape_from_edge, Qnil, 0, limit, &end);
674 return make_number (end);
677 DEFUN ("constrain-to-field", Fconstrain_to_field, Sconstrain_to_field, 2, 5, 0,
678 doc: /* Return the position closest to NEW-POS that is in the same field as OLD-POS.
680 A field is a region of text with the same `field' property.
681 If NEW-POS is nil, then the current point is used instead, and set to the
682 constrained position if that is different.
684 If OLD-POS is at the boundary of two fields, then the allowable
685 positions for NEW-POS depends on the value of the optional argument
686 ESCAPE-FROM-EDGE: If ESCAPE-FROM-EDGE is nil, then NEW-POS is
687 constrained to the field that has the same `field' char-property
688 as any new characters inserted at OLD-POS, whereas if ESCAPE-FROM-EDGE
689 is non-nil, NEW-POS is constrained to the union of the two adjacent
690 fields. Additionally, if two fields are separated by another field with
691 the special value `boundary', then any point within this special field is
692 also considered to be `on the boundary'.
694 If the optional argument ONLY-IN-LINE is non-nil and constraining
695 NEW-POS would move it to a different line, NEW-POS is returned
696 unconstrained. This useful for commands that move by line, like
697 \\[next-line] or \\[beginning-of-line], which should generally respect field boundaries
698 only in the case where they can still move to the right line.
700 If the optional argument INHIBIT-CAPTURE-PROPERTY is non-nil, and OLD-POS has
701 a non-nil property of that name, then any field boundaries are ignored.
703 Field boundaries are not noticed if `inhibit-field-text-motion' is non-nil. */)
704 (Lisp_Object new_pos, Lisp_Object old_pos, Lisp_Object escape_from_edge, Lisp_Object only_in_line, Lisp_Object inhibit_capture_property)
706 /* If non-zero, then the original point, before re-positioning. */
707 EMACS_INT orig_point = 0;
708 int fwd;
709 Lisp_Object prev_old, prev_new;
711 if (NILP (new_pos))
712 /* Use the current point, and afterwards, set it. */
714 orig_point = PT;
715 XSETFASTINT (new_pos, PT);
718 CHECK_NUMBER_COERCE_MARKER (new_pos);
719 CHECK_NUMBER_COERCE_MARKER (old_pos);
721 fwd = (XFASTINT (new_pos) > XFASTINT (old_pos));
723 prev_old = make_number (XFASTINT (old_pos) - 1);
724 prev_new = make_number (XFASTINT (new_pos) - 1);
726 if (NILP (Vinhibit_field_text_motion)
727 && !EQ (new_pos, old_pos)
728 && (!NILP (Fget_char_property (new_pos, Qfield, Qnil))
729 || !NILP (Fget_char_property (old_pos, Qfield, Qnil))
730 /* To recognize field boundaries, we must also look at the
731 previous positions; we could use `get_pos_property'
732 instead, but in itself that would fail inside non-sticky
733 fields (like comint prompts). */
734 || (XFASTINT (new_pos) > BEGV
735 && !NILP (Fget_char_property (prev_new, Qfield, Qnil)))
736 || (XFASTINT (old_pos) > BEGV
737 && !NILP (Fget_char_property (prev_old, Qfield, Qnil))))
738 && (NILP (inhibit_capture_property)
739 /* Field boundaries are again a problem; but now we must
740 decide the case exactly, so we need to call
741 `get_pos_property' as well. */
742 || (NILP (get_pos_property (old_pos, inhibit_capture_property, Qnil))
743 && (XFASTINT (old_pos) <= BEGV
744 || NILP (Fget_char_property (old_pos, inhibit_capture_property, Qnil))
745 || NILP (Fget_char_property (prev_old, inhibit_capture_property, Qnil))))))
746 /* It is possible that NEW_POS is not within the same field as
747 OLD_POS; try to move NEW_POS so that it is. */
749 EMACS_INT shortage;
750 Lisp_Object field_bound;
752 if (fwd)
753 field_bound = Ffield_end (old_pos, escape_from_edge, new_pos);
754 else
755 field_bound = Ffield_beginning (old_pos, escape_from_edge, new_pos);
757 if (/* See if ESCAPE_FROM_EDGE caused FIELD_BOUND to jump to the
758 other side of NEW_POS, which would mean that NEW_POS is
759 already acceptable, and it's not necessary to constrain it
760 to FIELD_BOUND. */
761 ((XFASTINT (field_bound) < XFASTINT (new_pos)) ? fwd : !fwd)
762 /* NEW_POS should be constrained, but only if either
763 ONLY_IN_LINE is nil (in which case any constraint is OK),
764 or NEW_POS and FIELD_BOUND are on the same line (in which
765 case the constraint is OK even if ONLY_IN_LINE is non-nil). */
766 && (NILP (only_in_line)
767 /* This is the ONLY_IN_LINE case, check that NEW_POS and
768 FIELD_BOUND are on the same line by seeing whether
769 there's an intervening newline or not. */
770 || (scan_buffer ('\n',
771 XFASTINT (new_pos), XFASTINT (field_bound),
772 fwd ? -1 : 1, &shortage, 1),
773 shortage != 0)))
774 /* Constrain NEW_POS to FIELD_BOUND. */
775 new_pos = field_bound;
777 if (orig_point && XFASTINT (new_pos) != orig_point)
778 /* The NEW_POS argument was originally nil, so automatically set PT. */
779 SET_PT (XFASTINT (new_pos));
782 return new_pos;
786 DEFUN ("line-beginning-position",
787 Fline_beginning_position, Sline_beginning_position, 0, 1, 0,
788 doc: /* Return the character position of the first character on the current line.
789 With argument N not nil or 1, move forward N - 1 lines first.
790 If scan reaches end of buffer, return that position.
792 The returned position is of the first character in the logical order,
793 i.e. the one that has the smallest character position.
795 This function constrains the returned position to the current field
796 unless that would be on a different line than the original,
797 unconstrained result. If N is nil or 1, and a front-sticky field
798 starts at point, the scan stops as soon as it starts. To ignore field
799 boundaries bind `inhibit-field-text-motion' to t.
801 This function does not move point. */)
802 (Lisp_Object n)
804 EMACS_INT orig, orig_byte, end;
805 int count = SPECPDL_INDEX ();
806 specbind (Qinhibit_point_motion_hooks, Qt);
808 if (NILP (n))
809 XSETFASTINT (n, 1);
810 else
811 CHECK_NUMBER (n);
813 orig = PT;
814 orig_byte = PT_BYTE;
815 Fforward_line (make_number (XINT (n) - 1));
816 end = PT;
818 SET_PT_BOTH (orig, orig_byte);
820 unbind_to (count, Qnil);
822 /* Return END constrained to the current input field. */
823 return Fconstrain_to_field (make_number (end), make_number (orig),
824 XINT (n) != 1 ? Qt : Qnil,
825 Qt, Qnil);
828 DEFUN ("line-end-position", Fline_end_position, Sline_end_position, 0, 1, 0,
829 doc: /* Return the character position of the last character on the current line.
830 With argument N not nil or 1, move forward N - 1 lines first.
831 If scan reaches end of buffer, return that position.
833 The returned position is of the last character in the logical order,
834 i.e. the character whose buffer position is the largest one.
836 This function constrains the returned position to the current field
837 unless that would be on a different line than the original,
838 unconstrained result. If N is nil or 1, and a rear-sticky field ends
839 at point, the scan stops as soon as it starts. To ignore field
840 boundaries bind `inhibit-field-text-motion' to t.
842 This function does not move point. */)
843 (Lisp_Object n)
845 EMACS_INT end_pos;
846 EMACS_INT orig = PT;
848 if (NILP (n))
849 XSETFASTINT (n, 1);
850 else
851 CHECK_NUMBER (n);
853 end_pos = find_before_next_newline (orig, 0, XINT (n) - (XINT (n) <= 0));
855 /* Return END_POS constrained to the current input field. */
856 return Fconstrain_to_field (make_number (end_pos), make_number (orig),
857 Qnil, Qt, Qnil);
861 Lisp_Object
862 save_excursion_save (void)
864 int visible = (XBUFFER (XWINDOW (selected_window)->buffer)
865 == current_buffer);
867 return Fcons (Fpoint_marker (),
868 Fcons (Fcopy_marker (BVAR (current_buffer, mark), Qnil),
869 Fcons (visible ? Qt : Qnil,
870 Fcons (BVAR (current_buffer, mark_active),
871 selected_window))));
874 Lisp_Object
875 save_excursion_restore (Lisp_Object info)
877 Lisp_Object tem, tem1, omark, nmark;
878 struct gcpro gcpro1, gcpro2, gcpro3;
879 int visible_p;
881 tem = Fmarker_buffer (XCAR (info));
882 /* If buffer being returned to is now deleted, avoid error */
883 /* Otherwise could get error here while unwinding to top level
884 and crash */
885 /* In that case, Fmarker_buffer returns nil now. */
886 if (NILP (tem))
887 return Qnil;
889 omark = nmark = Qnil;
890 GCPRO3 (info, omark, nmark);
892 Fset_buffer (tem);
894 /* Point marker. */
895 tem = XCAR (info);
896 Fgoto_char (tem);
897 unchain_marker (XMARKER (tem));
899 /* Mark marker. */
900 info = XCDR (info);
901 tem = XCAR (info);
902 omark = Fmarker_position (BVAR (current_buffer, mark));
903 Fset_marker (BVAR (current_buffer, mark), tem, Fcurrent_buffer ());
904 nmark = Fmarker_position (tem);
905 unchain_marker (XMARKER (tem));
907 /* visible */
908 info = XCDR (info);
909 visible_p = !NILP (XCAR (info));
911 #if 0 /* We used to make the current buffer visible in the selected window
912 if that was true previously. That avoids some anomalies.
913 But it creates others, and it wasn't documented, and it is simpler
914 and cleaner never to alter the window/buffer connections. */
915 tem1 = Fcar (tem);
916 if (!NILP (tem1)
917 && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer))
918 Fswitch_to_buffer (Fcurrent_buffer (), Qnil);
919 #endif /* 0 */
921 /* Mark active */
922 info = XCDR (info);
923 tem = XCAR (info);
924 tem1 = BVAR (current_buffer, mark_active);
925 BVAR (current_buffer, mark_active) = tem;
927 /* If mark is active now, and either was not active
928 or was at a different place, run the activate hook. */
929 if (! NILP (tem))
931 if (! EQ (omark, nmark))
933 tem = intern ("activate-mark-hook");
934 Frun_hooks (1, &tem);
937 /* If mark has ceased to be active, run deactivate hook. */
938 else if (! NILP (tem1))
940 tem = intern ("deactivate-mark-hook");
941 Frun_hooks (1, &tem);
944 /* If buffer was visible in a window, and a different window was
945 selected, and the old selected window is still showing this
946 buffer, restore point in that window. */
947 tem = XCDR (info);
948 if (visible_p
949 && !EQ (tem, selected_window)
950 && (tem1 = XWINDOW (tem)->buffer,
951 (/* Window is live... */
952 BUFFERP (tem1)
953 /* ...and it shows the current buffer. */
954 && XBUFFER (tem1) == current_buffer)))
955 Fset_window_point (tem, make_number (PT));
957 UNGCPRO;
958 return Qnil;
961 DEFUN ("save-excursion", Fsave_excursion, Ssave_excursion, 0, UNEVALLED, 0,
962 doc: /* Save point, mark, and current buffer; execute BODY; restore those things.
963 Executes BODY just like `progn'.
964 The values of point, mark and the current buffer are restored
965 even in case of abnormal exit (throw or error).
966 The state of activation of the mark is also restored.
968 This construct does not save `deactivate-mark', and therefore
969 functions that change the buffer will still cause deactivation
970 of the mark at the end of the command. To prevent that, bind
971 `deactivate-mark' with `let'.
973 If you only want to save the current buffer but not point nor mark,
974 then just use `save-current-buffer', or even `with-current-buffer'.
976 usage: (save-excursion &rest BODY) */)
977 (Lisp_Object args)
979 register Lisp_Object val;
980 int count = SPECPDL_INDEX ();
982 record_unwind_protect (save_excursion_restore, save_excursion_save ());
984 val = Fprogn (args);
985 return unbind_to (count, val);
988 DEFUN ("save-current-buffer", Fsave_current_buffer, Ssave_current_buffer, 0, UNEVALLED, 0,
989 doc: /* Save the current buffer; execute BODY; restore the current buffer.
990 Executes BODY just like `progn'.
991 usage: (save-current-buffer &rest BODY) */)
992 (Lisp_Object args)
994 Lisp_Object val;
995 int count = SPECPDL_INDEX ();
997 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
999 val = Fprogn (args);
1000 return unbind_to (count, val);
1003 DEFUN ("buffer-size", Fbufsize, Sbufsize, 0, 1, 0,
1004 doc: /* Return the number of characters in the current buffer.
1005 If BUFFER, return the number of characters in that buffer instead. */)
1006 (Lisp_Object buffer)
1008 if (NILP (buffer))
1009 return make_number (Z - BEG);
1010 else
1012 CHECK_BUFFER (buffer);
1013 return make_number (BUF_Z (XBUFFER (buffer))
1014 - BUF_BEG (XBUFFER (buffer)));
1018 DEFUN ("point-min", Fpoint_min, Spoint_min, 0, 0, 0,
1019 doc: /* Return the minimum permissible value of point in the current buffer.
1020 This is 1, unless narrowing (a buffer restriction) is in effect. */)
1021 (void)
1023 Lisp_Object temp;
1024 XSETFASTINT (temp, BEGV);
1025 return temp;
1028 DEFUN ("point-min-marker", Fpoint_min_marker, Spoint_min_marker, 0, 0, 0,
1029 doc: /* Return a marker to the minimum permissible value of point in this buffer.
1030 This is the beginning, unless narrowing (a buffer restriction) is in effect. */)
1031 (void)
1033 return buildmark (BEGV, BEGV_BYTE);
1036 DEFUN ("point-max", Fpoint_max, Spoint_max, 0, 0, 0,
1037 doc: /* Return the maximum permissible value of point in the current buffer.
1038 This is (1+ (buffer-size)), unless narrowing (a buffer restriction)
1039 is in effect, in which case it is less. */)
1040 (void)
1042 Lisp_Object temp;
1043 XSETFASTINT (temp, ZV);
1044 return temp;
1047 DEFUN ("point-max-marker", Fpoint_max_marker, Spoint_max_marker, 0, 0, 0,
1048 doc: /* Return a marker to the maximum permissible value of point in this buffer.
1049 This is (1+ (buffer-size)), unless narrowing (a buffer restriction)
1050 is in effect, in which case it is less. */)
1051 (void)
1053 return buildmark (ZV, ZV_BYTE);
1056 DEFUN ("gap-position", Fgap_position, Sgap_position, 0, 0, 0,
1057 doc: /* Return the position of the gap, in the current buffer.
1058 See also `gap-size'. */)
1059 (void)
1061 Lisp_Object temp;
1062 XSETFASTINT (temp, GPT);
1063 return temp;
1066 DEFUN ("gap-size", Fgap_size, Sgap_size, 0, 0, 0,
1067 doc: /* Return the size of the current buffer's gap.
1068 See also `gap-position'. */)
1069 (void)
1071 Lisp_Object temp;
1072 XSETFASTINT (temp, GAP_SIZE);
1073 return temp;
1076 DEFUN ("position-bytes", Fposition_bytes, Sposition_bytes, 1, 1, 0,
1077 doc: /* Return the byte position for character position POSITION.
1078 If POSITION is out of range, the value is nil. */)
1079 (Lisp_Object position)
1081 CHECK_NUMBER_COERCE_MARKER (position);
1082 if (XINT (position) < BEG || XINT (position) > Z)
1083 return Qnil;
1084 return make_number (CHAR_TO_BYTE (XINT (position)));
1087 DEFUN ("byte-to-position", Fbyte_to_position, Sbyte_to_position, 1, 1, 0,
1088 doc: /* Return the character position for byte position BYTEPOS.
1089 If BYTEPOS is out of range, the value is nil. */)
1090 (Lisp_Object bytepos)
1092 CHECK_NUMBER (bytepos);
1093 if (XINT (bytepos) < BEG_BYTE || XINT (bytepos) > Z_BYTE)
1094 return Qnil;
1095 return make_number (BYTE_TO_CHAR (XINT (bytepos)));
1098 DEFUN ("following-char", Ffollowing_char, Sfollowing_char, 0, 0, 0,
1099 doc: /* Return the character following point, as a number.
1100 At the end of the buffer or accessible region, return 0. */)
1101 (void)
1103 Lisp_Object temp;
1104 if (PT >= ZV)
1105 XSETFASTINT (temp, 0);
1106 else
1107 XSETFASTINT (temp, FETCH_CHAR (PT_BYTE));
1108 return temp;
1111 DEFUN ("preceding-char", Fprevious_char, Sprevious_char, 0, 0, 0,
1112 doc: /* Return the character preceding point, as a number.
1113 At the beginning of the buffer or accessible region, return 0. */)
1114 (void)
1116 Lisp_Object temp;
1117 if (PT <= BEGV)
1118 XSETFASTINT (temp, 0);
1119 else if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
1121 EMACS_INT pos = PT_BYTE;
1122 DEC_POS (pos);
1123 XSETFASTINT (temp, FETCH_CHAR (pos));
1125 else
1126 XSETFASTINT (temp, FETCH_BYTE (PT_BYTE - 1));
1127 return temp;
1130 DEFUN ("bobp", Fbobp, Sbobp, 0, 0, 0,
1131 doc: /* Return t if point is at the beginning of the buffer.
1132 If the buffer is narrowed, this means the beginning of the narrowed part. */)
1133 (void)
1135 if (PT == BEGV)
1136 return Qt;
1137 return Qnil;
1140 DEFUN ("eobp", Feobp, Seobp, 0, 0, 0,
1141 doc: /* Return t if point is at the end of the buffer.
1142 If the buffer is narrowed, this means the end of the narrowed part. */)
1143 (void)
1145 if (PT == ZV)
1146 return Qt;
1147 return Qnil;
1150 DEFUN ("bolp", Fbolp, Sbolp, 0, 0, 0,
1151 doc: /* Return t if point is at the beginning of a line. */)
1152 (void)
1154 if (PT == BEGV || FETCH_BYTE (PT_BYTE - 1) == '\n')
1155 return Qt;
1156 return Qnil;
1159 DEFUN ("eolp", Feolp, Seolp, 0, 0, 0,
1160 doc: /* Return t if point is at the end of a line.
1161 `End of a line' includes point being at the end of the buffer. */)
1162 (void)
1164 if (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n')
1165 return Qt;
1166 return Qnil;
1169 DEFUN ("char-after", Fchar_after, Schar_after, 0, 1, 0,
1170 doc: /* Return character in current buffer at position POS.
1171 POS is an integer or a marker and defaults to point.
1172 If POS is out of range, the value is nil. */)
1173 (Lisp_Object pos)
1175 register EMACS_INT pos_byte;
1177 if (NILP (pos))
1179 pos_byte = PT_BYTE;
1180 XSETFASTINT (pos, PT);
1183 if (MARKERP (pos))
1185 pos_byte = marker_byte_position (pos);
1186 if (pos_byte < BEGV_BYTE || pos_byte >= ZV_BYTE)
1187 return Qnil;
1189 else
1191 CHECK_NUMBER_COERCE_MARKER (pos);
1192 if (XINT (pos) < BEGV || XINT (pos) >= ZV)
1193 return Qnil;
1195 pos_byte = CHAR_TO_BYTE (XINT (pos));
1198 return make_number (FETCH_CHAR (pos_byte));
1201 DEFUN ("char-before", Fchar_before, Schar_before, 0, 1, 0,
1202 doc: /* Return character in current buffer preceding position POS.
1203 POS is an integer or a marker and defaults to point.
1204 If POS is out of range, the value is nil. */)
1205 (Lisp_Object pos)
1207 register Lisp_Object val;
1208 register EMACS_INT pos_byte;
1210 if (NILP (pos))
1212 pos_byte = PT_BYTE;
1213 XSETFASTINT (pos, PT);
1216 if (MARKERP (pos))
1218 pos_byte = marker_byte_position (pos);
1220 if (pos_byte <= BEGV_BYTE || pos_byte > ZV_BYTE)
1221 return Qnil;
1223 else
1225 CHECK_NUMBER_COERCE_MARKER (pos);
1227 if (XINT (pos) <= BEGV || XINT (pos) > ZV)
1228 return Qnil;
1230 pos_byte = CHAR_TO_BYTE (XINT (pos));
1233 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
1235 DEC_POS (pos_byte);
1236 XSETFASTINT (val, FETCH_CHAR (pos_byte));
1238 else
1240 pos_byte--;
1241 XSETFASTINT (val, FETCH_BYTE (pos_byte));
1243 return val;
1246 DEFUN ("user-login-name", Fuser_login_name, Suser_login_name, 0, 1, 0,
1247 doc: /* Return the name under which the user logged in, as a string.
1248 This is based on the effective uid, not the real uid.
1249 Also, if the environment variables LOGNAME or USER are set,
1250 that determines the value of this function.
1252 If optional argument UID is an integer or a float, return the login name
1253 of the user with that uid, or nil if there is no such user. */)
1254 (Lisp_Object uid)
1256 struct passwd *pw;
1257 uid_t id;
1259 /* Set up the user name info if we didn't do it before.
1260 (That can happen if Emacs is dumpable
1261 but you decide to run `temacs -l loadup' and not dump. */
1262 if (INTEGERP (Vuser_login_name))
1263 init_editfns ();
1265 if (NILP (uid))
1266 return Vuser_login_name;
1268 id = XFLOATINT (uid);
1269 BLOCK_INPUT;
1270 pw = getpwuid (id);
1271 UNBLOCK_INPUT;
1272 return (pw ? build_string (pw->pw_name) : Qnil);
1275 DEFUN ("user-real-login-name", Fuser_real_login_name, Suser_real_login_name,
1276 0, 0, 0,
1277 doc: /* Return the name of the user's real uid, as a string.
1278 This ignores the environment variables LOGNAME and USER, so it differs from
1279 `user-login-name' when running under `su'. */)
1280 (void)
1282 /* Set up the user name info if we didn't do it before.
1283 (That can happen if Emacs is dumpable
1284 but you decide to run `temacs -l loadup' and not dump. */
1285 if (INTEGERP (Vuser_login_name))
1286 init_editfns ();
1287 return Vuser_real_login_name;
1290 DEFUN ("user-uid", Fuser_uid, Suser_uid, 0, 0, 0,
1291 doc: /* Return the effective uid of Emacs.
1292 Value is an integer or a float, depending on the value. */)
1293 (void)
1295 /* Assignment to EMACS_INT stops GCC whining about limited range of
1296 data type. */
1297 EMACS_INT euid = geteuid ();
1299 /* Make sure we don't produce a negative UID due to signed integer
1300 overflow. */
1301 if (euid < 0)
1302 return make_float (geteuid ());
1303 return make_fixnum_or_float (euid);
1306 DEFUN ("user-real-uid", Fuser_real_uid, Suser_real_uid, 0, 0, 0,
1307 doc: /* Return the real uid of Emacs.
1308 Value is an integer or a float, depending on the value. */)
1309 (void)
1311 /* Assignment to EMACS_INT stops GCC whining about limited range of
1312 data type. */
1313 EMACS_INT uid = getuid ();
1315 /* Make sure we don't produce a negative UID due to signed integer
1316 overflow. */
1317 if (uid < 0)
1318 return make_float (getuid ());
1319 return make_fixnum_or_float (uid);
1322 DEFUN ("user-full-name", Fuser_full_name, Suser_full_name, 0, 1, 0,
1323 doc: /* Return the full name of the user logged in, as a string.
1324 If the full name corresponding to Emacs's userid is not known,
1325 return "unknown".
1327 If optional argument UID is an integer or float, return the full name
1328 of the user with that uid, or nil if there is no such user.
1329 If UID is a string, return the full name of the user with that login
1330 name, or nil if there is no such user. */)
1331 (Lisp_Object uid)
1333 struct passwd *pw;
1334 register char *p, *q;
1335 Lisp_Object full;
1337 if (NILP (uid))
1338 return Vuser_full_name;
1339 else if (NUMBERP (uid))
1341 uid_t u = XFLOATINT (uid);
1342 BLOCK_INPUT;
1343 pw = getpwuid (u);
1344 UNBLOCK_INPUT;
1346 else if (STRINGP (uid))
1348 BLOCK_INPUT;
1349 pw = getpwnam (SSDATA (uid));
1350 UNBLOCK_INPUT;
1352 else
1353 error ("Invalid UID specification");
1355 if (!pw)
1356 return Qnil;
1358 p = USER_FULL_NAME;
1359 /* Chop off everything after the first comma. */
1360 q = strchr (p, ',');
1361 full = make_string (p, q ? q - p : strlen (p));
1363 #ifdef AMPERSAND_FULL_NAME
1364 p = SSDATA (full);
1365 q = strchr (p, '&');
1366 /* Substitute the login name for the &, upcasing the first character. */
1367 if (q)
1369 register char *r;
1370 Lisp_Object login;
1372 login = Fuser_login_name (make_number (pw->pw_uid));
1373 r = (char *) alloca (strlen (p) + SCHARS (login) + 1);
1374 memcpy (r, p, q - p);
1375 r[q - p] = 0;
1376 strcat (r, SSDATA (login));
1377 r[q - p] = upcase ((unsigned char) r[q - p]);
1378 strcat (r, q + 1);
1379 full = build_string (r);
1381 #endif /* AMPERSAND_FULL_NAME */
1383 return full;
1386 DEFUN ("system-name", Fsystem_name, Ssystem_name, 0, 0, 0,
1387 doc: /* Return the host name of the machine you are running on, as a string. */)
1388 (void)
1390 return Vsystem_name;
1393 const char *
1394 get_system_name (void)
1396 if (STRINGP (Vsystem_name))
1397 return SSDATA (Vsystem_name);
1398 else
1399 return "";
1402 DEFUN ("emacs-pid", Femacs_pid, Semacs_pid, 0, 0, 0,
1403 doc: /* Return the process ID of Emacs, as an integer. */)
1404 (void)
1406 return make_number (getpid ());
1411 #ifndef TIME_T_MIN
1412 # define TIME_T_MIN TYPE_MINIMUM (time_t)
1413 #endif
1414 #ifndef TIME_T_MAX
1415 # define TIME_T_MAX TYPE_MAXIMUM (time_t)
1416 #endif
1418 /* Report that a time value is out of range for Emacs. */
1419 static void
1420 time_overflow (void)
1422 error ("Specified time is not representable");
1425 /* Return the upper part of the time T (everything but the bottom 16 bits),
1426 making sure that it is representable. */
1427 static EMACS_INT
1428 hi_time (time_t t)
1430 time_t hi = t >> 16;
1432 /* Check for overflow, helping the compiler for common cases where
1433 no runtime check is needed, and taking care not to convert
1434 negative numbers to unsigned before comparing them. */
1435 if (! ((! TYPE_SIGNED (time_t)
1436 || MOST_NEGATIVE_FIXNUM <= TIME_T_MIN >> 16
1437 || MOST_NEGATIVE_FIXNUM <= hi)
1438 && (TIME_T_MAX >> 16 <= MOST_POSITIVE_FIXNUM
1439 || hi <= MOST_POSITIVE_FIXNUM)))
1440 time_overflow ();
1442 return hi;
1445 /* Return the bottom 16 bits of the time T. */
1446 static EMACS_INT
1447 lo_time (time_t t)
1449 return t & ((1 << 16) - 1);
1452 DEFUN ("current-time", Fcurrent_time, Scurrent_time, 0, 0, 0,
1453 doc: /* Return the current time, as the number of seconds since 1970-01-01 00:00:00.
1454 The time is returned as a list of three integers. The first has the
1455 most significant 16 bits of the seconds, while the second has the
1456 least significant 16 bits. The third integer gives the microsecond
1457 count.
1459 The microsecond count is zero on systems that do not provide
1460 resolution finer than a second. */)
1461 (void)
1463 EMACS_TIME t;
1465 EMACS_GET_TIME (t);
1466 return list3 (make_number (hi_time (EMACS_SECS (t))),
1467 make_number (lo_time (EMACS_SECS (t))),
1468 make_number (EMACS_USECS (t)));
1471 DEFUN ("get-internal-run-time", Fget_internal_run_time, Sget_internal_run_time,
1472 0, 0, 0,
1473 doc: /* Return the current run time used by Emacs.
1474 The time is returned as a list of three integers. The first has the
1475 most significant 16 bits of the seconds, while the second has the
1476 least significant 16 bits. The third integer gives the microsecond
1477 count.
1479 On systems that can't determine the run time, `get-internal-run-time'
1480 does the same thing as `current-time'. The microsecond count is zero
1481 on systems that do not provide resolution finer than a second. */)
1482 (void)
1484 #ifdef HAVE_GETRUSAGE
1485 struct rusage usage;
1486 time_t secs;
1487 int usecs;
1489 if (getrusage (RUSAGE_SELF, &usage) < 0)
1490 /* This shouldn't happen. What action is appropriate? */
1491 xsignal0 (Qerror);
1493 /* Sum up user time and system time. */
1494 secs = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec;
1495 usecs = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
1496 if (usecs >= 1000000)
1498 usecs -= 1000000;
1499 secs++;
1502 return list3 (make_number (hi_time (secs)),
1503 make_number (lo_time (secs)),
1504 make_number (usecs));
1505 #else /* ! HAVE_GETRUSAGE */
1506 #ifdef WINDOWSNT
1507 return w32_get_internal_run_time ();
1508 #else /* ! WINDOWSNT */
1509 return Fcurrent_time ();
1510 #endif /* WINDOWSNT */
1511 #endif /* HAVE_GETRUSAGE */
1515 /* Make a Lisp list that represents the time T. */
1516 Lisp_Object
1517 make_time (time_t t)
1519 return list2 (make_number (hi_time (t)),
1520 make_number (lo_time (t)));
1523 /* Decode a Lisp list SPECIFIED_TIME that represents a time.
1524 If SPECIFIED_TIME is nil, use the current time.
1525 Set *RESULT to seconds since the Epoch.
1526 If USEC is not null, set *USEC to the microseconds component.
1527 Return nonzero if successful. */
1529 lisp_time_argument (Lisp_Object specified_time, time_t *result, int *usec)
1531 if (NILP (specified_time))
1533 if (usec)
1535 EMACS_TIME t;
1537 EMACS_GET_TIME (t);
1538 *usec = EMACS_USECS (t);
1539 *result = EMACS_SECS (t);
1540 return 1;
1542 else
1543 return time (result) != -1;
1545 else
1547 Lisp_Object high, low;
1548 EMACS_INT hi;
1549 high = Fcar (specified_time);
1550 CHECK_NUMBER (high);
1551 low = Fcdr (specified_time);
1552 if (CONSP (low))
1554 if (usec)
1556 Lisp_Object usec_l = Fcdr (low);
1557 if (CONSP (usec_l))
1558 usec_l = Fcar (usec_l);
1559 if (NILP (usec_l))
1560 *usec = 0;
1561 else
1563 CHECK_NUMBER (usec_l);
1564 *usec = XINT (usec_l);
1567 low = Fcar (low);
1569 else if (usec)
1570 *usec = 0;
1571 CHECK_NUMBER (low);
1572 hi = XINT (high);
1574 /* Check for overflow, helping the compiler for common cases
1575 where no runtime check is needed, and taking care not to
1576 convert negative numbers to unsigned before comparing them. */
1577 if (! ((TYPE_SIGNED (time_t)
1578 ? (TIME_T_MIN >> 16 <= MOST_NEGATIVE_FIXNUM
1579 || TIME_T_MIN >> 16 <= hi)
1580 : 0 <= hi)
1581 && (MOST_POSITIVE_FIXNUM <= TIME_T_MAX >> 16
1582 || hi <= TIME_T_MAX >> 16)))
1583 return 0;
1585 *result = (hi << 16) + (XINT (low) & 0xffff);
1586 return 1;
1590 DEFUN ("float-time", Ffloat_time, Sfloat_time, 0, 1, 0,
1591 doc: /* Return the current time, as a float number of seconds since the epoch.
1592 If SPECIFIED-TIME is given, it is the time to convert to float
1593 instead of the current time. The argument should have the form
1594 (HIGH LOW) or (HIGH LOW USEC). Thus, you can use times obtained from
1595 `current-time' and from `file-attributes'. SPECIFIED-TIME can also
1596 have the form (HIGH . LOW), but this is considered obsolete.
1598 WARNING: Since the result is floating point, it may not be exact.
1599 If precise time stamps are required, use either `current-time',
1600 or (if you need time as a string) `format-time-string'. */)
1601 (Lisp_Object specified_time)
1603 time_t sec;
1604 int usec;
1606 if (! lisp_time_argument (specified_time, &sec, &usec))
1607 error ("Invalid time specification");
1609 return make_float ((sec * 1e6 + usec) / 1e6);
1612 /* Write information into buffer S of size MAXSIZE, according to the
1613 FORMAT of length FORMAT_LEN, using time information taken from *TP.
1614 Default to Universal Time if UT is nonzero, local time otherwise.
1615 Use NS as the number of nanoseconds in the %N directive.
1616 Return the number of bytes written, not including the terminating
1617 '\0'. If S is NULL, nothing will be written anywhere; so to
1618 determine how many bytes would be written, use NULL for S and
1619 ((size_t) -1) for MAXSIZE.
1621 This function behaves like nstrftime, except it allows null
1622 bytes in FORMAT and it does not support nanoseconds. */
1623 static size_t
1624 emacs_nmemftime (char *s, size_t maxsize, const char *format,
1625 size_t format_len, const struct tm *tp, int ut, int ns)
1627 size_t total = 0;
1629 /* Loop through all the null-terminated strings in the format
1630 argument. Normally there's just one null-terminated string, but
1631 there can be arbitrarily many, concatenated together, if the
1632 format contains '\0' bytes. nstrftime stops at the first
1633 '\0' byte so we must invoke it separately for each such string. */
1634 for (;;)
1636 size_t len;
1637 size_t result;
1639 if (s)
1640 s[0] = '\1';
1642 result = nstrftime (s, maxsize, format, tp, ut, ns);
1644 if (s)
1646 if (result == 0 && s[0] != '\0')
1647 return 0;
1648 s += result + 1;
1651 maxsize -= result + 1;
1652 total += result;
1653 len = strlen (format);
1654 if (len == format_len)
1655 return total;
1656 total++;
1657 format += len + 1;
1658 format_len -= len + 1;
1662 DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0,
1663 doc: /* Use FORMAT-STRING to format the time TIME, or now if omitted.
1664 TIME is specified as (HIGH LOW . IGNORED), as returned by
1665 `current-time' or `file-attributes'. The obsolete form (HIGH . LOW)
1666 is also still accepted.
1667 The third, optional, argument UNIVERSAL, if non-nil, means describe TIME
1668 as Universal Time; nil means describe TIME in the local time zone.
1669 The value is a copy of FORMAT-STRING, but with certain constructs replaced
1670 by text that describes the specified date and time in TIME:
1672 %Y is the year, %y within the century, %C the century.
1673 %G is the year corresponding to the ISO week, %g within the century.
1674 %m is the numeric month.
1675 %b and %h are the locale's abbreviated month name, %B the full name.
1676 %d is the day of the month, zero-padded, %e is blank-padded.
1677 %u is the numeric day of week from 1 (Monday) to 7, %w from 0 (Sunday) to 6.
1678 %a is the locale's abbreviated name of the day of week, %A the full name.
1679 %U is the week number starting on Sunday, %W starting on Monday,
1680 %V according to ISO 8601.
1681 %j is the day of the year.
1683 %H is the hour on a 24-hour clock, %I is on a 12-hour clock, %k is like %H
1684 only blank-padded, %l is like %I blank-padded.
1685 %p is the locale's equivalent of either AM or PM.
1686 %M is the minute.
1687 %S is the second.
1688 %N is the nanosecond, %6N the microsecond, %3N the millisecond, etc.
1689 %Z is the time zone name, %z is the numeric form.
1690 %s is the number of seconds since 1970-01-01 00:00:00 +0000.
1692 %c is the locale's date and time format.
1693 %x is the locale's "preferred" date format.
1694 %D is like "%m/%d/%y".
1696 %R is like "%H:%M", %T is like "%H:%M:%S", %r is like "%I:%M:%S %p".
1697 %X is the locale's "preferred" time format.
1699 Finally, %n is a newline, %t is a tab, %% is a literal %.
1701 Certain flags and modifiers are available with some format controls.
1702 The flags are `_', `-', `^' and `#'. For certain characters X,
1703 %_X is like %X, but padded with blanks; %-X is like %X,
1704 but without padding. %^X is like %X, but with all textual
1705 characters up-cased; %#X is like %X, but with letter-case of
1706 all textual characters reversed.
1707 %NX (where N stands for an integer) is like %X,
1708 but takes up at least N (a number) positions.
1709 The modifiers are `E' and `O'. For certain characters X,
1710 %EX is a locale's alternative version of %X;
1711 %OX is like %X, but uses the locale's number symbols.
1713 For example, to produce full ISO 8601 format, use "%Y-%m-%dT%T%z". */)
1714 (Lisp_Object format_string, Lisp_Object timeval, Lisp_Object universal)
1716 time_t value;
1717 int size;
1718 int usec;
1719 int ns;
1720 struct tm *tm;
1721 int ut = ! NILP (universal);
1723 CHECK_STRING (format_string);
1725 if (! (lisp_time_argument (timeval, &value, &usec)
1726 && 0 <= usec && usec < 1000000))
1727 error ("Invalid time specification");
1728 ns = usec * 1000;
1730 format_string = code_convert_string_norecord (format_string,
1731 Vlocale_coding_system, 1);
1733 /* This is probably enough. */
1734 size = SBYTES (format_string) * 6 + 50;
1736 BLOCK_INPUT;
1737 tm = ut ? gmtime (&value) : localtime (&value);
1738 UNBLOCK_INPUT;
1739 if (! tm)
1740 time_overflow ();
1742 synchronize_system_time_locale ();
1744 while (1)
1746 char *buf = (char *) alloca (size + 1);
1747 int result;
1749 buf[0] = '\1';
1750 BLOCK_INPUT;
1751 result = emacs_nmemftime (buf, size, SSDATA (format_string),
1752 SBYTES (format_string),
1753 tm, ut, ns);
1754 UNBLOCK_INPUT;
1755 if ((result > 0 && result < size) || (result == 0 && buf[0] == '\0'))
1756 return code_convert_string_norecord (make_unibyte_string (buf, result),
1757 Vlocale_coding_system, 0);
1759 /* If buffer was too small, make it bigger and try again. */
1760 BLOCK_INPUT;
1761 result = emacs_nmemftime (NULL, (size_t) -1,
1762 SSDATA (format_string),
1763 SBYTES (format_string),
1764 tm, ut, ns);
1765 UNBLOCK_INPUT;
1766 size = result + 1;
1770 DEFUN ("decode-time", Fdecode_time, Sdecode_time, 0, 1, 0,
1771 doc: /* Decode a time value as (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE).
1772 The optional SPECIFIED-TIME should be a list of (HIGH LOW . IGNORED),
1773 as from `current-time' and `file-attributes', or nil to use the
1774 current time. The obsolete form (HIGH . LOW) is also still accepted.
1775 The list has the following nine members: SEC is an integer between 0
1776 and 60; SEC is 60 for a leap second, which only some operating systems
1777 support. MINUTE is an integer between 0 and 59. HOUR is an integer
1778 between 0 and 23. DAY is an integer between 1 and 31. MONTH is an
1779 integer between 1 and 12. YEAR is an integer indicating the
1780 four-digit year. DOW is the day of week, an integer between 0 and 6,
1781 where 0 is Sunday. DST is t if daylight saving time is in effect,
1782 otherwise nil. ZONE is an integer indicating the number of seconds
1783 east of Greenwich. (Note that Common Lisp has different meanings for
1784 DOW and ZONE.) */)
1785 (Lisp_Object specified_time)
1787 time_t time_spec;
1788 struct tm save_tm;
1789 struct tm *decoded_time;
1790 Lisp_Object list_args[9];
1792 if (! lisp_time_argument (specified_time, &time_spec, NULL))
1793 error ("Invalid time specification");
1795 BLOCK_INPUT;
1796 decoded_time = localtime (&time_spec);
1797 UNBLOCK_INPUT;
1798 if (! (decoded_time
1799 && MOST_NEGATIVE_FIXNUM - TM_YEAR_BASE <= decoded_time->tm_year
1800 && decoded_time->tm_year <= MOST_POSITIVE_FIXNUM - TM_YEAR_BASE))
1801 time_overflow ();
1802 XSETFASTINT (list_args[0], decoded_time->tm_sec);
1803 XSETFASTINT (list_args[1], decoded_time->tm_min);
1804 XSETFASTINT (list_args[2], decoded_time->tm_hour);
1805 XSETFASTINT (list_args[3], decoded_time->tm_mday);
1806 XSETFASTINT (list_args[4], decoded_time->tm_mon + 1);
1807 /* On 64-bit machines an int is narrower than EMACS_INT, thus the
1808 cast below avoids overflow in int arithmetics. */
1809 XSETINT (list_args[5], TM_YEAR_BASE + (EMACS_INT) decoded_time->tm_year);
1810 XSETFASTINT (list_args[6], decoded_time->tm_wday);
1811 list_args[7] = (decoded_time->tm_isdst)? Qt : Qnil;
1813 /* Make a copy, in case gmtime modifies the struct. */
1814 save_tm = *decoded_time;
1815 BLOCK_INPUT;
1816 decoded_time = gmtime (&time_spec);
1817 UNBLOCK_INPUT;
1818 if (decoded_time == 0)
1819 list_args[8] = Qnil;
1820 else
1821 XSETINT (list_args[8], tm_diff (&save_tm, decoded_time));
1822 return Flist (9, list_args);
1825 /* Return OBJ - OFFSET, checking that OBJ is a valid fixnum and that
1826 the result is representable as an int. Assume OFFSET is small and
1827 nonnegative. */
1828 static int
1829 check_tm_member (Lisp_Object obj, int offset)
1831 EMACS_INT n;
1832 CHECK_NUMBER (obj);
1833 n = XINT (obj);
1834 if (! (INT_MIN + offset <= n && n - offset <= INT_MAX))
1835 time_overflow ();
1836 return n - offset;
1839 DEFUN ("encode-time", Fencode_time, Sencode_time, 6, MANY, 0,
1840 doc: /* Convert SECOND, MINUTE, HOUR, DAY, MONTH, YEAR and ZONE to internal time.
1841 This is the reverse operation of `decode-time', which see.
1842 ZONE defaults to the current time zone rule. This can
1843 be a string or t (as from `set-time-zone-rule'), or it can be a list
1844 \(as from `current-time-zone') or an integer (as from `decode-time')
1845 applied without consideration for daylight saving time.
1847 You can pass more than 7 arguments; then the first six arguments
1848 are used as SECOND through YEAR, and the *last* argument is used as ZONE.
1849 The intervening arguments are ignored.
1850 This feature lets (apply 'encode-time (decode-time ...)) work.
1852 Out-of-range values for SECOND, MINUTE, HOUR, DAY, or MONTH are allowed;
1853 for example, a DAY of 0 means the day preceding the given month.
1854 Year numbers less than 100 are treated just like other year numbers.
1855 If you want them to stand for years in this century, you must do that yourself.
1857 Years before 1970 are not guaranteed to work. On some systems,
1858 year values as low as 1901 do work.
1860 usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE) */)
1861 (ptrdiff_t nargs, Lisp_Object *args)
1863 time_t value;
1864 struct tm tm;
1865 Lisp_Object zone = (nargs > 6 ? args[nargs - 1] : Qnil);
1867 tm.tm_sec = check_tm_member (args[0], 0);
1868 tm.tm_min = check_tm_member (args[1], 0);
1869 tm.tm_hour = check_tm_member (args[2], 0);
1870 tm.tm_mday = check_tm_member (args[3], 0);
1871 tm.tm_mon = check_tm_member (args[4], 1);
1872 tm.tm_year = check_tm_member (args[5], TM_YEAR_BASE);
1873 tm.tm_isdst = -1;
1875 if (CONSP (zone))
1876 zone = Fcar (zone);
1877 if (NILP (zone))
1879 BLOCK_INPUT;
1880 value = mktime (&tm);
1881 UNBLOCK_INPUT;
1883 else
1885 char tzbuf[100];
1886 const char *tzstring;
1887 char **oldenv = environ, **newenv;
1889 if (EQ (zone, Qt))
1890 tzstring = "UTC0";
1891 else if (STRINGP (zone))
1892 tzstring = SSDATA (zone);
1893 else if (INTEGERP (zone))
1895 int abszone = eabs (XINT (zone));
1896 sprintf (tzbuf, "XXX%s%d:%02d:%02d", "-" + (XINT (zone) < 0),
1897 abszone / (60*60), (abszone/60) % 60, abszone % 60);
1898 tzstring = tzbuf;
1900 else
1901 error ("Invalid time zone specification");
1903 /* Set TZ before calling mktime; merely adjusting mktime's returned
1904 value doesn't suffice, since that would mishandle leap seconds. */
1905 set_time_zone_rule (tzstring);
1907 BLOCK_INPUT;
1908 value = mktime (&tm);
1909 UNBLOCK_INPUT;
1911 /* Restore TZ to previous value. */
1912 newenv = environ;
1913 environ = oldenv;
1914 xfree (newenv);
1915 #ifdef LOCALTIME_CACHE
1916 tzset ();
1917 #endif
1920 if (value == (time_t) -1)
1921 time_overflow ();
1923 return make_time (value);
1926 DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0,
1927 doc: /* Return the current local time, as a human-readable string.
1928 Programs can use this function to decode a time,
1929 since the number of columns in each field is fixed
1930 if the year is in the range 1000-9999.
1931 The format is `Sun Sep 16 01:03:52 1973'.
1932 However, see also the functions `decode-time' and `format-time-string'
1933 which provide a much more powerful and general facility.
1935 If SPECIFIED-TIME is given, it is a time to format instead of the
1936 current time. The argument should have the form (HIGH LOW . IGNORED).
1937 Thus, you can use times obtained from `current-time' and from
1938 `file-attributes'. SPECIFIED-TIME can also have the form (HIGH . LOW),
1939 but this is considered obsolete. */)
1940 (Lisp_Object specified_time)
1942 time_t value;
1943 struct tm *tm;
1944 register char *tem;
1946 if (! lisp_time_argument (specified_time, &value, NULL))
1947 error ("Invalid time specification");
1949 /* Convert to a string, checking for out-of-range time stamps.
1950 Don't use 'ctime', as that might dump core if VALUE is out of
1951 range. */
1952 BLOCK_INPUT;
1953 tm = localtime (&value);
1954 UNBLOCK_INPUT;
1955 if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) && (tem = asctime (tm))))
1956 time_overflow ();
1958 /* Remove the trailing newline. */
1959 tem[strlen (tem) - 1] = '\0';
1961 return build_string (tem);
1964 /* Yield A - B, measured in seconds.
1965 This function is copied from the GNU C Library. */
1966 static int
1967 tm_diff (struct tm *a, struct tm *b)
1969 /* Compute intervening leap days correctly even if year is negative.
1970 Take care to avoid int overflow in leap day calculations,
1971 but it's OK to assume that A and B are close to each other. */
1972 int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3);
1973 int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3);
1974 int a100 = a4 / 25 - (a4 % 25 < 0);
1975 int b100 = b4 / 25 - (b4 % 25 < 0);
1976 int a400 = a100 >> 2;
1977 int b400 = b100 >> 2;
1978 int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
1979 int years = a->tm_year - b->tm_year;
1980 int days = (365 * years + intervening_leap_days
1981 + (a->tm_yday - b->tm_yday));
1982 return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
1983 + (a->tm_min - b->tm_min))
1984 + (a->tm_sec - b->tm_sec));
1987 DEFUN ("current-time-zone", Fcurrent_time_zone, Scurrent_time_zone, 0, 1, 0,
1988 doc: /* Return the offset and name for the local time zone.
1989 This returns a list of the form (OFFSET NAME).
1990 OFFSET is an integer number of seconds ahead of UTC (east of Greenwich).
1991 A negative value means west of Greenwich.
1992 NAME is a string giving the name of the time zone.
1993 If SPECIFIED-TIME is given, the time zone offset is determined from it
1994 instead of using the current time. The argument should have the form
1995 (HIGH LOW . IGNORED). Thus, you can use times obtained from
1996 `current-time' and from `file-attributes'. SPECIFIED-TIME can also
1997 have the form (HIGH . LOW), but this is considered obsolete.
1999 Some operating systems cannot provide all this information to Emacs;
2000 in this case, `current-time-zone' returns a list containing nil for
2001 the data it can't find. */)
2002 (Lisp_Object specified_time)
2004 time_t value;
2005 struct tm *t;
2006 struct tm gmt;
2008 if (!lisp_time_argument (specified_time, &value, NULL))
2009 t = NULL;
2010 else
2012 BLOCK_INPUT;
2013 t = gmtime (&value);
2014 if (t)
2016 gmt = *t;
2017 t = localtime (&value);
2019 UNBLOCK_INPUT;
2022 if (t)
2024 int offset = tm_diff (t, &gmt);
2025 char *s = 0;
2026 char buf[6];
2028 #ifdef HAVE_TM_ZONE
2029 if (t->tm_zone)
2030 s = (char *)t->tm_zone;
2031 #else /* not HAVE_TM_ZONE */
2032 #ifdef HAVE_TZNAME
2033 if (t->tm_isdst == 0 || t->tm_isdst == 1)
2034 s = tzname[t->tm_isdst];
2035 #endif
2036 #endif /* not HAVE_TM_ZONE */
2038 if (!s)
2040 /* No local time zone name is available; use "+-NNNN" instead. */
2041 int am = (offset < 0 ? -offset : offset) / 60;
2042 sprintf (buf, "%c%02d%02d", (offset < 0 ? '-' : '+'), am/60, am%60);
2043 s = buf;
2046 return Fcons (make_number (offset), Fcons (build_string (s), Qnil));
2048 else
2049 return Fmake_list (make_number (2), Qnil);
2052 /* This holds the value of `environ' produced by the previous
2053 call to Fset_time_zone_rule, or 0 if Fset_time_zone_rule
2054 has never been called. */
2055 static char **environbuf;
2057 /* This holds the startup value of the TZ environment variable so it
2058 can be restored if the user calls set-time-zone-rule with a nil
2059 argument. */
2060 static char *initial_tz;
2062 DEFUN ("set-time-zone-rule", Fset_time_zone_rule, Sset_time_zone_rule, 1, 1, 0,
2063 doc: /* Set the local time zone using TZ, a string specifying a time zone rule.
2064 If TZ is nil, use implementation-defined default time zone information.
2065 If TZ is t, use Universal Time. */)
2066 (Lisp_Object tz)
2068 const char *tzstring;
2070 /* When called for the first time, save the original TZ. */
2071 if (!environbuf)
2072 initial_tz = (char *) getenv ("TZ");
2074 if (NILP (tz))
2075 tzstring = initial_tz;
2076 else if (EQ (tz, Qt))
2077 tzstring = "UTC0";
2078 else
2080 CHECK_STRING (tz);
2081 tzstring = SSDATA (tz);
2084 set_time_zone_rule (tzstring);
2085 free (environbuf);
2086 environbuf = environ;
2088 return Qnil;
2091 #ifdef LOCALTIME_CACHE
2093 /* These two values are known to load tz files in buggy implementations,
2094 i.e. Solaris 1 executables running under either Solaris 1 or Solaris 2.
2095 Their values shouldn't matter in non-buggy implementations.
2096 We don't use string literals for these strings,
2097 since if a string in the environment is in readonly
2098 storage, it runs afoul of bugs in SVR4 and Solaris 2.3.
2099 See Sun bugs 1113095 and 1114114, ``Timezone routines
2100 improperly modify environment''. */
2102 static char set_time_zone_rule_tz1[] = "TZ=GMT+0";
2103 static char set_time_zone_rule_tz2[] = "TZ=GMT+1";
2105 #endif
2107 /* Set the local time zone rule to TZSTRING.
2108 This allocates memory into `environ', which it is the caller's
2109 responsibility to free. */
2111 void
2112 set_time_zone_rule (const char *tzstring)
2114 int envptrs;
2115 char **from, **to, **newenv;
2117 /* Make the ENVIRON vector longer with room for TZSTRING. */
2118 for (from = environ; *from; from++)
2119 continue;
2120 envptrs = from - environ + 2;
2121 newenv = to = (char **) xmalloc (envptrs * sizeof (char *)
2122 + (tzstring ? strlen (tzstring) + 4 : 0));
2124 /* Add TZSTRING to the end of environ, as a value for TZ. */
2125 if (tzstring)
2127 char *t = (char *) (to + envptrs);
2128 strcpy (t, "TZ=");
2129 strcat (t, tzstring);
2130 *to++ = t;
2133 /* Copy the old environ vector elements into NEWENV,
2134 but don't copy the TZ variable.
2135 So we have only one definition of TZ, which came from TZSTRING. */
2136 for (from = environ; *from; from++)
2137 if (strncmp (*from, "TZ=", 3) != 0)
2138 *to++ = *from;
2139 *to = 0;
2141 environ = newenv;
2143 /* If we do have a TZSTRING, NEWENV points to the vector slot where
2144 the TZ variable is stored. If we do not have a TZSTRING,
2145 TO points to the vector slot which has the terminating null. */
2147 #ifdef LOCALTIME_CACHE
2149 /* In SunOS 4.1.3_U1 and 4.1.4, if TZ has a value like
2150 "US/Pacific" that loads a tz file, then changes to a value like
2151 "XXX0" that does not load a tz file, and then changes back to
2152 its original value, the last change is (incorrectly) ignored.
2153 Also, if TZ changes twice in succession to values that do
2154 not load a tz file, tzset can dump core (see Sun bug#1225179).
2155 The following code works around these bugs. */
2157 if (tzstring)
2159 /* Temporarily set TZ to a value that loads a tz file
2160 and that differs from tzstring. */
2161 char *tz = *newenv;
2162 *newenv = (strcmp (tzstring, set_time_zone_rule_tz1 + 3) == 0
2163 ? set_time_zone_rule_tz2 : set_time_zone_rule_tz1);
2164 tzset ();
2165 *newenv = tz;
2167 else
2169 /* The implied tzstring is unknown, so temporarily set TZ to
2170 two different values that each load a tz file. */
2171 *to = set_time_zone_rule_tz1;
2172 to[1] = 0;
2173 tzset ();
2174 *to = set_time_zone_rule_tz2;
2175 tzset ();
2176 *to = 0;
2179 /* Now TZ has the desired value, and tzset can be invoked safely. */
2182 tzset ();
2183 #endif
2186 /* Insert NARGS Lisp objects in the array ARGS by calling INSERT_FUNC
2187 (if a type of object is Lisp_Int) or INSERT_FROM_STRING_FUNC (if a
2188 type of object is Lisp_String). INHERIT is passed to
2189 INSERT_FROM_STRING_FUNC as the last argument. */
2191 static void
2192 general_insert_function (void (*insert_func)
2193 (const char *, EMACS_INT),
2194 void (*insert_from_string_func)
2195 (Lisp_Object, EMACS_INT, EMACS_INT,
2196 EMACS_INT, EMACS_INT, int),
2197 int inherit, ptrdiff_t nargs, Lisp_Object *args)
2199 ptrdiff_t argnum;
2200 register Lisp_Object val;
2202 for (argnum = 0; argnum < nargs; argnum++)
2204 val = args[argnum];
2205 if (CHARACTERP (val))
2207 int c = XFASTINT (val);
2208 unsigned char str[MAX_MULTIBYTE_LENGTH];
2209 int len;
2211 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
2212 len = CHAR_STRING (c, str);
2213 else
2215 str[0] = ASCII_CHAR_P (c) ? c : multibyte_char_to_unibyte (c);
2216 len = 1;
2218 (*insert_func) ((char *) str, len);
2220 else if (STRINGP (val))
2222 (*insert_from_string_func) (val, 0, 0,
2223 SCHARS (val),
2224 SBYTES (val),
2225 inherit);
2227 else
2228 wrong_type_argument (Qchar_or_string_p, val);
2232 void
2233 insert1 (Lisp_Object arg)
2235 Finsert (1, &arg);
2239 /* Callers passing one argument to Finsert need not gcpro the
2240 argument "array", since the only element of the array will
2241 not be used after calling insert or insert_from_string, so
2242 we don't care if it gets trashed. */
2244 DEFUN ("insert", Finsert, Sinsert, 0, MANY, 0,
2245 doc: /* Insert the arguments, either strings or characters, at point.
2246 Point and before-insertion markers move forward to end up
2247 after the inserted text.
2248 Any other markers at the point of insertion remain before the text.
2250 If the current buffer is multibyte, unibyte strings are converted
2251 to multibyte for insertion (see `string-make-multibyte').
2252 If the current buffer is unibyte, multibyte strings are converted
2253 to unibyte for insertion (see `string-make-unibyte').
2255 When operating on binary data, it may be necessary to preserve the
2256 original bytes of a unibyte string when inserting it into a multibyte
2257 buffer; to accomplish this, apply `string-as-multibyte' to the string
2258 and insert the result.
2260 usage: (insert &rest ARGS) */)
2261 (ptrdiff_t nargs, Lisp_Object *args)
2263 general_insert_function (insert, insert_from_string, 0, nargs, args);
2264 return Qnil;
2267 DEFUN ("insert-and-inherit", Finsert_and_inherit, Sinsert_and_inherit,
2268 0, MANY, 0,
2269 doc: /* Insert the arguments at point, inheriting properties from adjoining text.
2270 Point and before-insertion markers move forward to end up
2271 after the inserted text.
2272 Any other markers at the point of insertion remain before the text.
2274 If the current buffer is multibyte, unibyte strings are converted
2275 to multibyte for insertion (see `unibyte-char-to-multibyte').
2276 If the current buffer is unibyte, multibyte strings are converted
2277 to unibyte for insertion.
2279 usage: (insert-and-inherit &rest ARGS) */)
2280 (ptrdiff_t nargs, Lisp_Object *args)
2282 general_insert_function (insert_and_inherit, insert_from_string, 1,
2283 nargs, args);
2284 return Qnil;
2287 DEFUN ("insert-before-markers", Finsert_before_markers, Sinsert_before_markers, 0, MANY, 0,
2288 doc: /* Insert strings or characters at point, relocating markers after the text.
2289 Point and markers move forward to end up after the inserted text.
2291 If the current buffer is multibyte, unibyte strings are converted
2292 to multibyte for insertion (see `unibyte-char-to-multibyte').
2293 If the current buffer is unibyte, multibyte strings are converted
2294 to unibyte for insertion.
2296 usage: (insert-before-markers &rest ARGS) */)
2297 (ptrdiff_t nargs, Lisp_Object *args)
2299 general_insert_function (insert_before_markers,
2300 insert_from_string_before_markers, 0,
2301 nargs, args);
2302 return Qnil;
2305 DEFUN ("insert-before-markers-and-inherit", Finsert_and_inherit_before_markers,
2306 Sinsert_and_inherit_before_markers, 0, MANY, 0,
2307 doc: /* Insert text at point, relocating markers and inheriting properties.
2308 Point and markers move forward to end up after the inserted text.
2310 If the current buffer is multibyte, unibyte strings are converted
2311 to multibyte for insertion (see `unibyte-char-to-multibyte').
2312 If the current buffer is unibyte, multibyte strings are converted
2313 to unibyte for insertion.
2315 usage: (insert-before-markers-and-inherit &rest ARGS) */)
2316 (ptrdiff_t nargs, Lisp_Object *args)
2318 general_insert_function (insert_before_markers_and_inherit,
2319 insert_from_string_before_markers, 1,
2320 nargs, args);
2321 return Qnil;
2324 DEFUN ("insert-char", Finsert_char, Sinsert_char, 2, 3, 0,
2325 doc: /* Insert COUNT copies of CHARACTER.
2326 Point, and before-insertion markers, are relocated as in the function `insert'.
2327 The optional third arg INHERIT, if non-nil, says to inherit text properties
2328 from adjoining text, if those properties are sticky. */)
2329 (Lisp_Object character, Lisp_Object count, Lisp_Object inherit)
2331 int i, stringlen;
2332 register EMACS_INT n;
2333 int c, len;
2334 unsigned char str[MAX_MULTIBYTE_LENGTH];
2335 char string[4000];
2337 CHECK_CHARACTER (character);
2338 CHECK_NUMBER (count);
2339 c = XFASTINT (character);
2341 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
2342 len = CHAR_STRING (c, str);
2343 else
2344 str[0] = c, len = 1;
2345 if (XINT (count) <= 0)
2346 return Qnil;
2347 if (BUF_BYTES_MAX / len < XINT (count))
2348 buffer_overflow ();
2349 n = XINT (count) * len;
2350 stringlen = min (n, sizeof string - sizeof string % len);
2351 for (i = 0; i < stringlen; i++)
2352 string[i] = str[i % len];
2353 while (n > stringlen)
2355 QUIT;
2356 if (!NILP (inherit))
2357 insert_and_inherit (string, stringlen);
2358 else
2359 insert (string, stringlen);
2360 n -= stringlen;
2362 if (!NILP (inherit))
2363 insert_and_inherit (string, n);
2364 else
2365 insert (string, n);
2366 return Qnil;
2369 DEFUN ("insert-byte", Finsert_byte, Sinsert_byte, 2, 3, 0,
2370 doc: /* Insert COUNT (second arg) copies of BYTE (first arg).
2371 Both arguments are required.
2372 BYTE is a number of the range 0..255.
2374 If BYTE is 128..255 and the current buffer is multibyte, the
2375 corresponding eight-bit character is inserted.
2377 Point, and before-insertion markers, are relocated as in the function `insert'.
2378 The optional third arg INHERIT, if non-nil, says to inherit text properties
2379 from adjoining text, if those properties are sticky. */)
2380 (Lisp_Object byte, Lisp_Object count, Lisp_Object inherit)
2382 CHECK_NUMBER (byte);
2383 if (XINT (byte) < 0 || XINT (byte) > 255)
2384 args_out_of_range_3 (byte, make_number (0), make_number (255));
2385 if (XINT (byte) >= 128
2386 && ! NILP (BVAR (current_buffer, enable_multibyte_characters)))
2387 XSETFASTINT (byte, BYTE8_TO_CHAR (XINT (byte)));
2388 return Finsert_char (byte, count, inherit);
2392 /* Making strings from buffer contents. */
2394 /* Return a Lisp_String containing the text of the current buffer from
2395 START to END. If text properties are in use and the current buffer
2396 has properties in the range specified, the resulting string will also
2397 have them, if PROPS is nonzero.
2399 We don't want to use plain old make_string here, because it calls
2400 make_uninit_string, which can cause the buffer arena to be
2401 compacted. make_string has no way of knowing that the data has
2402 been moved, and thus copies the wrong data into the string. This
2403 doesn't effect most of the other users of make_string, so it should
2404 be left as is. But we should use this function when conjuring
2405 buffer substrings. */
2407 Lisp_Object
2408 make_buffer_string (EMACS_INT start, EMACS_INT end, int props)
2410 EMACS_INT start_byte = CHAR_TO_BYTE (start);
2411 EMACS_INT end_byte = CHAR_TO_BYTE (end);
2413 return make_buffer_string_both (start, start_byte, end, end_byte, props);
2416 /* Return a Lisp_String containing the text of the current buffer from
2417 START / START_BYTE to END / END_BYTE.
2419 If text properties are in use and the current buffer
2420 has properties in the range specified, the resulting string will also
2421 have them, if PROPS is nonzero.
2423 We don't want to use plain old make_string here, because it calls
2424 make_uninit_string, which can cause the buffer arena to be
2425 compacted. make_string has no way of knowing that the data has
2426 been moved, and thus copies the wrong data into the string. This
2427 doesn't effect most of the other users of make_string, so it should
2428 be left as is. But we should use this function when conjuring
2429 buffer substrings. */
2431 Lisp_Object
2432 make_buffer_string_both (EMACS_INT start, EMACS_INT start_byte,
2433 EMACS_INT end, EMACS_INT end_byte, int props)
2435 Lisp_Object result, tem, tem1;
2437 if (start < GPT && GPT < end)
2438 move_gap (start);
2440 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
2441 result = make_uninit_multibyte_string (end - start, end_byte - start_byte);
2442 else
2443 result = make_uninit_string (end - start);
2444 memcpy (SDATA (result), BYTE_POS_ADDR (start_byte), end_byte - start_byte);
2446 /* If desired, update and copy the text properties. */
2447 if (props)
2449 update_buffer_properties (start, end);
2451 tem = Fnext_property_change (make_number (start), Qnil, make_number (end));
2452 tem1 = Ftext_properties_at (make_number (start), Qnil);
2454 if (XINT (tem) != end || !NILP (tem1))
2455 copy_intervals_to_string (result, current_buffer, start,
2456 end - start);
2459 return result;
2462 /* Call Vbuffer_access_fontify_functions for the range START ... END
2463 in the current buffer, if necessary. */
2465 static void
2466 update_buffer_properties (EMACS_INT start, EMACS_INT end)
2468 /* If this buffer has some access functions,
2469 call them, specifying the range of the buffer being accessed. */
2470 if (!NILP (Vbuffer_access_fontify_functions))
2472 Lisp_Object args[3];
2473 Lisp_Object tem;
2475 args[0] = Qbuffer_access_fontify_functions;
2476 XSETINT (args[1], start);
2477 XSETINT (args[2], end);
2479 /* But don't call them if we can tell that the work
2480 has already been done. */
2481 if (!NILP (Vbuffer_access_fontified_property))
2483 tem = Ftext_property_any (args[1], args[2],
2484 Vbuffer_access_fontified_property,
2485 Qnil, Qnil);
2486 if (! NILP (tem))
2487 Frun_hook_with_args (3, args);
2489 else
2490 Frun_hook_with_args (3, args);
2494 DEFUN ("buffer-substring", Fbuffer_substring, Sbuffer_substring, 2, 2, 0,
2495 doc: /* Return the contents of part of the current buffer as a string.
2496 The two arguments START and END are character positions;
2497 they can be in either order.
2498 The string returned is multibyte if the buffer is multibyte.
2500 This function copies the text properties of that part of the buffer
2501 into the result string; if you don't want the text properties,
2502 use `buffer-substring-no-properties' instead. */)
2503 (Lisp_Object start, Lisp_Object end)
2505 register EMACS_INT b, e;
2507 validate_region (&start, &end);
2508 b = XINT (start);
2509 e = XINT (end);
2511 return make_buffer_string (b, e, 1);
2514 DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties,
2515 Sbuffer_substring_no_properties, 2, 2, 0,
2516 doc: /* Return the characters of part of the buffer, without the text properties.
2517 The two arguments START and END are character positions;
2518 they can be in either order. */)
2519 (Lisp_Object start, Lisp_Object end)
2521 register EMACS_INT b, e;
2523 validate_region (&start, &end);
2524 b = XINT (start);
2525 e = XINT (end);
2527 return make_buffer_string (b, e, 0);
2530 DEFUN ("buffer-string", Fbuffer_string, Sbuffer_string, 0, 0, 0,
2531 doc: /* Return the contents of the current buffer as a string.
2532 If narrowing is in effect, this function returns only the visible part
2533 of the buffer. */)
2534 (void)
2536 return make_buffer_string (BEGV, ZV, 1);
2539 DEFUN ("insert-buffer-substring", Finsert_buffer_substring, Sinsert_buffer_substring,
2540 1, 3, 0,
2541 doc: /* Insert before point a substring of the contents of BUFFER.
2542 BUFFER may be a buffer or a buffer name.
2543 Arguments START and END are character positions specifying the substring.
2544 They default to the values of (point-min) and (point-max) in BUFFER. */)
2545 (Lisp_Object buffer, Lisp_Object start, Lisp_Object end)
2547 register EMACS_INT b, e, temp;
2548 register struct buffer *bp, *obuf;
2549 Lisp_Object buf;
2551 buf = Fget_buffer (buffer);
2552 if (NILP (buf))
2553 nsberror (buffer);
2554 bp = XBUFFER (buf);
2555 if (NILP (BVAR (bp, name)))
2556 error ("Selecting deleted buffer");
2558 if (NILP (start))
2559 b = BUF_BEGV (bp);
2560 else
2562 CHECK_NUMBER_COERCE_MARKER (start);
2563 b = XINT (start);
2565 if (NILP (end))
2566 e = BUF_ZV (bp);
2567 else
2569 CHECK_NUMBER_COERCE_MARKER (end);
2570 e = XINT (end);
2573 if (b > e)
2574 temp = b, b = e, e = temp;
2576 if (!(BUF_BEGV (bp) <= b && e <= BUF_ZV (bp)))
2577 args_out_of_range (start, end);
2579 obuf = current_buffer;
2580 set_buffer_internal_1 (bp);
2581 update_buffer_properties (b, e);
2582 set_buffer_internal_1 (obuf);
2584 insert_from_buffer (bp, b, e - b, 0);
2585 return Qnil;
2588 DEFUN ("compare-buffer-substrings", Fcompare_buffer_substrings, Scompare_buffer_substrings,
2589 6, 6, 0,
2590 doc: /* Compare two substrings of two buffers; return result as number.
2591 the value is -N if first string is less after N-1 chars,
2592 +N if first string is greater after N-1 chars, or 0 if strings match.
2593 Each substring is represented as three arguments: BUFFER, START and END.
2594 That makes six args in all, three for each substring.
2596 The value of `case-fold-search' in the current buffer
2597 determines whether case is significant or ignored. */)
2598 (Lisp_Object buffer1, Lisp_Object start1, Lisp_Object end1, Lisp_Object buffer2, Lisp_Object start2, Lisp_Object end2)
2600 register EMACS_INT begp1, endp1, begp2, endp2, temp;
2601 register struct buffer *bp1, *bp2;
2602 register Lisp_Object trt
2603 = (!NILP (BVAR (current_buffer, case_fold_search))
2604 ? BVAR (current_buffer, case_canon_table) : Qnil);
2605 EMACS_INT chars = 0;
2606 EMACS_INT i1, i2, i1_byte, i2_byte;
2608 /* Find the first buffer and its substring. */
2610 if (NILP (buffer1))
2611 bp1 = current_buffer;
2612 else
2614 Lisp_Object buf1;
2615 buf1 = Fget_buffer (buffer1);
2616 if (NILP (buf1))
2617 nsberror (buffer1);
2618 bp1 = XBUFFER (buf1);
2619 if (NILP (BVAR (bp1, name)))
2620 error ("Selecting deleted buffer");
2623 if (NILP (start1))
2624 begp1 = BUF_BEGV (bp1);
2625 else
2627 CHECK_NUMBER_COERCE_MARKER (start1);
2628 begp1 = XINT (start1);
2630 if (NILP (end1))
2631 endp1 = BUF_ZV (bp1);
2632 else
2634 CHECK_NUMBER_COERCE_MARKER (end1);
2635 endp1 = XINT (end1);
2638 if (begp1 > endp1)
2639 temp = begp1, begp1 = endp1, endp1 = temp;
2641 if (!(BUF_BEGV (bp1) <= begp1
2642 && begp1 <= endp1
2643 && endp1 <= BUF_ZV (bp1)))
2644 args_out_of_range (start1, end1);
2646 /* Likewise for second substring. */
2648 if (NILP (buffer2))
2649 bp2 = current_buffer;
2650 else
2652 Lisp_Object buf2;
2653 buf2 = Fget_buffer (buffer2);
2654 if (NILP (buf2))
2655 nsberror (buffer2);
2656 bp2 = XBUFFER (buf2);
2657 if (NILP (BVAR (bp2, name)))
2658 error ("Selecting deleted buffer");
2661 if (NILP (start2))
2662 begp2 = BUF_BEGV (bp2);
2663 else
2665 CHECK_NUMBER_COERCE_MARKER (start2);
2666 begp2 = XINT (start2);
2668 if (NILP (end2))
2669 endp2 = BUF_ZV (bp2);
2670 else
2672 CHECK_NUMBER_COERCE_MARKER (end2);
2673 endp2 = XINT (end2);
2676 if (begp2 > endp2)
2677 temp = begp2, begp2 = endp2, endp2 = temp;
2679 if (!(BUF_BEGV (bp2) <= begp2
2680 && begp2 <= endp2
2681 && endp2 <= BUF_ZV (bp2)))
2682 args_out_of_range (start2, end2);
2684 i1 = begp1;
2685 i2 = begp2;
2686 i1_byte = buf_charpos_to_bytepos (bp1, i1);
2687 i2_byte = buf_charpos_to_bytepos (bp2, i2);
2689 while (i1 < endp1 && i2 < endp2)
2691 /* When we find a mismatch, we must compare the
2692 characters, not just the bytes. */
2693 int c1, c2;
2695 QUIT;
2697 if (! NILP (BVAR (bp1, enable_multibyte_characters)))
2699 c1 = BUF_FETCH_MULTIBYTE_CHAR (bp1, i1_byte);
2700 BUF_INC_POS (bp1, i1_byte);
2701 i1++;
2703 else
2705 c1 = BUF_FETCH_BYTE (bp1, i1);
2706 MAKE_CHAR_MULTIBYTE (c1);
2707 i1++;
2710 if (! NILP (BVAR (bp2, enable_multibyte_characters)))
2712 c2 = BUF_FETCH_MULTIBYTE_CHAR (bp2, i2_byte);
2713 BUF_INC_POS (bp2, i2_byte);
2714 i2++;
2716 else
2718 c2 = BUF_FETCH_BYTE (bp2, i2);
2719 MAKE_CHAR_MULTIBYTE (c2);
2720 i2++;
2723 if (!NILP (trt))
2725 c1 = CHAR_TABLE_TRANSLATE (trt, c1);
2726 c2 = CHAR_TABLE_TRANSLATE (trt, c2);
2728 if (c1 < c2)
2729 return make_number (- 1 - chars);
2730 if (c1 > c2)
2731 return make_number (chars + 1);
2733 chars++;
2736 /* The strings match as far as they go.
2737 If one is shorter, that one is less. */
2738 if (chars < endp1 - begp1)
2739 return make_number (chars + 1);
2740 else if (chars < endp2 - begp2)
2741 return make_number (- chars - 1);
2743 /* Same length too => they are equal. */
2744 return make_number (0);
2747 static Lisp_Object
2748 subst_char_in_region_unwind (Lisp_Object arg)
2750 return BVAR (current_buffer, undo_list) = arg;
2753 static Lisp_Object
2754 subst_char_in_region_unwind_1 (Lisp_Object arg)
2756 return BVAR (current_buffer, filename) = arg;
2759 DEFUN ("subst-char-in-region", Fsubst_char_in_region,
2760 Ssubst_char_in_region, 4, 5, 0,
2761 doc: /* From START to END, replace FROMCHAR with TOCHAR each time it occurs.
2762 If optional arg NOUNDO is non-nil, don't record this change for undo
2763 and don't mark the buffer as really changed.
2764 Both characters must have the same length of multi-byte form. */)
2765 (Lisp_Object start, Lisp_Object end, Lisp_Object fromchar, Lisp_Object tochar, Lisp_Object noundo)
2767 register EMACS_INT pos, pos_byte, stop, i, len, end_byte;
2768 /* Keep track of the first change in the buffer:
2769 if 0 we haven't found it yet.
2770 if < 0 we've found it and we've run the before-change-function.
2771 if > 0 we've actually performed it and the value is its position. */
2772 EMACS_INT changed = 0;
2773 unsigned char fromstr[MAX_MULTIBYTE_LENGTH], tostr[MAX_MULTIBYTE_LENGTH];
2774 unsigned char *p;
2775 int count = SPECPDL_INDEX ();
2776 #define COMBINING_NO 0
2777 #define COMBINING_BEFORE 1
2778 #define COMBINING_AFTER 2
2779 #define COMBINING_BOTH (COMBINING_BEFORE | COMBINING_AFTER)
2780 int maybe_byte_combining = COMBINING_NO;
2781 EMACS_INT last_changed = 0;
2782 int multibyte_p = !NILP (BVAR (current_buffer, enable_multibyte_characters));
2783 int fromc, toc;
2785 restart:
2787 validate_region (&start, &end);
2788 CHECK_CHARACTER (fromchar);
2789 CHECK_CHARACTER (tochar);
2790 fromc = XFASTINT (fromchar);
2791 toc = XFASTINT (tochar);
2793 if (multibyte_p)
2795 len = CHAR_STRING (fromc, fromstr);
2796 if (CHAR_STRING (toc, tostr) != len)
2797 error ("Characters in `subst-char-in-region' have different byte-lengths");
2798 if (!ASCII_BYTE_P (*tostr))
2800 /* If *TOSTR is in the range 0x80..0x9F and TOCHAR is not a
2801 complete multibyte character, it may be combined with the
2802 after bytes. If it is in the range 0xA0..0xFF, it may be
2803 combined with the before and after bytes. */
2804 if (!CHAR_HEAD_P (*tostr))
2805 maybe_byte_combining = COMBINING_BOTH;
2806 else if (BYTES_BY_CHAR_HEAD (*tostr) > len)
2807 maybe_byte_combining = COMBINING_AFTER;
2810 else
2812 len = 1;
2813 fromstr[0] = fromc;
2814 tostr[0] = toc;
2817 pos = XINT (start);
2818 pos_byte = CHAR_TO_BYTE (pos);
2819 stop = CHAR_TO_BYTE (XINT (end));
2820 end_byte = stop;
2822 /* If we don't want undo, turn off putting stuff on the list.
2823 That's faster than getting rid of things,
2824 and it prevents even the entry for a first change.
2825 Also inhibit locking the file. */
2826 if (!changed && !NILP (noundo))
2828 record_unwind_protect (subst_char_in_region_unwind,
2829 BVAR (current_buffer, undo_list));
2830 BVAR (current_buffer, undo_list) = Qt;
2831 /* Don't do file-locking. */
2832 record_unwind_protect (subst_char_in_region_unwind_1,
2833 BVAR (current_buffer, filename));
2834 BVAR (current_buffer, filename) = Qnil;
2837 if (pos_byte < GPT_BYTE)
2838 stop = min (stop, GPT_BYTE);
2839 while (1)
2841 EMACS_INT pos_byte_next = pos_byte;
2843 if (pos_byte >= stop)
2845 if (pos_byte >= end_byte) break;
2846 stop = end_byte;
2848 p = BYTE_POS_ADDR (pos_byte);
2849 if (multibyte_p)
2850 INC_POS (pos_byte_next);
2851 else
2852 ++pos_byte_next;
2853 if (pos_byte_next - pos_byte == len
2854 && p[0] == fromstr[0]
2855 && (len == 1
2856 || (p[1] == fromstr[1]
2857 && (len == 2 || (p[2] == fromstr[2]
2858 && (len == 3 || p[3] == fromstr[3]))))))
2860 if (changed < 0)
2861 /* We've already seen this and run the before-change-function;
2862 this time we only need to record the actual position. */
2863 changed = pos;
2864 else if (!changed)
2866 changed = -1;
2867 modify_region (current_buffer, pos, XINT (end), 0);
2869 if (! NILP (noundo))
2871 if (MODIFF - 1 == SAVE_MODIFF)
2872 SAVE_MODIFF++;
2873 if (MODIFF - 1 == BUF_AUTOSAVE_MODIFF (current_buffer))
2874 BUF_AUTOSAVE_MODIFF (current_buffer)++;
2877 /* The before-change-function may have moved the gap
2878 or even modified the buffer so we should start over. */
2879 goto restart;
2882 /* Take care of the case where the new character
2883 combines with neighboring bytes. */
2884 if (maybe_byte_combining
2885 && (maybe_byte_combining == COMBINING_AFTER
2886 ? (pos_byte_next < Z_BYTE
2887 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
2888 : ((pos_byte_next < Z_BYTE
2889 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
2890 || (pos_byte > BEG_BYTE
2891 && ! ASCII_BYTE_P (FETCH_BYTE (pos_byte - 1))))))
2893 Lisp_Object tem, string;
2895 struct gcpro gcpro1;
2897 tem = BVAR (current_buffer, undo_list);
2898 GCPRO1 (tem);
2900 /* Make a multibyte string containing this single character. */
2901 string = make_multibyte_string ((char *) tostr, 1, len);
2902 /* replace_range is less efficient, because it moves the gap,
2903 but it handles combining correctly. */
2904 replace_range (pos, pos + 1, string,
2905 0, 0, 1);
2906 pos_byte_next = CHAR_TO_BYTE (pos);
2907 if (pos_byte_next > pos_byte)
2908 /* Before combining happened. We should not increment
2909 POS. So, to cancel the later increment of POS,
2910 decrease it now. */
2911 pos--;
2912 else
2913 INC_POS (pos_byte_next);
2915 if (! NILP (noundo))
2916 BVAR (current_buffer, undo_list) = tem;
2918 UNGCPRO;
2920 else
2922 if (NILP (noundo))
2923 record_change (pos, 1);
2924 for (i = 0; i < len; i++) *p++ = tostr[i];
2926 last_changed = pos + 1;
2928 pos_byte = pos_byte_next;
2929 pos++;
2932 if (changed > 0)
2934 signal_after_change (changed,
2935 last_changed - changed, last_changed - changed);
2936 update_compositions (changed, last_changed, CHECK_ALL);
2939 unbind_to (count, Qnil);
2940 return Qnil;
2944 static Lisp_Object check_translation (EMACS_INT, EMACS_INT, EMACS_INT,
2945 Lisp_Object);
2947 /* Helper function for Ftranslate_region_internal.
2949 Check if a character sequence at POS (POS_BYTE) matches an element
2950 of VAL. VAL is a list (([FROM-CHAR ...] . TO) ...). If a matching
2951 element is found, return it. Otherwise return Qnil. */
2953 static Lisp_Object
2954 check_translation (EMACS_INT pos, EMACS_INT pos_byte, EMACS_INT end,
2955 Lisp_Object val)
2957 int buf_size = 16, buf_used = 0;
2958 int *buf = alloca (sizeof (int) * buf_size);
2960 for (; CONSP (val); val = XCDR (val))
2962 Lisp_Object elt;
2963 EMACS_INT len, i;
2965 elt = XCAR (val);
2966 if (! CONSP (elt))
2967 continue;
2968 elt = XCAR (elt);
2969 if (! VECTORP (elt))
2970 continue;
2971 len = ASIZE (elt);
2972 if (len <= end - pos)
2974 for (i = 0; i < len; i++)
2976 if (buf_used <= i)
2978 unsigned char *p = BYTE_POS_ADDR (pos_byte);
2979 int len1;
2981 if (buf_used == buf_size)
2983 int *newbuf;
2985 buf_size += 16;
2986 newbuf = alloca (sizeof (int) * buf_size);
2987 memcpy (newbuf, buf, sizeof (int) * buf_used);
2988 buf = newbuf;
2990 buf[buf_used++] = STRING_CHAR_AND_LENGTH (p, len1);
2991 pos_byte += len1;
2993 if (XINT (AREF (elt, i)) != buf[i])
2994 break;
2996 if (i == len)
2997 return XCAR (val);
3000 return Qnil;
3004 DEFUN ("translate-region-internal", Ftranslate_region_internal,
3005 Stranslate_region_internal, 3, 3, 0,
3006 doc: /* Internal use only.
3007 From START to END, translate characters according to TABLE.
3008 TABLE is a string or a char-table; the Nth character in it is the
3009 mapping for the character with code N.
3010 It returns the number of characters changed. */)
3011 (Lisp_Object start, Lisp_Object end, register Lisp_Object table)
3013 register unsigned char *tt; /* Trans table. */
3014 register int nc; /* New character. */
3015 int cnt; /* Number of changes made. */
3016 EMACS_INT size; /* Size of translate table. */
3017 EMACS_INT pos, pos_byte, end_pos;
3018 int multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters));
3019 int string_multibyte IF_LINT (= 0);
3021 validate_region (&start, &end);
3022 if (CHAR_TABLE_P (table))
3024 if (! EQ (XCHAR_TABLE (table)->purpose, Qtranslation_table))
3025 error ("Not a translation table");
3026 size = MAX_CHAR;
3027 tt = NULL;
3029 else
3031 CHECK_STRING (table);
3033 if (! multibyte && (SCHARS (table) < SBYTES (table)))
3034 table = string_make_unibyte (table);
3035 string_multibyte = SCHARS (table) < SBYTES (table);
3036 size = SBYTES (table);
3037 tt = SDATA (table);
3040 pos = XINT (start);
3041 pos_byte = CHAR_TO_BYTE (pos);
3042 end_pos = XINT (end);
3043 modify_region (current_buffer, pos, end_pos, 0);
3045 cnt = 0;
3046 for (; pos < end_pos; )
3048 register unsigned char *p = BYTE_POS_ADDR (pos_byte);
3049 unsigned char *str, buf[MAX_MULTIBYTE_LENGTH];
3050 int len, str_len;
3051 int oc;
3052 Lisp_Object val;
3054 if (multibyte)
3055 oc = STRING_CHAR_AND_LENGTH (p, len);
3056 else
3057 oc = *p, len = 1;
3058 if (oc < size)
3060 if (tt)
3062 /* Reload as signal_after_change in last iteration may GC. */
3063 tt = SDATA (table);
3064 if (string_multibyte)
3066 str = tt + string_char_to_byte (table, oc);
3067 nc = STRING_CHAR_AND_LENGTH (str, str_len);
3069 else
3071 nc = tt[oc];
3072 if (! ASCII_BYTE_P (nc) && multibyte)
3074 str_len = BYTE8_STRING (nc, buf);
3075 str = buf;
3077 else
3079 str_len = 1;
3080 str = tt + oc;
3084 else
3086 nc = oc;
3087 val = CHAR_TABLE_REF (table, oc);
3088 if (CHARACTERP (val))
3090 nc = XFASTINT (val);
3091 str_len = CHAR_STRING (nc, buf);
3092 str = buf;
3094 else if (VECTORP (val) || (CONSP (val)))
3096 /* VAL is [TO_CHAR ...] or (([FROM-CHAR ...] . TO) ...)
3097 where TO is TO-CHAR or [TO-CHAR ...]. */
3098 nc = -1;
3102 if (nc != oc && nc >= 0)
3104 /* Simple one char to one char translation. */
3105 if (len != str_len)
3107 Lisp_Object string;
3109 /* This is less efficient, because it moves the gap,
3110 but it should handle multibyte characters correctly. */
3111 string = make_multibyte_string ((char *) str, 1, str_len);
3112 replace_range (pos, pos + 1, string, 1, 0, 1);
3113 len = str_len;
3115 else
3117 record_change (pos, 1);
3118 while (str_len-- > 0)
3119 *p++ = *str++;
3120 signal_after_change (pos, 1, 1);
3121 update_compositions (pos, pos + 1, CHECK_BORDER);
3123 ++cnt;
3125 else if (nc < 0)
3127 Lisp_Object string;
3129 if (CONSP (val))
3131 val = check_translation (pos, pos_byte, end_pos, val);
3132 if (NILP (val))
3134 pos_byte += len;
3135 pos++;
3136 continue;
3138 /* VAL is ([FROM-CHAR ...] . TO). */
3139 len = ASIZE (XCAR (val));
3140 val = XCDR (val);
3142 else
3143 len = 1;
3145 if (VECTORP (val))
3147 string = Fconcat (1, &val);
3149 else
3151 string = Fmake_string (make_number (1), val);
3153 replace_range (pos, pos + len, string, 1, 0, 1);
3154 pos_byte += SBYTES (string);
3155 pos += SCHARS (string);
3156 cnt += SCHARS (string);
3157 end_pos += SCHARS (string) - len;
3158 continue;
3161 pos_byte += len;
3162 pos++;
3165 return make_number (cnt);
3168 DEFUN ("delete-region", Fdelete_region, Sdelete_region, 2, 2, "r",
3169 doc: /* Delete the text between point and mark.
3171 When called from a program, expects two arguments,
3172 positions (integers or markers) specifying the stretch to be deleted. */)
3173 (Lisp_Object start, Lisp_Object end)
3175 validate_region (&start, &end);
3176 del_range (XINT (start), XINT (end));
3177 return Qnil;
3180 DEFUN ("delete-and-extract-region", Fdelete_and_extract_region,
3181 Sdelete_and_extract_region, 2, 2, 0,
3182 doc: /* Delete the text between START and END and return it. */)
3183 (Lisp_Object start, Lisp_Object end)
3185 validate_region (&start, &end);
3186 if (XINT (start) == XINT (end))
3187 return empty_unibyte_string;
3188 return del_range_1 (XINT (start), XINT (end), 1, 1);
3191 DEFUN ("widen", Fwiden, Swiden, 0, 0, "",
3192 doc: /* Remove restrictions (narrowing) from current buffer.
3193 This allows the buffer's full text to be seen and edited. */)
3194 (void)
3196 if (BEG != BEGV || Z != ZV)
3197 current_buffer->clip_changed = 1;
3198 BEGV = BEG;
3199 BEGV_BYTE = BEG_BYTE;
3200 SET_BUF_ZV_BOTH (current_buffer, Z, Z_BYTE);
3201 /* Changing the buffer bounds invalidates any recorded current column. */
3202 invalidate_current_column ();
3203 return Qnil;
3206 DEFUN ("narrow-to-region", Fnarrow_to_region, Snarrow_to_region, 2, 2, "r",
3207 doc: /* Restrict editing in this buffer to the current region.
3208 The rest of the text becomes temporarily invisible and untouchable
3209 but is not deleted; if you save the buffer in a file, the invisible
3210 text is included in the file. \\[widen] makes all visible again.
3211 See also `save-restriction'.
3213 When calling from a program, pass two arguments; positions (integers
3214 or markers) bounding the text that should remain visible. */)
3215 (register Lisp_Object start, Lisp_Object end)
3217 CHECK_NUMBER_COERCE_MARKER (start);
3218 CHECK_NUMBER_COERCE_MARKER (end);
3220 if (XINT (start) > XINT (end))
3222 Lisp_Object tem;
3223 tem = start; start = end; end = tem;
3226 if (!(BEG <= XINT (start) && XINT (start) <= XINT (end) && XINT (end) <= Z))
3227 args_out_of_range (start, end);
3229 if (BEGV != XFASTINT (start) || ZV != XFASTINT (end))
3230 current_buffer->clip_changed = 1;
3232 SET_BUF_BEGV (current_buffer, XFASTINT (start));
3233 SET_BUF_ZV (current_buffer, XFASTINT (end));
3234 if (PT < XFASTINT (start))
3235 SET_PT (XFASTINT (start));
3236 if (PT > XFASTINT (end))
3237 SET_PT (XFASTINT (end));
3238 /* Changing the buffer bounds invalidates any recorded current column. */
3239 invalidate_current_column ();
3240 return Qnil;
3243 Lisp_Object
3244 save_restriction_save (void)
3246 if (BEGV == BEG && ZV == Z)
3247 /* The common case that the buffer isn't narrowed.
3248 We return just the buffer object, which save_restriction_restore
3249 recognizes as meaning `no restriction'. */
3250 return Fcurrent_buffer ();
3251 else
3252 /* We have to save a restriction, so return a pair of markers, one
3253 for the beginning and one for the end. */
3255 Lisp_Object beg, end;
3257 beg = buildmark (BEGV, BEGV_BYTE);
3258 end = buildmark (ZV, ZV_BYTE);
3260 /* END must move forward if text is inserted at its exact location. */
3261 XMARKER(end)->insertion_type = 1;
3263 return Fcons (beg, end);
3267 Lisp_Object
3268 save_restriction_restore (Lisp_Object data)
3270 struct buffer *cur = NULL;
3271 struct buffer *buf = (CONSP (data)
3272 ? XMARKER (XCAR (data))->buffer
3273 : XBUFFER (data));
3275 if (buf && buf != current_buffer && !NILP (BVAR (buf, pt_marker)))
3276 { /* If `buf' uses markers to keep track of PT, BEGV, and ZV (as
3277 is the case if it is or has an indirect buffer), then make
3278 sure it is current before we update BEGV, so
3279 set_buffer_internal takes care of managing those markers. */
3280 cur = current_buffer;
3281 set_buffer_internal (buf);
3284 if (CONSP (data))
3285 /* A pair of marks bounding a saved restriction. */
3287 struct Lisp_Marker *beg = XMARKER (XCAR (data));
3288 struct Lisp_Marker *end = XMARKER (XCDR (data));
3289 eassert (buf == end->buffer);
3291 if (buf /* Verify marker still points to a buffer. */
3292 && (beg->charpos != BUF_BEGV (buf) || end->charpos != BUF_ZV (buf)))
3293 /* The restriction has changed from the saved one, so restore
3294 the saved restriction. */
3296 EMACS_INT pt = BUF_PT (buf);
3298 SET_BUF_BEGV_BOTH (buf, beg->charpos, beg->bytepos);
3299 SET_BUF_ZV_BOTH (buf, end->charpos, end->bytepos);
3301 if (pt < beg->charpos || pt > end->charpos)
3302 /* The point is outside the new visible range, move it inside. */
3303 SET_BUF_PT_BOTH (buf,
3304 clip_to_bounds (beg->charpos, pt, end->charpos),
3305 clip_to_bounds (beg->bytepos, BUF_PT_BYTE (buf),
3306 end->bytepos));
3308 buf->clip_changed = 1; /* Remember that the narrowing changed. */
3311 else
3312 /* A buffer, which means that there was no old restriction. */
3314 if (buf /* Verify marker still points to a buffer. */
3315 && (BUF_BEGV (buf) != BUF_BEG (buf) || BUF_ZV (buf) != BUF_Z (buf)))
3316 /* The buffer has been narrowed, get rid of the narrowing. */
3318 SET_BUF_BEGV_BOTH (buf, BUF_BEG (buf), BUF_BEG_BYTE (buf));
3319 SET_BUF_ZV_BOTH (buf, BUF_Z (buf), BUF_Z_BYTE (buf));
3321 buf->clip_changed = 1; /* Remember that the narrowing changed. */
3325 /* Changing the buffer bounds invalidates any recorded current column. */
3326 invalidate_current_column ();
3328 if (cur)
3329 set_buffer_internal (cur);
3331 return Qnil;
3334 DEFUN ("save-restriction", Fsave_restriction, Ssave_restriction, 0, UNEVALLED, 0,
3335 doc: /* Execute BODY, saving and restoring current buffer's restrictions.
3336 The buffer's restrictions make parts of the beginning and end invisible.
3337 \(They are set up with `narrow-to-region' and eliminated with `widen'.)
3338 This special form, `save-restriction', saves the current buffer's restrictions
3339 when it is entered, and restores them when it is exited.
3340 So any `narrow-to-region' within BODY lasts only until the end of the form.
3341 The old restrictions settings are restored
3342 even in case of abnormal exit (throw or error).
3344 The value returned is the value of the last form in BODY.
3346 Note: if you are using both `save-excursion' and `save-restriction',
3347 use `save-excursion' outermost:
3348 (save-excursion (save-restriction ...))
3350 usage: (save-restriction &rest BODY) */)
3351 (Lisp_Object body)
3353 register Lisp_Object val;
3354 int count = SPECPDL_INDEX ();
3356 record_unwind_protect (save_restriction_restore, save_restriction_save ());
3357 val = Fprogn (body);
3358 return unbind_to (count, val);
3361 /* Buffer for the most recent text displayed by Fmessage_box. */
3362 static char *message_text;
3364 /* Allocated length of that buffer. */
3365 static int message_length;
3367 DEFUN ("message", Fmessage, Smessage, 1, MANY, 0,
3368 doc: /* Display a message at the bottom of the screen.
3369 The message also goes into the `*Messages*' buffer.
3370 \(In keyboard macros, that's all it does.)
3371 Return the message.
3373 The first argument is a format control string, and the rest are data
3374 to be formatted under control of the string. See `format' for details.
3376 Note: Use (message "%s" VALUE) to print the value of expressions and
3377 variables to avoid accidentally interpreting `%' as format specifiers.
3379 If the first argument is nil or the empty string, the function clears
3380 any existing message; this lets the minibuffer contents show. See
3381 also `current-message'.
3383 usage: (message FORMAT-STRING &rest ARGS) */)
3384 (ptrdiff_t nargs, Lisp_Object *args)
3386 if (NILP (args[0])
3387 || (STRINGP (args[0])
3388 && SBYTES (args[0]) == 0))
3390 message (0);
3391 return args[0];
3393 else
3395 register Lisp_Object val;
3396 val = Fformat (nargs, args);
3397 message3 (val, SBYTES (val), STRING_MULTIBYTE (val));
3398 return val;
3402 DEFUN ("message-box", Fmessage_box, Smessage_box, 1, MANY, 0,
3403 doc: /* Display a message, in a dialog box if possible.
3404 If a dialog box is not available, use the echo area.
3405 The first argument is a format control string, and the rest are data
3406 to be formatted under control of the string. See `format' for details.
3408 If the first argument is nil or the empty string, clear any existing
3409 message; let the minibuffer contents show.
3411 usage: (message-box FORMAT-STRING &rest ARGS) */)
3412 (ptrdiff_t nargs, Lisp_Object *args)
3414 if (NILP (args[0]))
3416 message (0);
3417 return Qnil;
3419 else
3421 register Lisp_Object val;
3422 val = Fformat (nargs, args);
3423 #ifdef HAVE_MENUS
3424 /* The MS-DOS frames support popup menus even though they are
3425 not FRAME_WINDOW_P. */
3426 if (FRAME_WINDOW_P (XFRAME (selected_frame))
3427 || FRAME_MSDOS_P (XFRAME (selected_frame)))
3429 Lisp_Object pane, menu;
3430 struct gcpro gcpro1;
3431 pane = Fcons (Fcons (build_string ("OK"), Qt), Qnil);
3432 GCPRO1 (pane);
3433 menu = Fcons (val, pane);
3434 Fx_popup_dialog (Qt, menu, Qt);
3435 UNGCPRO;
3436 return val;
3438 #endif /* HAVE_MENUS */
3439 /* Copy the data so that it won't move when we GC. */
3440 if (! message_text)
3442 message_text = (char *)xmalloc (80);
3443 message_length = 80;
3445 if (SBYTES (val) > message_length)
3447 message_length = SBYTES (val);
3448 message_text = (char *)xrealloc (message_text, message_length);
3450 memcpy (message_text, SDATA (val), SBYTES (val));
3451 message2 (message_text, SBYTES (val),
3452 STRING_MULTIBYTE (val));
3453 return val;
3457 DEFUN ("message-or-box", Fmessage_or_box, Smessage_or_box, 1, MANY, 0,
3458 doc: /* Display a message in a dialog box or in the echo area.
3459 If this command was invoked with the mouse, use a dialog box if
3460 `use-dialog-box' is non-nil.
3461 Otherwise, use the echo area.
3462 The first argument is a format control string, and the rest are data
3463 to be formatted under control of the string. See `format' for details.
3465 If the first argument is nil or the empty string, clear any existing
3466 message; let the minibuffer contents show.
3468 usage: (message-or-box FORMAT-STRING &rest ARGS) */)
3469 (ptrdiff_t nargs, Lisp_Object *args)
3471 #ifdef HAVE_MENUS
3472 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3473 && use_dialog_box)
3474 return Fmessage_box (nargs, args);
3475 #endif
3476 return Fmessage (nargs, args);
3479 DEFUN ("current-message", Fcurrent_message, Scurrent_message, 0, 0, 0,
3480 doc: /* Return the string currently displayed in the echo area, or nil if none. */)
3481 (void)
3483 return current_message ();
3487 DEFUN ("propertize", Fpropertize, Spropertize, 1, MANY, 0,
3488 doc: /* Return a copy of STRING with text properties added.
3489 First argument is the string to copy.
3490 Remaining arguments form a sequence of PROPERTY VALUE pairs for text
3491 properties to add to the result.
3492 usage: (propertize STRING &rest PROPERTIES) */)
3493 (ptrdiff_t nargs, Lisp_Object *args)
3495 Lisp_Object properties, string;
3496 struct gcpro gcpro1, gcpro2;
3497 ptrdiff_t i;
3499 /* Number of args must be odd. */
3500 if ((nargs & 1) == 0)
3501 error ("Wrong number of arguments");
3503 properties = string = Qnil;
3504 GCPRO2 (properties, string);
3506 /* First argument must be a string. */
3507 CHECK_STRING (args[0]);
3508 string = Fcopy_sequence (args[0]);
3510 for (i = 1; i < nargs; i += 2)
3511 properties = Fcons (args[i], Fcons (args[i + 1], properties));
3513 Fadd_text_properties (make_number (0),
3514 make_number (SCHARS (string)),
3515 properties, string);
3516 RETURN_UNGCPRO (string);
3519 /* pWIDE is a conversion for printing large decimal integers (possibly with a
3520 trailing "d" that is ignored). pWIDElen is its length. signed_wide and
3521 unsigned_wide are signed and unsigned types for printing them. Use widest
3522 integers if available so that more floating point values can be converted. */
3523 #ifdef PRIdMAX
3524 # define pWIDE PRIdMAX
3525 enum { pWIDElen = sizeof PRIdMAX - 2 }; /* Don't count trailing "d". */
3526 typedef intmax_t signed_wide;
3527 typedef uintmax_t unsigned_wide;
3528 #else
3529 # define pWIDE pI
3530 enum { pWIDElen = sizeof pI - 1 };
3531 typedef EMACS_INT signed_wide;
3532 typedef EMACS_UINT unsigned_wide;
3533 #endif
3535 DEFUN ("format", Fformat, Sformat, 1, MANY, 0,
3536 doc: /* Format a string out of a format-string and arguments.
3537 The first argument is a format control string.
3538 The other arguments are substituted into it to make the result, a string.
3540 The format control string may contain %-sequences meaning to substitute
3541 the next available argument:
3543 %s means print a string argument. Actually, prints any object, with `princ'.
3544 %d means print as number in decimal (%o octal, %x hex).
3545 %X is like %x, but uses upper case.
3546 %e means print a number in exponential notation.
3547 %f means print a number in decimal-point notation.
3548 %g means print a number in exponential notation
3549 or decimal-point notation, whichever uses fewer characters.
3550 %c means print a number as a single character.
3551 %S means print any object as an s-expression (using `prin1').
3553 The argument used for %d, %o, %x, %e, %f, %g or %c must be a number.
3554 Use %% to put a single % into the output.
3556 A %-sequence may contain optional flag, width, and precision
3557 specifiers, as follows:
3559 %<flags><width><precision>character
3561 where flags is [+ #-0]+, width is [0-9]+, and precision is .[0-9]+
3563 The + flag character inserts a + before any positive number, while a
3564 space inserts a space before any positive number; these flags only
3565 affect %d, %e, %f, and %g sequences, and the + flag takes precedence.
3566 The # flag means to use an alternate display form for %o, %x, %X, %e,
3567 %f, and %g sequences. The - and 0 flags affect the width specifier,
3568 as described below.
3570 The width specifier supplies a lower limit for the length of the
3571 printed representation. The padding, if any, normally goes on the
3572 left, but it goes on the right if the - flag is present. The padding
3573 character is normally a space, but it is 0 if the 0 flag is present.
3574 The - flag takes precedence over the 0 flag.
3576 For %e, %f, and %g sequences, the number after the "." in the
3577 precision specifier says how many decimal places to show; if zero, the
3578 decimal point itself is omitted. For %s and %S, the precision
3579 specifier truncates the string to the given width.
3581 usage: (format STRING &rest OBJECTS) */)
3582 (ptrdiff_t nargs, Lisp_Object *args)
3584 ptrdiff_t n; /* The number of the next arg to substitute */
3585 char initial_buffer[4000];
3586 char *buf = initial_buffer;
3587 EMACS_INT bufsize = sizeof initial_buffer;
3588 EMACS_INT max_bufsize = STRING_BYTES_BOUND + 1;
3589 char *p;
3590 Lisp_Object buf_save_value IF_LINT (= {0});
3591 register char *format, *end, *format_start;
3592 EMACS_INT formatlen, nchars;
3593 /* Nonzero if the format is multibyte. */
3594 int multibyte_format = 0;
3595 /* Nonzero if the output should be a multibyte string,
3596 which is true if any of the inputs is one. */
3597 int multibyte = 0;
3598 /* When we make a multibyte string, we must pay attention to the
3599 byte combining problem, i.e., a byte may be combined with a
3600 multibyte character of the previous string. This flag tells if we
3601 must consider such a situation or not. */
3602 int maybe_combine_byte;
3603 Lisp_Object val;
3604 int arg_intervals = 0;
3605 USE_SAFE_ALLOCA;
3607 /* discarded[I] is 1 if byte I of the format
3608 string was not copied into the output.
3609 It is 2 if byte I was not the first byte of its character. */
3610 char *discarded;
3612 /* Each element records, for one argument,
3613 the start and end bytepos in the output string,
3614 whether the argument has been converted to string (e.g., due to "%S"),
3615 and whether the argument is a string with intervals.
3616 info[0] is unused. Unused elements have -1 for start. */
3617 struct info
3619 EMACS_INT start, end;
3620 int converted_to_string;
3621 int intervals;
3622 } *info = 0;
3624 /* It should not be necessary to GCPRO ARGS, because
3625 the caller in the interpreter should take care of that. */
3627 CHECK_STRING (args[0]);
3628 format_start = SSDATA (args[0]);
3629 formatlen = SBYTES (args[0]);
3631 /* Allocate the info and discarded tables. */
3633 ptrdiff_t i;
3634 if ((SIZE_MAX - formatlen) / sizeof (struct info) <= nargs)
3635 memory_full (SIZE_MAX);
3636 SAFE_ALLOCA (info, struct info *, (nargs + 1) * sizeof *info + formatlen);
3637 discarded = (char *) &info[nargs + 1];
3638 for (i = 0; i < nargs + 1; i++)
3640 info[i].start = -1;
3641 info[i].intervals = info[i].converted_to_string = 0;
3643 memset (discarded, 0, formatlen);
3646 /* Try to determine whether the result should be multibyte.
3647 This is not always right; sometimes the result needs to be multibyte
3648 because of an object that we will pass through prin1,
3649 and in that case, we won't know it here. */
3650 multibyte_format = STRING_MULTIBYTE (args[0]);
3651 multibyte = multibyte_format;
3652 for (n = 1; !multibyte && n < nargs; n++)
3653 if (STRINGP (args[n]) && STRING_MULTIBYTE (args[n]))
3654 multibyte = 1;
3656 /* If we start out planning a unibyte result,
3657 then discover it has to be multibyte, we jump back to retry. */
3658 retry:
3660 p = buf;
3661 nchars = 0;
3662 n = 0;
3664 /* Scan the format and store result in BUF. */
3665 format = format_start;
3666 end = format + formatlen;
3667 maybe_combine_byte = 0;
3669 while (format != end)
3671 /* The values of N and FORMAT when the loop body is entered. */
3672 ptrdiff_t n0 = n;
3673 char *format0 = format;
3675 /* Bytes needed to represent the output of this conversion. */
3676 EMACS_INT convbytes;
3678 if (*format == '%')
3680 /* General format specifications look like
3682 '%' [flags] [field-width] [precision] format
3684 where
3686 flags ::= [-+0# ]+
3687 field-width ::= [0-9]+
3688 precision ::= '.' [0-9]*
3690 If a field-width is specified, it specifies to which width
3691 the output should be padded with blanks, if the output
3692 string is shorter than field-width.
3694 If precision is specified, it specifies the number of
3695 digits to print after the '.' for floats, or the max.
3696 number of chars to print from a string. */
3698 int minus_flag = 0;
3699 int plus_flag = 0;
3700 int space_flag = 0;
3701 int sharp_flag = 0;
3702 int zero_flag = 0;
3703 EMACS_INT field_width;
3704 int precision_given;
3705 uintmax_t precision = UINTMAX_MAX;
3706 char *num_end;
3707 char conversion;
3709 while (1)
3711 switch (*++format)
3713 case '-': minus_flag = 1; continue;
3714 case '+': plus_flag = 1; continue;
3715 case ' ': space_flag = 1; continue;
3716 case '#': sharp_flag = 1; continue;
3717 case '0': zero_flag = 1; continue;
3719 break;
3722 /* Ignore flags when sprintf ignores them. */
3723 space_flag &= ~ plus_flag;
3724 zero_flag &= ~ minus_flag;
3727 uintmax_t w = strtoumax (format, &num_end, 10);
3728 if (max_bufsize <= w)
3729 string_overflow ();
3730 field_width = w;
3732 precision_given = *num_end == '.';
3733 if (precision_given)
3734 precision = strtoumax (num_end + 1, &num_end, 10);
3735 format = num_end;
3737 if (format == end)
3738 error ("Format string ends in middle of format specifier");
3740 memset (&discarded[format0 - format_start], 1, format - format0);
3741 conversion = *format;
3742 if (conversion == '%')
3743 goto copy_char;
3744 discarded[format - format_start] = 1;
3745 format++;
3747 ++n;
3748 if (! (n < nargs))
3749 error ("Not enough arguments for format string");
3751 /* For 'S', prin1 the argument, and then treat like 's'.
3752 For 's', princ any argument that is not a string or
3753 symbol. But don't do this conversion twice, which might
3754 happen after retrying. */
3755 if ((conversion == 'S'
3756 || (conversion == 's'
3757 && ! STRINGP (args[n]) && ! SYMBOLP (args[n]))))
3759 if (! info[n].converted_to_string)
3761 Lisp_Object noescape = conversion == 'S' ? Qnil : Qt;
3762 args[n] = Fprin1_to_string (args[n], noescape);
3763 info[n].converted_to_string = 1;
3764 if (STRING_MULTIBYTE (args[n]) && ! multibyte)
3766 multibyte = 1;
3767 goto retry;
3770 conversion = 's';
3772 else if (conversion == 'c')
3774 if (FLOATP (args[n]))
3776 double d = XFLOAT_DATA (args[n]);
3777 args[n] = make_number (FIXNUM_OVERFLOW_P (d) ? -1 : d);
3780 if (INTEGERP (args[n]) && ! ASCII_CHAR_P (XINT (args[n])))
3782 if (!multibyte)
3784 multibyte = 1;
3785 goto retry;
3787 args[n] = Fchar_to_string (args[n]);
3788 info[n].converted_to_string = 1;
3791 if (info[n].converted_to_string)
3792 conversion = 's';
3793 zero_flag = 0;
3796 if (SYMBOLP (args[n]))
3798 args[n] = SYMBOL_NAME (args[n]);
3799 if (STRING_MULTIBYTE (args[n]) && ! multibyte)
3801 multibyte = 1;
3802 goto retry;
3806 if (conversion == 's')
3808 /* handle case (precision[n] >= 0) */
3810 EMACS_INT width, padding, nbytes;
3811 EMACS_INT nchars_string;
3813 EMACS_INT prec = -1;
3814 if (precision_given && precision <= TYPE_MAXIMUM (EMACS_INT))
3815 prec = precision;
3817 /* lisp_string_width ignores a precision of 0, but GNU
3818 libc functions print 0 characters when the precision
3819 is 0. Imitate libc behavior here. Changing
3820 lisp_string_width is the right thing, and will be
3821 done, but meanwhile we work with it. */
3823 if (prec == 0)
3824 width = nchars_string = nbytes = 0;
3825 else
3827 EMACS_INT nch, nby;
3828 width = lisp_string_width (args[n], prec, &nch, &nby);
3829 if (prec < 0)
3831 nchars_string = SCHARS (args[n]);
3832 nbytes = SBYTES (args[n]);
3834 else
3836 nchars_string = nch;
3837 nbytes = nby;
3841 convbytes = nbytes;
3842 if (convbytes && multibyte && ! STRING_MULTIBYTE (args[n]))
3843 convbytes = count_size_as_multibyte (SDATA (args[n]), nbytes);
3845 padding = width < field_width ? field_width - width : 0;
3847 if (max_bufsize - padding <= convbytes)
3848 string_overflow ();
3849 convbytes += padding;
3850 if (convbytes <= buf + bufsize - p)
3852 if (! minus_flag)
3854 memset (p, ' ', padding);
3855 p += padding;
3856 nchars += padding;
3859 if (p > buf
3860 && multibyte
3861 && !ASCII_BYTE_P (*((unsigned char *) p - 1))
3862 && STRING_MULTIBYTE (args[n])
3863 && !CHAR_HEAD_P (SREF (args[n], 0)))
3864 maybe_combine_byte = 1;
3866 p += copy_text (SDATA (args[n]), (unsigned char *) p,
3867 nbytes,
3868 STRING_MULTIBYTE (args[n]), multibyte);
3870 info[n].start = nchars;
3871 nchars += nchars_string;
3872 info[n].end = nchars;
3874 if (minus_flag)
3876 memset (p, ' ', padding);
3877 p += padding;
3878 nchars += padding;
3881 /* If this argument has text properties, record where
3882 in the result string it appears. */
3883 if (STRING_INTERVALS (args[n]))
3884 info[n].intervals = arg_intervals = 1;
3886 continue;
3889 else if (! (conversion == 'c' || conversion == 'd'
3890 || conversion == 'e' || conversion == 'f'
3891 || conversion == 'g' || conversion == 'i'
3892 || conversion == 'o' || conversion == 'x'
3893 || conversion == 'X'))
3894 error ("Invalid format operation %%%c",
3895 STRING_CHAR ((unsigned char *) format - 1));
3896 else if (! (INTEGERP (args[n]) || FLOATP (args[n])))
3897 error ("Format specifier doesn't match argument type");
3898 else
3900 enum
3902 /* Maximum precision for a %f conversion such that the
3903 trailing output digit might be nonzero. Any precisions
3904 larger than this will not yield useful information. */
3905 USEFUL_PRECISION_MAX =
3906 ((1 - DBL_MIN_EXP)
3907 * (FLT_RADIX == 2 || FLT_RADIX == 10 ? 1
3908 : FLT_RADIX == 16 ? 4
3909 : -1)),
3911 /* Maximum number of bytes generated by any format, if
3912 precision is no more than DBL_USEFUL_PRECISION_MAX.
3913 On all practical hosts, %f is the worst case. */
3914 SPRINTF_BUFSIZE =
3915 sizeof "-." + (DBL_MAX_10_EXP + 1) + USEFUL_PRECISION_MAX
3917 verify (0 < USEFUL_PRECISION_MAX);
3919 int prec;
3920 EMACS_INT padding, sprintf_bytes;
3921 uintmax_t excess_precision, numwidth;
3922 uintmax_t leading_zeros = 0, trailing_zeros = 0;
3924 char sprintf_buf[SPRINTF_BUFSIZE];
3926 /* Copy of conversion specification, modified somewhat.
3927 At most three flags F can be specified at once. */
3928 char convspec[sizeof "%FFF.*d" + pWIDElen];
3930 /* Avoid undefined behavior in underlying sprintf. */
3931 if (conversion == 'd' || conversion == 'i')
3932 sharp_flag = 0;
3934 /* Create the copy of the conversion specification, with
3935 any width and precision removed, with ".*" inserted,
3936 and with pWIDE inserted for integer formats. */
3938 char *f = convspec;
3939 *f++ = '%';
3940 *f = '-'; f += minus_flag;
3941 *f = '+'; f += plus_flag;
3942 *f = ' '; f += space_flag;
3943 *f = '#'; f += sharp_flag;
3944 *f = '0'; f += zero_flag;
3945 *f++ = '.';
3946 *f++ = '*';
3947 if (conversion == 'd' || conversion == 'i'
3948 || conversion == 'o' || conversion == 'x'
3949 || conversion == 'X')
3951 memcpy (f, pWIDE, pWIDElen);
3952 f += pWIDElen;
3953 zero_flag &= ~ precision_given;
3955 *f++ = conversion;
3956 *f = '\0';
3959 prec = -1;
3960 if (precision_given)
3961 prec = min (precision, USEFUL_PRECISION_MAX);
3963 /* Use sprintf to format this number into sprintf_buf. Omit
3964 padding and excess precision, though, because sprintf limits
3965 output length to INT_MAX.
3967 There are four types of conversion: double, unsigned
3968 char (passed as int), wide signed int, and wide
3969 unsigned int. Treat them separately because the
3970 sprintf ABI is sensitive to which type is passed. Be
3971 careful about integer overflow, NaNs, infinities, and
3972 conversions; for example, the min and max macros are
3973 not suitable here. */
3974 if (conversion == 'e' || conversion == 'f' || conversion == 'g')
3976 double x = (INTEGERP (args[n])
3977 ? XINT (args[n])
3978 : XFLOAT_DATA (args[n]));
3979 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
3981 else if (conversion == 'c')
3983 /* Don't use sprintf here, as it might mishandle prec. */
3984 sprintf_buf[0] = XINT (args[n]);
3985 sprintf_bytes = prec != 0;
3987 else if (conversion == 'd')
3989 /* For float, maybe we should use "%1.0f"
3990 instead so it also works for values outside
3991 the integer range. */
3992 signed_wide x;
3993 if (INTEGERP (args[n]))
3994 x = XINT (args[n]);
3995 else
3997 double d = XFLOAT_DATA (args[n]);
3998 if (d < 0)
4000 x = TYPE_MINIMUM (signed_wide);
4001 if (x < d)
4002 x = d;
4004 else
4006 x = TYPE_MAXIMUM (signed_wide);
4007 if (d < x)
4008 x = d;
4011 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
4013 else
4015 /* Don't sign-extend for octal or hex printing. */
4016 unsigned_wide x;
4017 if (INTEGERP (args[n]))
4018 x = XUINT (args[n]);
4019 else
4021 double d = XFLOAT_DATA (args[n]);
4022 if (d < 0)
4023 x = 0;
4024 else
4026 x = TYPE_MAXIMUM (unsigned_wide);
4027 if (d < x)
4028 x = d;
4031 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
4034 /* Now the length of the formatted item is known, except it omits
4035 padding and excess precision. Deal with excess precision
4036 first. This happens only when the format specifies
4037 ridiculously large precision. */
4038 excess_precision = precision - prec;
4039 if (excess_precision)
4041 if (conversion == 'e' || conversion == 'f'
4042 || conversion == 'g')
4044 if ((conversion == 'g' && ! sharp_flag)
4045 || ! ('0' <= sprintf_buf[sprintf_bytes - 1]
4046 && sprintf_buf[sprintf_bytes - 1] <= '9'))
4047 excess_precision = 0;
4048 else
4050 if (conversion == 'g')
4052 char *dot = strchr (sprintf_buf, '.');
4053 if (!dot)
4054 excess_precision = 0;
4057 trailing_zeros = excess_precision;
4059 else
4060 leading_zeros = excess_precision;
4063 /* Compute the total bytes needed for this item, including
4064 excess precision and padding. */
4065 numwidth = sprintf_bytes + excess_precision;
4066 padding = numwidth < field_width ? field_width - numwidth : 0;
4067 if (max_bufsize - sprintf_bytes <= excess_precision
4068 || max_bufsize - padding <= numwidth)
4069 string_overflow ();
4070 convbytes = numwidth + padding;
4072 if (convbytes <= buf + bufsize - p)
4074 /* Copy the formatted item from sprintf_buf into buf,
4075 inserting padding and excess-precision zeros. */
4077 char *src = sprintf_buf;
4078 char src0 = src[0];
4079 int exponent_bytes = 0;
4080 int signedp = src0 == '-' || src0 == '+' || src0 == ' ';
4081 int significand_bytes;
4082 if (zero_flag
4083 && ((src[signedp] >= '0' && src[signedp] <= '9')
4084 || (src[signedp] >= 'a' && src[signedp] <= 'f')
4085 || (src[signedp] >= 'A' && src[signedp] <= 'F')))
4087 leading_zeros += padding;
4088 padding = 0;
4091 if (excess_precision
4092 && (conversion == 'e' || conversion == 'g'))
4094 char *e = strchr (src, 'e');
4095 if (e)
4096 exponent_bytes = src + sprintf_bytes - e;
4099 if (! minus_flag)
4101 memset (p, ' ', padding);
4102 p += padding;
4103 nchars += padding;
4106 *p = src0;
4107 src += signedp;
4108 p += signedp;
4109 memset (p, '0', leading_zeros);
4110 p += leading_zeros;
4111 significand_bytes = sprintf_bytes - signedp - exponent_bytes;
4112 memcpy (p, src, significand_bytes);
4113 p += significand_bytes;
4114 src += significand_bytes;
4115 memset (p, '0', trailing_zeros);
4116 p += trailing_zeros;
4117 memcpy (p, src, exponent_bytes);
4118 p += exponent_bytes;
4120 info[n].start = nchars;
4121 nchars += leading_zeros + sprintf_bytes + trailing_zeros;
4122 info[n].end = nchars;
4124 if (minus_flag)
4126 memset (p, ' ', padding);
4127 p += padding;
4128 nchars += padding;
4131 continue;
4135 else
4136 copy_char:
4138 /* Copy a single character from format to buf. */
4140 char *src = format;
4141 unsigned char str[MAX_MULTIBYTE_LENGTH];
4143 if (multibyte_format)
4145 /* Copy a whole multibyte character. */
4146 if (p > buf
4147 && !ASCII_BYTE_P (*((unsigned char *) p - 1))
4148 && !CHAR_HEAD_P (*format))
4149 maybe_combine_byte = 1;
4152 format++;
4153 while (! CHAR_HEAD_P (*format));
4155 convbytes = format - format0;
4156 memset (&discarded[format0 + 1 - format_start], 2, convbytes - 1);
4158 else
4160 unsigned char uc = *format++;
4161 if (! multibyte || ASCII_BYTE_P (uc))
4162 convbytes = 1;
4163 else
4165 int c = BYTE8_TO_CHAR (uc);
4166 convbytes = CHAR_STRING (c, str);
4167 src = (char *) str;
4171 if (convbytes <= buf + bufsize - p)
4173 memcpy (p, src, convbytes);
4174 p += convbytes;
4175 nchars++;
4176 continue;
4180 /* There wasn't enough room to store this conversion or single
4181 character. CONVBYTES says how much room is needed. Allocate
4182 enough room (and then some) and do it again. */
4184 EMACS_INT used = p - buf;
4186 if (max_bufsize - used < convbytes)
4187 string_overflow ();
4188 bufsize = used + convbytes;
4189 bufsize = bufsize < max_bufsize / 2 ? bufsize * 2 : max_bufsize;
4191 if (buf == initial_buffer)
4193 buf = xmalloc (bufsize);
4194 sa_must_free = 1;
4195 buf_save_value = make_save_value (buf, 0);
4196 record_unwind_protect (safe_alloca_unwind, buf_save_value);
4197 memcpy (buf, initial_buffer, used);
4199 else
4200 XSAVE_VALUE (buf_save_value)->pointer = buf = xrealloc (buf, bufsize);
4202 p = buf + used;
4205 format = format0;
4206 n = n0;
4209 if (bufsize < p - buf)
4210 abort ();
4212 if (maybe_combine_byte)
4213 nchars = multibyte_chars_in_text ((unsigned char *) buf, p - buf);
4214 val = make_specified_string (buf, nchars, p - buf, multibyte);
4216 /* If we allocated BUF with malloc, free it too. */
4217 SAFE_FREE ();
4219 /* If the format string has text properties, or any of the string
4220 arguments has text properties, set up text properties of the
4221 result string. */
4223 if (STRING_INTERVALS (args[0]) || arg_intervals)
4225 Lisp_Object len, new_len, props;
4226 struct gcpro gcpro1;
4228 /* Add text properties from the format string. */
4229 len = make_number (SCHARS (args[0]));
4230 props = text_property_list (args[0], make_number (0), len, Qnil);
4231 GCPRO1 (props);
4233 if (CONSP (props))
4235 EMACS_INT bytepos = 0, position = 0, translated = 0;
4236 EMACS_INT argn = 1;
4237 Lisp_Object list;
4239 /* Adjust the bounds of each text property
4240 to the proper start and end in the output string. */
4242 /* Put the positions in PROPS in increasing order, so that
4243 we can do (effectively) one scan through the position
4244 space of the format string. */
4245 props = Fnreverse (props);
4247 /* BYTEPOS is the byte position in the format string,
4248 POSITION is the untranslated char position in it,
4249 TRANSLATED is the translated char position in BUF,
4250 and ARGN is the number of the next arg we will come to. */
4251 for (list = props; CONSP (list); list = XCDR (list))
4253 Lisp_Object item;
4254 EMACS_INT pos;
4256 item = XCAR (list);
4258 /* First adjust the property start position. */
4259 pos = XINT (XCAR (item));
4261 /* Advance BYTEPOS, POSITION, TRANSLATED and ARGN
4262 up to this position. */
4263 for (; position < pos; bytepos++)
4265 if (! discarded[bytepos])
4266 position++, translated++;
4267 else if (discarded[bytepos] == 1)
4269 position++;
4270 if (translated == info[argn].start)
4272 translated += info[argn].end - info[argn].start;
4273 argn++;
4278 XSETCAR (item, make_number (translated));
4280 /* Likewise adjust the property end position. */
4281 pos = XINT (XCAR (XCDR (item)));
4283 for (; position < pos; bytepos++)
4285 if (! discarded[bytepos])
4286 position++, translated++;
4287 else if (discarded[bytepos] == 1)
4289 position++;
4290 if (translated == info[argn].start)
4292 translated += info[argn].end - info[argn].start;
4293 argn++;
4298 XSETCAR (XCDR (item), make_number (translated));
4301 add_text_properties_from_list (val, props, make_number (0));
4304 /* Add text properties from arguments. */
4305 if (arg_intervals)
4306 for (n = 1; n < nargs; ++n)
4307 if (info[n].intervals)
4309 len = make_number (SCHARS (args[n]));
4310 new_len = make_number (info[n].end - info[n].start);
4311 props = text_property_list (args[n], make_number (0), len, Qnil);
4312 props = extend_property_ranges (props, new_len);
4313 /* If successive arguments have properties, be sure that
4314 the value of `composition' property be the copy. */
4315 if (n > 1 && info[n - 1].end)
4316 make_composition_value_copy (props);
4317 add_text_properties_from_list (val, props,
4318 make_number (info[n].start));
4321 UNGCPRO;
4324 return val;
4327 Lisp_Object
4328 format2 (const char *string1, Lisp_Object arg0, Lisp_Object arg1)
4330 Lisp_Object args[3];
4331 args[0] = build_string (string1);
4332 args[1] = arg0;
4333 args[2] = arg1;
4334 return Fformat (3, args);
4337 DEFUN ("char-equal", Fchar_equal, Schar_equal, 2, 2, 0,
4338 doc: /* Return t if two characters match, optionally ignoring case.
4339 Both arguments must be characters (i.e. integers).
4340 Case is ignored if `case-fold-search' is non-nil in the current buffer. */)
4341 (register Lisp_Object c1, Lisp_Object c2)
4343 int i1, i2;
4344 /* Check they're chars, not just integers, otherwise we could get array
4345 bounds violations in downcase. */
4346 CHECK_CHARACTER (c1);
4347 CHECK_CHARACTER (c2);
4349 if (XINT (c1) == XINT (c2))
4350 return Qt;
4351 if (NILP (BVAR (current_buffer, case_fold_search)))
4352 return Qnil;
4354 i1 = XFASTINT (c1);
4355 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
4356 && ! ASCII_CHAR_P (i1))
4358 MAKE_CHAR_MULTIBYTE (i1);
4360 i2 = XFASTINT (c2);
4361 if (NILP (BVAR (current_buffer, enable_multibyte_characters))
4362 && ! ASCII_CHAR_P (i2))
4364 MAKE_CHAR_MULTIBYTE (i2);
4366 return (downcase (i1) == downcase (i2) ? Qt : Qnil);
4369 /* Transpose the markers in two regions of the current buffer, and
4370 adjust the ones between them if necessary (i.e.: if the regions
4371 differ in size).
4373 START1, END1 are the character positions of the first region.
4374 START1_BYTE, END1_BYTE are the byte positions.
4375 START2, END2 are the character positions of the second region.
4376 START2_BYTE, END2_BYTE are the byte positions.
4378 Traverses the entire marker list of the buffer to do so, adding an
4379 appropriate amount to some, subtracting from some, and leaving the
4380 rest untouched. Most of this is copied from adjust_markers in insdel.c.
4382 It's the caller's job to ensure that START1 <= END1 <= START2 <= END2. */
4384 static void
4385 transpose_markers (EMACS_INT start1, EMACS_INT end1,
4386 EMACS_INT start2, EMACS_INT end2,
4387 EMACS_INT start1_byte, EMACS_INT end1_byte,
4388 EMACS_INT start2_byte, EMACS_INT end2_byte)
4390 register EMACS_INT amt1, amt1_byte, amt2, amt2_byte, diff, diff_byte, mpos;
4391 register struct Lisp_Marker *marker;
4393 /* Update point as if it were a marker. */
4394 if (PT < start1)
4396 else if (PT < end1)
4397 TEMP_SET_PT_BOTH (PT + (end2 - end1),
4398 PT_BYTE + (end2_byte - end1_byte));
4399 else if (PT < start2)
4400 TEMP_SET_PT_BOTH (PT + (end2 - start2) - (end1 - start1),
4401 (PT_BYTE + (end2_byte - start2_byte)
4402 - (end1_byte - start1_byte)));
4403 else if (PT < end2)
4404 TEMP_SET_PT_BOTH (PT - (start2 - start1),
4405 PT_BYTE - (start2_byte - start1_byte));
4407 /* We used to adjust the endpoints here to account for the gap, but that
4408 isn't good enough. Even if we assume the caller has tried to move the
4409 gap out of our way, it might still be at start1 exactly, for example;
4410 and that places it `inside' the interval, for our purposes. The amount
4411 of adjustment is nontrivial if there's a `denormalized' marker whose
4412 position is between GPT and GPT + GAP_SIZE, so it's simpler to leave
4413 the dirty work to Fmarker_position, below. */
4415 /* The difference between the region's lengths */
4416 diff = (end2 - start2) - (end1 - start1);
4417 diff_byte = (end2_byte - start2_byte) - (end1_byte - start1_byte);
4419 /* For shifting each marker in a region by the length of the other
4420 region plus the distance between the regions. */
4421 amt1 = (end2 - start2) + (start2 - end1);
4422 amt2 = (end1 - start1) + (start2 - end1);
4423 amt1_byte = (end2_byte - start2_byte) + (start2_byte - end1_byte);
4424 amt2_byte = (end1_byte - start1_byte) + (start2_byte - end1_byte);
4426 for (marker = BUF_MARKERS (current_buffer); marker; marker = marker->next)
4428 mpos = marker->bytepos;
4429 if (mpos >= start1_byte && mpos < end2_byte)
4431 if (mpos < end1_byte)
4432 mpos += amt1_byte;
4433 else if (mpos < start2_byte)
4434 mpos += diff_byte;
4435 else
4436 mpos -= amt2_byte;
4437 marker->bytepos = mpos;
4439 mpos = marker->charpos;
4440 if (mpos >= start1 && mpos < end2)
4442 if (mpos < end1)
4443 mpos += amt1;
4444 else if (mpos < start2)
4445 mpos += diff;
4446 else
4447 mpos -= amt2;
4449 marker->charpos = mpos;
4453 DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5, 0,
4454 doc: /* Transpose region STARTR1 to ENDR1 with STARTR2 to ENDR2.
4455 The regions should not be overlapping, because the size of the buffer is
4456 never changed in a transposition.
4458 Optional fifth arg LEAVE-MARKERS, if non-nil, means don't update
4459 any markers that happen to be located in the regions.
4461 Transposing beyond buffer boundaries is an error. */)
4462 (Lisp_Object startr1, Lisp_Object endr1, Lisp_Object startr2, Lisp_Object endr2, Lisp_Object leave_markers)
4464 register EMACS_INT start1, end1, start2, end2;
4465 EMACS_INT start1_byte, start2_byte, len1_byte, len2_byte;
4466 EMACS_INT gap, len1, len_mid, len2;
4467 unsigned char *start1_addr, *start2_addr, *temp;
4469 INTERVAL cur_intv, tmp_interval1, tmp_interval_mid, tmp_interval2, tmp_interval3;
4470 Lisp_Object buf;
4472 XSETBUFFER (buf, current_buffer);
4473 cur_intv = BUF_INTERVALS (current_buffer);
4475 validate_region (&startr1, &endr1);
4476 validate_region (&startr2, &endr2);
4478 start1 = XFASTINT (startr1);
4479 end1 = XFASTINT (endr1);
4480 start2 = XFASTINT (startr2);
4481 end2 = XFASTINT (endr2);
4482 gap = GPT;
4484 /* Swap the regions if they're reversed. */
4485 if (start2 < end1)
4487 register EMACS_INT glumph = start1;
4488 start1 = start2;
4489 start2 = glumph;
4490 glumph = end1;
4491 end1 = end2;
4492 end2 = glumph;
4495 len1 = end1 - start1;
4496 len2 = end2 - start2;
4498 if (start2 < end1)
4499 error ("Transposed regions overlap");
4500 /* Nothing to change for adjacent regions with one being empty */
4501 else if ((start1 == end1 || start2 == end2) && end1 == start2)
4502 return Qnil;
4504 /* The possibilities are:
4505 1. Adjacent (contiguous) regions, or separate but equal regions
4506 (no, really equal, in this case!), or
4507 2. Separate regions of unequal size.
4509 The worst case is usually No. 2. It means that (aside from
4510 potential need for getting the gap out of the way), there also
4511 needs to be a shifting of the text between the two regions. So
4512 if they are spread far apart, we are that much slower... sigh. */
4514 /* It must be pointed out that the really studly thing to do would
4515 be not to move the gap at all, but to leave it in place and work
4516 around it if necessary. This would be extremely efficient,
4517 especially considering that people are likely to do
4518 transpositions near where they are working interactively, which
4519 is exactly where the gap would be found. However, such code
4520 would be much harder to write and to read. So, if you are
4521 reading this comment and are feeling squirrely, by all means have
4522 a go! I just didn't feel like doing it, so I will simply move
4523 the gap the minimum distance to get it out of the way, and then
4524 deal with an unbroken array. */
4526 /* Make sure the gap won't interfere, by moving it out of the text
4527 we will operate on. */
4528 if (start1 < gap && gap < end2)
4530 if (gap - start1 < end2 - gap)
4531 move_gap (start1);
4532 else
4533 move_gap (end2);
4536 start1_byte = CHAR_TO_BYTE (start1);
4537 start2_byte = CHAR_TO_BYTE (start2);
4538 len1_byte = CHAR_TO_BYTE (end1) - start1_byte;
4539 len2_byte = CHAR_TO_BYTE (end2) - start2_byte;
4541 #ifdef BYTE_COMBINING_DEBUG
4542 if (end1 == start2)
4544 if (count_combining_before (BYTE_POS_ADDR (start2_byte),
4545 len2_byte, start1, start1_byte)
4546 || count_combining_before (BYTE_POS_ADDR (start1_byte),
4547 len1_byte, end2, start2_byte + len2_byte)
4548 || count_combining_after (BYTE_POS_ADDR (start1_byte),
4549 len1_byte, end2, start2_byte + len2_byte))
4550 abort ();
4552 else
4554 if (count_combining_before (BYTE_POS_ADDR (start2_byte),
4555 len2_byte, start1, start1_byte)
4556 || count_combining_before (BYTE_POS_ADDR (start1_byte),
4557 len1_byte, start2, start2_byte)
4558 || count_combining_after (BYTE_POS_ADDR (start2_byte),
4559 len2_byte, end1, start1_byte + len1_byte)
4560 || count_combining_after (BYTE_POS_ADDR (start1_byte),
4561 len1_byte, end2, start2_byte + len2_byte))
4562 abort ();
4564 #endif
4566 /* Hmmm... how about checking to see if the gap is large
4567 enough to use as the temporary storage? That would avoid an
4568 allocation... interesting. Later, don't fool with it now. */
4570 /* Working without memmove, for portability (sigh), so must be
4571 careful of overlapping subsections of the array... */
4573 if (end1 == start2) /* adjacent regions */
4575 modify_region (current_buffer, start1, end2, 0);
4576 record_change (start1, len1 + len2);
4578 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4579 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4580 /* Don't use Fset_text_properties: that can cause GC, which can
4581 clobber objects stored in the tmp_intervals. */
4582 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4583 if (!NULL_INTERVAL_P (tmp_interval3))
4584 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4586 /* First region smaller than second. */
4587 if (len1_byte < len2_byte)
4589 USE_SAFE_ALLOCA;
4591 SAFE_ALLOCA (temp, unsigned char *, len2_byte);
4593 /* Don't precompute these addresses. We have to compute them
4594 at the last minute, because the relocating allocator might
4595 have moved the buffer around during the xmalloc. */
4596 start1_addr = BYTE_POS_ADDR (start1_byte);
4597 start2_addr = BYTE_POS_ADDR (start2_byte);
4599 memcpy (temp, start2_addr, len2_byte);
4600 memcpy (start1_addr + len2_byte, start1_addr, len1_byte);
4601 memcpy (start1_addr, temp, len2_byte);
4602 SAFE_FREE ();
4604 else
4605 /* First region not smaller than second. */
4607 USE_SAFE_ALLOCA;
4609 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4610 start1_addr = BYTE_POS_ADDR (start1_byte);
4611 start2_addr = BYTE_POS_ADDR (start2_byte);
4612 memcpy (temp, start1_addr, len1_byte);
4613 memcpy (start1_addr, start2_addr, len2_byte);
4614 memcpy (start1_addr + len2_byte, temp, len1_byte);
4615 SAFE_FREE ();
4617 graft_intervals_into_buffer (tmp_interval1, start1 + len2,
4618 len1, current_buffer, 0);
4619 graft_intervals_into_buffer (tmp_interval2, start1,
4620 len2, current_buffer, 0);
4621 update_compositions (start1, start1 + len2, CHECK_BORDER);
4622 update_compositions (start1 + len2, end2, CHECK_TAIL);
4624 /* Non-adjacent regions, because end1 != start2, bleagh... */
4625 else
4627 len_mid = start2_byte - (start1_byte + len1_byte);
4629 if (len1_byte == len2_byte)
4630 /* Regions are same size, though, how nice. */
4632 USE_SAFE_ALLOCA;
4634 modify_region (current_buffer, start1, end1, 0);
4635 modify_region (current_buffer, start2, end2, 0);
4636 record_change (start1, len1);
4637 record_change (start2, len2);
4638 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4639 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4641 tmp_interval3 = validate_interval_range (buf, &startr1, &endr1, 0);
4642 if (!NULL_INTERVAL_P (tmp_interval3))
4643 set_text_properties_1 (startr1, endr1, Qnil, buf, tmp_interval3);
4645 tmp_interval3 = validate_interval_range (buf, &startr2, &endr2, 0);
4646 if (!NULL_INTERVAL_P (tmp_interval3))
4647 set_text_properties_1 (startr2, endr2, Qnil, buf, tmp_interval3);
4649 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4650 start1_addr = BYTE_POS_ADDR (start1_byte);
4651 start2_addr = BYTE_POS_ADDR (start2_byte);
4652 memcpy (temp, start1_addr, len1_byte);
4653 memcpy (start1_addr, start2_addr, len2_byte);
4654 memcpy (start2_addr, temp, len1_byte);
4655 SAFE_FREE ();
4657 graft_intervals_into_buffer (tmp_interval1, start2,
4658 len1, current_buffer, 0);
4659 graft_intervals_into_buffer (tmp_interval2, start1,
4660 len2, current_buffer, 0);
4663 else if (len1_byte < len2_byte) /* Second region larger than first */
4664 /* Non-adjacent & unequal size, area between must also be shifted. */
4666 USE_SAFE_ALLOCA;
4668 modify_region (current_buffer, start1, end2, 0);
4669 record_change (start1, (end2 - start1));
4670 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4671 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4672 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4674 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4675 if (!NULL_INTERVAL_P (tmp_interval3))
4676 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4678 /* holds region 2 */
4679 SAFE_ALLOCA (temp, unsigned char *, len2_byte);
4680 start1_addr = BYTE_POS_ADDR (start1_byte);
4681 start2_addr = BYTE_POS_ADDR (start2_byte);
4682 memcpy (temp, start2_addr, len2_byte);
4683 memcpy (start1_addr + len_mid + len2_byte, start1_addr, len1_byte);
4684 memmove (start1_addr + len2_byte, start1_addr + len1_byte, len_mid);
4685 memcpy (start1_addr, temp, len2_byte);
4686 SAFE_FREE ();
4688 graft_intervals_into_buffer (tmp_interval1, end2 - len1,
4689 len1, current_buffer, 0);
4690 graft_intervals_into_buffer (tmp_interval_mid, start1 + len2,
4691 len_mid, current_buffer, 0);
4692 graft_intervals_into_buffer (tmp_interval2, start1,
4693 len2, current_buffer, 0);
4695 else
4696 /* Second region smaller than first. */
4698 USE_SAFE_ALLOCA;
4700 record_change (start1, (end2 - start1));
4701 modify_region (current_buffer, start1, end2, 0);
4703 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4704 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4705 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4707 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4708 if (!NULL_INTERVAL_P (tmp_interval3))
4709 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4711 /* holds region 1 */
4712 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4713 start1_addr = BYTE_POS_ADDR (start1_byte);
4714 start2_addr = BYTE_POS_ADDR (start2_byte);
4715 memcpy (temp, start1_addr, len1_byte);
4716 memcpy (start1_addr, start2_addr, len2_byte);
4717 memcpy (start1_addr + len2_byte, start1_addr + len1_byte, len_mid);
4718 memcpy (start1_addr + len2_byte + len_mid, temp, len1_byte);
4719 SAFE_FREE ();
4721 graft_intervals_into_buffer (tmp_interval1, end2 - len1,
4722 len1, current_buffer, 0);
4723 graft_intervals_into_buffer (tmp_interval_mid, start1 + len2,
4724 len_mid, current_buffer, 0);
4725 graft_intervals_into_buffer (tmp_interval2, start1,
4726 len2, current_buffer, 0);
4729 update_compositions (start1, start1 + len2, CHECK_BORDER);
4730 update_compositions (end2 - len1, end2, CHECK_BORDER);
4733 /* When doing multiple transpositions, it might be nice
4734 to optimize this. Perhaps the markers in any one buffer
4735 should be organized in some sorted data tree. */
4736 if (NILP (leave_markers))
4738 transpose_markers (start1, end1, start2, end2,
4739 start1_byte, start1_byte + len1_byte,
4740 start2_byte, start2_byte + len2_byte);
4741 fix_start_end_in_overlays (start1, end2);
4744 signal_after_change (start1, end2 - start1, end2 - start1);
4745 return Qnil;
4749 void
4750 syms_of_editfns (void)
4752 environbuf = 0;
4753 initial_tz = 0;
4755 Qbuffer_access_fontify_functions
4756 = intern_c_string ("buffer-access-fontify-functions");
4757 staticpro (&Qbuffer_access_fontify_functions);
4759 DEFVAR_LISP ("inhibit-field-text-motion", Vinhibit_field_text_motion,
4760 doc: /* Non-nil means text motion commands don't notice fields. */);
4761 Vinhibit_field_text_motion = Qnil;
4763 DEFVAR_LISP ("buffer-access-fontify-functions",
4764 Vbuffer_access_fontify_functions,
4765 doc: /* List of functions called by `buffer-substring' to fontify if necessary.
4766 Each function is called with two arguments which specify the range
4767 of the buffer being accessed. */);
4768 Vbuffer_access_fontify_functions = Qnil;
4771 Lisp_Object obuf;
4772 obuf = Fcurrent_buffer ();
4773 /* Do this here, because init_buffer_once is too early--it won't work. */
4774 Fset_buffer (Vprin1_to_string_buffer);
4775 /* Make sure buffer-access-fontify-functions is nil in this buffer. */
4776 Fset (Fmake_local_variable (intern_c_string ("buffer-access-fontify-functions")),
4777 Qnil);
4778 Fset_buffer (obuf);
4781 DEFVAR_LISP ("buffer-access-fontified-property",
4782 Vbuffer_access_fontified_property,
4783 doc: /* Property which (if non-nil) indicates text has been fontified.
4784 `buffer-substring' need not call the `buffer-access-fontify-functions'
4785 functions if all the text being accessed has this property. */);
4786 Vbuffer_access_fontified_property = Qnil;
4788 DEFVAR_LISP ("system-name", Vsystem_name,
4789 doc: /* The host name of the machine Emacs is running on. */);
4791 DEFVAR_LISP ("user-full-name", Vuser_full_name,
4792 doc: /* The full name of the user logged in. */);
4794 DEFVAR_LISP ("user-login-name", Vuser_login_name,
4795 doc: /* The user's name, taken from environment variables if possible. */);
4797 DEFVAR_LISP ("user-real-login-name", Vuser_real_login_name,
4798 doc: /* The user's name, based upon the real uid only. */);
4800 DEFVAR_LISP ("operating-system-release", Voperating_system_release,
4801 doc: /* The release of the operating system Emacs is running on. */);
4803 defsubr (&Spropertize);
4804 defsubr (&Schar_equal);
4805 defsubr (&Sgoto_char);
4806 defsubr (&Sstring_to_char);
4807 defsubr (&Schar_to_string);
4808 defsubr (&Sbyte_to_string);
4809 defsubr (&Sbuffer_substring);
4810 defsubr (&Sbuffer_substring_no_properties);
4811 defsubr (&Sbuffer_string);
4813 defsubr (&Spoint_marker);
4814 defsubr (&Smark_marker);
4815 defsubr (&Spoint);
4816 defsubr (&Sregion_beginning);
4817 defsubr (&Sregion_end);
4819 staticpro (&Qfield);
4820 Qfield = intern_c_string ("field");
4821 staticpro (&Qboundary);
4822 Qboundary = intern_c_string ("boundary");
4823 defsubr (&Sfield_beginning);
4824 defsubr (&Sfield_end);
4825 defsubr (&Sfield_string);
4826 defsubr (&Sfield_string_no_properties);
4827 defsubr (&Sdelete_field);
4828 defsubr (&Sconstrain_to_field);
4830 defsubr (&Sline_beginning_position);
4831 defsubr (&Sline_end_position);
4833 /* defsubr (&Smark); */
4834 /* defsubr (&Sset_mark); */
4835 defsubr (&Ssave_excursion);
4836 defsubr (&Ssave_current_buffer);
4838 defsubr (&Sbufsize);
4839 defsubr (&Spoint_max);
4840 defsubr (&Spoint_min);
4841 defsubr (&Spoint_min_marker);
4842 defsubr (&Spoint_max_marker);
4843 defsubr (&Sgap_position);
4844 defsubr (&Sgap_size);
4845 defsubr (&Sposition_bytes);
4846 defsubr (&Sbyte_to_position);
4848 defsubr (&Sbobp);
4849 defsubr (&Seobp);
4850 defsubr (&Sbolp);
4851 defsubr (&Seolp);
4852 defsubr (&Sfollowing_char);
4853 defsubr (&Sprevious_char);
4854 defsubr (&Schar_after);
4855 defsubr (&Schar_before);
4856 defsubr (&Sinsert);
4857 defsubr (&Sinsert_before_markers);
4858 defsubr (&Sinsert_and_inherit);
4859 defsubr (&Sinsert_and_inherit_before_markers);
4860 defsubr (&Sinsert_char);
4861 defsubr (&Sinsert_byte);
4863 defsubr (&Suser_login_name);
4864 defsubr (&Suser_real_login_name);
4865 defsubr (&Suser_uid);
4866 defsubr (&Suser_real_uid);
4867 defsubr (&Suser_full_name);
4868 defsubr (&Semacs_pid);
4869 defsubr (&Scurrent_time);
4870 defsubr (&Sget_internal_run_time);
4871 defsubr (&Sformat_time_string);
4872 defsubr (&Sfloat_time);
4873 defsubr (&Sdecode_time);
4874 defsubr (&Sencode_time);
4875 defsubr (&Scurrent_time_string);
4876 defsubr (&Scurrent_time_zone);
4877 defsubr (&Sset_time_zone_rule);
4878 defsubr (&Ssystem_name);
4879 defsubr (&Smessage);
4880 defsubr (&Smessage_box);
4881 defsubr (&Smessage_or_box);
4882 defsubr (&Scurrent_message);
4883 defsubr (&Sformat);
4885 defsubr (&Sinsert_buffer_substring);
4886 defsubr (&Scompare_buffer_substrings);
4887 defsubr (&Ssubst_char_in_region);
4888 defsubr (&Stranslate_region_internal);
4889 defsubr (&Sdelete_region);
4890 defsubr (&Sdelete_and_extract_region);
4891 defsubr (&Swiden);
4892 defsubr (&Snarrow_to_region);
4893 defsubr (&Ssave_restriction);
4894 defsubr (&Stranspose_regions);