]> code.delx.au - gnu-emacs/blob - src/editfns.c
Fix 'transpose-regions' when LEAVE-MARKERS arg is non-nil
[gnu-emacs] / src / editfns.c
1 /* Lisp functions pertaining to editing. -*- coding: utf-8 -*-
2
3 Copyright (C) 1985-1987, 1989, 1993-2016 Free Software Foundation, Inc.
4
5 This file is part of GNU Emacs.
6
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 (at
10 your option) any later version.
11
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.
16
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/>. */
19
20
21 #include <config.h>
22 #include <sys/types.h>
23 #include <stdio.h>
24
25 #ifdef HAVE_PWD_H
26 #include <pwd.h>
27 #include <grp.h>
28 #endif
29
30 #include <unistd.h>
31
32 #ifdef HAVE_SYS_UTSNAME_H
33 #include <sys/utsname.h>
34 #endif
35
36 #include "lisp.h"
37
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"
42
43 #if defined HAVE_SYS_RESOURCE_H
44 #include <sys/resource.h>
45 #endif
46
47 #include <errno.h>
48 #include <float.h>
49 #include <limits.h>
50
51 #include <intprops.h>
52 #include <strftime.h>
53 #include <verify.h>
54
55 #include "composite.h"
56 #include "intervals.h"
57 #include "character.h"
58 #include "buffer.h"
59 #include "coding.h"
60 #include "window.h"
61 #include "blockinput.h"
62
63 #define TM_YEAR_BASE 1900
64
65 #ifdef WINDOWSNT
66 extern Lisp_Object w32_get_internal_run_time (void);
67 #endif
68
69 static struct lisp_time lisp_time_struct (Lisp_Object, int *);
70 static Lisp_Object format_time_string (char const *, ptrdiff_t, struct timespec,
71 Lisp_Object, struct tm *);
72 static long int tm_gmtoff (struct tm *);
73 static int tm_diff (struct tm *, struct tm *);
74 static void update_buffer_properties (ptrdiff_t, ptrdiff_t);
75 static Lisp_Object styled_format (ptrdiff_t, Lisp_Object *, bool);
76
77 #ifndef HAVE_TM_GMTOFF
78 # define HAVE_TM_GMTOFF false
79 #endif
80
81 enum { tzeqlen = sizeof "TZ=" - 1 };
82
83 /* Time zones equivalent to current local time, to wall clock time,
84 and to UTC, respectively. */
85 static timezone_t local_tz;
86 static timezone_t wall_clock_tz;
87 static timezone_t const utc_tz = 0;
88
89 /* A valid but unlikely setting for the TZ environment variable.
90 It is OK (though a bit slower) if the user chooses this value. */
91 static char dump_tz_string[] = "TZ=UtC0";
92
93 /* The cached value of Vsystem_name. This is used only to compare it
94 to Vsystem_name, so it need not be visible to the GC. */
95 static Lisp_Object cached_system_name;
96
97 static void
98 init_and_cache_system_name (void)
99 {
100 init_system_name ();
101 cached_system_name = Vsystem_name;
102 }
103
104 static struct tm *
105 emacs_localtime_rz (timezone_t tz, time_t const *t, struct tm *tm)
106 {
107 tm = localtime_rz (tz, t, tm);
108 if (!tm && errno == ENOMEM)
109 memory_full (SIZE_MAX);
110 return tm;
111 }
112
113 static time_t
114 emacs_mktime_z (timezone_t tz, struct tm *tm)
115 {
116 errno = 0;
117 time_t t = mktime_z (tz, tm);
118 if (t == (time_t) -1 && errno == ENOMEM)
119 memory_full (SIZE_MAX);
120 return t;
121 }
122
123 /* Allocate a timezone, signaling on failure. */
124 static timezone_t
125 xtzalloc (char const *name)
126 {
127 timezone_t tz = tzalloc (name);
128 if (!tz)
129 memory_full (SIZE_MAX);
130 return tz;
131 }
132
133 /* Free a timezone, except do not free the time zone for local time.
134 Freeing utc_tz is also a no-op. */
135 static void
136 xtzfree (timezone_t tz)
137 {
138 if (tz != local_tz)
139 tzfree (tz);
140 }
141
142 /* Convert the Lisp time zone rule ZONE to a timezone_t object.
143 The returned value either is 0, or is LOCAL_TZ, or is newly allocated.
144 If SETTZ, set Emacs local time to the time zone rule; otherwise,
145 the caller should eventually pass the returned value to xtzfree. */
146 static timezone_t
147 tzlookup (Lisp_Object zone, bool settz)
148 {
149 char const *zone_string;
150 timezone_t new_tz;
151
152 if (NILP (zone))
153 return local_tz;
154 else if (EQ (zone, Qt))
155 {
156 zone_string = "UTC0";
157 new_tz = utc_tz;
158 }
159 else
160 {
161 static char const tzbuf_format[] = "<%+.*"pI"d>%s%"pI"d:%02d:%02d";
162 char const *trailing_tzbuf_format = tzbuf_format + sizeof "<%+.*"pI"d" - 1;
163 char tzbuf[sizeof tzbuf_format + 2 * INT_STRLEN_BOUND (EMACS_INT)];
164 bool plain_integer = INTEGERP (zone);
165
166 if (EQ (zone, Qwall))
167 zone_string = 0;
168 else if (STRINGP (zone))
169 zone_string = SSDATA (ENCODE_SYSTEM (zone));
170 else if (plain_integer || (CONSP (zone) && INTEGERP (XCAR (zone))
171 && CONSP (XCDR (zone))))
172 {
173 Lisp_Object abbr;
174 if (!plain_integer)
175 {
176 abbr = XCAR (XCDR (zone));
177 zone = XCAR (zone);
178 }
179
180 EMACS_INT abszone = eabs (XINT (zone)), hour = abszone / (60 * 60);
181 int hour_remainder = abszone % (60 * 60);
182 int min = hour_remainder / 60, sec = hour_remainder % 60;
183
184 if (plain_integer)
185 {
186 int prec = 2;
187 EMACS_INT numzone = hour;
188 if (hour_remainder != 0)
189 {
190 prec += 2, numzone = 100 * numzone + min;
191 if (sec != 0)
192 prec += 2, numzone = 100 * numzone + sec;
193 }
194 sprintf (tzbuf, tzbuf_format, prec, numzone,
195 &"-"[XINT (zone) < 0], hour, min, sec);
196 zone_string = tzbuf;
197 }
198 else
199 {
200 AUTO_STRING (leading, "<");
201 AUTO_STRING_WITH_LEN (trailing, tzbuf,
202 sprintf (tzbuf, trailing_tzbuf_format,
203 &"-"[XINT (zone) < 0],
204 hour, min, sec));
205 zone_string = SSDATA (concat3 (leading, ENCODE_SYSTEM (abbr),
206 trailing));
207 }
208 }
209 else
210 xsignal2 (Qerror, build_string ("Invalid time zone specification"),
211 zone);
212 new_tz = xtzalloc (zone_string);
213 }
214
215 if (settz)
216 {
217 block_input ();
218 emacs_setenv_TZ (zone_string);
219 tzset ();
220 timezone_t old_tz = local_tz;
221 local_tz = new_tz;
222 tzfree (old_tz);
223 unblock_input ();
224 }
225
226 return new_tz;
227 }
228
229 void
230 init_editfns (bool dumping)
231 {
232 const char *user_name;
233 register char *p;
234 struct passwd *pw; /* password entry for the current user */
235 Lisp_Object tem;
236
237 /* Set up system_name even when dumping. */
238 init_and_cache_system_name ();
239
240 #ifndef CANNOT_DUMP
241 /* When just dumping out, set the time zone to a known unlikely value
242 and skip the rest of this function. */
243 if (dumping)
244 {
245 # ifdef HAVE_TZSET
246 xputenv (dump_tz_string);
247 tzset ();
248 # endif
249 return;
250 }
251 #endif
252
253 char *tz = getenv ("TZ");
254
255 #if !defined CANNOT_DUMP && defined HAVE_TZSET
256 /* If the execution TZ happens to be the same as the dump TZ,
257 change it to some other value and then change it back,
258 to force the underlying implementation to reload the TZ info.
259 This is needed on implementations that load TZ info from files,
260 since the TZ file contents may differ between dump and execution. */
261 if (tz && strcmp (tz, &dump_tz_string[tzeqlen]) == 0)
262 {
263 ++*tz;
264 tzset ();
265 --*tz;
266 }
267 #endif
268
269 /* Set the time zone rule now, so that the call to putenv is done
270 before multiple threads are active. */
271 wall_clock_tz = xtzalloc (0);
272 tzlookup (tz ? build_string (tz) : Qwall, true);
273
274 pw = getpwuid (getuid ());
275 #ifdef MSDOS
276 /* We let the real user name default to "root" because that's quite
277 accurate on MS-DOS and because it lets Emacs find the init file.
278 (The DVX libraries override the Djgpp libraries here.) */
279 Vuser_real_login_name = build_string (pw ? pw->pw_name : "root");
280 #else
281 Vuser_real_login_name = build_string (pw ? pw->pw_name : "unknown");
282 #endif
283
284 /* Get the effective user name, by consulting environment variables,
285 or the effective uid if those are unset. */
286 user_name = getenv ("LOGNAME");
287 if (!user_name)
288 #ifdef WINDOWSNT
289 user_name = getenv ("USERNAME"); /* it's USERNAME on NT */
290 #else /* WINDOWSNT */
291 user_name = getenv ("USER");
292 #endif /* WINDOWSNT */
293 if (!user_name)
294 {
295 pw = getpwuid (geteuid ());
296 user_name = pw ? pw->pw_name : "unknown";
297 }
298 Vuser_login_name = build_string (user_name);
299
300 /* If the user name claimed in the environment vars differs from
301 the real uid, use the claimed name to find the full name. */
302 tem = Fstring_equal (Vuser_login_name, Vuser_real_login_name);
303 if (! NILP (tem))
304 tem = Vuser_login_name;
305 else
306 {
307 uid_t euid = geteuid ();
308 tem = make_fixnum_or_float (euid);
309 }
310 Vuser_full_name = Fuser_full_name (tem);
311
312 p = getenv ("NAME");
313 if (p)
314 Vuser_full_name = build_string (p);
315 else if (NILP (Vuser_full_name))
316 Vuser_full_name = build_string ("unknown");
317
318 #ifdef HAVE_SYS_UTSNAME_H
319 {
320 struct utsname uts;
321 uname (&uts);
322 Voperating_system_release = build_string (uts.release);
323 }
324 #else
325 Voperating_system_release = Qnil;
326 #endif
327 }
328 \f
329 DEFUN ("char-to-string", Fchar_to_string, Schar_to_string, 1, 1, 0,
330 doc: /* Convert arg CHAR to a string containing that character.
331 usage: (char-to-string CHAR) */)
332 (Lisp_Object character)
333 {
334 int c, len;
335 unsigned char str[MAX_MULTIBYTE_LENGTH];
336
337 CHECK_CHARACTER (character);
338 c = XFASTINT (character);
339
340 len = CHAR_STRING (c, str);
341 return make_string_from_bytes ((char *) str, 1, len);
342 }
343
344 DEFUN ("byte-to-string", Fbyte_to_string, Sbyte_to_string, 1, 1, 0,
345 doc: /* Convert arg BYTE to a unibyte string containing that byte. */)
346 (Lisp_Object byte)
347 {
348 unsigned char b;
349 CHECK_NUMBER (byte);
350 if (XINT (byte) < 0 || XINT (byte) > 255)
351 error ("Invalid byte");
352 b = XINT (byte);
353 return make_string_from_bytes ((char *) &b, 1, 1);
354 }
355
356 DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
357 doc: /* Return the first character in STRING. */)
358 (register Lisp_Object string)
359 {
360 register Lisp_Object val;
361 CHECK_STRING (string);
362 if (SCHARS (string))
363 {
364 if (STRING_MULTIBYTE (string))
365 XSETFASTINT (val, STRING_CHAR (SDATA (string)));
366 else
367 XSETFASTINT (val, SREF (string, 0));
368 }
369 else
370 XSETFASTINT (val, 0);
371 return val;
372 }
373
374 DEFUN ("point", Fpoint, Spoint, 0, 0, 0,
375 doc: /* Return value of point, as an integer.
376 Beginning of buffer is position (point-min). */)
377 (void)
378 {
379 Lisp_Object temp;
380 XSETFASTINT (temp, PT);
381 return temp;
382 }
383
384 DEFUN ("point-marker", Fpoint_marker, Spoint_marker, 0, 0, 0,
385 doc: /* Return value of point, as a marker object. */)
386 (void)
387 {
388 return build_marker (current_buffer, PT, PT_BYTE);
389 }
390
391 DEFUN ("goto-char", Fgoto_char, Sgoto_char, 1, 1, "NGoto char: ",
392 doc: /* Set point to POSITION, a number or marker.
393 Beginning of buffer is position (point-min), end is (point-max).
394
395 The return value is POSITION. */)
396 (register Lisp_Object position)
397 {
398 if (MARKERP (position))
399 set_point_from_marker (position);
400 else if (INTEGERP (position))
401 SET_PT (clip_to_bounds (BEGV, XINT (position), ZV));
402 else
403 wrong_type_argument (Qinteger_or_marker_p, position);
404 return position;
405 }
406
407
408 /* Return the start or end position of the region.
409 BEGINNINGP means return the start.
410 If there is no region active, signal an error. */
411
412 static Lisp_Object
413 region_limit (bool beginningp)
414 {
415 Lisp_Object m;
416
417 if (!NILP (Vtransient_mark_mode)
418 && NILP (Vmark_even_if_inactive)
419 && NILP (BVAR (current_buffer, mark_active)))
420 xsignal0 (Qmark_inactive);
421
422 m = Fmarker_position (BVAR (current_buffer, mark));
423 if (NILP (m))
424 error ("The mark is not set now, so there is no region");
425
426 /* Clip to the current narrowing (bug#11770). */
427 return make_number ((PT < XFASTINT (m)) == beginningp
428 ? PT
429 : clip_to_bounds (BEGV, XFASTINT (m), ZV));
430 }
431
432 DEFUN ("region-beginning", Fregion_beginning, Sregion_beginning, 0, 0, 0,
433 doc: /* Return the integer value of point or mark, whichever is smaller. */)
434 (void)
435 {
436 return region_limit (1);
437 }
438
439 DEFUN ("region-end", Fregion_end, Sregion_end, 0, 0, 0,
440 doc: /* Return the integer value of point or mark, whichever is larger. */)
441 (void)
442 {
443 return region_limit (0);
444 }
445
446 DEFUN ("mark-marker", Fmark_marker, Smark_marker, 0, 0, 0,
447 doc: /* Return this buffer's mark, as a marker object.
448 Watch out! Moving this marker changes the mark position.
449 If you set the marker not to point anywhere, the buffer will have no mark. */)
450 (void)
451 {
452 return BVAR (current_buffer, mark);
453 }
454
455 \f
456 /* Find all the overlays in the current buffer that touch position POS.
457 Return the number found, and store them in a vector in VEC
458 of length LEN. */
459
460 static ptrdiff_t
461 overlays_around (EMACS_INT pos, Lisp_Object *vec, ptrdiff_t len)
462 {
463 Lisp_Object overlay, start, end;
464 struct Lisp_Overlay *tail;
465 ptrdiff_t startpos, endpos;
466 ptrdiff_t idx = 0;
467
468 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
469 {
470 XSETMISC (overlay, tail);
471
472 end = OVERLAY_END (overlay);
473 endpos = OVERLAY_POSITION (end);
474 if (endpos < pos)
475 break;
476 start = OVERLAY_START (overlay);
477 startpos = OVERLAY_POSITION (start);
478 if (startpos <= pos)
479 {
480 if (idx < len)
481 vec[idx] = overlay;
482 /* Keep counting overlays even if we can't return them all. */
483 idx++;
484 }
485 }
486
487 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
488 {
489 XSETMISC (overlay, tail);
490
491 start = OVERLAY_START (overlay);
492 startpos = OVERLAY_POSITION (start);
493 if (pos < startpos)
494 break;
495 end = OVERLAY_END (overlay);
496 endpos = OVERLAY_POSITION (end);
497 if (pos <= endpos)
498 {
499 if (idx < len)
500 vec[idx] = overlay;
501 idx++;
502 }
503 }
504
505 return idx;
506 }
507
508 DEFUN ("get-pos-property", Fget_pos_property, Sget_pos_property, 2, 3, 0,
509 doc: /* Return the value of POSITION's property PROP, in OBJECT.
510 Almost identical to `get-char-property' except for the following difference:
511 Whereas `get-char-property' returns the property of the char at (i.e. right
512 after) POSITION, this pays attention to properties's stickiness and overlays's
513 advancement settings, in order to find the property of POSITION itself,
514 i.e. the property that a char would inherit if it were inserted
515 at POSITION. */)
516 (Lisp_Object position, register Lisp_Object prop, Lisp_Object object)
517 {
518 CHECK_NUMBER_COERCE_MARKER (position);
519
520 if (NILP (object))
521 XSETBUFFER (object, current_buffer);
522 else if (WINDOWP (object))
523 object = XWINDOW (object)->contents;
524
525 if (!BUFFERP (object))
526 /* pos-property only makes sense in buffers right now, since strings
527 have no overlays and no notion of insertion for which stickiness
528 could be obeyed. */
529 return Fget_text_property (position, prop, object);
530 else
531 {
532 EMACS_INT posn = XINT (position);
533 ptrdiff_t noverlays;
534 Lisp_Object *overlay_vec, tem;
535 struct buffer *obuf = current_buffer;
536 USE_SAFE_ALLOCA;
537
538 set_buffer_temp (XBUFFER (object));
539
540 /* First try with room for 40 overlays. */
541 Lisp_Object overlay_vecbuf[40];
542 noverlays = ARRAYELTS (overlay_vecbuf);
543 overlay_vec = overlay_vecbuf;
544 noverlays = overlays_around (posn, overlay_vec, noverlays);
545
546 /* If there are more than 40,
547 make enough space for all, and try again. */
548 if (ARRAYELTS (overlay_vecbuf) < noverlays)
549 {
550 SAFE_ALLOCA_LISP (overlay_vec, noverlays);
551 noverlays = overlays_around (posn, overlay_vec, noverlays);
552 }
553 noverlays = sort_overlays (overlay_vec, noverlays, NULL);
554
555 set_buffer_temp (obuf);
556
557 /* Now check the overlays in order of decreasing priority. */
558 while (--noverlays >= 0)
559 {
560 Lisp_Object ol = overlay_vec[noverlays];
561 tem = Foverlay_get (ol, prop);
562 if (!NILP (tem))
563 {
564 /* Check the overlay is indeed active at point. */
565 Lisp_Object start = OVERLAY_START (ol), finish = OVERLAY_END (ol);
566 if ((OVERLAY_POSITION (start) == posn
567 && XMARKER (start)->insertion_type == 1)
568 || (OVERLAY_POSITION (finish) == posn
569 && XMARKER (finish)->insertion_type == 0))
570 ; /* The overlay will not cover a char inserted at point. */
571 else
572 {
573 SAFE_FREE ();
574 return tem;
575 }
576 }
577 }
578 SAFE_FREE ();
579
580 { /* Now check the text properties. */
581 int stickiness = text_property_stickiness (prop, position, object);
582 if (stickiness > 0)
583 return Fget_text_property (position, prop, object);
584 else if (stickiness < 0
585 && XINT (position) > BUF_BEGV (XBUFFER (object)))
586 return Fget_text_property (make_number (XINT (position) - 1),
587 prop, object);
588 else
589 return Qnil;
590 }
591 }
592 }
593
594 /* Find the field surrounding POS in *BEG and *END. If POS is nil,
595 the value of point is used instead. If BEG or END is null,
596 means don't store the beginning or end of the field.
597
598 BEG_LIMIT and END_LIMIT serve to limit the ranged of the returned
599 results; they do not effect boundary behavior.
600
601 If MERGE_AT_BOUNDARY is non-nil, then if POS is at the very first
602 position of a field, then the beginning of the previous field is
603 returned instead of the beginning of POS's field (since the end of a
604 field is actually also the beginning of the next input field, this
605 behavior is sometimes useful). Additionally in the MERGE_AT_BOUNDARY
606 non-nil case, if two fields are separated by a field with the special
607 value `boundary', and POS lies within it, then the two separated
608 fields are considered to be adjacent, and POS between them, when
609 finding the beginning and ending of the "merged" field.
610
611 Either BEG or END may be 0, in which case the corresponding value
612 is not stored. */
613
614 static void
615 find_field (Lisp_Object pos, Lisp_Object merge_at_boundary,
616 Lisp_Object beg_limit,
617 ptrdiff_t *beg, Lisp_Object end_limit, ptrdiff_t *end)
618 {
619 /* Fields right before and after the point. */
620 Lisp_Object before_field, after_field;
621 /* True if POS counts as the start of a field. */
622 bool at_field_start = 0;
623 /* True if POS counts as the end of a field. */
624 bool at_field_end = 0;
625
626 if (NILP (pos))
627 XSETFASTINT (pos, PT);
628 else
629 CHECK_NUMBER_COERCE_MARKER (pos);
630
631 after_field
632 = get_char_property_and_overlay (pos, Qfield, Qnil, NULL);
633 before_field
634 = (XFASTINT (pos) > BEGV
635 ? get_char_property_and_overlay (make_number (XINT (pos) - 1),
636 Qfield, Qnil, NULL)
637 /* Using nil here would be a more obvious choice, but it would
638 fail when the buffer starts with a non-sticky field. */
639 : after_field);
640
641 /* See if we need to handle the case where MERGE_AT_BOUNDARY is nil
642 and POS is at beginning of a field, which can also be interpreted
643 as the end of the previous field. Note that the case where if
644 MERGE_AT_BOUNDARY is non-nil (see function comment) is actually the
645 more natural one; then we avoid treating the beginning of a field
646 specially. */
647 if (NILP (merge_at_boundary))
648 {
649 Lisp_Object field = Fget_pos_property (pos, Qfield, Qnil);
650 if (!EQ (field, after_field))
651 at_field_end = 1;
652 if (!EQ (field, before_field))
653 at_field_start = 1;
654 if (NILP (field) && at_field_start && at_field_end)
655 /* If an inserted char would have a nil field while the surrounding
656 text is non-nil, we're probably not looking at a
657 zero-length field, but instead at a non-nil field that's
658 not intended for editing (such as comint's prompts). */
659 at_field_end = at_field_start = 0;
660 }
661
662 /* Note about special `boundary' fields:
663
664 Consider the case where the point (`.') is between the fields `x' and `y':
665
666 xxxx.yyyy
667
668 In this situation, if merge_at_boundary is non-nil, consider the
669 `x' and `y' fields as forming one big merged field, and so the end
670 of the field is the end of `y'.
671
672 However, if `x' and `y' are separated by a special `boundary' field
673 (a field with a `field' char-property of 'boundary), then ignore
674 this special field when merging adjacent fields. Here's the same
675 situation, but with a `boundary' field between the `x' and `y' fields:
676
677 xxx.BBBByyyy
678
679 Here, if point is at the end of `x', the beginning of `y', or
680 anywhere in-between (within the `boundary' field), merge all
681 three fields and consider the beginning as being the beginning of
682 the `x' field, and the end as being the end of the `y' field. */
683
684 if (beg)
685 {
686 if (at_field_start)
687 /* POS is at the edge of a field, and we should consider it as
688 the beginning of the following field. */
689 *beg = XFASTINT (pos);
690 else
691 /* Find the previous field boundary. */
692 {
693 Lisp_Object p = pos;
694 if (!NILP (merge_at_boundary) && EQ (before_field, Qboundary))
695 /* Skip a `boundary' field. */
696 p = Fprevious_single_char_property_change (p, Qfield, Qnil,
697 beg_limit);
698
699 p = Fprevious_single_char_property_change (p, Qfield, Qnil,
700 beg_limit);
701 *beg = NILP (p) ? BEGV : XFASTINT (p);
702 }
703 }
704
705 if (end)
706 {
707 if (at_field_end)
708 /* POS is at the edge of a field, and we should consider it as
709 the end of the previous field. */
710 *end = XFASTINT (pos);
711 else
712 /* Find the next field boundary. */
713 {
714 if (!NILP (merge_at_boundary) && EQ (after_field, Qboundary))
715 /* Skip a `boundary' field. */
716 pos = Fnext_single_char_property_change (pos, Qfield, Qnil,
717 end_limit);
718
719 pos = Fnext_single_char_property_change (pos, Qfield, Qnil,
720 end_limit);
721 *end = NILP (pos) ? ZV : XFASTINT (pos);
722 }
723 }
724 }
725
726 \f
727 DEFUN ("delete-field", Fdelete_field, Sdelete_field, 0, 1, 0,
728 doc: /* Delete the field surrounding POS.
729 A field is a region of text with the same `field' property.
730 If POS is nil, the value of point is used for POS. */)
731 (Lisp_Object pos)
732 {
733 ptrdiff_t beg, end;
734 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
735 if (beg != end)
736 del_range (beg, end);
737 return Qnil;
738 }
739
740 DEFUN ("field-string", Ffield_string, Sfield_string, 0, 1, 0,
741 doc: /* Return the contents of the field surrounding POS as a string.
742 A field is a region of text with the same `field' property.
743 If POS is nil, the value of point is used for POS. */)
744 (Lisp_Object pos)
745 {
746 ptrdiff_t beg, end;
747 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
748 return make_buffer_string (beg, end, 1);
749 }
750
751 DEFUN ("field-string-no-properties", Ffield_string_no_properties, Sfield_string_no_properties, 0, 1, 0,
752 doc: /* Return the contents of the field around POS, without text properties.
753 A field is a region of text with the same `field' property.
754 If POS is nil, the value of point is used for POS. */)
755 (Lisp_Object pos)
756 {
757 ptrdiff_t beg, end;
758 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
759 return make_buffer_string (beg, end, 0);
760 }
761
762 DEFUN ("field-beginning", Ffield_beginning, Sfield_beginning, 0, 3, 0,
763 doc: /* Return the beginning of the field surrounding POS.
764 A field is a region of text with the same `field' property.
765 If POS is nil, the value of point is used for POS.
766 If ESCAPE-FROM-EDGE is non-nil and POS is at the beginning of its
767 field, then the beginning of the *previous* field is returned.
768 If LIMIT is non-nil, it is a buffer position; if the beginning of the field
769 is before LIMIT, then LIMIT will be returned instead. */)
770 (Lisp_Object pos, Lisp_Object escape_from_edge, Lisp_Object limit)
771 {
772 ptrdiff_t beg;
773 find_field (pos, escape_from_edge, limit, &beg, Qnil, 0);
774 return make_number (beg);
775 }
776
777 DEFUN ("field-end", Ffield_end, Sfield_end, 0, 3, 0,
778 doc: /* Return the end of the field surrounding POS.
779 A field is a region of text with the same `field' property.
780 If POS is nil, the value of point is used for POS.
781 If ESCAPE-FROM-EDGE is non-nil and POS is at the end of its field,
782 then the end of the *following* field is returned.
783 If LIMIT is non-nil, it is a buffer position; if the end of the field
784 is after LIMIT, then LIMIT will be returned instead. */)
785 (Lisp_Object pos, Lisp_Object escape_from_edge, Lisp_Object limit)
786 {
787 ptrdiff_t end;
788 find_field (pos, escape_from_edge, Qnil, 0, limit, &end);
789 return make_number (end);
790 }
791
792 DEFUN ("constrain-to-field", Fconstrain_to_field, Sconstrain_to_field, 2, 5, 0,
793 doc: /* Return the position closest to NEW-POS that is in the same field as OLD-POS.
794 A field is a region of text with the same `field' property.
795
796 If NEW-POS is nil, then use the current point instead, and move point
797 to the resulting constrained position, in addition to returning that
798 position.
799
800 If OLD-POS is at the boundary of two fields, then the allowable
801 positions for NEW-POS depends on the value of the optional argument
802 ESCAPE-FROM-EDGE: If ESCAPE-FROM-EDGE is nil, then NEW-POS is
803 constrained to the field that has the same `field' char-property
804 as any new characters inserted at OLD-POS, whereas if ESCAPE-FROM-EDGE
805 is non-nil, NEW-POS is constrained to the union of the two adjacent
806 fields. Additionally, if two fields are separated by another field with
807 the special value `boundary', then any point within this special field is
808 also considered to be `on the boundary'.
809
810 If the optional argument ONLY-IN-LINE is non-nil and constraining
811 NEW-POS would move it to a different line, NEW-POS is returned
812 unconstrained. This is useful for commands that move by line, like
813 \\[next-line] or \\[beginning-of-line], which should generally respect field boundaries
814 only in the case where they can still move to the right line.
815
816 If the optional argument INHIBIT-CAPTURE-PROPERTY is non-nil, and OLD-POS has
817 a non-nil property of that name, then any field boundaries are ignored.
818
819 Field boundaries are not noticed if `inhibit-field-text-motion' is non-nil. */)
820 (Lisp_Object new_pos, Lisp_Object old_pos, Lisp_Object escape_from_edge,
821 Lisp_Object only_in_line, Lisp_Object inhibit_capture_property)
822 {
823 /* If non-zero, then the original point, before re-positioning. */
824 ptrdiff_t orig_point = 0;
825 bool fwd;
826 Lisp_Object prev_old, prev_new;
827
828 if (NILP (new_pos))
829 /* Use the current point, and afterwards, set it. */
830 {
831 orig_point = PT;
832 XSETFASTINT (new_pos, PT);
833 }
834
835 CHECK_NUMBER_COERCE_MARKER (new_pos);
836 CHECK_NUMBER_COERCE_MARKER (old_pos);
837
838 fwd = (XINT (new_pos) > XINT (old_pos));
839
840 prev_old = make_number (XINT (old_pos) - 1);
841 prev_new = make_number (XINT (new_pos) - 1);
842
843 if (NILP (Vinhibit_field_text_motion)
844 && !EQ (new_pos, old_pos)
845 && (!NILP (Fget_char_property (new_pos, Qfield, Qnil))
846 || !NILP (Fget_char_property (old_pos, Qfield, Qnil))
847 /* To recognize field boundaries, we must also look at the
848 previous positions; we could use `Fget_pos_property'
849 instead, but in itself that would fail inside non-sticky
850 fields (like comint prompts). */
851 || (XFASTINT (new_pos) > BEGV
852 && !NILP (Fget_char_property (prev_new, Qfield, Qnil)))
853 || (XFASTINT (old_pos) > BEGV
854 && !NILP (Fget_char_property (prev_old, Qfield, Qnil))))
855 && (NILP (inhibit_capture_property)
856 /* Field boundaries are again a problem; but now we must
857 decide the case exactly, so we need to call
858 `get_pos_property' as well. */
859 || (NILP (Fget_pos_property (old_pos, inhibit_capture_property, Qnil))
860 && (XFASTINT (old_pos) <= BEGV
861 || NILP (Fget_char_property
862 (old_pos, inhibit_capture_property, Qnil))
863 || NILP (Fget_char_property
864 (prev_old, inhibit_capture_property, Qnil))))))
865 /* It is possible that NEW_POS is not within the same field as
866 OLD_POS; try to move NEW_POS so that it is. */
867 {
868 ptrdiff_t shortage;
869 Lisp_Object field_bound;
870
871 if (fwd)
872 field_bound = Ffield_end (old_pos, escape_from_edge, new_pos);
873 else
874 field_bound = Ffield_beginning (old_pos, escape_from_edge, new_pos);
875
876 if (/* See if ESCAPE_FROM_EDGE caused FIELD_BOUND to jump to the
877 other side of NEW_POS, which would mean that NEW_POS is
878 already acceptable, and it's not necessary to constrain it
879 to FIELD_BOUND. */
880 ((XFASTINT (field_bound) < XFASTINT (new_pos)) ? fwd : !fwd)
881 /* NEW_POS should be constrained, but only if either
882 ONLY_IN_LINE is nil (in which case any constraint is OK),
883 or NEW_POS and FIELD_BOUND are on the same line (in which
884 case the constraint is OK even if ONLY_IN_LINE is non-nil). */
885 && (NILP (only_in_line)
886 /* This is the ONLY_IN_LINE case, check that NEW_POS and
887 FIELD_BOUND are on the same line by seeing whether
888 there's an intervening newline or not. */
889 || (find_newline (XFASTINT (new_pos), -1,
890 XFASTINT (field_bound), -1,
891 fwd ? -1 : 1, &shortage, NULL, 1),
892 shortage != 0)))
893 /* Constrain NEW_POS to FIELD_BOUND. */
894 new_pos = field_bound;
895
896 if (orig_point && XFASTINT (new_pos) != orig_point)
897 /* The NEW_POS argument was originally nil, so automatically set PT. */
898 SET_PT (XFASTINT (new_pos));
899 }
900
901 return new_pos;
902 }
903
904 \f
905 DEFUN ("line-beginning-position",
906 Fline_beginning_position, Sline_beginning_position, 0, 1, 0,
907 doc: /* Return the character position of the first character on the current line.
908 With optional argument N, scan forward N - 1 lines first.
909 If the scan reaches the end of the buffer, return that position.
910
911 This function ignores text display directionality; it returns the
912 position of the first character in logical order, i.e. the smallest
913 character position on the line.
914
915 This function constrains the returned position to the current field
916 unless that position would be on a different line than the original,
917 unconstrained result. If N is nil or 1, and a front-sticky field
918 starts at point, the scan stops as soon as it starts. To ignore field
919 boundaries, bind `inhibit-field-text-motion' to t.
920
921 This function does not move point. */)
922 (Lisp_Object n)
923 {
924 ptrdiff_t charpos, bytepos;
925
926 if (NILP (n))
927 XSETFASTINT (n, 1);
928 else
929 CHECK_NUMBER (n);
930
931 scan_newline_from_point (XINT (n) - 1, &charpos, &bytepos);
932
933 /* Return END constrained to the current input field. */
934 return Fconstrain_to_field (make_number (charpos), make_number (PT),
935 XINT (n) != 1 ? Qt : Qnil,
936 Qt, Qnil);
937 }
938
939 DEFUN ("line-end-position", Fline_end_position, Sline_end_position, 0, 1, 0,
940 doc: /* Return the character position of the last character on the current line.
941 With argument N not nil or 1, move forward N - 1 lines first.
942 If scan reaches end of buffer, return that position.
943
944 This function ignores text display directionality; it returns the
945 position of the last character in logical order, i.e. the largest
946 character position on the line.
947
948 This function constrains the returned position to the current field
949 unless that would be on a different line than the original,
950 unconstrained result. If N is nil or 1, and a rear-sticky field ends
951 at point, the scan stops as soon as it starts. To ignore field
952 boundaries bind `inhibit-field-text-motion' to t.
953
954 This function does not move point. */)
955 (Lisp_Object n)
956 {
957 ptrdiff_t clipped_n;
958 ptrdiff_t end_pos;
959 ptrdiff_t orig = PT;
960
961 if (NILP (n))
962 XSETFASTINT (n, 1);
963 else
964 CHECK_NUMBER (n);
965
966 clipped_n = clip_to_bounds (PTRDIFF_MIN + 1, XINT (n), PTRDIFF_MAX);
967 end_pos = find_before_next_newline (orig, 0, clipped_n - (clipped_n <= 0),
968 NULL);
969
970 /* Return END_POS constrained to the current input field. */
971 return Fconstrain_to_field (make_number (end_pos), make_number (orig),
972 Qnil, Qt, Qnil);
973 }
974
975 /* Save current buffer state for `save-excursion' special form.
976 We (ab)use Lisp_Misc_Save_Value to allow explicit free and so
977 offload some work from GC. */
978
979 Lisp_Object
980 save_excursion_save (void)
981 {
982 return make_save_obj_obj_obj_obj
983 (Fpoint_marker (),
984 Qnil,
985 /* Selected window if current buffer is shown in it, nil otherwise. */
986 (EQ (XWINDOW (selected_window)->contents, Fcurrent_buffer ())
987 ? selected_window : Qnil),
988 Qnil);
989 }
990
991 /* Restore saved buffer before leaving `save-excursion' special form. */
992
993 void
994 save_excursion_restore (Lisp_Object info)
995 {
996 Lisp_Object tem, tem1;
997
998 tem = Fmarker_buffer (XSAVE_OBJECT (info, 0));
999 /* If we're unwinding to top level, saved buffer may be deleted. This
1000 means that all of its markers are unchained and so tem is nil. */
1001 if (NILP (tem))
1002 goto out;
1003
1004 Fset_buffer (tem);
1005
1006 /* Point marker. */
1007 tem = XSAVE_OBJECT (info, 0);
1008 Fgoto_char (tem);
1009 unchain_marker (XMARKER (tem));
1010
1011 /* If buffer was visible in a window, and a different window was
1012 selected, and the old selected window is still showing this
1013 buffer, restore point in that window. */
1014 tem = XSAVE_OBJECT (info, 2);
1015 if (WINDOWP (tem)
1016 && !EQ (tem, selected_window)
1017 && (tem1 = XWINDOW (tem)->contents,
1018 (/* Window is live... */
1019 BUFFERP (tem1)
1020 /* ...and it shows the current buffer. */
1021 && XBUFFER (tem1) == current_buffer)))
1022 Fset_window_point (tem, make_number (PT));
1023
1024 out:
1025
1026 free_misc (info);
1027 }
1028
1029 DEFUN ("save-excursion", Fsave_excursion, Ssave_excursion, 0, UNEVALLED, 0,
1030 doc: /* Save point, and current buffer; execute BODY; restore those things.
1031 Executes BODY just like `progn'.
1032 The values of point and the current buffer are restored
1033 even in case of abnormal exit (throw or error).
1034
1035 If you only want to save the current buffer but not point,
1036 then just use `save-current-buffer', or even `with-current-buffer'.
1037
1038 Before Emacs 25.1, `save-excursion' used to save the mark state.
1039 To save the marker state as well as the point and buffer, use
1040 `save-mark-and-excursion'.
1041
1042 usage: (save-excursion &rest BODY) */)
1043 (Lisp_Object args)
1044 {
1045 register Lisp_Object val;
1046 ptrdiff_t count = SPECPDL_INDEX ();
1047
1048 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1049
1050 val = Fprogn (args);
1051 return unbind_to (count, val);
1052 }
1053
1054 DEFUN ("save-current-buffer", Fsave_current_buffer, Ssave_current_buffer, 0, UNEVALLED, 0,
1055 doc: /* Record which buffer is current; execute BODY; make that buffer current.
1056 BODY is executed just like `progn'.
1057 usage: (save-current-buffer &rest BODY) */)
1058 (Lisp_Object args)
1059 {
1060 ptrdiff_t count = SPECPDL_INDEX ();
1061
1062 record_unwind_current_buffer ();
1063 return unbind_to (count, Fprogn (args));
1064 }
1065 \f
1066 DEFUN ("buffer-size", Fbuffer_size, Sbuffer_size, 0, 1, 0,
1067 doc: /* Return the number of characters in the current buffer.
1068 If BUFFER, return the number of characters in that buffer instead. */)
1069 (Lisp_Object buffer)
1070 {
1071 if (NILP (buffer))
1072 return make_number (Z - BEG);
1073 else
1074 {
1075 CHECK_BUFFER (buffer);
1076 return make_number (BUF_Z (XBUFFER (buffer))
1077 - BUF_BEG (XBUFFER (buffer)));
1078 }
1079 }
1080
1081 DEFUN ("point-min", Fpoint_min, Spoint_min, 0, 0, 0,
1082 doc: /* Return the minimum permissible value of point in the current buffer.
1083 This is 1, unless narrowing (a buffer restriction) is in effect. */)
1084 (void)
1085 {
1086 Lisp_Object temp;
1087 XSETFASTINT (temp, BEGV);
1088 return temp;
1089 }
1090
1091 DEFUN ("point-min-marker", Fpoint_min_marker, Spoint_min_marker, 0, 0, 0,
1092 doc: /* Return a marker to the minimum permissible value of point in this buffer.
1093 This is the beginning, unless narrowing (a buffer restriction) is in effect. */)
1094 (void)
1095 {
1096 return build_marker (current_buffer, BEGV, BEGV_BYTE);
1097 }
1098
1099 DEFUN ("point-max", Fpoint_max, Spoint_max, 0, 0, 0,
1100 doc: /* Return the maximum permissible value of point in the current buffer.
1101 This is (1+ (buffer-size)), unless narrowing (a buffer restriction)
1102 is in effect, in which case it is less. */)
1103 (void)
1104 {
1105 Lisp_Object temp;
1106 XSETFASTINT (temp, ZV);
1107 return temp;
1108 }
1109
1110 DEFUN ("point-max-marker", Fpoint_max_marker, Spoint_max_marker, 0, 0, 0,
1111 doc: /* Return a marker to the maximum permissible value of point in this buffer.
1112 This is (1+ (buffer-size)), unless narrowing (a buffer restriction)
1113 is in effect, in which case it is less. */)
1114 (void)
1115 {
1116 return build_marker (current_buffer, ZV, ZV_BYTE);
1117 }
1118
1119 DEFUN ("gap-position", Fgap_position, Sgap_position, 0, 0, 0,
1120 doc: /* Return the position of the gap, in the current buffer.
1121 See also `gap-size'. */)
1122 (void)
1123 {
1124 Lisp_Object temp;
1125 XSETFASTINT (temp, GPT);
1126 return temp;
1127 }
1128
1129 DEFUN ("gap-size", Fgap_size, Sgap_size, 0, 0, 0,
1130 doc: /* Return the size of the current buffer's gap.
1131 See also `gap-position'. */)
1132 (void)
1133 {
1134 Lisp_Object temp;
1135 XSETFASTINT (temp, GAP_SIZE);
1136 return temp;
1137 }
1138
1139 DEFUN ("position-bytes", Fposition_bytes, Sposition_bytes, 1, 1, 0,
1140 doc: /* Return the byte position for character position POSITION.
1141 If POSITION is out of range, the value is nil. */)
1142 (Lisp_Object position)
1143 {
1144 CHECK_NUMBER_COERCE_MARKER (position);
1145 if (XINT (position) < BEG || XINT (position) > Z)
1146 return Qnil;
1147 return make_number (CHAR_TO_BYTE (XINT (position)));
1148 }
1149
1150 DEFUN ("byte-to-position", Fbyte_to_position, Sbyte_to_position, 1, 1, 0,
1151 doc: /* Return the character position for byte position BYTEPOS.
1152 If BYTEPOS is out of range, the value is nil. */)
1153 (Lisp_Object bytepos)
1154 {
1155 ptrdiff_t pos_byte;
1156
1157 CHECK_NUMBER (bytepos);
1158 pos_byte = XINT (bytepos);
1159 if (pos_byte < BEG_BYTE || pos_byte > Z_BYTE)
1160 return Qnil;
1161 if (Z != Z_BYTE)
1162 /* There are multibyte characters in the buffer.
1163 The argument of BYTE_TO_CHAR must be a byte position at
1164 a character boundary, so search for the start of the current
1165 character. */
1166 while (!CHAR_HEAD_P (FETCH_BYTE (pos_byte)))
1167 pos_byte--;
1168 return make_number (BYTE_TO_CHAR (pos_byte));
1169 }
1170 \f
1171 DEFUN ("following-char", Ffollowing_char, Sfollowing_char, 0, 0, 0,
1172 doc: /* Return the character following point, as a number.
1173 At the end of the buffer or accessible region, return 0. */)
1174 (void)
1175 {
1176 Lisp_Object temp;
1177 if (PT >= ZV)
1178 XSETFASTINT (temp, 0);
1179 else
1180 XSETFASTINT (temp, FETCH_CHAR (PT_BYTE));
1181 return temp;
1182 }
1183
1184 DEFUN ("preceding-char", Fprevious_char, Sprevious_char, 0, 0, 0,
1185 doc: /* Return the character preceding point, as a number.
1186 At the beginning of the buffer or accessible region, return 0. */)
1187 (void)
1188 {
1189 Lisp_Object temp;
1190 if (PT <= BEGV)
1191 XSETFASTINT (temp, 0);
1192 else if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
1193 {
1194 ptrdiff_t pos = PT_BYTE;
1195 DEC_POS (pos);
1196 XSETFASTINT (temp, FETCH_CHAR (pos));
1197 }
1198 else
1199 XSETFASTINT (temp, FETCH_BYTE (PT_BYTE - 1));
1200 return temp;
1201 }
1202
1203 DEFUN ("bobp", Fbobp, Sbobp, 0, 0, 0,
1204 doc: /* Return t if point is at the beginning of the buffer.
1205 If the buffer is narrowed, this means the beginning of the narrowed part. */)
1206 (void)
1207 {
1208 if (PT == BEGV)
1209 return Qt;
1210 return Qnil;
1211 }
1212
1213 DEFUN ("eobp", Feobp, Seobp, 0, 0, 0,
1214 doc: /* Return t if point is at the end of the buffer.
1215 If the buffer is narrowed, this means the end of the narrowed part. */)
1216 (void)
1217 {
1218 if (PT == ZV)
1219 return Qt;
1220 return Qnil;
1221 }
1222
1223 DEFUN ("bolp", Fbolp, Sbolp, 0, 0, 0,
1224 doc: /* Return t if point is at the beginning of a line. */)
1225 (void)
1226 {
1227 if (PT == BEGV || FETCH_BYTE (PT_BYTE - 1) == '\n')
1228 return Qt;
1229 return Qnil;
1230 }
1231
1232 DEFUN ("eolp", Feolp, Seolp, 0, 0, 0,
1233 doc: /* Return t if point is at the end of a line.
1234 `End of a line' includes point being at the end of the buffer. */)
1235 (void)
1236 {
1237 if (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n')
1238 return Qt;
1239 return Qnil;
1240 }
1241
1242 DEFUN ("char-after", Fchar_after, Schar_after, 0, 1, 0,
1243 doc: /* Return character in current buffer at position POS.
1244 POS is an integer or a marker and defaults to point.
1245 If POS is out of range, the value is nil. */)
1246 (Lisp_Object pos)
1247 {
1248 register ptrdiff_t pos_byte;
1249
1250 if (NILP (pos))
1251 {
1252 pos_byte = PT_BYTE;
1253 XSETFASTINT (pos, PT);
1254 }
1255
1256 if (MARKERP (pos))
1257 {
1258 pos_byte = marker_byte_position (pos);
1259 if (pos_byte < BEGV_BYTE || pos_byte >= ZV_BYTE)
1260 return Qnil;
1261 }
1262 else
1263 {
1264 CHECK_NUMBER_COERCE_MARKER (pos);
1265 if (XINT (pos) < BEGV || XINT (pos) >= ZV)
1266 return Qnil;
1267
1268 pos_byte = CHAR_TO_BYTE (XINT (pos));
1269 }
1270
1271 return make_number (FETCH_CHAR (pos_byte));
1272 }
1273
1274 DEFUN ("char-before", Fchar_before, Schar_before, 0, 1, 0,
1275 doc: /* Return character in current buffer preceding position POS.
1276 POS is an integer or a marker and defaults to point.
1277 If POS is out of range, the value is nil. */)
1278 (Lisp_Object pos)
1279 {
1280 register Lisp_Object val;
1281 register ptrdiff_t pos_byte;
1282
1283 if (NILP (pos))
1284 {
1285 pos_byte = PT_BYTE;
1286 XSETFASTINT (pos, PT);
1287 }
1288
1289 if (MARKERP (pos))
1290 {
1291 pos_byte = marker_byte_position (pos);
1292
1293 if (pos_byte <= BEGV_BYTE || pos_byte > ZV_BYTE)
1294 return Qnil;
1295 }
1296 else
1297 {
1298 CHECK_NUMBER_COERCE_MARKER (pos);
1299
1300 if (XINT (pos) <= BEGV || XINT (pos) > ZV)
1301 return Qnil;
1302
1303 pos_byte = CHAR_TO_BYTE (XINT (pos));
1304 }
1305
1306 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
1307 {
1308 DEC_POS (pos_byte);
1309 XSETFASTINT (val, FETCH_CHAR (pos_byte));
1310 }
1311 else
1312 {
1313 pos_byte--;
1314 XSETFASTINT (val, FETCH_BYTE (pos_byte));
1315 }
1316 return val;
1317 }
1318 \f
1319 DEFUN ("user-login-name", Fuser_login_name, Suser_login_name, 0, 1, 0,
1320 doc: /* Return the name under which the user logged in, as a string.
1321 This is based on the effective uid, not the real uid.
1322 Also, if the environment variables LOGNAME or USER are set,
1323 that determines the value of this function.
1324
1325 If optional argument UID is an integer or a float, return the login name
1326 of the user with that uid, or nil if there is no such user. */)
1327 (Lisp_Object uid)
1328 {
1329 struct passwd *pw;
1330 uid_t id;
1331
1332 /* Set up the user name info if we didn't do it before.
1333 (That can happen if Emacs is dumpable
1334 but you decide to run `temacs -l loadup' and not dump. */
1335 if (NILP (Vuser_login_name))
1336 init_editfns (false);
1337
1338 if (NILP (uid))
1339 return Vuser_login_name;
1340
1341 CONS_TO_INTEGER (uid, uid_t, id);
1342 block_input ();
1343 pw = getpwuid (id);
1344 unblock_input ();
1345 return (pw ? build_string (pw->pw_name) : Qnil);
1346 }
1347
1348 DEFUN ("user-real-login-name", Fuser_real_login_name, Suser_real_login_name,
1349 0, 0, 0,
1350 doc: /* Return the name of the user's real uid, as a string.
1351 This ignores the environment variables LOGNAME and USER, so it differs from
1352 `user-login-name' when running under `su'. */)
1353 (void)
1354 {
1355 /* Set up the user name info if we didn't do it before.
1356 (That can happen if Emacs is dumpable
1357 but you decide to run `temacs -l loadup' and not dump. */
1358 if (NILP (Vuser_login_name))
1359 init_editfns (false);
1360 return Vuser_real_login_name;
1361 }
1362
1363 DEFUN ("user-uid", Fuser_uid, Suser_uid, 0, 0, 0,
1364 doc: /* Return the effective uid of Emacs.
1365 Value is an integer or a float, depending on the value. */)
1366 (void)
1367 {
1368 uid_t euid = geteuid ();
1369 return make_fixnum_or_float (euid);
1370 }
1371
1372 DEFUN ("user-real-uid", Fuser_real_uid, Suser_real_uid, 0, 0, 0,
1373 doc: /* Return the real uid of Emacs.
1374 Value is an integer or a float, depending on the value. */)
1375 (void)
1376 {
1377 uid_t uid = getuid ();
1378 return make_fixnum_or_float (uid);
1379 }
1380
1381 DEFUN ("group-gid", Fgroup_gid, Sgroup_gid, 0, 0, 0,
1382 doc: /* Return the effective gid of Emacs.
1383 Value is an integer or a float, depending on the value. */)
1384 (void)
1385 {
1386 gid_t egid = getegid ();
1387 return make_fixnum_or_float (egid);
1388 }
1389
1390 DEFUN ("group-real-gid", Fgroup_real_gid, Sgroup_real_gid, 0, 0, 0,
1391 doc: /* Return the real gid of Emacs.
1392 Value is an integer or a float, depending on the value. */)
1393 (void)
1394 {
1395 gid_t gid = getgid ();
1396 return make_fixnum_or_float (gid);
1397 }
1398
1399 DEFUN ("user-full-name", Fuser_full_name, Suser_full_name, 0, 1, 0,
1400 doc: /* Return the full name of the user logged in, as a string.
1401 If the full name corresponding to Emacs's userid is not known,
1402 return "unknown".
1403
1404 If optional argument UID is an integer or float, return the full name
1405 of the user with that uid, or nil if there is no such user.
1406 If UID is a string, return the full name of the user with that login
1407 name, or nil if there is no such user. */)
1408 (Lisp_Object uid)
1409 {
1410 struct passwd *pw;
1411 register char *p, *q;
1412 Lisp_Object full;
1413
1414 if (NILP (uid))
1415 return Vuser_full_name;
1416 else if (NUMBERP (uid))
1417 {
1418 uid_t u;
1419 CONS_TO_INTEGER (uid, uid_t, u);
1420 block_input ();
1421 pw = getpwuid (u);
1422 unblock_input ();
1423 }
1424 else if (STRINGP (uid))
1425 {
1426 block_input ();
1427 pw = getpwnam (SSDATA (uid));
1428 unblock_input ();
1429 }
1430 else
1431 error ("Invalid UID specification");
1432
1433 if (!pw)
1434 return Qnil;
1435
1436 p = USER_FULL_NAME;
1437 /* Chop off everything after the first comma. */
1438 q = strchr (p, ',');
1439 full = make_string (p, q ? q - p : strlen (p));
1440
1441 #ifdef AMPERSAND_FULL_NAME
1442 p = SSDATA (full);
1443 q = strchr (p, '&');
1444 /* Substitute the login name for the &, upcasing the first character. */
1445 if (q)
1446 {
1447 Lisp_Object login = Fuser_login_name (make_number (pw->pw_uid));
1448 USE_SAFE_ALLOCA;
1449 char *r = SAFE_ALLOCA (strlen (p) + SBYTES (login) + 1);
1450 memcpy (r, p, q - p);
1451 char *s = lispstpcpy (&r[q - p], login);
1452 r[q - p] = upcase ((unsigned char) r[q - p]);
1453 strcpy (s, q + 1);
1454 full = build_string (r);
1455 SAFE_FREE ();
1456 }
1457 #endif /* AMPERSAND_FULL_NAME */
1458
1459 return full;
1460 }
1461
1462 DEFUN ("system-name", Fsystem_name, Ssystem_name, 0, 0, 0,
1463 doc: /* Return the host name of the machine you are running on, as a string. */)
1464 (void)
1465 {
1466 if (EQ (Vsystem_name, cached_system_name))
1467 init_and_cache_system_name ();
1468 return Vsystem_name;
1469 }
1470
1471 DEFUN ("emacs-pid", Femacs_pid, Semacs_pid, 0, 0, 0,
1472 doc: /* Return the process ID of Emacs, as a number. */)
1473 (void)
1474 {
1475 pid_t pid = getpid ();
1476 return make_fixnum_or_float (pid);
1477 }
1478
1479 \f
1480
1481 #ifndef TIME_T_MIN
1482 # define TIME_T_MIN TYPE_MINIMUM (time_t)
1483 #endif
1484 #ifndef TIME_T_MAX
1485 # define TIME_T_MAX TYPE_MAXIMUM (time_t)
1486 #endif
1487
1488 /* Report that a time value is out of range for Emacs. */
1489 void
1490 time_overflow (void)
1491 {
1492 error ("Specified time is not representable");
1493 }
1494
1495 static _Noreturn void
1496 invalid_time (void)
1497 {
1498 error ("Invalid time specification");
1499 }
1500
1501 /* Check a return value compatible with that of decode_time_components. */
1502 static void
1503 check_time_validity (int validity)
1504 {
1505 if (validity <= 0)
1506 {
1507 if (validity < 0)
1508 time_overflow ();
1509 else
1510 invalid_time ();
1511 }
1512 }
1513
1514 /* Return the upper part of the time T (everything but the bottom 16 bits). */
1515 static EMACS_INT
1516 hi_time (time_t t)
1517 {
1518 time_t hi = t >> LO_TIME_BITS;
1519
1520 /* Check for overflow, helping the compiler for common cases where
1521 no runtime check is needed, and taking care not to convert
1522 negative numbers to unsigned before comparing them. */
1523 if (! ((! TYPE_SIGNED (time_t)
1524 || MOST_NEGATIVE_FIXNUM <= TIME_T_MIN >> LO_TIME_BITS
1525 || MOST_NEGATIVE_FIXNUM <= hi)
1526 && (TIME_T_MAX >> LO_TIME_BITS <= MOST_POSITIVE_FIXNUM
1527 || hi <= MOST_POSITIVE_FIXNUM)))
1528 time_overflow ();
1529
1530 return hi;
1531 }
1532
1533 /* Return the bottom bits of the time T. */
1534 static int
1535 lo_time (time_t t)
1536 {
1537 return t & ((1 << LO_TIME_BITS) - 1);
1538 }
1539
1540 DEFUN ("current-time", Fcurrent_time, Scurrent_time, 0, 0, 0,
1541 doc: /* Return the current time, as the number of seconds since 1970-01-01 00:00:00.
1542 The time is returned as a list of integers (HIGH LOW USEC PSEC).
1543 HIGH has the most significant bits of the seconds, while LOW has the
1544 least significant 16 bits. USEC and PSEC are the microsecond and
1545 picosecond counts. */)
1546 (void)
1547 {
1548 return make_lisp_time (current_timespec ());
1549 }
1550
1551 static struct lisp_time
1552 time_add (struct lisp_time ta, struct lisp_time tb)
1553 {
1554 EMACS_INT hi = ta.hi + tb.hi;
1555 int lo = ta.lo + tb.lo;
1556 int us = ta.us + tb.us;
1557 int ps = ta.ps + tb.ps;
1558 us += (1000000 <= ps);
1559 ps -= (1000000 <= ps) * 1000000;
1560 lo += (1000000 <= us);
1561 us -= (1000000 <= us) * 1000000;
1562 hi += (1 << LO_TIME_BITS <= lo);
1563 lo -= (1 << LO_TIME_BITS <= lo) << LO_TIME_BITS;
1564 return (struct lisp_time) { hi, lo, us, ps };
1565 }
1566
1567 static struct lisp_time
1568 time_subtract (struct lisp_time ta, struct lisp_time tb)
1569 {
1570 EMACS_INT hi = ta.hi - tb.hi;
1571 int lo = ta.lo - tb.lo;
1572 int us = ta.us - tb.us;
1573 int ps = ta.ps - tb.ps;
1574 us -= (ps < 0);
1575 ps += (ps < 0) * 1000000;
1576 lo -= (us < 0);
1577 us += (us < 0) * 1000000;
1578 hi -= (lo < 0);
1579 lo += (lo < 0) << LO_TIME_BITS;
1580 return (struct lisp_time) { hi, lo, us, ps };
1581 }
1582
1583 static Lisp_Object
1584 time_arith (Lisp_Object a, Lisp_Object b,
1585 struct lisp_time (*op) (struct lisp_time, struct lisp_time))
1586 {
1587 int alen, blen;
1588 struct lisp_time ta = lisp_time_struct (a, &alen);
1589 struct lisp_time tb = lisp_time_struct (b, &blen);
1590 struct lisp_time t = op (ta, tb);
1591 if (! (MOST_NEGATIVE_FIXNUM <= t.hi && t.hi <= MOST_POSITIVE_FIXNUM))
1592 time_overflow ();
1593 Lisp_Object val = Qnil;
1594
1595 switch (max (alen, blen))
1596 {
1597 default:
1598 val = Fcons (make_number (t.ps), val);
1599 /* Fall through. */
1600 case 3:
1601 val = Fcons (make_number (t.us), val);
1602 /* Fall through. */
1603 case 2:
1604 val = Fcons (make_number (t.lo), val);
1605 val = Fcons (make_number (t.hi), val);
1606 break;
1607 }
1608
1609 return val;
1610 }
1611
1612 DEFUN ("time-add", Ftime_add, Stime_add, 2, 2, 0,
1613 doc: /* Return the sum of two time values A and B, as a time value. */)
1614 (Lisp_Object a, Lisp_Object b)
1615 {
1616 return time_arith (a, b, time_add);
1617 }
1618
1619 DEFUN ("time-subtract", Ftime_subtract, Stime_subtract, 2, 2, 0,
1620 doc: /* Return the difference between two time values A and B, as a time value. */)
1621 (Lisp_Object a, Lisp_Object b)
1622 {
1623 return time_arith (a, b, time_subtract);
1624 }
1625
1626 DEFUN ("time-less-p", Ftime_less_p, Stime_less_p, 2, 2, 0,
1627 doc: /* Return non-nil if time value T1 is earlier than time value T2. */)
1628 (Lisp_Object t1, Lisp_Object t2)
1629 {
1630 int t1len, t2len;
1631 struct lisp_time a = lisp_time_struct (t1, &t1len);
1632 struct lisp_time b = lisp_time_struct (t2, &t2len);
1633 return ((a.hi != b.hi ? a.hi < b.hi
1634 : a.lo != b.lo ? a.lo < b.lo
1635 : a.us != b.us ? a.us < b.us
1636 : a.ps < b.ps)
1637 ? Qt : Qnil);
1638 }
1639
1640
1641 DEFUN ("get-internal-run-time", Fget_internal_run_time, Sget_internal_run_time,
1642 0, 0, 0,
1643 doc: /* Return the current run time used by Emacs.
1644 The time is returned as a list (HIGH LOW USEC PSEC), using the same
1645 style as (current-time).
1646
1647 On systems that can't determine the run time, `get-internal-run-time'
1648 does the same thing as `current-time'. */)
1649 (void)
1650 {
1651 #ifdef HAVE_GETRUSAGE
1652 struct rusage usage;
1653 time_t secs;
1654 int usecs;
1655
1656 if (getrusage (RUSAGE_SELF, &usage) < 0)
1657 /* This shouldn't happen. What action is appropriate? */
1658 xsignal0 (Qerror);
1659
1660 /* Sum up user time and system time. */
1661 secs = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec;
1662 usecs = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
1663 if (usecs >= 1000000)
1664 {
1665 usecs -= 1000000;
1666 secs++;
1667 }
1668 return make_lisp_time (make_timespec (secs, usecs * 1000));
1669 #else /* ! HAVE_GETRUSAGE */
1670 #ifdef WINDOWSNT
1671 return w32_get_internal_run_time ();
1672 #else /* ! WINDOWSNT */
1673 return Fcurrent_time ();
1674 #endif /* WINDOWSNT */
1675 #endif /* HAVE_GETRUSAGE */
1676 }
1677 \f
1678
1679 /* Make a Lisp list that represents the Emacs time T. T may be an
1680 invalid time, with a slightly negative tv_nsec value such as
1681 UNKNOWN_MODTIME_NSECS; in that case, the Lisp list contains a
1682 correspondingly negative picosecond count. */
1683 Lisp_Object
1684 make_lisp_time (struct timespec t)
1685 {
1686 time_t s = t.tv_sec;
1687 int ns = t.tv_nsec;
1688 return list4i (hi_time (s), lo_time (s), ns / 1000, ns % 1000 * 1000);
1689 }
1690
1691 /* Decode a Lisp list SPECIFIED_TIME that represents a time.
1692 Set *PHIGH, *PLOW, *PUSEC, *PPSEC to its parts; do not check their values.
1693 Return 2, 3, or 4 to indicate the effective length of SPECIFIED_TIME
1694 if successful, 0 if unsuccessful. */
1695 static int
1696 disassemble_lisp_time (Lisp_Object specified_time, Lisp_Object *phigh,
1697 Lisp_Object *plow, Lisp_Object *pusec,
1698 Lisp_Object *ppsec)
1699 {
1700 Lisp_Object high = make_number (0);
1701 Lisp_Object low = specified_time;
1702 Lisp_Object usec = make_number (0);
1703 Lisp_Object psec = make_number (0);
1704 int len = 4;
1705
1706 if (CONSP (specified_time))
1707 {
1708 high = XCAR (specified_time);
1709 low = XCDR (specified_time);
1710 if (CONSP (low))
1711 {
1712 Lisp_Object low_tail = XCDR (low);
1713 low = XCAR (low);
1714 if (CONSP (low_tail))
1715 {
1716 usec = XCAR (low_tail);
1717 low_tail = XCDR (low_tail);
1718 if (CONSP (low_tail))
1719 psec = XCAR (low_tail);
1720 else
1721 len = 3;
1722 }
1723 else if (!NILP (low_tail))
1724 {
1725 usec = low_tail;
1726 len = 3;
1727 }
1728 else
1729 len = 2;
1730 }
1731 else
1732 len = 2;
1733
1734 /* When combining components, require LOW to be an integer,
1735 as otherwise it would be a pain to add up times. */
1736 if (! INTEGERP (low))
1737 return 0;
1738 }
1739 else if (INTEGERP (specified_time))
1740 len = 2;
1741
1742 *phigh = high;
1743 *plow = low;
1744 *pusec = usec;
1745 *ppsec = psec;
1746 return len;
1747 }
1748
1749 /* Convert T into an Emacs time *RESULT, truncating toward minus infinity.
1750 Return true if T is in range, false otherwise. */
1751 static bool
1752 decode_float_time (double t, struct lisp_time *result)
1753 {
1754 double lo_multiplier = 1 << LO_TIME_BITS;
1755 double emacs_time_min = MOST_NEGATIVE_FIXNUM * lo_multiplier;
1756 if (! (emacs_time_min <= t && t < -emacs_time_min))
1757 return false;
1758
1759 double small_t = t / lo_multiplier;
1760 EMACS_INT hi = small_t;
1761 double t_sans_hi = t - hi * lo_multiplier;
1762 int lo = t_sans_hi;
1763 long double fracps = (t_sans_hi - lo) * 1e12L;
1764 #ifdef INT_FAST64_MAX
1765 int_fast64_t ifracps = fracps;
1766 int us = ifracps / 1000000;
1767 int ps = ifracps % 1000000;
1768 #else
1769 int us = fracps / 1e6L;
1770 int ps = fracps - us * 1e6L;
1771 #endif
1772 us -= (ps < 0);
1773 ps += (ps < 0) * 1000000;
1774 lo -= (us < 0);
1775 us += (us < 0) * 1000000;
1776 hi -= (lo < 0);
1777 lo += (lo < 0) << LO_TIME_BITS;
1778 result->hi = hi;
1779 result->lo = lo;
1780 result->us = us;
1781 result->ps = ps;
1782 return true;
1783 }
1784
1785 /* From the time components HIGH, LOW, USEC and PSEC taken from a Lisp
1786 list, generate the corresponding time value.
1787 If LOW is floating point, the other components should be zero.
1788
1789 If RESULT is not null, store into *RESULT the converted time.
1790 If *DRESULT is not null, store into *DRESULT the number of
1791 seconds since the start of the POSIX Epoch.
1792
1793 Return 1 if successful, 0 if the components are of the
1794 wrong type, and -1 if the time is out of range. */
1795 int
1796 decode_time_components (Lisp_Object high, Lisp_Object low, Lisp_Object usec,
1797 Lisp_Object psec,
1798 struct lisp_time *result, double *dresult)
1799 {
1800 EMACS_INT hi, lo, us, ps;
1801 if (! (INTEGERP (high)
1802 && INTEGERP (usec) && INTEGERP (psec)))
1803 return 0;
1804 if (! INTEGERP (low))
1805 {
1806 if (FLOATP (low))
1807 {
1808 double t = XFLOAT_DATA (low);
1809 if (result && ! decode_float_time (t, result))
1810 return -1;
1811 if (dresult)
1812 *dresult = t;
1813 return 1;
1814 }
1815 else if (NILP (low))
1816 {
1817 struct timespec now = current_timespec ();
1818 if (result)
1819 {
1820 result->hi = hi_time (now.tv_sec);
1821 result->lo = lo_time (now.tv_sec);
1822 result->us = now.tv_nsec / 1000;
1823 result->ps = now.tv_nsec % 1000 * 1000;
1824 }
1825 if (dresult)
1826 *dresult = now.tv_sec + now.tv_nsec / 1e9;
1827 return 1;
1828 }
1829 else
1830 return 0;
1831 }
1832
1833 hi = XINT (high);
1834 lo = XINT (low);
1835 us = XINT (usec);
1836 ps = XINT (psec);
1837
1838 /* Normalize out-of-range lower-order components by carrying
1839 each overflow into the next higher-order component. */
1840 us += ps / 1000000 - (ps % 1000000 < 0);
1841 lo += us / 1000000 - (us % 1000000 < 0);
1842 hi += lo >> LO_TIME_BITS;
1843 ps = ps % 1000000 + 1000000 * (ps % 1000000 < 0);
1844 us = us % 1000000 + 1000000 * (us % 1000000 < 0);
1845 lo &= (1 << LO_TIME_BITS) - 1;
1846
1847 if (result)
1848 {
1849 if (! (MOST_NEGATIVE_FIXNUM <= hi && hi <= MOST_POSITIVE_FIXNUM))
1850 return -1;
1851 result->hi = hi;
1852 result->lo = lo;
1853 result->us = us;
1854 result->ps = ps;
1855 }
1856
1857 if (dresult)
1858 {
1859 double dhi = hi;
1860 *dresult = (us * 1e6 + ps) / 1e12 + lo + dhi * (1 << LO_TIME_BITS);
1861 }
1862
1863 return 1;
1864 }
1865
1866 struct timespec
1867 lisp_to_timespec (struct lisp_time t)
1868 {
1869 if (! ((TYPE_SIGNED (time_t) ? TIME_T_MIN >> LO_TIME_BITS <= t.hi : 0 <= t.hi)
1870 && t.hi <= TIME_T_MAX >> LO_TIME_BITS))
1871 return invalid_timespec ();
1872 time_t s = (t.hi << LO_TIME_BITS) + t.lo;
1873 int ns = t.us * 1000 + t.ps / 1000;
1874 return make_timespec (s, ns);
1875 }
1876
1877 /* Decode a Lisp list SPECIFIED_TIME that represents a time.
1878 Store its effective length into *PLEN.
1879 If SPECIFIED_TIME is nil, use the current time.
1880 Signal an error if SPECIFIED_TIME does not represent a time. */
1881 static struct lisp_time
1882 lisp_time_struct (Lisp_Object specified_time, int *plen)
1883 {
1884 Lisp_Object high, low, usec, psec;
1885 struct lisp_time t;
1886 int len = disassemble_lisp_time (specified_time, &high, &low, &usec, &psec);
1887 if (!len)
1888 invalid_time ();
1889 int val = decode_time_components (high, low, usec, psec, &t, 0);
1890 check_time_validity (val);
1891 *plen = len;
1892 return t;
1893 }
1894
1895 /* Like lisp_time_struct, except return a struct timespec.
1896 Discard any low-order digits. */
1897 struct timespec
1898 lisp_time_argument (Lisp_Object specified_time)
1899 {
1900 int len;
1901 struct lisp_time lt = lisp_time_struct (specified_time, &len);
1902 struct timespec t = lisp_to_timespec (lt);
1903 if (! timespec_valid_p (t))
1904 time_overflow ();
1905 return t;
1906 }
1907
1908 /* Like lisp_time_argument, except decode only the seconds part,
1909 and do not check the subseconds part. */
1910 static time_t
1911 lisp_seconds_argument (Lisp_Object specified_time)
1912 {
1913 Lisp_Object high, low, usec, psec;
1914 struct lisp_time t;
1915
1916 int val = disassemble_lisp_time (specified_time, &high, &low, &usec, &psec);
1917 if (val != 0)
1918 {
1919 val = decode_time_components (high, low, make_number (0),
1920 make_number (0), &t, 0);
1921 if (0 < val
1922 && ! ((TYPE_SIGNED (time_t)
1923 ? TIME_T_MIN >> LO_TIME_BITS <= t.hi
1924 : 0 <= t.hi)
1925 && t.hi <= TIME_T_MAX >> LO_TIME_BITS))
1926 val = -1;
1927 }
1928 check_time_validity (val);
1929 return (t.hi << LO_TIME_BITS) + t.lo;
1930 }
1931
1932 DEFUN ("float-time", Ffloat_time, Sfloat_time, 0, 1, 0,
1933 doc: /* Return the current time, as a float number of seconds since the epoch.
1934 If SPECIFIED-TIME is given, it is the time to convert to float
1935 instead of the current time. The argument should have the form
1936 \(HIGH LOW) or (HIGH LOW USEC) or (HIGH LOW USEC PSEC). Thus,
1937 you can use times from `current-time' and from `file-attributes'.
1938 SPECIFIED-TIME can also have the form (HIGH . LOW), but this is
1939 considered obsolete.
1940
1941 WARNING: Since the result is floating point, it may not be exact.
1942 If precise time stamps are required, use either `current-time',
1943 or (if you need time as a string) `format-time-string'. */)
1944 (Lisp_Object specified_time)
1945 {
1946 double t;
1947 Lisp_Object high, low, usec, psec;
1948 if (! (disassemble_lisp_time (specified_time, &high, &low, &usec, &psec)
1949 && decode_time_components (high, low, usec, psec, 0, &t)))
1950 invalid_time ();
1951 return make_float (t);
1952 }
1953
1954 /* Write information into buffer S of size MAXSIZE, according to the
1955 FORMAT of length FORMAT_LEN, using time information taken from *TP.
1956 Use the time zone specified by TZ.
1957 Use NS as the number of nanoseconds in the %N directive.
1958 Return the number of bytes written, not including the terminating
1959 '\0'. If S is NULL, nothing will be written anywhere; so to
1960 determine how many bytes would be written, use NULL for S and
1961 ((size_t) -1) for MAXSIZE.
1962
1963 This function behaves like nstrftime, except it allows null
1964 bytes in FORMAT and it does not support nanoseconds. */
1965 static size_t
1966 emacs_nmemftime (char *s, size_t maxsize, const char *format,
1967 size_t format_len, const struct tm *tp, timezone_t tz, int ns)
1968 {
1969 size_t total = 0;
1970
1971 /* Loop through all the null-terminated strings in the format
1972 argument. Normally there's just one null-terminated string, but
1973 there can be arbitrarily many, concatenated together, if the
1974 format contains '\0' bytes. nstrftime stops at the first
1975 '\0' byte so we must invoke it separately for each such string. */
1976 for (;;)
1977 {
1978 size_t len;
1979 size_t result;
1980
1981 if (s)
1982 s[0] = '\1';
1983
1984 result = nstrftime (s, maxsize, format, tp, tz, ns);
1985
1986 if (s)
1987 {
1988 if (result == 0 && s[0] != '\0')
1989 return 0;
1990 s += result + 1;
1991 }
1992
1993 maxsize -= result + 1;
1994 total += result;
1995 len = strlen (format);
1996 if (len == format_len)
1997 return total;
1998 total++;
1999 format += len + 1;
2000 format_len -= len + 1;
2001 }
2002 }
2003
2004 DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0,
2005 doc: /* Use FORMAT-STRING to format the time TIME, or now if omitted.
2006 TIME is specified as (HIGH LOW USEC PSEC), as returned by
2007 `current-time' or `file-attributes'. The obsolete form (HIGH . LOW)
2008 is also still accepted.
2009
2010 The optional ZONE is omitted or nil for Emacs local time, t for
2011 Universal Time, `wall' for system wall clock time, or a string as in
2012 the TZ environment variable. It can also be a list (as from
2013 `current-time-zone') or an integer (as from `decode-time') applied
2014 without consideration for daylight saving time.
2015
2016 The value is a copy of FORMAT-STRING, but with certain constructs replaced
2017 by text that describes the specified date and time in TIME:
2018
2019 %Y is the year, %y within the century, %C the century.
2020 %G is the year corresponding to the ISO week, %g within the century.
2021 %m is the numeric month.
2022 %b and %h are the locale's abbreviated month name, %B the full name.
2023 (%h is not supported on MS-Windows.)
2024 %d is the day of the month, zero-padded, %e is blank-padded.
2025 %u is the numeric day of week from 1 (Monday) to 7, %w from 0 (Sunday) to 6.
2026 %a is the locale's abbreviated name of the day of week, %A the full name.
2027 %U is the week number starting on Sunday, %W starting on Monday,
2028 %V according to ISO 8601.
2029 %j is the day of the year.
2030
2031 %H is the hour on a 24-hour clock, %I is on a 12-hour clock, %k is like %H
2032 only blank-padded, %l is like %I blank-padded.
2033 %p is the locale's equivalent of either AM or PM.
2034 %M is the minute.
2035 %S is the second.
2036 %N is the nanosecond, %6N the microsecond, %3N the millisecond, etc.
2037 %Z is the time zone name, %z is the numeric form.
2038 %s is the number of seconds since 1970-01-01 00:00:00 +0000.
2039
2040 %c is the locale's date and time format.
2041 %x is the locale's "preferred" date format.
2042 %D is like "%m/%d/%y".
2043 %F is the ISO 8601 date format (like "%Y-%m-%d").
2044
2045 %R is like "%H:%M", %T is like "%H:%M:%S", %r is like "%I:%M:%S %p".
2046 %X is the locale's "preferred" time format.
2047
2048 Finally, %n is a newline, %t is a tab, %% is a literal %.
2049
2050 Certain flags and modifiers are available with some format controls.
2051 The flags are `_', `-', `^' and `#'. For certain characters X,
2052 %_X is like %X, but padded with blanks; %-X is like %X,
2053 but without padding. %^X is like %X, but with all textual
2054 characters up-cased; %#X is like %X, but with letter-case of
2055 all textual characters reversed.
2056 %NX (where N stands for an integer) is like %X,
2057 but takes up at least N (a number) positions.
2058 The modifiers are `E' and `O'. For certain characters X,
2059 %EX is a locale's alternative version of %X;
2060 %OX is like %X, but uses the locale's number symbols.
2061
2062 For example, to produce full ISO 8601 format, use "%FT%T%z".
2063
2064 usage: (format-time-string FORMAT-STRING &optional TIME ZONE) */)
2065 (Lisp_Object format_string, Lisp_Object timeval, Lisp_Object zone)
2066 {
2067 struct timespec t = lisp_time_argument (timeval);
2068 struct tm tm;
2069
2070 CHECK_STRING (format_string);
2071 format_string = code_convert_string_norecord (format_string,
2072 Vlocale_coding_system, 1);
2073 return format_time_string (SSDATA (format_string), SBYTES (format_string),
2074 t, zone, &tm);
2075 }
2076
2077 static Lisp_Object
2078 format_time_string (char const *format, ptrdiff_t formatlen,
2079 struct timespec t, Lisp_Object zone, struct tm *tmp)
2080 {
2081 char buffer[4000];
2082 char *buf = buffer;
2083 ptrdiff_t size = sizeof buffer;
2084 size_t len;
2085 int ns = t.tv_nsec;
2086 USE_SAFE_ALLOCA;
2087
2088 timezone_t tz = tzlookup (zone, false);
2089 tmp = emacs_localtime_rz (tz, &t.tv_sec, tmp);
2090 if (! tmp)
2091 {
2092 xtzfree (tz);
2093 time_overflow ();
2094 }
2095 synchronize_system_time_locale ();
2096
2097 while (true)
2098 {
2099 buf[0] = '\1';
2100 len = emacs_nmemftime (buf, size, format, formatlen, tmp, tz, ns);
2101 if ((0 < len && len < size) || (len == 0 && buf[0] == '\0'))
2102 break;
2103
2104 /* Buffer was too small, so make it bigger and try again. */
2105 len = emacs_nmemftime (NULL, SIZE_MAX, format, formatlen, tmp, tz, ns);
2106 if (STRING_BYTES_BOUND <= len)
2107 {
2108 xtzfree (tz);
2109 string_overflow ();
2110 }
2111 size = len + 1;
2112 buf = SAFE_ALLOCA (size);
2113 }
2114
2115 xtzfree (tz);
2116 AUTO_STRING_WITH_LEN (bufstring, buf, len);
2117 Lisp_Object result = code_convert_string_norecord (bufstring,
2118 Vlocale_coding_system, 0);
2119 SAFE_FREE ();
2120 return result;
2121 }
2122
2123 DEFUN ("decode-time", Fdecode_time, Sdecode_time, 0, 2, 0,
2124 doc: /* Decode a time value as (SEC MINUTE HOUR DAY MONTH YEAR DOW DST UTCOFF).
2125 The optional SPECIFIED-TIME should be a list of (HIGH LOW . IGNORED),
2126 as from `current-time' and `file-attributes', or nil to use the
2127 current time. The obsolete form (HIGH . LOW) is also still accepted.
2128
2129 The optional ZONE is omitted or nil for Emacs local time, t for
2130 Universal Time, `wall' for system wall clock time, or a string as in
2131 the TZ environment variable. It can also be a list (as from
2132 `current-time-zone') or an integer (as from `decode-time') applied
2133 without consideration for daylight saving time.
2134
2135 The list has the following nine members: SEC is an integer between 0
2136 and 60; SEC is 60 for a leap second, which only some operating systems
2137 support. MINUTE is an integer between 0 and 59. HOUR is an integer
2138 between 0 and 23. DAY is an integer between 1 and 31. MONTH is an
2139 integer between 1 and 12. YEAR is an integer indicating the
2140 four-digit year. DOW is the day of week, an integer between 0 and 6,
2141 where 0 is Sunday. DST is t if daylight saving time is in effect,
2142 otherwise nil. UTCOFF is an integer indicating the UTC offset in
2143 seconds, i.e., the number of seconds east of Greenwich. (Note that
2144 Common Lisp has different meanings for DOW and UTCOFF.)
2145
2146 usage: (decode-time &optional TIME ZONE) */)
2147 (Lisp_Object specified_time, Lisp_Object zone)
2148 {
2149 time_t time_spec = lisp_seconds_argument (specified_time);
2150 struct tm local_tm, gmt_tm;
2151 timezone_t tz = tzlookup (zone, false);
2152 struct tm *tm = emacs_localtime_rz (tz, &time_spec, &local_tm);
2153 xtzfree (tz);
2154
2155 if (! (tm
2156 && MOST_NEGATIVE_FIXNUM - TM_YEAR_BASE <= local_tm.tm_year
2157 && local_tm.tm_year <= MOST_POSITIVE_FIXNUM - TM_YEAR_BASE))
2158 time_overflow ();
2159
2160 /* Avoid overflow when INT_MAX < EMACS_INT_MAX. */
2161 EMACS_INT tm_year_base = TM_YEAR_BASE;
2162
2163 return CALLN (Flist,
2164 make_number (local_tm.tm_sec),
2165 make_number (local_tm.tm_min),
2166 make_number (local_tm.tm_hour),
2167 make_number (local_tm.tm_mday),
2168 make_number (local_tm.tm_mon + 1),
2169 make_number (local_tm.tm_year + tm_year_base),
2170 make_number (local_tm.tm_wday),
2171 local_tm.tm_isdst ? Qt : Qnil,
2172 (HAVE_TM_GMTOFF
2173 ? make_number (tm_gmtoff (&local_tm))
2174 : gmtime_r (&time_spec, &gmt_tm)
2175 ? make_number (tm_diff (&local_tm, &gmt_tm))
2176 : Qnil));
2177 }
2178
2179 /* Return OBJ - OFFSET, checking that OBJ is a valid fixnum and that
2180 the result is representable as an int. */
2181 static int
2182 check_tm_member (Lisp_Object obj, int offset)
2183 {
2184 CHECK_NUMBER (obj);
2185 EMACS_INT n = XINT (obj);
2186 int result;
2187 if (INT_SUBTRACT_WRAPV (n, offset, &result))
2188 time_overflow ();
2189 return result;
2190 }
2191
2192 DEFUN ("encode-time", Fencode_time, Sencode_time, 6, MANY, 0,
2193 doc: /* Convert SECOND, MINUTE, HOUR, DAY, MONTH, YEAR and ZONE to internal time.
2194 This is the reverse operation of `decode-time', which see.
2195
2196 The optional ZONE is omitted or nil for Emacs local time, t for
2197 Universal Time, `wall' for system wall clock time, or a string as in
2198 the TZ environment variable. It can also be a list (as from
2199 `current-time-zone') or an integer (as from `decode-time') applied
2200 without consideration for daylight saving time.
2201
2202 You can pass more than 7 arguments; then the first six arguments
2203 are used as SECOND through YEAR, and the *last* argument is used as ZONE.
2204 The intervening arguments are ignored.
2205 This feature lets (apply \\='encode-time (decode-time ...)) work.
2206
2207 Out-of-range values for SECOND, MINUTE, HOUR, DAY, or MONTH are allowed;
2208 for example, a DAY of 0 means the day preceding the given month.
2209 Year numbers less than 100 are treated just like other year numbers.
2210 If you want them to stand for years in this century, you must do that yourself.
2211
2212 Years before 1970 are not guaranteed to work. On some systems,
2213 year values as low as 1901 do work.
2214
2215 usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE) */)
2216 (ptrdiff_t nargs, Lisp_Object *args)
2217 {
2218 time_t value;
2219 struct tm tm;
2220 Lisp_Object zone = (nargs > 6 ? args[nargs - 1] : Qnil);
2221
2222 tm.tm_sec = check_tm_member (args[0], 0);
2223 tm.tm_min = check_tm_member (args[1], 0);
2224 tm.tm_hour = check_tm_member (args[2], 0);
2225 tm.tm_mday = check_tm_member (args[3], 0);
2226 tm.tm_mon = check_tm_member (args[4], 1);
2227 tm.tm_year = check_tm_member (args[5], TM_YEAR_BASE);
2228 tm.tm_isdst = -1;
2229
2230 timezone_t tz = tzlookup (zone, false);
2231 value = emacs_mktime_z (tz, &tm);
2232 xtzfree (tz);
2233
2234 if (value == (time_t) -1)
2235 time_overflow ();
2236
2237 return list2i (hi_time (value), lo_time (value));
2238 }
2239
2240 DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string,
2241 0, 2, 0,
2242 doc: /* Return the current local time, as a human-readable string.
2243 Programs can use this function to decode a time,
2244 since the number of columns in each field is fixed
2245 if the year is in the range 1000-9999.
2246 The format is `Sun Sep 16 01:03:52 1973'.
2247 However, see also the functions `decode-time' and `format-time-string'
2248 which provide a much more powerful and general facility.
2249
2250 If SPECIFIED-TIME is given, it is a time to format instead of the
2251 current time. The argument should have the form (HIGH LOW . IGNORED).
2252 Thus, you can use times obtained from `current-time' and from
2253 `file-attributes'. SPECIFIED-TIME can also have the form (HIGH . LOW),
2254 but this is considered obsolete.
2255
2256 The optional ZONE is omitted or nil for Emacs local time, t for
2257 Universal Time, `wall' for system wall clock time, or a string as in
2258 the TZ environment variable. It can also be a list (as from
2259 `current-time-zone') or an integer (as from `decode-time') applied
2260 without consideration for daylight saving time. */)
2261 (Lisp_Object specified_time, Lisp_Object zone)
2262 {
2263 time_t value = lisp_seconds_argument (specified_time);
2264 timezone_t tz = tzlookup (zone, false);
2265
2266 /* Convert to a string in ctime format, except without the trailing
2267 newline, and without the 4-digit year limit. Don't use asctime
2268 or ctime, as they might dump core if the year is outside the
2269 range -999 .. 9999. */
2270 struct tm tm;
2271 struct tm *tmp = emacs_localtime_rz (tz, &value, &tm);
2272 xtzfree (tz);
2273 if (! tmp)
2274 time_overflow ();
2275
2276 static char const wday_name[][4] =
2277 { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
2278 static char const mon_name[][4] =
2279 { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
2280 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
2281 printmax_t year_base = TM_YEAR_BASE;
2282 char buf[sizeof "Mon Apr 30 12:49:17 " + INT_STRLEN_BOUND (int) + 1];
2283 int len = sprintf (buf, "%s %s%3d %02d:%02d:%02d %"pMd,
2284 wday_name[tm.tm_wday], mon_name[tm.tm_mon], tm.tm_mday,
2285 tm.tm_hour, tm.tm_min, tm.tm_sec,
2286 tm.tm_year + year_base);
2287
2288 return make_unibyte_string (buf, len);
2289 }
2290
2291 /* Yield A - B, measured in seconds.
2292 This function is copied from the GNU C Library. */
2293 static int
2294 tm_diff (struct tm *a, struct tm *b)
2295 {
2296 /* Compute intervening leap days correctly even if year is negative.
2297 Take care to avoid int overflow in leap day calculations,
2298 but it's OK to assume that A and B are close to each other. */
2299 int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3);
2300 int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3);
2301 int a100 = a4 / 25 - (a4 % 25 < 0);
2302 int b100 = b4 / 25 - (b4 % 25 < 0);
2303 int a400 = a100 >> 2;
2304 int b400 = b100 >> 2;
2305 int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
2306 int years = a->tm_year - b->tm_year;
2307 int days = (365 * years + intervening_leap_days
2308 + (a->tm_yday - b->tm_yday));
2309 return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
2310 + (a->tm_min - b->tm_min))
2311 + (a->tm_sec - b->tm_sec));
2312 }
2313
2314 /* Yield A's UTC offset, or an unspecified value if unknown. */
2315 static long int
2316 tm_gmtoff (struct tm *a)
2317 {
2318 #if HAVE_TM_GMTOFF
2319 return a->tm_gmtoff;
2320 #else
2321 return 0;
2322 #endif
2323 }
2324
2325 DEFUN ("current-time-zone", Fcurrent_time_zone, Scurrent_time_zone, 0, 2, 0,
2326 doc: /* Return the offset and name for the local time zone.
2327 This returns a list of the form (OFFSET NAME).
2328 OFFSET is an integer number of seconds ahead of UTC (east of Greenwich).
2329 A negative value means west of Greenwich.
2330 NAME is a string giving the name of the time zone.
2331 If SPECIFIED-TIME is given, the time zone offset is determined from it
2332 instead of using the current time. The argument should have the form
2333 \(HIGH LOW . IGNORED). Thus, you can use times obtained from
2334 `current-time' and from `file-attributes'. SPECIFIED-TIME can also
2335 have the form (HIGH . LOW), but this is considered obsolete.
2336
2337 The optional ZONE is omitted or nil for Emacs local time, t for
2338 Universal Time, `wall' for system wall clock time, or a string as in
2339 the TZ environment variable. It can also be a list (as from
2340 `current-time-zone') or an integer (as from `decode-time') applied
2341 without consideration for daylight saving time.
2342
2343 Some operating systems cannot provide all this information to Emacs;
2344 in this case, `current-time-zone' returns a list containing nil for
2345 the data it can't find. */)
2346 (Lisp_Object specified_time, Lisp_Object zone)
2347 {
2348 struct timespec value;
2349 struct tm local_tm, gmt_tm;
2350 Lisp_Object zone_offset, zone_name;
2351
2352 zone_offset = Qnil;
2353 value = make_timespec (lisp_seconds_argument (specified_time), 0);
2354 zone_name = format_time_string ("%Z", sizeof "%Z" - 1, value,
2355 zone, &local_tm);
2356
2357 if (HAVE_TM_GMTOFF || gmtime_r (&value.tv_sec, &gmt_tm))
2358 {
2359 long int offset = (HAVE_TM_GMTOFF
2360 ? tm_gmtoff (&local_tm)
2361 : tm_diff (&local_tm, &gmt_tm));
2362 zone_offset = make_number (offset);
2363 if (SCHARS (zone_name) == 0)
2364 {
2365 /* No local time zone name is available; use numeric zone instead. */
2366 long int hour = offset / 3600;
2367 int min_sec = offset % 3600;
2368 int amin_sec = min_sec < 0 ? - min_sec : min_sec;
2369 int min = amin_sec / 60;
2370 int sec = amin_sec % 60;
2371 int min_prec = min_sec ? 2 : 0;
2372 int sec_prec = sec ? 2 : 0;
2373 char buf[sizeof "+0000" + INT_STRLEN_BOUND (long int)];
2374 zone_name = make_formatted_string (buf, "%c%.2ld%.*d%.*d",
2375 (offset < 0 ? '-' : '+'),
2376 hour, min_prec, min, sec_prec, sec);
2377 }
2378 }
2379
2380 return list2 (zone_offset, zone_name);
2381 }
2382
2383 DEFUN ("set-time-zone-rule", Fset_time_zone_rule, Sset_time_zone_rule, 1, 1, 0,
2384 doc: /* Set the Emacs local time zone using TZ, a string specifying a time zone rule.
2385 If TZ is nil or `wall', use system wall clock time; this differs from
2386 the usual Emacs convention where nil means current local time. If TZ
2387 is t, use Universal Time. If TZ is a list (as from
2388 `current-time-zone') or an integer (as from `decode-time'), use the
2389 specified time zone without consideration for daylight saving time.
2390
2391 Instead of calling this function, you typically want something else.
2392 To temporarily use a different time zone rule for just one invocation
2393 of `decode-time', `encode-time', or `format-time-string', pass the
2394 function a ZONE argument. To change local time consistently
2395 throughout Emacs, call (setenv "TZ" TZ): this changes both the
2396 environment of the Emacs process and the variable
2397 `process-environment', whereas `set-time-zone-rule' affects only the
2398 former. */)
2399 (Lisp_Object tz)
2400 {
2401 tzlookup (NILP (tz) ? Qwall : tz, true);
2402 return Qnil;
2403 }
2404
2405 /* A buffer holding a string of the form "TZ=value", intended
2406 to be part of the environment. If TZ is supposed to be unset,
2407 the buffer string is "tZ=". */
2408 static char *tzvalbuf;
2409
2410 /* Get the local time zone rule. */
2411 char *
2412 emacs_getenv_TZ (void)
2413 {
2414 return tzvalbuf[0] == 'T' ? tzvalbuf + tzeqlen : 0;
2415 }
2416
2417 /* Set the local time zone rule to TZSTRING, which can be null to
2418 denote wall clock time. Do not record the setting in LOCAL_TZ.
2419
2420 This function is not thread-safe, in theory because putenv is not,
2421 but mostly because of the static storage it updates. Other threads
2422 that invoke localtime etc. may be adversely affected while this
2423 function is executing. */
2424
2425 int
2426 emacs_setenv_TZ (const char *tzstring)
2427 {
2428 static ptrdiff_t tzvalbufsize;
2429 ptrdiff_t tzstringlen = tzstring ? strlen (tzstring) : 0;
2430 char *tzval = tzvalbuf;
2431 bool new_tzvalbuf = tzvalbufsize <= tzeqlen + tzstringlen;
2432
2433 if (new_tzvalbuf)
2434 {
2435 /* Do not attempt to free the old tzvalbuf, since another thread
2436 may be using it. In practice, the first allocation is large
2437 enough and memory does not leak. */
2438 tzval = xpalloc (NULL, &tzvalbufsize,
2439 tzeqlen + tzstringlen - tzvalbufsize + 1, -1, 1);
2440 tzvalbuf = tzval;
2441 tzval[1] = 'Z';
2442 tzval[2] = '=';
2443 }
2444
2445 if (tzstring)
2446 {
2447 /* Modify TZVAL in place. Although this is dicey in a
2448 multithreaded environment, we know of no portable alternative.
2449 Calling putenv or setenv could crash some other thread. */
2450 tzval[0] = 'T';
2451 strcpy (tzval + tzeqlen, tzstring);
2452 }
2453 else
2454 {
2455 /* Turn 'TZ=whatever' into an empty environment variable 'tZ='.
2456 Although this is also dicey, calling unsetenv here can crash Emacs.
2457 See Bug#8705. */
2458 tzval[0] = 't';
2459 tzval[tzeqlen] = 0;
2460 }
2461
2462
2463 #ifndef WINDOWSNT
2464 /* Modifying *TZVAL merely requires calling tzset (which is the
2465 caller's responsibility). However, modifying TZVAL requires
2466 calling putenv; although this is not thread-safe, in practice this
2467 runs only on startup when there is only one thread. */
2468 bool need_putenv = new_tzvalbuf;
2469 #else
2470 /* MS-Windows 'putenv' copies the argument string into a block it
2471 allocates, so modifying *TZVAL will not change the environment.
2472 However, the other threads run by Emacs on MS-Windows never call
2473 'xputenv' or 'putenv' or 'unsetenv', so the original cause for the
2474 dicey in-place modification technique doesn't exist there in the
2475 first place. */
2476 bool need_putenv = true;
2477 #endif
2478 if (need_putenv)
2479 xputenv (tzval);
2480
2481 return 0;
2482 }
2483 \f
2484 /* Insert NARGS Lisp objects in the array ARGS by calling INSERT_FUNC
2485 (if a type of object is Lisp_Int) or INSERT_FROM_STRING_FUNC (if a
2486 type of object is Lisp_String). INHERIT is passed to
2487 INSERT_FROM_STRING_FUNC as the last argument. */
2488
2489 static void
2490 general_insert_function (void (*insert_func)
2491 (const char *, ptrdiff_t),
2492 void (*insert_from_string_func)
2493 (Lisp_Object, ptrdiff_t, ptrdiff_t,
2494 ptrdiff_t, ptrdiff_t, bool),
2495 bool inherit, ptrdiff_t nargs, Lisp_Object *args)
2496 {
2497 ptrdiff_t argnum;
2498 Lisp_Object val;
2499
2500 for (argnum = 0; argnum < nargs; argnum++)
2501 {
2502 val = args[argnum];
2503 if (CHARACTERP (val))
2504 {
2505 int c = XFASTINT (val);
2506 unsigned char str[MAX_MULTIBYTE_LENGTH];
2507 int len;
2508
2509 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
2510 len = CHAR_STRING (c, str);
2511 else
2512 {
2513 str[0] = CHAR_TO_BYTE8 (c);
2514 len = 1;
2515 }
2516 (*insert_func) ((char *) str, len);
2517 }
2518 else if (STRINGP (val))
2519 {
2520 (*insert_from_string_func) (val, 0, 0,
2521 SCHARS (val),
2522 SBYTES (val),
2523 inherit);
2524 }
2525 else
2526 wrong_type_argument (Qchar_or_string_p, val);
2527 }
2528 }
2529
2530 void
2531 insert1 (Lisp_Object arg)
2532 {
2533 Finsert (1, &arg);
2534 }
2535
2536
2537 DEFUN ("insert", Finsert, Sinsert, 0, MANY, 0,
2538 doc: /* Insert the arguments, either strings or characters, at point.
2539 Point and after-insertion markers move forward to end up
2540 after the inserted text.
2541 Any other markers at the point of insertion remain before the text.
2542
2543 If the current buffer is multibyte, unibyte strings are converted
2544 to multibyte for insertion (see `string-make-multibyte').
2545 If the current buffer is unibyte, multibyte strings are converted
2546 to unibyte for insertion (see `string-make-unibyte').
2547
2548 When operating on binary data, it may be necessary to preserve the
2549 original bytes of a unibyte string when inserting it into a multibyte
2550 buffer; to accomplish this, apply `string-as-multibyte' to the string
2551 and insert the result.
2552
2553 usage: (insert &rest ARGS) */)
2554 (ptrdiff_t nargs, Lisp_Object *args)
2555 {
2556 general_insert_function (insert, insert_from_string, 0, nargs, args);
2557 return Qnil;
2558 }
2559
2560 DEFUN ("insert-and-inherit", Finsert_and_inherit, Sinsert_and_inherit,
2561 0, MANY, 0,
2562 doc: /* Insert the arguments at point, inheriting properties from adjoining text.
2563 Point and after-insertion markers move forward to end up
2564 after the inserted text.
2565 Any other markers at the point of insertion remain before the text.
2566
2567 If the current buffer is multibyte, unibyte strings are converted
2568 to multibyte for insertion (see `unibyte-char-to-multibyte').
2569 If the current buffer is unibyte, multibyte strings are converted
2570 to unibyte for insertion.
2571
2572 usage: (insert-and-inherit &rest ARGS) */)
2573 (ptrdiff_t nargs, Lisp_Object *args)
2574 {
2575 general_insert_function (insert_and_inherit, insert_from_string, 1,
2576 nargs, args);
2577 return Qnil;
2578 }
2579
2580 DEFUN ("insert-before-markers", Finsert_before_markers, Sinsert_before_markers, 0, MANY, 0,
2581 doc: /* Insert strings or characters at point, relocating markers after the text.
2582 Point and markers move forward to end up after the inserted text.
2583
2584 If the current buffer is multibyte, unibyte strings are converted
2585 to multibyte for insertion (see `unibyte-char-to-multibyte').
2586 If the current buffer is unibyte, multibyte strings are converted
2587 to unibyte for insertion.
2588
2589 If an overlay begins at the insertion point, the inserted text falls
2590 outside the overlay; if a nonempty overlay ends at the insertion
2591 point, the inserted text falls inside that overlay.
2592
2593 usage: (insert-before-markers &rest ARGS) */)
2594 (ptrdiff_t nargs, Lisp_Object *args)
2595 {
2596 general_insert_function (insert_before_markers,
2597 insert_from_string_before_markers, 0,
2598 nargs, args);
2599 return Qnil;
2600 }
2601
2602 DEFUN ("insert-before-markers-and-inherit", Finsert_and_inherit_before_markers,
2603 Sinsert_and_inherit_before_markers, 0, MANY, 0,
2604 doc: /* Insert text at point, relocating markers and inheriting properties.
2605 Point and markers move forward to end up after the inserted text.
2606
2607 If the current buffer is multibyte, unibyte strings are converted
2608 to multibyte for insertion (see `unibyte-char-to-multibyte').
2609 If the current buffer is unibyte, multibyte strings are converted
2610 to unibyte for insertion.
2611
2612 usage: (insert-before-markers-and-inherit &rest ARGS) */)
2613 (ptrdiff_t nargs, Lisp_Object *args)
2614 {
2615 general_insert_function (insert_before_markers_and_inherit,
2616 insert_from_string_before_markers, 1,
2617 nargs, args);
2618 return Qnil;
2619 }
2620 \f
2621 DEFUN ("insert-char", Finsert_char, Sinsert_char, 1, 3,
2622 "(list (read-char-by-name \"Insert character (Unicode name or hex): \")\
2623 (prefix-numeric-value current-prefix-arg)\
2624 t))",
2625 doc: /* Insert COUNT copies of CHARACTER.
2626 Interactively, prompt for CHARACTER. You can specify CHARACTER in one
2627 of these ways:
2628
2629 - As its Unicode character name, e.g. \"LATIN SMALL LETTER A\".
2630 Completion is available; if you type a substring of the name
2631 preceded by an asterisk `*', Emacs shows all names which include
2632 that substring, not necessarily at the beginning of the name.
2633
2634 - As a hexadecimal code point, e.g. 263A. Note that code points in
2635 Emacs are equivalent to Unicode up to 10FFFF (which is the limit of
2636 the Unicode code space).
2637
2638 - As a code point with a radix specified with #, e.g. #o21430
2639 (octal), #x2318 (hex), or #10r8984 (decimal).
2640
2641 If called interactively, COUNT is given by the prefix argument. If
2642 omitted or nil, it defaults to 1.
2643
2644 Inserting the character(s) relocates point and before-insertion
2645 markers in the same ways as the function `insert'.
2646
2647 The optional third argument INHERIT, if non-nil, says to inherit text
2648 properties from adjoining text, if those properties are sticky. If
2649 called interactively, INHERIT is t. */)
2650 (Lisp_Object character, Lisp_Object count, Lisp_Object inherit)
2651 {
2652 int i, stringlen;
2653 register ptrdiff_t n;
2654 int c, len;
2655 unsigned char str[MAX_MULTIBYTE_LENGTH];
2656 char string[4000];
2657
2658 CHECK_CHARACTER (character);
2659 if (NILP (count))
2660 XSETFASTINT (count, 1);
2661 CHECK_NUMBER (count);
2662 c = XFASTINT (character);
2663
2664 if (!NILP (BVAR (current_buffer, enable_multibyte_characters)))
2665 len = CHAR_STRING (c, str);
2666 else
2667 str[0] = c, len = 1;
2668 if (XINT (count) <= 0)
2669 return Qnil;
2670 if (BUF_BYTES_MAX / len < XINT (count))
2671 buffer_overflow ();
2672 n = XINT (count) * len;
2673 stringlen = min (n, sizeof string - sizeof string % len);
2674 for (i = 0; i < stringlen; i++)
2675 string[i] = str[i % len];
2676 while (n > stringlen)
2677 {
2678 QUIT;
2679 if (!NILP (inherit))
2680 insert_and_inherit (string, stringlen);
2681 else
2682 insert (string, stringlen);
2683 n -= stringlen;
2684 }
2685 if (!NILP (inherit))
2686 insert_and_inherit (string, n);
2687 else
2688 insert (string, n);
2689 return Qnil;
2690 }
2691
2692 DEFUN ("insert-byte", Finsert_byte, Sinsert_byte, 2, 3, 0,
2693 doc: /* Insert COUNT (second arg) copies of BYTE (first arg).
2694 Both arguments are required.
2695 BYTE is a number of the range 0..255.
2696
2697 If BYTE is 128..255 and the current buffer is multibyte, the
2698 corresponding eight-bit character is inserted.
2699
2700 Point, and before-insertion markers, are relocated as in the function `insert'.
2701 The optional third arg INHERIT, if non-nil, says to inherit text properties
2702 from adjoining text, if those properties are sticky. */)
2703 (Lisp_Object byte, Lisp_Object count, Lisp_Object inherit)
2704 {
2705 CHECK_NUMBER (byte);
2706 if (XINT (byte) < 0 || XINT (byte) > 255)
2707 args_out_of_range_3 (byte, make_number (0), make_number (255));
2708 if (XINT (byte) >= 128
2709 && ! NILP (BVAR (current_buffer, enable_multibyte_characters)))
2710 XSETFASTINT (byte, BYTE8_TO_CHAR (XINT (byte)));
2711 return Finsert_char (byte, count, inherit);
2712 }
2713
2714 \f
2715 /* Making strings from buffer contents. */
2716
2717 /* Return a Lisp_String containing the text of the current buffer from
2718 START to END. If text properties are in use and the current buffer
2719 has properties in the range specified, the resulting string will also
2720 have them, if PROPS is true.
2721
2722 We don't want to use plain old make_string here, because it calls
2723 make_uninit_string, which can cause the buffer arena to be
2724 compacted. make_string has no way of knowing that the data has
2725 been moved, and thus copies the wrong data into the string. This
2726 doesn't effect most of the other users of make_string, so it should
2727 be left as is. But we should use this function when conjuring
2728 buffer substrings. */
2729
2730 Lisp_Object
2731 make_buffer_string (ptrdiff_t start, ptrdiff_t end, bool props)
2732 {
2733 ptrdiff_t start_byte = CHAR_TO_BYTE (start);
2734 ptrdiff_t end_byte = CHAR_TO_BYTE (end);
2735
2736 return make_buffer_string_both (start, start_byte, end, end_byte, props);
2737 }
2738
2739 /* Return a Lisp_String containing the text of the current buffer from
2740 START / START_BYTE to END / END_BYTE.
2741
2742 If text properties are in use and the current buffer
2743 has properties in the range specified, the resulting string will also
2744 have them, if PROPS is true.
2745
2746 We don't want to use plain old make_string here, because it calls
2747 make_uninit_string, which can cause the buffer arena to be
2748 compacted. make_string has no way of knowing that the data has
2749 been moved, and thus copies the wrong data into the string. This
2750 doesn't effect most of the other users of make_string, so it should
2751 be left as is. But we should use this function when conjuring
2752 buffer substrings. */
2753
2754 Lisp_Object
2755 make_buffer_string_both (ptrdiff_t start, ptrdiff_t start_byte,
2756 ptrdiff_t end, ptrdiff_t end_byte, bool props)
2757 {
2758 Lisp_Object result, tem, tem1;
2759 ptrdiff_t beg0, end0, beg1, end1, size;
2760
2761 if (start_byte < GPT_BYTE && GPT_BYTE < end_byte)
2762 {
2763 /* Two regions, before and after the gap. */
2764 beg0 = start_byte;
2765 end0 = GPT_BYTE;
2766 beg1 = GPT_BYTE + GAP_SIZE - BEG_BYTE;
2767 end1 = end_byte + GAP_SIZE - BEG_BYTE;
2768 }
2769 else
2770 {
2771 /* The only region. */
2772 beg0 = start_byte;
2773 end0 = end_byte;
2774 beg1 = -1;
2775 end1 = -1;
2776 }
2777
2778 if (! NILP (BVAR (current_buffer, enable_multibyte_characters)))
2779 result = make_uninit_multibyte_string (end - start, end_byte - start_byte);
2780 else
2781 result = make_uninit_string (end - start);
2782
2783 size = end0 - beg0;
2784 memcpy (SDATA (result), BYTE_POS_ADDR (beg0), size);
2785 if (beg1 != -1)
2786 memcpy (SDATA (result) + size, BEG_ADDR + beg1, end1 - beg1);
2787
2788 /* If desired, update and copy the text properties. */
2789 if (props)
2790 {
2791 update_buffer_properties (start, end);
2792
2793 tem = Fnext_property_change (make_number (start), Qnil, make_number (end));
2794 tem1 = Ftext_properties_at (make_number (start), Qnil);
2795
2796 if (XINT (tem) != end || !NILP (tem1))
2797 copy_intervals_to_string (result, current_buffer, start,
2798 end - start);
2799 }
2800
2801 return result;
2802 }
2803
2804 /* Call Vbuffer_access_fontify_functions for the range START ... END
2805 in the current buffer, if necessary. */
2806
2807 static void
2808 update_buffer_properties (ptrdiff_t start, ptrdiff_t end)
2809 {
2810 /* If this buffer has some access functions,
2811 call them, specifying the range of the buffer being accessed. */
2812 if (!NILP (Vbuffer_access_fontify_functions))
2813 {
2814 /* But don't call them if we can tell that the work
2815 has already been done. */
2816 if (!NILP (Vbuffer_access_fontified_property))
2817 {
2818 Lisp_Object tem
2819 = Ftext_property_any (make_number (start), make_number (end),
2820 Vbuffer_access_fontified_property,
2821 Qnil, Qnil);
2822 if (NILP (tem))
2823 return;
2824 }
2825
2826 CALLN (Frun_hook_with_args, Qbuffer_access_fontify_functions,
2827 make_number (start), make_number (end));
2828 }
2829 }
2830
2831 DEFUN ("buffer-substring", Fbuffer_substring, Sbuffer_substring, 2, 2, 0,
2832 doc: /* Return the contents of part of the current buffer as a string.
2833 The two arguments START and END are character positions;
2834 they can be in either order.
2835 The string returned is multibyte if the buffer is multibyte.
2836
2837 This function copies the text properties of that part of the buffer
2838 into the result string; if you don't want the text properties,
2839 use `buffer-substring-no-properties' instead. */)
2840 (Lisp_Object start, Lisp_Object end)
2841 {
2842 register ptrdiff_t b, e;
2843
2844 validate_region (&start, &end);
2845 b = XINT (start);
2846 e = XINT (end);
2847
2848 return make_buffer_string (b, e, 1);
2849 }
2850
2851 DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties,
2852 Sbuffer_substring_no_properties, 2, 2, 0,
2853 doc: /* Return the characters of part of the buffer, without the text properties.
2854 The two arguments START and END are character positions;
2855 they can be in either order. */)
2856 (Lisp_Object start, Lisp_Object end)
2857 {
2858 register ptrdiff_t b, e;
2859
2860 validate_region (&start, &end);
2861 b = XINT (start);
2862 e = XINT (end);
2863
2864 return make_buffer_string (b, e, 0);
2865 }
2866
2867 DEFUN ("buffer-string", Fbuffer_string, Sbuffer_string, 0, 0, 0,
2868 doc: /* Return the contents of the current buffer as a string.
2869 If narrowing is in effect, this function returns only the visible part
2870 of the buffer. */)
2871 (void)
2872 {
2873 return make_buffer_string_both (BEGV, BEGV_BYTE, ZV, ZV_BYTE, 1);
2874 }
2875
2876 DEFUN ("insert-buffer-substring", Finsert_buffer_substring, Sinsert_buffer_substring,
2877 1, 3, 0,
2878 doc: /* Insert before point a substring of the contents of BUFFER.
2879 BUFFER may be a buffer or a buffer name.
2880 Arguments START and END are character positions specifying the substring.
2881 They default to the values of (point-min) and (point-max) in BUFFER.
2882
2883 Point and before-insertion markers move forward to end up after the
2884 inserted text.
2885 Any other markers at the point of insertion remain before the text.
2886
2887 If the current buffer is multibyte and BUFFER is unibyte, or vice
2888 versa, strings are converted from unibyte to multibyte or vice versa
2889 using `string-make-multibyte' or `string-make-unibyte', which see. */)
2890 (Lisp_Object buffer, Lisp_Object start, Lisp_Object end)
2891 {
2892 register EMACS_INT b, e, temp;
2893 register struct buffer *bp, *obuf;
2894 Lisp_Object buf;
2895
2896 buf = Fget_buffer (buffer);
2897 if (NILP (buf))
2898 nsberror (buffer);
2899 bp = XBUFFER (buf);
2900 if (!BUFFER_LIVE_P (bp))
2901 error ("Selecting deleted buffer");
2902
2903 if (NILP (start))
2904 b = BUF_BEGV (bp);
2905 else
2906 {
2907 CHECK_NUMBER_COERCE_MARKER (start);
2908 b = XINT (start);
2909 }
2910 if (NILP (end))
2911 e = BUF_ZV (bp);
2912 else
2913 {
2914 CHECK_NUMBER_COERCE_MARKER (end);
2915 e = XINT (end);
2916 }
2917
2918 if (b > e)
2919 temp = b, b = e, e = temp;
2920
2921 if (!(BUF_BEGV (bp) <= b && e <= BUF_ZV (bp)))
2922 args_out_of_range (start, end);
2923
2924 obuf = current_buffer;
2925 set_buffer_internal_1 (bp);
2926 update_buffer_properties (b, e);
2927 set_buffer_internal_1 (obuf);
2928
2929 insert_from_buffer (bp, b, e - b, 0);
2930 return Qnil;
2931 }
2932
2933 DEFUN ("compare-buffer-substrings", Fcompare_buffer_substrings, Scompare_buffer_substrings,
2934 6, 6, 0,
2935 doc: /* Compare two substrings of two buffers; return result as number.
2936 Return -N if first string is less after N-1 chars, +N if first string is
2937 greater after N-1 chars, or 0 if strings match.
2938 The first substring is in BUFFER1 from START1 to END1 and the second
2939 is in BUFFER2 from START2 to END2.
2940 The value of `case-fold-search' in the current buffer
2941 determines whether case is significant or ignored. */)
2942 (Lisp_Object buffer1, Lisp_Object start1, Lisp_Object end1, Lisp_Object buffer2, Lisp_Object start2, Lisp_Object end2)
2943 {
2944 register EMACS_INT begp1, endp1, begp2, endp2, temp;
2945 register struct buffer *bp1, *bp2;
2946 register Lisp_Object trt
2947 = (!NILP (BVAR (current_buffer, case_fold_search))
2948 ? BVAR (current_buffer, case_canon_table) : Qnil);
2949 ptrdiff_t chars = 0;
2950 ptrdiff_t i1, i2, i1_byte, i2_byte;
2951
2952 /* Find the first buffer and its substring. */
2953
2954 if (NILP (buffer1))
2955 bp1 = current_buffer;
2956 else
2957 {
2958 Lisp_Object buf1;
2959 buf1 = Fget_buffer (buffer1);
2960 if (NILP (buf1))
2961 nsberror (buffer1);
2962 bp1 = XBUFFER (buf1);
2963 if (!BUFFER_LIVE_P (bp1))
2964 error ("Selecting deleted buffer");
2965 }
2966
2967 if (NILP (start1))
2968 begp1 = BUF_BEGV (bp1);
2969 else
2970 {
2971 CHECK_NUMBER_COERCE_MARKER (start1);
2972 begp1 = XINT (start1);
2973 }
2974 if (NILP (end1))
2975 endp1 = BUF_ZV (bp1);
2976 else
2977 {
2978 CHECK_NUMBER_COERCE_MARKER (end1);
2979 endp1 = XINT (end1);
2980 }
2981
2982 if (begp1 > endp1)
2983 temp = begp1, begp1 = endp1, endp1 = temp;
2984
2985 if (!(BUF_BEGV (bp1) <= begp1
2986 && begp1 <= endp1
2987 && endp1 <= BUF_ZV (bp1)))
2988 args_out_of_range (start1, end1);
2989
2990 /* Likewise for second substring. */
2991
2992 if (NILP (buffer2))
2993 bp2 = current_buffer;
2994 else
2995 {
2996 Lisp_Object buf2;
2997 buf2 = Fget_buffer (buffer2);
2998 if (NILP (buf2))
2999 nsberror (buffer2);
3000 bp2 = XBUFFER (buf2);
3001 if (!BUFFER_LIVE_P (bp2))
3002 error ("Selecting deleted buffer");
3003 }
3004
3005 if (NILP (start2))
3006 begp2 = BUF_BEGV (bp2);
3007 else
3008 {
3009 CHECK_NUMBER_COERCE_MARKER (start2);
3010 begp2 = XINT (start2);
3011 }
3012 if (NILP (end2))
3013 endp2 = BUF_ZV (bp2);
3014 else
3015 {
3016 CHECK_NUMBER_COERCE_MARKER (end2);
3017 endp2 = XINT (end2);
3018 }
3019
3020 if (begp2 > endp2)
3021 temp = begp2, begp2 = endp2, endp2 = temp;
3022
3023 if (!(BUF_BEGV (bp2) <= begp2
3024 && begp2 <= endp2
3025 && endp2 <= BUF_ZV (bp2)))
3026 args_out_of_range (start2, end2);
3027
3028 i1 = begp1;
3029 i2 = begp2;
3030 i1_byte = buf_charpos_to_bytepos (bp1, i1);
3031 i2_byte = buf_charpos_to_bytepos (bp2, i2);
3032
3033 while (i1 < endp1 && i2 < endp2)
3034 {
3035 /* When we find a mismatch, we must compare the
3036 characters, not just the bytes. */
3037 int c1, c2;
3038
3039 QUIT;
3040
3041 if (! NILP (BVAR (bp1, enable_multibyte_characters)))
3042 {
3043 c1 = BUF_FETCH_MULTIBYTE_CHAR (bp1, i1_byte);
3044 BUF_INC_POS (bp1, i1_byte);
3045 i1++;
3046 }
3047 else
3048 {
3049 c1 = BUF_FETCH_BYTE (bp1, i1);
3050 MAKE_CHAR_MULTIBYTE (c1);
3051 i1++;
3052 }
3053
3054 if (! NILP (BVAR (bp2, enable_multibyte_characters)))
3055 {
3056 c2 = BUF_FETCH_MULTIBYTE_CHAR (bp2, i2_byte);
3057 BUF_INC_POS (bp2, i2_byte);
3058 i2++;
3059 }
3060 else
3061 {
3062 c2 = BUF_FETCH_BYTE (bp2, i2);
3063 MAKE_CHAR_MULTIBYTE (c2);
3064 i2++;
3065 }
3066
3067 if (!NILP (trt))
3068 {
3069 c1 = char_table_translate (trt, c1);
3070 c2 = char_table_translate (trt, c2);
3071 }
3072 if (c1 < c2)
3073 return make_number (- 1 - chars);
3074 if (c1 > c2)
3075 return make_number (chars + 1);
3076
3077 chars++;
3078 }
3079
3080 /* The strings match as far as they go.
3081 If one is shorter, that one is less. */
3082 if (chars < endp1 - begp1)
3083 return make_number (chars + 1);
3084 else if (chars < endp2 - begp2)
3085 return make_number (- chars - 1);
3086
3087 /* Same length too => they are equal. */
3088 return make_number (0);
3089 }
3090 \f
3091 static void
3092 subst_char_in_region_unwind (Lisp_Object arg)
3093 {
3094 bset_undo_list (current_buffer, arg);
3095 }
3096
3097 static void
3098 subst_char_in_region_unwind_1 (Lisp_Object arg)
3099 {
3100 bset_filename (current_buffer, arg);
3101 }
3102
3103 DEFUN ("subst-char-in-region", Fsubst_char_in_region,
3104 Ssubst_char_in_region, 4, 5, 0,
3105 doc: /* From START to END, replace FROMCHAR with TOCHAR each time it occurs.
3106 If optional arg NOUNDO is non-nil, don't record this change for undo
3107 and don't mark the buffer as really changed.
3108 Both characters must have the same length of multi-byte form. */)
3109 (Lisp_Object start, Lisp_Object end, Lisp_Object fromchar, Lisp_Object tochar, Lisp_Object noundo)
3110 {
3111 register ptrdiff_t pos, pos_byte, stop, i, len, end_byte;
3112 /* Keep track of the first change in the buffer:
3113 if 0 we haven't found it yet.
3114 if < 0 we've found it and we've run the before-change-function.
3115 if > 0 we've actually performed it and the value is its position. */
3116 ptrdiff_t changed = 0;
3117 unsigned char fromstr[MAX_MULTIBYTE_LENGTH], tostr[MAX_MULTIBYTE_LENGTH];
3118 unsigned char *p;
3119 ptrdiff_t count = SPECPDL_INDEX ();
3120 #define COMBINING_NO 0
3121 #define COMBINING_BEFORE 1
3122 #define COMBINING_AFTER 2
3123 #define COMBINING_BOTH (COMBINING_BEFORE | COMBINING_AFTER)
3124 int maybe_byte_combining = COMBINING_NO;
3125 ptrdiff_t last_changed = 0;
3126 bool multibyte_p
3127 = !NILP (BVAR (current_buffer, enable_multibyte_characters));
3128 int fromc, toc;
3129
3130 restart:
3131
3132 validate_region (&start, &end);
3133 CHECK_CHARACTER (fromchar);
3134 CHECK_CHARACTER (tochar);
3135 fromc = XFASTINT (fromchar);
3136 toc = XFASTINT (tochar);
3137
3138 if (multibyte_p)
3139 {
3140 len = CHAR_STRING (fromc, fromstr);
3141 if (CHAR_STRING (toc, tostr) != len)
3142 error ("Characters in `subst-char-in-region' have different byte-lengths");
3143 if (!ASCII_CHAR_P (*tostr))
3144 {
3145 /* If *TOSTR is in the range 0x80..0x9F and TOCHAR is not a
3146 complete multibyte character, it may be combined with the
3147 after bytes. If it is in the range 0xA0..0xFF, it may be
3148 combined with the before and after bytes. */
3149 if (!CHAR_HEAD_P (*tostr))
3150 maybe_byte_combining = COMBINING_BOTH;
3151 else if (BYTES_BY_CHAR_HEAD (*tostr) > len)
3152 maybe_byte_combining = COMBINING_AFTER;
3153 }
3154 }
3155 else
3156 {
3157 len = 1;
3158 fromstr[0] = fromc;
3159 tostr[0] = toc;
3160 }
3161
3162 pos = XINT (start);
3163 pos_byte = CHAR_TO_BYTE (pos);
3164 stop = CHAR_TO_BYTE (XINT (end));
3165 end_byte = stop;
3166
3167 /* If we don't want undo, turn off putting stuff on the list.
3168 That's faster than getting rid of things,
3169 and it prevents even the entry for a first change.
3170 Also inhibit locking the file. */
3171 if (!changed && !NILP (noundo))
3172 {
3173 record_unwind_protect (subst_char_in_region_unwind,
3174 BVAR (current_buffer, undo_list));
3175 bset_undo_list (current_buffer, Qt);
3176 /* Don't do file-locking. */
3177 record_unwind_protect (subst_char_in_region_unwind_1,
3178 BVAR (current_buffer, filename));
3179 bset_filename (current_buffer, Qnil);
3180 }
3181
3182 if (pos_byte < GPT_BYTE)
3183 stop = min (stop, GPT_BYTE);
3184 while (1)
3185 {
3186 ptrdiff_t pos_byte_next = pos_byte;
3187
3188 if (pos_byte >= stop)
3189 {
3190 if (pos_byte >= end_byte) break;
3191 stop = end_byte;
3192 }
3193 p = BYTE_POS_ADDR (pos_byte);
3194 if (multibyte_p)
3195 INC_POS (pos_byte_next);
3196 else
3197 ++pos_byte_next;
3198 if (pos_byte_next - pos_byte == len
3199 && p[0] == fromstr[0]
3200 && (len == 1
3201 || (p[1] == fromstr[1]
3202 && (len == 2 || (p[2] == fromstr[2]
3203 && (len == 3 || p[3] == fromstr[3]))))))
3204 {
3205 if (changed < 0)
3206 /* We've already seen this and run the before-change-function;
3207 this time we only need to record the actual position. */
3208 changed = pos;
3209 else if (!changed)
3210 {
3211 changed = -1;
3212 modify_text (pos, XINT (end));
3213
3214 if (! NILP (noundo))
3215 {
3216 if (MODIFF - 1 == SAVE_MODIFF)
3217 SAVE_MODIFF++;
3218 if (MODIFF - 1 == BUF_AUTOSAVE_MODIFF (current_buffer))
3219 BUF_AUTOSAVE_MODIFF (current_buffer)++;
3220 }
3221
3222 /* The before-change-function may have moved the gap
3223 or even modified the buffer so we should start over. */
3224 goto restart;
3225 }
3226
3227 /* Take care of the case where the new character
3228 combines with neighboring bytes. */
3229 if (maybe_byte_combining
3230 && (maybe_byte_combining == COMBINING_AFTER
3231 ? (pos_byte_next < Z_BYTE
3232 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
3233 : ((pos_byte_next < Z_BYTE
3234 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
3235 || (pos_byte > BEG_BYTE
3236 && ! ASCII_CHAR_P (FETCH_BYTE (pos_byte - 1))))))
3237 {
3238 Lisp_Object tem, string;
3239
3240 tem = BVAR (current_buffer, undo_list);
3241
3242 /* Make a multibyte string containing this single character. */
3243 string = make_multibyte_string ((char *) tostr, 1, len);
3244 /* replace_range is less efficient, because it moves the gap,
3245 but it handles combining correctly. */
3246 replace_range (pos, pos + 1, string,
3247 0, 0, 1);
3248 pos_byte_next = CHAR_TO_BYTE (pos);
3249 if (pos_byte_next > pos_byte)
3250 /* Before combining happened. We should not increment
3251 POS. So, to cancel the later increment of POS,
3252 decrease it now. */
3253 pos--;
3254 else
3255 INC_POS (pos_byte_next);
3256
3257 if (! NILP (noundo))
3258 bset_undo_list (current_buffer, tem);
3259 }
3260 else
3261 {
3262 if (NILP (noundo))
3263 record_change (pos, 1);
3264 for (i = 0; i < len; i++) *p++ = tostr[i];
3265 }
3266 last_changed = pos + 1;
3267 }
3268 pos_byte = pos_byte_next;
3269 pos++;
3270 }
3271
3272 if (changed > 0)
3273 {
3274 signal_after_change (changed,
3275 last_changed - changed, last_changed - changed);
3276 update_compositions (changed, last_changed, CHECK_ALL);
3277 }
3278
3279 unbind_to (count, Qnil);
3280 return Qnil;
3281 }
3282
3283
3284 static Lisp_Object check_translation (ptrdiff_t, ptrdiff_t, ptrdiff_t,
3285 Lisp_Object);
3286
3287 /* Helper function for Ftranslate_region_internal.
3288
3289 Check if a character sequence at POS (POS_BYTE) matches an element
3290 of VAL. VAL is a list (([FROM-CHAR ...] . TO) ...). If a matching
3291 element is found, return it. Otherwise return Qnil. */
3292
3293 static Lisp_Object
3294 check_translation (ptrdiff_t pos, ptrdiff_t pos_byte, ptrdiff_t end,
3295 Lisp_Object val)
3296 {
3297 int initial_buf[16];
3298 int *buf = initial_buf;
3299 ptrdiff_t buf_size = ARRAYELTS (initial_buf);
3300 int *bufalloc = 0;
3301 ptrdiff_t buf_used = 0;
3302 Lisp_Object result = Qnil;
3303
3304 for (; CONSP (val); val = XCDR (val))
3305 {
3306 Lisp_Object elt;
3307 ptrdiff_t len, i;
3308
3309 elt = XCAR (val);
3310 if (! CONSP (elt))
3311 continue;
3312 elt = XCAR (elt);
3313 if (! VECTORP (elt))
3314 continue;
3315 len = ASIZE (elt);
3316 if (len <= end - pos)
3317 {
3318 for (i = 0; i < len; i++)
3319 {
3320 if (buf_used <= i)
3321 {
3322 unsigned char *p = BYTE_POS_ADDR (pos_byte);
3323 int len1;
3324
3325 if (buf_used == buf_size)
3326 {
3327 bufalloc = xpalloc (bufalloc, &buf_size, 1, -1,
3328 sizeof *bufalloc);
3329 if (buf == initial_buf)
3330 memcpy (bufalloc, buf, sizeof initial_buf);
3331 buf = bufalloc;
3332 }
3333 buf[buf_used++] = STRING_CHAR_AND_LENGTH (p, len1);
3334 pos_byte += len1;
3335 }
3336 if (XINT (AREF (elt, i)) != buf[i])
3337 break;
3338 }
3339 if (i == len)
3340 {
3341 result = XCAR (val);
3342 break;
3343 }
3344 }
3345 }
3346
3347 xfree (bufalloc);
3348 return result;
3349 }
3350
3351
3352 DEFUN ("translate-region-internal", Ftranslate_region_internal,
3353 Stranslate_region_internal, 3, 3, 0,
3354 doc: /* Internal use only.
3355 From START to END, translate characters according to TABLE.
3356 TABLE is a string or a char-table; the Nth character in it is the
3357 mapping for the character with code N.
3358 It returns the number of characters changed. */)
3359 (Lisp_Object start, Lisp_Object end, register Lisp_Object table)
3360 {
3361 register unsigned char *tt; /* Trans table. */
3362 register int nc; /* New character. */
3363 int cnt; /* Number of changes made. */
3364 ptrdiff_t size; /* Size of translate table. */
3365 ptrdiff_t pos, pos_byte, end_pos;
3366 bool multibyte = !NILP (BVAR (current_buffer, enable_multibyte_characters));
3367 bool string_multibyte UNINIT;
3368
3369 validate_region (&start, &end);
3370 if (CHAR_TABLE_P (table))
3371 {
3372 if (! EQ (XCHAR_TABLE (table)->purpose, Qtranslation_table))
3373 error ("Not a translation table");
3374 size = MAX_CHAR;
3375 tt = NULL;
3376 }
3377 else
3378 {
3379 CHECK_STRING (table);
3380
3381 if (! multibyte && (SCHARS (table) < SBYTES (table)))
3382 table = string_make_unibyte (table);
3383 string_multibyte = SCHARS (table) < SBYTES (table);
3384 size = SBYTES (table);
3385 tt = SDATA (table);
3386 }
3387
3388 pos = XINT (start);
3389 pos_byte = CHAR_TO_BYTE (pos);
3390 end_pos = XINT (end);
3391 modify_text (pos, end_pos);
3392
3393 cnt = 0;
3394 for (; pos < end_pos; )
3395 {
3396 register unsigned char *p = BYTE_POS_ADDR (pos_byte);
3397 unsigned char *str, buf[MAX_MULTIBYTE_LENGTH];
3398 int len, str_len;
3399 int oc;
3400 Lisp_Object val;
3401
3402 if (multibyte)
3403 oc = STRING_CHAR_AND_LENGTH (p, len);
3404 else
3405 oc = *p, len = 1;
3406 if (oc < size)
3407 {
3408 if (tt)
3409 {
3410 /* Reload as signal_after_change in last iteration may GC. */
3411 tt = SDATA (table);
3412 if (string_multibyte)
3413 {
3414 str = tt + string_char_to_byte (table, oc);
3415 nc = STRING_CHAR_AND_LENGTH (str, str_len);
3416 }
3417 else
3418 {
3419 nc = tt[oc];
3420 if (! ASCII_CHAR_P (nc) && multibyte)
3421 {
3422 str_len = BYTE8_STRING (nc, buf);
3423 str = buf;
3424 }
3425 else
3426 {
3427 str_len = 1;
3428 str = tt + oc;
3429 }
3430 }
3431 }
3432 else
3433 {
3434 nc = oc;
3435 val = CHAR_TABLE_REF (table, oc);
3436 if (CHARACTERP (val))
3437 {
3438 nc = XFASTINT (val);
3439 str_len = CHAR_STRING (nc, buf);
3440 str = buf;
3441 }
3442 else if (VECTORP (val) || (CONSP (val)))
3443 {
3444 /* VAL is [TO_CHAR ...] or (([FROM-CHAR ...] . TO) ...)
3445 where TO is TO-CHAR or [TO-CHAR ...]. */
3446 nc = -1;
3447 }
3448 }
3449
3450 if (nc != oc && nc >= 0)
3451 {
3452 /* Simple one char to one char translation. */
3453 if (len != str_len)
3454 {
3455 Lisp_Object string;
3456
3457 /* This is less efficient, because it moves the gap,
3458 but it should handle multibyte characters correctly. */
3459 string = make_multibyte_string ((char *) str, 1, str_len);
3460 replace_range (pos, pos + 1, string, 1, 0, 1);
3461 len = str_len;
3462 }
3463 else
3464 {
3465 record_change (pos, 1);
3466 while (str_len-- > 0)
3467 *p++ = *str++;
3468 signal_after_change (pos, 1, 1);
3469 update_compositions (pos, pos + 1, CHECK_BORDER);
3470 }
3471 ++cnt;
3472 }
3473 else if (nc < 0)
3474 {
3475 Lisp_Object string;
3476
3477 if (CONSP (val))
3478 {
3479 val = check_translation (pos, pos_byte, end_pos, val);
3480 if (NILP (val))
3481 {
3482 pos_byte += len;
3483 pos++;
3484 continue;
3485 }
3486 /* VAL is ([FROM-CHAR ...] . TO). */
3487 len = ASIZE (XCAR (val));
3488 val = XCDR (val);
3489 }
3490 else
3491 len = 1;
3492
3493 if (VECTORP (val))
3494 {
3495 string = Fconcat (1, &val);
3496 }
3497 else
3498 {
3499 string = Fmake_string (make_number (1), val);
3500 }
3501 replace_range (pos, pos + len, string, 1, 0, 1);
3502 pos_byte += SBYTES (string);
3503 pos += SCHARS (string);
3504 cnt += SCHARS (string);
3505 end_pos += SCHARS (string) - len;
3506 continue;
3507 }
3508 }
3509 pos_byte += len;
3510 pos++;
3511 }
3512
3513 return make_number (cnt);
3514 }
3515
3516 DEFUN ("delete-region", Fdelete_region, Sdelete_region, 2, 2, "r",
3517 doc: /* Delete the text between START and END.
3518 If called interactively, delete the region between point and mark.
3519 This command deletes buffer text without modifying the kill ring. */)
3520 (Lisp_Object start, Lisp_Object end)
3521 {
3522 validate_region (&start, &end);
3523 del_range (XINT (start), XINT (end));
3524 return Qnil;
3525 }
3526
3527 DEFUN ("delete-and-extract-region", Fdelete_and_extract_region,
3528 Sdelete_and_extract_region, 2, 2, 0,
3529 doc: /* Delete the text between START and END and return it. */)
3530 (Lisp_Object start, Lisp_Object end)
3531 {
3532 validate_region (&start, &end);
3533 if (XINT (start) == XINT (end))
3534 return empty_unibyte_string;
3535 return del_range_1 (XINT (start), XINT (end), 1, 1);
3536 }
3537 \f
3538 DEFUN ("widen", Fwiden, Swiden, 0, 0, "",
3539 doc: /* Remove restrictions (narrowing) from current buffer.
3540 This allows the buffer's full text to be seen and edited. */)
3541 (void)
3542 {
3543 if (BEG != BEGV || Z != ZV)
3544 current_buffer->clip_changed = 1;
3545 BEGV = BEG;
3546 BEGV_BYTE = BEG_BYTE;
3547 SET_BUF_ZV_BOTH (current_buffer, Z, Z_BYTE);
3548 /* Changing the buffer bounds invalidates any recorded current column. */
3549 invalidate_current_column ();
3550 return Qnil;
3551 }
3552
3553 DEFUN ("narrow-to-region", Fnarrow_to_region, Snarrow_to_region, 2, 2, "r",
3554 doc: /* Restrict editing in this buffer to the current region.
3555 The rest of the text becomes temporarily invisible and untouchable
3556 but is not deleted; if you save the buffer in a file, the invisible
3557 text is included in the file. \\[widen] makes all visible again.
3558 See also `save-restriction'.
3559
3560 When calling from a program, pass two arguments; positions (integers
3561 or markers) bounding the text that should remain visible. */)
3562 (register Lisp_Object start, Lisp_Object end)
3563 {
3564 CHECK_NUMBER_COERCE_MARKER (start);
3565 CHECK_NUMBER_COERCE_MARKER (end);
3566
3567 if (XINT (start) > XINT (end))
3568 {
3569 Lisp_Object tem;
3570 tem = start; start = end; end = tem;
3571 }
3572
3573 if (!(BEG <= XINT (start) && XINT (start) <= XINT (end) && XINT (end) <= Z))
3574 args_out_of_range (start, end);
3575
3576 if (BEGV != XFASTINT (start) || ZV != XFASTINT (end))
3577 current_buffer->clip_changed = 1;
3578
3579 SET_BUF_BEGV (current_buffer, XFASTINT (start));
3580 SET_BUF_ZV (current_buffer, XFASTINT (end));
3581 if (PT < XFASTINT (start))
3582 SET_PT (XFASTINT (start));
3583 if (PT > XFASTINT (end))
3584 SET_PT (XFASTINT (end));
3585 /* Changing the buffer bounds invalidates any recorded current column. */
3586 invalidate_current_column ();
3587 return Qnil;
3588 }
3589
3590 Lisp_Object
3591 save_restriction_save (void)
3592 {
3593 if (BEGV == BEG && ZV == Z)
3594 /* The common case that the buffer isn't narrowed.
3595 We return just the buffer object, which save_restriction_restore
3596 recognizes as meaning `no restriction'. */
3597 return Fcurrent_buffer ();
3598 else
3599 /* We have to save a restriction, so return a pair of markers, one
3600 for the beginning and one for the end. */
3601 {
3602 Lisp_Object beg, end;
3603
3604 beg = build_marker (current_buffer, BEGV, BEGV_BYTE);
3605 end = build_marker (current_buffer, ZV, ZV_BYTE);
3606
3607 /* END must move forward if text is inserted at its exact location. */
3608 XMARKER (end)->insertion_type = 1;
3609
3610 return Fcons (beg, end);
3611 }
3612 }
3613
3614 void
3615 save_restriction_restore (Lisp_Object data)
3616 {
3617 struct buffer *cur = NULL;
3618 struct buffer *buf = (CONSP (data)
3619 ? XMARKER (XCAR (data))->buffer
3620 : XBUFFER (data));
3621
3622 if (buf && buf != current_buffer && !NILP (BVAR (buf, pt_marker)))
3623 { /* If `buf' uses markers to keep track of PT, BEGV, and ZV (as
3624 is the case if it is or has an indirect buffer), then make
3625 sure it is current before we update BEGV, so
3626 set_buffer_internal takes care of managing those markers. */
3627 cur = current_buffer;
3628 set_buffer_internal (buf);
3629 }
3630
3631 if (CONSP (data))
3632 /* A pair of marks bounding a saved restriction. */
3633 {
3634 struct Lisp_Marker *beg = XMARKER (XCAR (data));
3635 struct Lisp_Marker *end = XMARKER (XCDR (data));
3636 eassert (buf == end->buffer);
3637
3638 if (buf /* Verify marker still points to a buffer. */
3639 && (beg->charpos != BUF_BEGV (buf) || end->charpos != BUF_ZV (buf)))
3640 /* The restriction has changed from the saved one, so restore
3641 the saved restriction. */
3642 {
3643 ptrdiff_t pt = BUF_PT (buf);
3644
3645 SET_BUF_BEGV_BOTH (buf, beg->charpos, beg->bytepos);
3646 SET_BUF_ZV_BOTH (buf, end->charpos, end->bytepos);
3647
3648 if (pt < beg->charpos || pt > end->charpos)
3649 /* The point is outside the new visible range, move it inside. */
3650 SET_BUF_PT_BOTH (buf,
3651 clip_to_bounds (beg->charpos, pt, end->charpos),
3652 clip_to_bounds (beg->bytepos, BUF_PT_BYTE (buf),
3653 end->bytepos));
3654
3655 buf->clip_changed = 1; /* Remember that the narrowing changed. */
3656 }
3657 /* These aren't needed anymore, so don't wait for GC. */
3658 free_marker (XCAR (data));
3659 free_marker (XCDR (data));
3660 free_cons (XCONS (data));
3661 }
3662 else
3663 /* A buffer, which means that there was no old restriction. */
3664 {
3665 if (buf /* Verify marker still points to a buffer. */
3666 && (BUF_BEGV (buf) != BUF_BEG (buf) || BUF_ZV (buf) != BUF_Z (buf)))
3667 /* The buffer has been narrowed, get rid of the narrowing. */
3668 {
3669 SET_BUF_BEGV_BOTH (buf, BUF_BEG (buf), BUF_BEG_BYTE (buf));
3670 SET_BUF_ZV_BOTH (buf, BUF_Z (buf), BUF_Z_BYTE (buf));
3671
3672 buf->clip_changed = 1; /* Remember that the narrowing changed. */
3673 }
3674 }
3675
3676 /* Changing the buffer bounds invalidates any recorded current column. */
3677 invalidate_current_column ();
3678
3679 if (cur)
3680 set_buffer_internal (cur);
3681 }
3682
3683 DEFUN ("save-restriction", Fsave_restriction, Ssave_restriction, 0, UNEVALLED, 0,
3684 doc: /* Execute BODY, saving and restoring current buffer's restrictions.
3685 The buffer's restrictions make parts of the beginning and end invisible.
3686 \(They are set up with `narrow-to-region' and eliminated with `widen'.)
3687 This special form, `save-restriction', saves the current buffer's restrictions
3688 when it is entered, and restores them when it is exited.
3689 So any `narrow-to-region' within BODY lasts only until the end of the form.
3690 The old restrictions settings are restored
3691 even in case of abnormal exit (throw or error).
3692
3693 The value returned is the value of the last form in BODY.
3694
3695 Note: if you are using both `save-excursion' and `save-restriction',
3696 use `save-excursion' outermost:
3697 (save-excursion (save-restriction ...))
3698
3699 usage: (save-restriction &rest BODY) */)
3700 (Lisp_Object body)
3701 {
3702 register Lisp_Object val;
3703 ptrdiff_t count = SPECPDL_INDEX ();
3704
3705 record_unwind_protect (save_restriction_restore, save_restriction_save ());
3706 val = Fprogn (body);
3707 return unbind_to (count, val);
3708 }
3709 \f
3710 DEFUN ("message", Fmessage, Smessage, 1, MANY, 0,
3711 doc: /* Display a message at the bottom of the screen.
3712 The message also goes into the `*Messages*' buffer, if `message-log-max'
3713 is non-nil. (In keyboard macros, that's all it does.)
3714 Return the message.
3715
3716 In batch mode, the message is printed to the standard error stream,
3717 followed by a newline.
3718
3719 The first argument is a format control string, and the rest are data
3720 to be formatted under control of the string. See `format-message' for
3721 details.
3722
3723 Note: (message "%s" VALUE) displays the string VALUE without
3724 interpreting format characters like `%', `\\=`', and `\\=''.
3725
3726 If the first argument is nil or the empty string, the function clears
3727 any existing message; this lets the minibuffer contents show. See
3728 also `current-message'.
3729
3730 usage: (message FORMAT-STRING &rest ARGS) */)
3731 (ptrdiff_t nargs, Lisp_Object *args)
3732 {
3733 if (NILP (args[0])
3734 || (STRINGP (args[0])
3735 && SBYTES (args[0]) == 0))
3736 {
3737 message1 (0);
3738 return args[0];
3739 }
3740 else
3741 {
3742 Lisp_Object val = Fformat_message (nargs, args);
3743 message3 (val);
3744 return val;
3745 }
3746 }
3747
3748 DEFUN ("message-box", Fmessage_box, Smessage_box, 1, MANY, 0,
3749 doc: /* Display a message, in a dialog box if possible.
3750 If a dialog box is not available, use the echo area.
3751 The first argument is a format control string, and the rest are data
3752 to be formatted under control of the string. See `format-message' for
3753 details.
3754
3755 If the first argument is nil or the empty string, clear any existing
3756 message; let the minibuffer contents show.
3757
3758 usage: (message-box FORMAT-STRING &rest ARGS) */)
3759 (ptrdiff_t nargs, Lisp_Object *args)
3760 {
3761 if (NILP (args[0]))
3762 {
3763 message1 (0);
3764 return Qnil;
3765 }
3766 else
3767 {
3768 Lisp_Object val = Fformat_message (nargs, args);
3769 Lisp_Object pane, menu;
3770
3771 pane = list1 (Fcons (build_string ("OK"), Qt));
3772 menu = Fcons (val, pane);
3773 Fx_popup_dialog (Qt, menu, Qt);
3774 return val;
3775 }
3776 }
3777
3778 DEFUN ("message-or-box", Fmessage_or_box, Smessage_or_box, 1, MANY, 0,
3779 doc: /* Display a message in a dialog box or in the echo area.
3780 If this command was invoked with the mouse, use a dialog box if
3781 `use-dialog-box' is non-nil.
3782 Otherwise, use the echo area.
3783 The first argument is a format control string, and the rest are data
3784 to be formatted under control of the string. See `format-message' for
3785 details.
3786
3787 If the first argument is nil or the empty string, clear any existing
3788 message; let the minibuffer contents show.
3789
3790 usage: (message-or-box FORMAT-STRING &rest ARGS) */)
3791 (ptrdiff_t nargs, Lisp_Object *args)
3792 {
3793 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3794 && use_dialog_box)
3795 return Fmessage_box (nargs, args);
3796 return Fmessage (nargs, args);
3797 }
3798
3799 DEFUN ("current-message", Fcurrent_message, Scurrent_message, 0, 0, 0,
3800 doc: /* Return the string currently displayed in the echo area, or nil if none. */)
3801 (void)
3802 {
3803 return current_message ();
3804 }
3805
3806
3807 DEFUN ("propertize", Fpropertize, Spropertize, 1, MANY, 0,
3808 doc: /* Return a copy of STRING with text properties added.
3809 First argument is the string to copy.
3810 Remaining arguments form a sequence of PROPERTY VALUE pairs for text
3811 properties to add to the result.
3812 usage: (propertize STRING &rest PROPERTIES) */)
3813 (ptrdiff_t nargs, Lisp_Object *args)
3814 {
3815 Lisp_Object properties, string;
3816 ptrdiff_t i;
3817
3818 /* Number of args must be odd. */
3819 if ((nargs & 1) == 0)
3820 error ("Wrong number of arguments");
3821
3822 properties = string = Qnil;
3823
3824 /* First argument must be a string. */
3825 CHECK_STRING (args[0]);
3826 string = Fcopy_sequence (args[0]);
3827
3828 for (i = 1; i < nargs; i += 2)
3829 properties = Fcons (args[i], Fcons (args[i + 1], properties));
3830
3831 Fadd_text_properties (make_number (0),
3832 make_number (SCHARS (string)),
3833 properties, string);
3834 return string;
3835 }
3836
3837 DEFUN ("format", Fformat, Sformat, 1, MANY, 0,
3838 doc: /* Format a string out of a format-string and arguments.
3839 The first argument is a format control string.
3840 The other arguments are substituted into it to make the result, a string.
3841
3842 The format control string may contain %-sequences meaning to substitute
3843 the next available argument:
3844
3845 %s means print a string argument. Actually, prints any object, with `princ'.
3846 %d means print as number in decimal (%o octal, %x hex).
3847 %X is like %x, but uses upper case.
3848 %e means print a number in exponential notation.
3849 %f means print a number in decimal-point notation.
3850 %g means print a number in exponential notation
3851 or decimal-point notation, whichever uses fewer characters.
3852 %c means print a number as a single character.
3853 %S means print any object as an s-expression (using `prin1').
3854
3855 The argument used for %d, %o, %x, %e, %f, %g or %c must be a number.
3856 Use %% to put a single % into the output.
3857
3858 A %-sequence may contain optional flag, width, and precision
3859 specifiers, as follows:
3860
3861 %<flags><width><precision>character
3862
3863 where flags is [+ #-0]+, width is [0-9]+, and precision is .[0-9]+
3864
3865 The + flag character inserts a + before any positive number, while a
3866 space inserts a space before any positive number; these flags only
3867 affect %d, %e, %f, and %g sequences, and the + flag takes precedence.
3868 The - and 0 flags affect the width specifier, as described below.
3869
3870 The # flag means to use an alternate display form for %o, %x, %X, %e,
3871 %f, and %g sequences: for %o, it ensures that the result begins with
3872 \"0\"; for %x and %X, it prefixes the result with \"0x\" or \"0X\";
3873 for %e, %f, and %g, it causes a decimal point to be included even if
3874 the precision is zero.
3875
3876 The width specifier supplies a lower limit for the length of the
3877 printed representation. The padding, if any, normally goes on the
3878 left, but it goes on the right if the - flag is present. The padding
3879 character is normally a space, but it is 0 if the 0 flag is present.
3880 The 0 flag is ignored if the - flag is present, or the format sequence
3881 is something other than %d, %e, %f, and %g.
3882
3883 For %e, %f, and %g sequences, the number after the "." in the
3884 precision specifier says how many decimal places to show; if zero, the
3885 decimal point itself is omitted. For %s and %S, the precision
3886 specifier truncates the string to the given width.
3887
3888 Text properties, if any, are copied from the format-string to the
3889 produced text.
3890
3891 usage: (format STRING &rest OBJECTS) */)
3892 (ptrdiff_t nargs, Lisp_Object *args)
3893 {
3894 return styled_format (nargs, args, false);
3895 }
3896
3897 DEFUN ("format-message", Fformat_message, Sformat_message, 1, MANY, 0,
3898 doc: /* Format a string out of a format-string and arguments.
3899 The first argument is a format control string.
3900 The other arguments are substituted into it to make the result, a string.
3901
3902 This acts like `format', except it also replaces each left single
3903 quotation mark (\\=‘) and grave accent (\\=`) by a left quote, and each
3904 right single quotation mark (\\=’) and apostrophe (\\=') by a right quote.
3905 The left and right quote replacement characters are specified by
3906 `text-quoting-style'.
3907
3908 usage: (format-message STRING &rest OBJECTS) */)
3909 (ptrdiff_t nargs, Lisp_Object *args)
3910 {
3911 return styled_format (nargs, args, true);
3912 }
3913
3914 /* Implement ‘format-message’ if MESSAGE is true, ‘format’ otherwise. */
3915
3916 static Lisp_Object
3917 styled_format (ptrdiff_t nargs, Lisp_Object *args, bool message)
3918 {
3919 ptrdiff_t n; /* The number of the next arg to substitute. */
3920 char initial_buffer[4000];
3921 char *buf = initial_buffer;
3922 ptrdiff_t bufsize = sizeof initial_buffer;
3923 ptrdiff_t max_bufsize = STRING_BYTES_BOUND + 1;
3924 char *p;
3925 ptrdiff_t buf_save_value_index UNINIT;
3926 char *format, *end;
3927 ptrdiff_t nchars;
3928 /* When we make a multibyte string, we must pay attention to the
3929 byte combining problem, i.e., a byte may be combined with a
3930 multibyte character of the previous string. This flag tells if we
3931 must consider such a situation or not. */
3932 bool maybe_combine_byte;
3933 bool arg_intervals = false;
3934 USE_SAFE_ALLOCA;
3935
3936 /* Each element records, for one argument,
3937 the start and end bytepos in the output string,
3938 whether the argument has been converted to string (e.g., due to "%S"),
3939 and whether the argument is a string with intervals. */
3940 struct info
3941 {
3942 ptrdiff_t start, end;
3943 bool_bf converted_to_string : 1;
3944 bool_bf intervals : 1;
3945 } *info;
3946
3947 CHECK_STRING (args[0]);
3948 char *format_start = SSDATA (args[0]);
3949 ptrdiff_t formatlen = SBYTES (args[0]);
3950
3951 /* Allocate the info and discarded tables. */
3952 ptrdiff_t alloca_size;
3953 if (INT_MULTIPLY_WRAPV (nargs, sizeof *info, &alloca_size)
3954 || INT_ADD_WRAPV (sizeof *info, alloca_size, &alloca_size)
3955 || INT_ADD_WRAPV (formatlen, alloca_size, &alloca_size)
3956 || SIZE_MAX < alloca_size)
3957 memory_full (SIZE_MAX);
3958 /* info[0] is unused. Unused elements have -1 for start. */
3959 info = SAFE_ALLOCA (alloca_size);
3960 memset (info, 0, alloca_size);
3961 for (ptrdiff_t i = 0; i < nargs + 1; i++)
3962 info[i].start = -1;
3963 /* discarded[I] is 1 if byte I of the format
3964 string was not copied into the output.
3965 It is 2 if byte I was not the first byte of its character. */
3966 char *discarded = (char *) &info[nargs + 1];
3967
3968 /* Try to determine whether the result should be multibyte.
3969 This is not always right; sometimes the result needs to be multibyte
3970 because of an object that we will pass through prin1.
3971 or because a grave accent or apostrophe is requoted,
3972 and in that case, we won't know it here. */
3973
3974 /* True if the format is multibyte. */
3975 bool multibyte_format = STRING_MULTIBYTE (args[0]);
3976 /* True if the output should be a multibyte string,
3977 which is true if any of the inputs is one. */
3978 bool multibyte = multibyte_format;
3979 for (ptrdiff_t i = 1; !multibyte && i < nargs; i++)
3980 if (STRINGP (args[i]) && STRING_MULTIBYTE (args[i]))
3981 multibyte = true;
3982
3983 int quoting_style = message ? text_quoting_style () : -1;
3984
3985 /* If we start out planning a unibyte result,
3986 then discover it has to be multibyte, we jump back to retry. */
3987 retry:
3988
3989 p = buf;
3990 nchars = 0;
3991 n = 0;
3992
3993 /* Scan the format and store result in BUF. */
3994 format = format_start;
3995 end = format + formatlen;
3996 maybe_combine_byte = false;
3997
3998 while (format != end)
3999 {
4000 /* The values of N and FORMAT when the loop body is entered. */
4001 ptrdiff_t n0 = n;
4002 char *format0 = format;
4003 char const *convsrc = format;
4004 unsigned char format_char = *format++;
4005
4006 /* Bytes needed to represent the output of this conversion. */
4007 ptrdiff_t convbytes = 1;
4008
4009 if (format_char == '%')
4010 {
4011 /* General format specifications look like
4012
4013 '%' [flags] [field-width] [precision] format
4014
4015 where
4016
4017 flags ::= [-+0# ]+
4018 field-width ::= [0-9]+
4019 precision ::= '.' [0-9]*
4020
4021 If a field-width is specified, it specifies to which width
4022 the output should be padded with blanks, if the output
4023 string is shorter than field-width.
4024
4025 If precision is specified, it specifies the number of
4026 digits to print after the '.' for floats, or the max.
4027 number of chars to print from a string. */
4028
4029 bool minus_flag = false;
4030 bool plus_flag = false;
4031 bool space_flag = false;
4032 bool sharp_flag = false;
4033 bool zero_flag = false;
4034
4035 for (; ; format++)
4036 {
4037 switch (*format)
4038 {
4039 case '-': minus_flag = true; continue;
4040 case '+': plus_flag = true; continue;
4041 case ' ': space_flag = true; continue;
4042 case '#': sharp_flag = true; continue;
4043 case '0': zero_flag = true; continue;
4044 }
4045 break;
4046 }
4047
4048 /* Ignore flags when sprintf ignores them. */
4049 space_flag &= ~ plus_flag;
4050 zero_flag &= ~ minus_flag;
4051
4052 char *num_end;
4053 uintmax_t raw_field_width = strtoumax (format, &num_end, 10);
4054 if (max_bufsize <= raw_field_width)
4055 string_overflow ();
4056 ptrdiff_t field_width = raw_field_width;
4057
4058 bool precision_given = *num_end == '.';
4059 uintmax_t precision = (precision_given
4060 ? strtoumax (num_end + 1, &num_end, 10)
4061 : UINTMAX_MAX);
4062 format = num_end;
4063
4064 if (format == end)
4065 error ("Format string ends in middle of format specifier");
4066
4067 char conversion = *format++;
4068 memset (&discarded[format0 - format_start], 1,
4069 format - format0 - (conversion == '%'));
4070 if (conversion == '%')
4071 goto copy_char;
4072
4073 ++n;
4074 if (! (n < nargs))
4075 error ("Not enough arguments for format string");
4076
4077 /* For 'S', prin1 the argument, and then treat like 's'.
4078 For 's', princ any argument that is not a string or
4079 symbol. But don't do this conversion twice, which might
4080 happen after retrying. */
4081 if ((conversion == 'S'
4082 || (conversion == 's'
4083 && ! STRINGP (args[n]) && ! SYMBOLP (args[n]))))
4084 {
4085 if (! info[n].converted_to_string)
4086 {
4087 Lisp_Object noescape = conversion == 'S' ? Qnil : Qt;
4088 args[n] = Fprin1_to_string (args[n], noescape);
4089 info[n].converted_to_string = true;
4090 if (STRING_MULTIBYTE (args[n]) && ! multibyte)
4091 {
4092 multibyte = true;
4093 goto retry;
4094 }
4095 }
4096 conversion = 's';
4097 }
4098 else if (conversion == 'c')
4099 {
4100 if (FLOATP (args[n]))
4101 {
4102 double d = XFLOAT_DATA (args[n]);
4103 args[n] = make_number (FIXNUM_OVERFLOW_P (d) ? -1 : d);
4104 }
4105
4106 if (INTEGERP (args[n]) && ! ASCII_CHAR_P (XINT (args[n])))
4107 {
4108 if (!multibyte)
4109 {
4110 multibyte = true;
4111 goto retry;
4112 }
4113 args[n] = Fchar_to_string (args[n]);
4114 info[n].converted_to_string = true;
4115 }
4116
4117 if (info[n].converted_to_string)
4118 conversion = 's';
4119 zero_flag = false;
4120 }
4121
4122 if (SYMBOLP (args[n]))
4123 {
4124 args[n] = SYMBOL_NAME (args[n]);
4125 if (STRING_MULTIBYTE (args[n]) && ! multibyte)
4126 {
4127 multibyte = true;
4128 goto retry;
4129 }
4130 }
4131
4132 if (conversion == 's')
4133 {
4134 /* handle case (precision[n] >= 0) */
4135
4136 ptrdiff_t prec = -1;
4137 if (precision_given && precision <= TYPE_MAXIMUM (ptrdiff_t))
4138 prec = precision;
4139
4140 /* lisp_string_width ignores a precision of 0, but GNU
4141 libc functions print 0 characters when the precision
4142 is 0. Imitate libc behavior here. Changing
4143 lisp_string_width is the right thing, and will be
4144 done, but meanwhile we work with it. */
4145
4146 ptrdiff_t width, nbytes;
4147 ptrdiff_t nchars_string;
4148 if (prec == 0)
4149 width = nchars_string = nbytes = 0;
4150 else
4151 {
4152 ptrdiff_t nch, nby;
4153 width = lisp_string_width (args[n], prec, &nch, &nby);
4154 if (prec < 0)
4155 {
4156 nchars_string = SCHARS (args[n]);
4157 nbytes = SBYTES (args[n]);
4158 }
4159 else
4160 {
4161 nchars_string = nch;
4162 nbytes = nby;
4163 }
4164 }
4165
4166 convbytes = nbytes;
4167 if (convbytes && multibyte && ! STRING_MULTIBYTE (args[n]))
4168 convbytes = count_size_as_multibyte (SDATA (args[n]), nbytes);
4169
4170 ptrdiff_t padding
4171 = width < field_width ? field_width - width : 0;
4172
4173 if (max_bufsize - padding <= convbytes)
4174 string_overflow ();
4175 convbytes += padding;
4176 if (convbytes <= buf + bufsize - p)
4177 {
4178 if (! minus_flag)
4179 {
4180 memset (p, ' ', padding);
4181 p += padding;
4182 nchars += padding;
4183 }
4184 info[n].start = nchars;
4185
4186 if (p > buf
4187 && multibyte
4188 && !ASCII_CHAR_P (*((unsigned char *) p - 1))
4189 && STRING_MULTIBYTE (args[n])
4190 && !CHAR_HEAD_P (SREF (args[n], 0)))
4191 maybe_combine_byte = true;
4192
4193 p += copy_text (SDATA (args[n]), (unsigned char *) p,
4194 nbytes,
4195 STRING_MULTIBYTE (args[n]), multibyte);
4196
4197 nchars += nchars_string;
4198
4199 if (minus_flag)
4200 {
4201 memset (p, ' ', padding);
4202 p += padding;
4203 nchars += padding;
4204 }
4205 info[n].end = nchars;
4206
4207 /* If this argument has text properties, record where
4208 in the result string it appears. */
4209 if (string_intervals (args[n]))
4210 info[n].intervals = arg_intervals = true;
4211
4212 continue;
4213 }
4214 }
4215 else if (! (conversion == 'c' || conversion == 'd'
4216 || conversion == 'e' || conversion == 'f'
4217 || conversion == 'g' || conversion == 'i'
4218 || conversion == 'o' || conversion == 'x'
4219 || conversion == 'X'))
4220 error ("Invalid format operation %%%c",
4221 STRING_CHAR ((unsigned char *) format - 1));
4222 else if (! NUMBERP (args[n]))
4223 error ("Format specifier doesn't match argument type");
4224 else
4225 {
4226 enum
4227 {
4228 /* Maximum precision for a %f conversion such that the
4229 trailing output digit might be nonzero. Any precision
4230 larger than this will not yield useful information. */
4231 USEFUL_PRECISION_MAX =
4232 ((1 - DBL_MIN_EXP)
4233 * (FLT_RADIX == 2 || FLT_RADIX == 10 ? 1
4234 : FLT_RADIX == 16 ? 4
4235 : -1)),
4236
4237 /* Maximum number of bytes generated by any format, if
4238 precision is no more than USEFUL_PRECISION_MAX.
4239 On all practical hosts, %f is the worst case. */
4240 SPRINTF_BUFSIZE =
4241 sizeof "-." + (DBL_MAX_10_EXP + 1) + USEFUL_PRECISION_MAX,
4242
4243 /* Length of pM (that is, of pMd without the
4244 trailing "d"). */
4245 pMlen = sizeof pMd - 2
4246 };
4247 verify (USEFUL_PRECISION_MAX > 0);
4248
4249 /* Avoid undefined behavior in underlying sprintf. */
4250 if (conversion == 'd' || conversion == 'i')
4251 sharp_flag = false;
4252
4253 /* Create the copy of the conversion specification, with
4254 any width and precision removed, with ".*" inserted,
4255 and with pM inserted for integer formats.
4256 At most three flags F can be specified at once. */
4257 char convspec[sizeof "%FFF.*d" + pMlen];
4258 {
4259 char *f = convspec;
4260 *f++ = '%';
4261 *f = '-'; f += minus_flag;
4262 *f = '+'; f += plus_flag;
4263 *f = ' '; f += space_flag;
4264 *f = '#'; f += sharp_flag;
4265 *f = '0'; f += zero_flag;
4266 *f++ = '.';
4267 *f++ = '*';
4268 if (conversion == 'd' || conversion == 'i'
4269 || conversion == 'o' || conversion == 'x'
4270 || conversion == 'X')
4271 {
4272 memcpy (f, pMd, pMlen);
4273 f += pMlen;
4274 zero_flag &= ~ precision_given;
4275 }
4276 *f++ = conversion;
4277 *f = '\0';
4278 }
4279
4280 int prec = -1;
4281 if (precision_given)
4282 prec = min (precision, USEFUL_PRECISION_MAX);
4283
4284 /* Use sprintf to format this number into sprintf_buf. Omit
4285 padding and excess precision, though, because sprintf limits
4286 output length to INT_MAX.
4287
4288 There are four types of conversion: double, unsigned
4289 char (passed as int), wide signed int, and wide
4290 unsigned int. Treat them separately because the
4291 sprintf ABI is sensitive to which type is passed. Be
4292 careful about integer overflow, NaNs, infinities, and
4293 conversions; for example, the min and max macros are
4294 not suitable here. */
4295 char sprintf_buf[SPRINTF_BUFSIZE];
4296 ptrdiff_t sprintf_bytes;
4297 if (conversion == 'e' || conversion == 'f' || conversion == 'g')
4298 {
4299 double x = (INTEGERP (args[n])
4300 ? XINT (args[n])
4301 : XFLOAT_DATA (args[n]));
4302 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
4303 }
4304 else if (conversion == 'c')
4305 {
4306 /* Don't use sprintf here, as it might mishandle prec. */
4307 sprintf_buf[0] = XINT (args[n]);
4308 sprintf_bytes = prec != 0;
4309 }
4310 else if (conversion == 'd')
4311 {
4312 /* For float, maybe we should use "%1.0f"
4313 instead so it also works for values outside
4314 the integer range. */
4315 printmax_t x;
4316 if (INTEGERP (args[n]))
4317 x = XINT (args[n]);
4318 else
4319 {
4320 double d = XFLOAT_DATA (args[n]);
4321 if (d < 0)
4322 {
4323 x = TYPE_MINIMUM (printmax_t);
4324 if (x < d)
4325 x = d;
4326 }
4327 else
4328 {
4329 x = TYPE_MAXIMUM (printmax_t);
4330 if (d < x)
4331 x = d;
4332 }
4333 }
4334 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
4335 }
4336 else
4337 {
4338 /* Don't sign-extend for octal or hex printing. */
4339 uprintmax_t x;
4340 if (INTEGERP (args[n]))
4341 x = XUINT (args[n]);
4342 else
4343 {
4344 double d = XFLOAT_DATA (args[n]);
4345 if (d < 0)
4346 x = 0;
4347 else
4348 {
4349 x = TYPE_MAXIMUM (uprintmax_t);
4350 if (d < x)
4351 x = d;
4352 }
4353 }
4354 sprintf_bytes = sprintf (sprintf_buf, convspec, prec, x);
4355 }
4356
4357 /* Now the length of the formatted item is known, except it omits
4358 padding and excess precision. Deal with excess precision
4359 first. This happens only when the format specifies
4360 ridiculously large precision. */
4361 uintmax_t excess_precision = precision - prec;
4362 uintmax_t leading_zeros = 0, trailing_zeros = 0;
4363 if (excess_precision)
4364 {
4365 if (conversion == 'e' || conversion == 'f'
4366 || conversion == 'g')
4367 {
4368 if ((conversion == 'g' && ! sharp_flag)
4369 || ! ('0' <= sprintf_buf[sprintf_bytes - 1]
4370 && sprintf_buf[sprintf_bytes - 1] <= '9'))
4371 excess_precision = 0;
4372 else
4373 {
4374 if (conversion == 'g')
4375 {
4376 char *dot = strchr (sprintf_buf, '.');
4377 if (!dot)
4378 excess_precision = 0;
4379 }
4380 }
4381 trailing_zeros = excess_precision;
4382 }
4383 else
4384 leading_zeros = excess_precision;
4385 }
4386
4387 /* Compute the total bytes needed for this item, including
4388 excess precision and padding. */
4389 uintmax_t numwidth = sprintf_bytes + excess_precision;
4390 ptrdiff_t padding
4391 = numwidth < field_width ? field_width - numwidth : 0;
4392 if (max_bufsize - sprintf_bytes <= excess_precision
4393 || max_bufsize - padding <= numwidth)
4394 string_overflow ();
4395 convbytes = numwidth + padding;
4396
4397 if (convbytes <= buf + bufsize - p)
4398 {
4399 /* Copy the formatted item from sprintf_buf into buf,
4400 inserting padding and excess-precision zeros. */
4401
4402 char *src = sprintf_buf;
4403 char src0 = src[0];
4404 int exponent_bytes = 0;
4405 bool signedp = src0 == '-' || src0 == '+' || src0 == ' ';
4406 if (zero_flag
4407 && ((src[signedp] >= '0' && src[signedp] <= '9')
4408 || (src[signedp] >= 'a' && src[signedp] <= 'f')
4409 || (src[signedp] >= 'A' && src[signedp] <= 'F')))
4410 {
4411 leading_zeros += padding;
4412 padding = 0;
4413 }
4414
4415 if (excess_precision
4416 && (conversion == 'e' || conversion == 'g'))
4417 {
4418 char *e = strchr (src, 'e');
4419 if (e)
4420 exponent_bytes = src + sprintf_bytes - e;
4421 }
4422
4423 info[n].start = nchars;
4424 if (! minus_flag)
4425 {
4426 memset (p, ' ', padding);
4427 p += padding;
4428 nchars += padding;
4429 }
4430
4431 *p = src0;
4432 src += signedp;
4433 p += signedp;
4434 memset (p, '0', leading_zeros);
4435 p += leading_zeros;
4436 int significand_bytes
4437 = sprintf_bytes - signedp - exponent_bytes;
4438 memcpy (p, src, significand_bytes);
4439 p += significand_bytes;
4440 src += significand_bytes;
4441 memset (p, '0', trailing_zeros);
4442 p += trailing_zeros;
4443 memcpy (p, src, exponent_bytes);
4444 p += exponent_bytes;
4445
4446 nchars += leading_zeros + sprintf_bytes + trailing_zeros;
4447
4448 if (minus_flag)
4449 {
4450 memset (p, ' ', padding);
4451 p += padding;
4452 nchars += padding;
4453 }
4454 info[n].end = nchars;
4455
4456 continue;
4457 }
4458 }
4459 }
4460 else
4461 {
4462 unsigned char str[MAX_MULTIBYTE_LENGTH];
4463
4464 if ((format_char == '`' || format_char == '\'')
4465 && quoting_style == CURVE_QUOTING_STYLE)
4466 {
4467 if (! multibyte)
4468 {
4469 multibyte = true;
4470 goto retry;
4471 }
4472 convsrc = format_char == '`' ? uLSQM : uRSQM;
4473 convbytes = 3;
4474 }
4475 else if (format_char == '`' && quoting_style == STRAIGHT_QUOTING_STYLE)
4476 convsrc = "'";
4477 else
4478 {
4479 /* Copy a single character from format to buf. */
4480 if (multibyte_format)
4481 {
4482 /* Copy a whole multibyte character. */
4483 if (p > buf
4484 && !ASCII_CHAR_P (*((unsigned char *) p - 1))
4485 && !CHAR_HEAD_P (format_char))
4486 maybe_combine_byte = true;
4487
4488 while (! CHAR_HEAD_P (*format))
4489 format++;
4490
4491 convbytes = format - format0;
4492 memset (&discarded[format0 + 1 - format_start], 2,
4493 convbytes - 1);
4494 }
4495 else if (multibyte && !ASCII_CHAR_P (format_char))
4496 {
4497 int c = BYTE8_TO_CHAR (format_char);
4498 convbytes = CHAR_STRING (c, str);
4499 convsrc = (char *) str;
4500 }
4501 }
4502
4503 copy_char:
4504 if (convbytes <= buf + bufsize - p)
4505 {
4506 memcpy (p, convsrc, convbytes);
4507 p += convbytes;
4508 nchars++;
4509 continue;
4510 }
4511 }
4512
4513 /* There wasn't enough room to store this conversion or single
4514 character. CONVBYTES says how much room is needed. Allocate
4515 enough room (and then some) and do it again. */
4516
4517 ptrdiff_t used = p - buf;
4518 if (max_bufsize - used < convbytes)
4519 string_overflow ();
4520 bufsize = used + convbytes;
4521 bufsize = bufsize < max_bufsize / 2 ? bufsize * 2 : max_bufsize;
4522
4523 if (buf == initial_buffer)
4524 {
4525 buf = xmalloc (bufsize);
4526 sa_must_free = true;
4527 buf_save_value_index = SPECPDL_INDEX ();
4528 record_unwind_protect_ptr (xfree, buf);
4529 memcpy (buf, initial_buffer, used);
4530 }
4531 else
4532 {
4533 buf = xrealloc (buf, bufsize);
4534 set_unwind_protect_ptr (buf_save_value_index, xfree, buf);
4535 }
4536
4537 p = buf + used;
4538 format = format0;
4539 n = n0;
4540 }
4541
4542 if (bufsize < p - buf)
4543 emacs_abort ();
4544
4545 if (maybe_combine_byte)
4546 nchars = multibyte_chars_in_text ((unsigned char *) buf, p - buf);
4547 Lisp_Object val = make_specified_string (buf, nchars, p - buf, multibyte);
4548
4549 /* If the format string has text properties, or any of the string
4550 arguments has text properties, set up text properties of the
4551 result string. */
4552
4553 if (string_intervals (args[0]) || arg_intervals)
4554 {
4555 /* Add text properties from the format string. */
4556 Lisp_Object len = make_number (SCHARS (args[0]));
4557 Lisp_Object props = text_property_list (args[0], make_number (0),
4558 len, Qnil);
4559 if (CONSP (props))
4560 {
4561 ptrdiff_t bytepos = 0, position = 0, translated = 0;
4562 ptrdiff_t argn = 1;
4563
4564 /* Adjust the bounds of each text property
4565 to the proper start and end in the output string. */
4566
4567 /* Put the positions in PROPS in increasing order, so that
4568 we can do (effectively) one scan through the position
4569 space of the format string. */
4570 props = Fnreverse (props);
4571
4572 /* BYTEPOS is the byte position in the format string,
4573 POSITION is the untranslated char position in it,
4574 TRANSLATED is the translated char position in BUF,
4575 and ARGN is the number of the next arg we will come to. */
4576 for (Lisp_Object list = props; CONSP (list); list = XCDR (list))
4577 {
4578 Lisp_Object item = XCAR (list);
4579
4580 /* First adjust the property start position. */
4581 ptrdiff_t pos = XINT (XCAR (item));
4582
4583 /* Advance BYTEPOS, POSITION, TRANSLATED and ARGN
4584 up to this position. */
4585 for (; position < pos; bytepos++)
4586 {
4587 if (! discarded[bytepos])
4588 position++, translated++;
4589 else if (discarded[bytepos] == 1)
4590 {
4591 position++;
4592 if (translated == info[argn].start)
4593 {
4594 translated += info[argn].end - info[argn].start;
4595 argn++;
4596 }
4597 }
4598 }
4599
4600 XSETCAR (item, make_number (translated));
4601
4602 /* Likewise adjust the property end position. */
4603 pos = XINT (XCAR (XCDR (item)));
4604
4605 for (; position < pos; bytepos++)
4606 {
4607 if (! discarded[bytepos])
4608 position++, translated++;
4609 else if (discarded[bytepos] == 1)
4610 {
4611 position++;
4612 if (translated == info[argn].start)
4613 {
4614 translated += info[argn].end - info[argn].start;
4615 argn++;
4616 }
4617 }
4618 }
4619
4620 XSETCAR (XCDR (item), make_number (translated));
4621 }
4622
4623 add_text_properties_from_list (val, props, make_number (0));
4624 }
4625
4626 /* Add text properties from arguments. */
4627 if (arg_intervals)
4628 for (ptrdiff_t i = 1; i < nargs; i++)
4629 if (info[i].intervals)
4630 {
4631 len = make_number (SCHARS (args[i]));
4632 Lisp_Object new_len = make_number (info[i].end - info[i].start);
4633 props = text_property_list (args[i], make_number (0), len, Qnil);
4634 props = extend_property_ranges (props, len, new_len);
4635 /* If successive arguments have properties, be sure that
4636 the value of `composition' property be the copy. */
4637 if (1 < i && info[i - 1].end)
4638 make_composition_value_copy (props);
4639 add_text_properties_from_list (val, props,
4640 make_number (info[i].start));
4641 }
4642 }
4643
4644 /* If we allocated BUF or INFO with malloc, free it too. */
4645 SAFE_FREE ();
4646
4647 return val;
4648 }
4649 \f
4650 DEFUN ("char-equal", Fchar_equal, Schar_equal, 2, 2, 0,
4651 doc: /* Return t if two characters match, optionally ignoring case.
4652 Both arguments must be characters (i.e. integers).
4653 Case is ignored if `case-fold-search' is non-nil in the current buffer. */)
4654 (register Lisp_Object c1, Lisp_Object c2)
4655 {
4656 int i1, i2;
4657 /* Check they're chars, not just integers, otherwise we could get array
4658 bounds violations in downcase. */
4659 CHECK_CHARACTER (c1);
4660 CHECK_CHARACTER (c2);
4661
4662 if (XINT (c1) == XINT (c2))
4663 return Qt;
4664 if (NILP (BVAR (current_buffer, case_fold_search)))
4665 return Qnil;
4666
4667 i1 = XFASTINT (c1);
4668 i2 = XFASTINT (c2);
4669
4670 /* FIXME: It is possible to compare multibyte characters even when
4671 the current buffer is unibyte. Unfortunately this is ambiguous
4672 for characters between 128 and 255, as they could be either
4673 eight-bit raw bytes or Latin-1 characters. Assume the former for
4674 now. See Bug#17011, and also see casefiddle.c's casify_object,
4675 which has a similar problem. */
4676 if (NILP (BVAR (current_buffer, enable_multibyte_characters)))
4677 {
4678 if (SINGLE_BYTE_CHAR_P (i1))
4679 i1 = UNIBYTE_TO_CHAR (i1);
4680 if (SINGLE_BYTE_CHAR_P (i2))
4681 i2 = UNIBYTE_TO_CHAR (i2);
4682 }
4683
4684 return (downcase (i1) == downcase (i2) ? Qt : Qnil);
4685 }
4686 \f
4687 /* Transpose the markers in two regions of the current buffer, and
4688 adjust the ones between them if necessary (i.e.: if the regions
4689 differ in size).
4690
4691 START1, END1 are the character positions of the first region.
4692 START1_BYTE, END1_BYTE are the byte positions.
4693 START2, END2 are the character positions of the second region.
4694 START2_BYTE, END2_BYTE are the byte positions.
4695
4696 Traverses the entire marker list of the buffer to do so, adding an
4697 appropriate amount to some, subtracting from some, and leaving the
4698 rest untouched. Most of this is copied from adjust_markers in insdel.c.
4699
4700 It's the caller's job to ensure that START1 <= END1 <= START2 <= END2. */
4701
4702 static void
4703 transpose_markers (ptrdiff_t start1, ptrdiff_t end1,
4704 ptrdiff_t start2, ptrdiff_t end2,
4705 ptrdiff_t start1_byte, ptrdiff_t end1_byte,
4706 ptrdiff_t start2_byte, ptrdiff_t end2_byte)
4707 {
4708 register ptrdiff_t amt1, amt1_byte, amt2, amt2_byte, diff, diff_byte, mpos;
4709 register struct Lisp_Marker *marker;
4710
4711 /* Update point as if it were a marker. */
4712 if (PT < start1)
4713 ;
4714 else if (PT < end1)
4715 TEMP_SET_PT_BOTH (PT + (end2 - end1),
4716 PT_BYTE + (end2_byte - end1_byte));
4717 else if (PT < start2)
4718 TEMP_SET_PT_BOTH (PT + (end2 - start2) - (end1 - start1),
4719 (PT_BYTE + (end2_byte - start2_byte)
4720 - (end1_byte - start1_byte)));
4721 else if (PT < end2)
4722 TEMP_SET_PT_BOTH (PT - (start2 - start1),
4723 PT_BYTE - (start2_byte - start1_byte));
4724
4725 /* We used to adjust the endpoints here to account for the gap, but that
4726 isn't good enough. Even if we assume the caller has tried to move the
4727 gap out of our way, it might still be at start1 exactly, for example;
4728 and that places it `inside' the interval, for our purposes. The amount
4729 of adjustment is nontrivial if there's a `denormalized' marker whose
4730 position is between GPT and GPT + GAP_SIZE, so it's simpler to leave
4731 the dirty work to Fmarker_position, below. */
4732
4733 /* The difference between the region's lengths */
4734 diff = (end2 - start2) - (end1 - start1);
4735 diff_byte = (end2_byte - start2_byte) - (end1_byte - start1_byte);
4736
4737 /* For shifting each marker in a region by the length of the other
4738 region plus the distance between the regions. */
4739 amt1 = (end2 - start2) + (start2 - end1);
4740 amt2 = (end1 - start1) + (start2 - end1);
4741 amt1_byte = (end2_byte - start2_byte) + (start2_byte - end1_byte);
4742 amt2_byte = (end1_byte - start1_byte) + (start2_byte - end1_byte);
4743
4744 for (marker = BUF_MARKERS (current_buffer); marker; marker = marker->next)
4745 {
4746 mpos = marker->bytepos;
4747 if (mpos >= start1_byte && mpos < end2_byte)
4748 {
4749 if (mpos < end1_byte)
4750 mpos += amt1_byte;
4751 else if (mpos < start2_byte)
4752 mpos += diff_byte;
4753 else
4754 mpos -= amt2_byte;
4755 marker->bytepos = mpos;
4756 }
4757 mpos = marker->charpos;
4758 if (mpos >= start1 && mpos < end2)
4759 {
4760 if (mpos < end1)
4761 mpos += amt1;
4762 else if (mpos < start2)
4763 mpos += diff;
4764 else
4765 mpos -= amt2;
4766 }
4767 marker->charpos = mpos;
4768 }
4769 }
4770
4771 DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5, 0,
4772 doc: /* Transpose region STARTR1 to ENDR1 with STARTR2 to ENDR2.
4773 The regions should not be overlapping, because the size of the buffer is
4774 never changed in a transposition.
4775
4776 Optional fifth arg LEAVE-MARKERS, if non-nil, means don't update
4777 any markers that happen to be located in the regions.
4778
4779 Transposing beyond buffer boundaries is an error. */)
4780 (Lisp_Object startr1, Lisp_Object endr1, Lisp_Object startr2, Lisp_Object endr2, Lisp_Object leave_markers)
4781 {
4782 register ptrdiff_t start1, end1, start2, end2;
4783 ptrdiff_t start1_byte, start2_byte, len1_byte, len2_byte, end2_byte;
4784 ptrdiff_t gap, len1, len_mid, len2;
4785 unsigned char *start1_addr, *start2_addr, *temp;
4786
4787 INTERVAL cur_intv, tmp_interval1, tmp_interval_mid, tmp_interval2, tmp_interval3;
4788 Lisp_Object buf;
4789
4790 XSETBUFFER (buf, current_buffer);
4791 cur_intv = buffer_intervals (current_buffer);
4792
4793 validate_region (&startr1, &endr1);
4794 validate_region (&startr2, &endr2);
4795
4796 start1 = XFASTINT (startr1);
4797 end1 = XFASTINT (endr1);
4798 start2 = XFASTINT (startr2);
4799 end2 = XFASTINT (endr2);
4800 gap = GPT;
4801
4802 /* Swap the regions if they're reversed. */
4803 if (start2 < end1)
4804 {
4805 register ptrdiff_t glumph = start1;
4806 start1 = start2;
4807 start2 = glumph;
4808 glumph = end1;
4809 end1 = end2;
4810 end2 = glumph;
4811 }
4812
4813 len1 = end1 - start1;
4814 len2 = end2 - start2;
4815
4816 if (start2 < end1)
4817 error ("Transposed regions overlap");
4818 /* Nothing to change for adjacent regions with one being empty */
4819 else if ((start1 == end1 || start2 == end2) && end1 == start2)
4820 return Qnil;
4821
4822 /* The possibilities are:
4823 1. Adjacent (contiguous) regions, or separate but equal regions
4824 (no, really equal, in this case!), or
4825 2. Separate regions of unequal size.
4826
4827 The worst case is usually No. 2. It means that (aside from
4828 potential need for getting the gap out of the way), there also
4829 needs to be a shifting of the text between the two regions. So
4830 if they are spread far apart, we are that much slower... sigh. */
4831
4832 /* It must be pointed out that the really studly thing to do would
4833 be not to move the gap at all, but to leave it in place and work
4834 around it if necessary. This would be extremely efficient,
4835 especially considering that people are likely to do
4836 transpositions near where they are working interactively, which
4837 is exactly where the gap would be found. However, such code
4838 would be much harder to write and to read. So, if you are
4839 reading this comment and are feeling squirrely, by all means have
4840 a go! I just didn't feel like doing it, so I will simply move
4841 the gap the minimum distance to get it out of the way, and then
4842 deal with an unbroken array. */
4843
4844 start1_byte = CHAR_TO_BYTE (start1);
4845 end2_byte = CHAR_TO_BYTE (end2);
4846
4847 /* Make sure the gap won't interfere, by moving it out of the text
4848 we will operate on. */
4849 if (start1 < gap && gap < end2)
4850 {
4851 if (gap - start1 < end2 - gap)
4852 move_gap_both (start1, start1_byte);
4853 else
4854 move_gap_both (end2, end2_byte);
4855 }
4856
4857 start2_byte = CHAR_TO_BYTE (start2);
4858 len1_byte = CHAR_TO_BYTE (end1) - start1_byte;
4859 len2_byte = end2_byte - start2_byte;
4860
4861 #ifdef BYTE_COMBINING_DEBUG
4862 if (end1 == start2)
4863 {
4864 if (count_combining_before (BYTE_POS_ADDR (start2_byte),
4865 len2_byte, start1, start1_byte)
4866 || count_combining_before (BYTE_POS_ADDR (start1_byte),
4867 len1_byte, end2, start2_byte + len2_byte)
4868 || count_combining_after (BYTE_POS_ADDR (start1_byte),
4869 len1_byte, end2, start2_byte + len2_byte))
4870 emacs_abort ();
4871 }
4872 else
4873 {
4874 if (count_combining_before (BYTE_POS_ADDR (start2_byte),
4875 len2_byte, start1, start1_byte)
4876 || count_combining_before (BYTE_POS_ADDR (start1_byte),
4877 len1_byte, start2, start2_byte)
4878 || count_combining_after (BYTE_POS_ADDR (start2_byte),
4879 len2_byte, end1, start1_byte + len1_byte)
4880 || count_combining_after (BYTE_POS_ADDR (start1_byte),
4881 len1_byte, end2, start2_byte + len2_byte))
4882 emacs_abort ();
4883 }
4884 #endif
4885
4886 /* Hmmm... how about checking to see if the gap is large
4887 enough to use as the temporary storage? That would avoid an
4888 allocation... interesting. Later, don't fool with it now. */
4889
4890 /* Working without memmove, for portability (sigh), so must be
4891 careful of overlapping subsections of the array... */
4892
4893 if (end1 == start2) /* adjacent regions */
4894 {
4895 modify_text (start1, end2);
4896 record_change (start1, len1 + len2);
4897
4898 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4899 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4900 /* Don't use Fset_text_properties: that can cause GC, which can
4901 clobber objects stored in the tmp_intervals. */
4902 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4903 if (tmp_interval3)
4904 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4905
4906 USE_SAFE_ALLOCA;
4907
4908 /* First region smaller than second. */
4909 if (len1_byte < len2_byte)
4910 {
4911 temp = SAFE_ALLOCA (len2_byte);
4912
4913 /* Don't precompute these addresses. We have to compute them
4914 at the last minute, because the relocating allocator might
4915 have moved the buffer around during the xmalloc. */
4916 start1_addr = BYTE_POS_ADDR (start1_byte);
4917 start2_addr = BYTE_POS_ADDR (start2_byte);
4918
4919 memcpy (temp, start2_addr, len2_byte);
4920 memcpy (start1_addr + len2_byte, start1_addr, len1_byte);
4921 memcpy (start1_addr, temp, len2_byte);
4922 }
4923 else
4924 /* First region not smaller than second. */
4925 {
4926 temp = SAFE_ALLOCA (len1_byte);
4927 start1_addr = BYTE_POS_ADDR (start1_byte);
4928 start2_addr = BYTE_POS_ADDR (start2_byte);
4929 memcpy (temp, start1_addr, len1_byte);
4930 memcpy (start1_addr, start2_addr, len2_byte);
4931 memcpy (start1_addr + len2_byte, temp, len1_byte);
4932 }
4933
4934 SAFE_FREE ();
4935 graft_intervals_into_buffer (tmp_interval1, start1 + len2,
4936 len1, current_buffer, 0);
4937 graft_intervals_into_buffer (tmp_interval2, start1,
4938 len2, current_buffer, 0);
4939 update_compositions (start1, start1 + len2, CHECK_BORDER);
4940 update_compositions (start1 + len2, end2, CHECK_TAIL);
4941 }
4942 /* Non-adjacent regions, because end1 != start2, bleagh... */
4943 else
4944 {
4945 len_mid = start2_byte - (start1_byte + len1_byte);
4946
4947 if (len1_byte == len2_byte)
4948 /* Regions are same size, though, how nice. */
4949 {
4950 USE_SAFE_ALLOCA;
4951
4952 modify_text (start1, end1);
4953 modify_text (start2, end2);
4954 record_change (start1, len1);
4955 record_change (start2, len2);
4956 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4957 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4958
4959 tmp_interval3 = validate_interval_range (buf, &startr1, &endr1, 0);
4960 if (tmp_interval3)
4961 set_text_properties_1 (startr1, endr1, Qnil, buf, tmp_interval3);
4962
4963 tmp_interval3 = validate_interval_range (buf, &startr2, &endr2, 0);
4964 if (tmp_interval3)
4965 set_text_properties_1 (startr2, endr2, Qnil, buf, tmp_interval3);
4966
4967 temp = SAFE_ALLOCA (len1_byte);
4968 start1_addr = BYTE_POS_ADDR (start1_byte);
4969 start2_addr = BYTE_POS_ADDR (start2_byte);
4970 memcpy (temp, start1_addr, len1_byte);
4971 memcpy (start1_addr, start2_addr, len2_byte);
4972 memcpy (start2_addr, temp, len1_byte);
4973 SAFE_FREE ();
4974
4975 graft_intervals_into_buffer (tmp_interval1, start2,
4976 len1, current_buffer, 0);
4977 graft_intervals_into_buffer (tmp_interval2, start1,
4978 len2, current_buffer, 0);
4979 }
4980
4981 else if (len1_byte < len2_byte) /* Second region larger than first */
4982 /* Non-adjacent & unequal size, area between must also be shifted. */
4983 {
4984 USE_SAFE_ALLOCA;
4985
4986 modify_text (start1, end2);
4987 record_change (start1, (end2 - start1));
4988 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4989 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4990 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4991
4992 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
4993 if (tmp_interval3)
4994 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
4995
4996 /* holds region 2 */
4997 temp = SAFE_ALLOCA (len2_byte);
4998 start1_addr = BYTE_POS_ADDR (start1_byte);
4999 start2_addr = BYTE_POS_ADDR (start2_byte);
5000 memcpy (temp, start2_addr, len2_byte);
5001 memcpy (start1_addr + len_mid + len2_byte, start1_addr, len1_byte);
5002 memmove (start1_addr + len2_byte, start1_addr + len1_byte, len_mid);
5003 memcpy (start1_addr, temp, len2_byte);
5004 SAFE_FREE ();
5005
5006 graft_intervals_into_buffer (tmp_interval1, end2 - len1,
5007 len1, current_buffer, 0);
5008 graft_intervals_into_buffer (tmp_interval_mid, start1 + len2,
5009 len_mid, current_buffer, 0);
5010 graft_intervals_into_buffer (tmp_interval2, start1,
5011 len2, current_buffer, 0);
5012 }
5013 else
5014 /* Second region smaller than first. */
5015 {
5016 USE_SAFE_ALLOCA;
5017
5018 record_change (start1, (end2 - start1));
5019 modify_text (start1, end2);
5020
5021 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
5022 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
5023 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
5024
5025 tmp_interval3 = validate_interval_range (buf, &startr1, &endr2, 0);
5026 if (tmp_interval3)
5027 set_text_properties_1 (startr1, endr2, Qnil, buf, tmp_interval3);
5028
5029 /* holds region 1 */
5030 temp = SAFE_ALLOCA (len1_byte);
5031 start1_addr = BYTE_POS_ADDR (start1_byte);
5032 start2_addr = BYTE_POS_ADDR (start2_byte);
5033 memcpy (temp, start1_addr, len1_byte);
5034 memcpy (start1_addr, start2_addr, len2_byte);
5035 memmove (start1_addr + len2_byte, start1_addr + len1_byte, len_mid);
5036 memcpy (start1_addr + len2_byte + len_mid, temp, len1_byte);
5037 SAFE_FREE ();
5038
5039 graft_intervals_into_buffer (tmp_interval1, end2 - len1,
5040 len1, current_buffer, 0);
5041 graft_intervals_into_buffer (tmp_interval_mid, start1 + len2,
5042 len_mid, current_buffer, 0);
5043 graft_intervals_into_buffer (tmp_interval2, start1,
5044 len2, current_buffer, 0);
5045 }
5046
5047 update_compositions (start1, start1 + len2, CHECK_BORDER);
5048 update_compositions (end2 - len1, end2, CHECK_BORDER);
5049 }
5050
5051 /* When doing multiple transpositions, it might be nice
5052 to optimize this. Perhaps the markers in any one buffer
5053 should be organized in some sorted data tree. */
5054 if (NILP (leave_markers))
5055 {
5056 transpose_markers (start1, end1, start2, end2,
5057 start1_byte, start1_byte + len1_byte,
5058 start2_byte, start2_byte + len2_byte);
5059 fix_start_end_in_overlays (start1, end2);
5060 }
5061 else
5062 {
5063 /* The character positions of the markers remain intact, but we
5064 still need to update their byte positions, because the
5065 transposed regions might include multibyte sequences which
5066 make some original byte positions of the markers invalid. */
5067 adjust_markers_bytepos (start1, start1_byte, end2, end2_byte, 0);
5068 }
5069
5070 signal_after_change (start1, end2 - start1, end2 - start1);
5071 return Qnil;
5072 }
5073
5074 \f
5075 void
5076 syms_of_editfns (void)
5077 {
5078 DEFSYM (Qbuffer_access_fontify_functions, "buffer-access-fontify-functions");
5079 DEFSYM (Qwall, "wall");
5080
5081 DEFVAR_LISP ("inhibit-field-text-motion", Vinhibit_field_text_motion,
5082 doc: /* Non-nil means text motion commands don't notice fields. */);
5083 Vinhibit_field_text_motion = Qnil;
5084
5085 DEFVAR_LISP ("buffer-access-fontify-functions",
5086 Vbuffer_access_fontify_functions,
5087 doc: /* List of functions called by `buffer-substring' to fontify if necessary.
5088 Each function is called with two arguments which specify the range
5089 of the buffer being accessed. */);
5090 Vbuffer_access_fontify_functions = Qnil;
5091
5092 {
5093 Lisp_Object obuf;
5094 obuf = Fcurrent_buffer ();
5095 /* Do this here, because init_buffer_once is too early--it won't work. */
5096 Fset_buffer (Vprin1_to_string_buffer);
5097 /* Make sure buffer-access-fontify-functions is nil in this buffer. */
5098 Fset (Fmake_local_variable (Qbuffer_access_fontify_functions), Qnil);
5099 Fset_buffer (obuf);
5100 }
5101
5102 DEFVAR_LISP ("buffer-access-fontified-property",
5103 Vbuffer_access_fontified_property,
5104 doc: /* Property which (if non-nil) indicates text has been fontified.
5105 `buffer-substring' need not call the `buffer-access-fontify-functions'
5106 functions if all the text being accessed has this property. */);
5107 Vbuffer_access_fontified_property = Qnil;
5108
5109 DEFVAR_LISP ("system-name", Vsystem_name,
5110 doc: /* The host name of the machine Emacs is running on. */);
5111 Vsystem_name = cached_system_name = Qnil;
5112
5113 DEFVAR_LISP ("user-full-name", Vuser_full_name,
5114 doc: /* The full name of the user logged in. */);
5115
5116 DEFVAR_LISP ("user-login-name", Vuser_login_name,
5117 doc: /* The user's name, taken from environment variables if possible. */);
5118 Vuser_login_name = Qnil;
5119
5120 DEFVAR_LISP ("user-real-login-name", Vuser_real_login_name,
5121 doc: /* The user's name, based upon the real uid only. */);
5122
5123 DEFVAR_LISP ("operating-system-release", Voperating_system_release,
5124 doc: /* The release of the operating system Emacs is running on. */);
5125
5126 defsubr (&Spropertize);
5127 defsubr (&Schar_equal);
5128 defsubr (&Sgoto_char);
5129 defsubr (&Sstring_to_char);
5130 defsubr (&Schar_to_string);
5131 defsubr (&Sbyte_to_string);
5132 defsubr (&Sbuffer_substring);
5133 defsubr (&Sbuffer_substring_no_properties);
5134 defsubr (&Sbuffer_string);
5135 defsubr (&Sget_pos_property);
5136
5137 defsubr (&Spoint_marker);
5138 defsubr (&Smark_marker);
5139 defsubr (&Spoint);
5140 defsubr (&Sregion_beginning);
5141 defsubr (&Sregion_end);
5142
5143 /* Symbol for the text property used to mark fields. */
5144 DEFSYM (Qfield, "field");
5145
5146 /* A special value for Qfield properties. */
5147 DEFSYM (Qboundary, "boundary");
5148
5149 defsubr (&Sfield_beginning);
5150 defsubr (&Sfield_end);
5151 defsubr (&Sfield_string);
5152 defsubr (&Sfield_string_no_properties);
5153 defsubr (&Sdelete_field);
5154 defsubr (&Sconstrain_to_field);
5155
5156 defsubr (&Sline_beginning_position);
5157 defsubr (&Sline_end_position);
5158
5159 defsubr (&Ssave_excursion);
5160 defsubr (&Ssave_current_buffer);
5161
5162 defsubr (&Sbuffer_size);
5163 defsubr (&Spoint_max);
5164 defsubr (&Spoint_min);
5165 defsubr (&Spoint_min_marker);
5166 defsubr (&Spoint_max_marker);
5167 defsubr (&Sgap_position);
5168 defsubr (&Sgap_size);
5169 defsubr (&Sposition_bytes);
5170 defsubr (&Sbyte_to_position);
5171
5172 defsubr (&Sbobp);
5173 defsubr (&Seobp);
5174 defsubr (&Sbolp);
5175 defsubr (&Seolp);
5176 defsubr (&Sfollowing_char);
5177 defsubr (&Sprevious_char);
5178 defsubr (&Schar_after);
5179 defsubr (&Schar_before);
5180 defsubr (&Sinsert);
5181 defsubr (&Sinsert_before_markers);
5182 defsubr (&Sinsert_and_inherit);
5183 defsubr (&Sinsert_and_inherit_before_markers);
5184 defsubr (&Sinsert_char);
5185 defsubr (&Sinsert_byte);
5186
5187 defsubr (&Suser_login_name);
5188 defsubr (&Suser_real_login_name);
5189 defsubr (&Suser_uid);
5190 defsubr (&Suser_real_uid);
5191 defsubr (&Sgroup_gid);
5192 defsubr (&Sgroup_real_gid);
5193 defsubr (&Suser_full_name);
5194 defsubr (&Semacs_pid);
5195 defsubr (&Scurrent_time);
5196 defsubr (&Stime_add);
5197 defsubr (&Stime_subtract);
5198 defsubr (&Stime_less_p);
5199 defsubr (&Sget_internal_run_time);
5200 defsubr (&Sformat_time_string);
5201 defsubr (&Sfloat_time);
5202 defsubr (&Sdecode_time);
5203 defsubr (&Sencode_time);
5204 defsubr (&Scurrent_time_string);
5205 defsubr (&Scurrent_time_zone);
5206 defsubr (&Sset_time_zone_rule);
5207 defsubr (&Ssystem_name);
5208 defsubr (&Smessage);
5209 defsubr (&Smessage_box);
5210 defsubr (&Smessage_or_box);
5211 defsubr (&Scurrent_message);
5212 defsubr (&Sformat);
5213 defsubr (&Sformat_message);
5214
5215 defsubr (&Sinsert_buffer_substring);
5216 defsubr (&Scompare_buffer_substrings);
5217 defsubr (&Ssubst_char_in_region);
5218 defsubr (&Stranslate_region_internal);
5219 defsubr (&Sdelete_region);
5220 defsubr (&Sdelete_and_extract_region);
5221 defsubr (&Swiden);
5222 defsubr (&Snarrow_to_region);
5223 defsubr (&Ssave_restriction);
5224 defsubr (&Stranspose_regions);
5225 }