* editfns.c (Fdelete_field, Ffield_string, Ffield_beginning)
[bpt/emacs.git] / src / editfns.c
1 /* Lisp functions pertaining to editing.
2 Copyright (C) 1985, 1986, 1987, 1989, 1993, 1994, 1995, 1996,
3 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006 Free Software Foundation, Inc.
5
6 This file is part of GNU Emacs.
7
8 GNU Emacs is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs; see the file COPYING. If not, write to
20 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
22
23
24 #include <config.h>
25 #include <sys/types.h>
26 #include <stdio.h>
27
28 #ifdef HAVE_PWD_H
29 #include <pwd.h>
30 #endif
31
32 #ifdef HAVE_UNISTD_H
33 #include <unistd.h>
34 #endif
35
36 #ifdef HAVE_SYS_UTSNAME_H
37 #include <sys/utsname.h>
38 #endif
39
40 #include "lisp.h"
41
42 /* systime.h includes <sys/time.h> which, on some systems, is required
43 for <sys/resource.h>; thus systime.h must be included before
44 <sys/resource.h> */
45 #include "systime.h"
46
47 #if defined HAVE_SYS_RESOURCE_H
48 #include <sys/resource.h>
49 #endif
50
51 #include <ctype.h>
52
53 #include "intervals.h"
54 #include "buffer.h"
55 #include "charset.h"
56 #include "coding.h"
57 #include "frame.h"
58 #include "window.h"
59
60 #ifdef STDC_HEADERS
61 #include <float.h>
62 #define MAX_10_EXP DBL_MAX_10_EXP
63 #else
64 #define MAX_10_EXP 310
65 #endif
66
67 #ifndef NULL
68 #define NULL 0
69 #endif
70
71 #ifndef USE_CRT_DLL
72 extern char **environ;
73 #endif
74
75 #define TM_YEAR_BASE 1900
76
77 /* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
78 asctime to have well-defined behavior. */
79 #ifndef TM_YEAR_IN_ASCTIME_RANGE
80 # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
81 (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
82 #endif
83
84 extern size_t emacs_strftimeu P_ ((char *, size_t, const char *,
85 const struct tm *, int));
86 static int tm_diff P_ ((struct tm *, struct tm *));
87 static void find_field P_ ((Lisp_Object, Lisp_Object, Lisp_Object, int *, Lisp_Object, int *));
88 static void update_buffer_properties P_ ((int, int));
89 static Lisp_Object region_limit P_ ((int));
90 int lisp_time_argument P_ ((Lisp_Object, time_t *, int *));
91 static size_t emacs_memftimeu P_ ((char *, size_t, const char *,
92 size_t, const struct tm *, int));
93 static void general_insert_function P_ ((void (*) (const unsigned char *, int),
94 void (*) (Lisp_Object, int, int, int,
95 int, int),
96 int, int, Lisp_Object *));
97 static Lisp_Object subst_char_in_region_unwind P_ ((Lisp_Object));
98 static Lisp_Object subst_char_in_region_unwind_1 P_ ((Lisp_Object));
99 static void transpose_markers P_ ((int, int, int, int, int, int, int, int));
100
101 #ifdef HAVE_INDEX
102 extern char *index P_ ((const char *, int));
103 #endif
104
105 Lisp_Object Vbuffer_access_fontify_functions;
106 Lisp_Object Qbuffer_access_fontify_functions;
107 Lisp_Object Vbuffer_access_fontified_property;
108
109 Lisp_Object Fuser_full_name P_ ((Lisp_Object));
110
111 /* Non-nil means don't stop at field boundary in text motion commands. */
112
113 Lisp_Object Vinhibit_field_text_motion;
114
115 /* Some static data, and a function to initialize it for each run */
116
117 Lisp_Object Vsystem_name;
118 Lisp_Object Vuser_real_login_name; /* login name of current user ID */
119 Lisp_Object Vuser_full_name; /* full name of current user */
120 Lisp_Object Vuser_login_name; /* user name from LOGNAME or USER */
121 Lisp_Object Voperating_system_release; /* Operating System Release */
122
123 /* Symbol for the text property used to mark fields. */
124
125 Lisp_Object Qfield;
126
127 /* A special value for Qfield properties. */
128
129 Lisp_Object Qboundary;
130
131
132 void
133 init_editfns ()
134 {
135 char *user_name;
136 register unsigned char *p;
137 struct passwd *pw; /* password entry for the current user */
138 Lisp_Object tem;
139
140 /* Set up system_name even when dumping. */
141 init_system_name ();
142
143 #ifndef CANNOT_DUMP
144 /* Don't bother with this on initial start when just dumping out */
145 if (!initialized)
146 return;
147 #endif /* not CANNOT_DUMP */
148
149 pw = (struct passwd *) getpwuid (getuid ());
150 #ifdef MSDOS
151 /* We let the real user name default to "root" because that's quite
152 accurate on MSDOG and because it lets Emacs find the init file.
153 (The DVX libraries override the Djgpp libraries here.) */
154 Vuser_real_login_name = build_string (pw ? pw->pw_name : "root");
155 #else
156 Vuser_real_login_name = build_string (pw ? pw->pw_name : "unknown");
157 #endif
158
159 /* Get the effective user name, by consulting environment variables,
160 or the effective uid if those are unset. */
161 user_name = (char *) getenv ("LOGNAME");
162 if (!user_name)
163 #ifdef WINDOWSNT
164 user_name = (char *) getenv ("USERNAME"); /* it's USERNAME on NT */
165 #else /* WINDOWSNT */
166 user_name = (char *) getenv ("USER");
167 #endif /* WINDOWSNT */
168 if (!user_name)
169 {
170 pw = (struct passwd *) getpwuid (geteuid ());
171 user_name = (char *) (pw ? pw->pw_name : "unknown");
172 }
173 Vuser_login_name = build_string (user_name);
174
175 /* If the user name claimed in the environment vars differs from
176 the real uid, use the claimed name to find the full name. */
177 tem = Fstring_equal (Vuser_login_name, Vuser_real_login_name);
178 Vuser_full_name = Fuser_full_name (NILP (tem)? make_number (geteuid())
179 : Vuser_login_name);
180
181 p = (unsigned char *) getenv ("NAME");
182 if (p)
183 Vuser_full_name = build_string (p);
184 else if (NILP (Vuser_full_name))
185 Vuser_full_name = build_string ("unknown");
186
187 #ifdef HAVE_SYS_UTSNAME_H
188 {
189 struct utsname uts;
190 uname (&uts);
191 Voperating_system_release = build_string (uts.release);
192 }
193 #else
194 Voperating_system_release = Qnil;
195 #endif
196 }
197 \f
198 DEFUN ("char-to-string", Fchar_to_string, Schar_to_string, 1, 1, 0,
199 doc: /* Convert arg CHAR to a string containing that character.
200 usage: (char-to-string CHAR) */)
201 (character)
202 Lisp_Object character;
203 {
204 int len;
205 unsigned char str[MAX_MULTIBYTE_LENGTH];
206
207 CHECK_NUMBER (character);
208
209 len = (SINGLE_BYTE_CHAR_P (XFASTINT (character))
210 ? (*str = (unsigned char)(XFASTINT (character)), 1)
211 : char_to_string (XFASTINT (character), str));
212 return make_string_from_bytes (str, 1, len);
213 }
214
215 DEFUN ("string-to-char", Fstring_to_char, Sstring_to_char, 1, 1, 0,
216 doc: /* Convert arg STRING to a character, the first character of that string.
217 A multibyte character is handled correctly. */)
218 (string)
219 register Lisp_Object string;
220 {
221 register Lisp_Object val;
222 CHECK_STRING (string);
223 if (SCHARS (string))
224 {
225 if (STRING_MULTIBYTE (string))
226 XSETFASTINT (val, STRING_CHAR (SDATA (string), SBYTES (string)));
227 else
228 XSETFASTINT (val, SREF (string, 0));
229 }
230 else
231 XSETFASTINT (val, 0);
232 return val;
233 }
234 \f
235 static Lisp_Object
236 buildmark (charpos, bytepos)
237 int charpos, bytepos;
238 {
239 register Lisp_Object mark;
240 mark = Fmake_marker ();
241 set_marker_both (mark, Qnil, charpos, bytepos);
242 return mark;
243 }
244
245 DEFUN ("point", Fpoint, Spoint, 0, 0, 0,
246 doc: /* Return value of point, as an integer.
247 Beginning of buffer is position (point-min). */)
248 ()
249 {
250 Lisp_Object temp;
251 XSETFASTINT (temp, PT);
252 return temp;
253 }
254
255 DEFUN ("point-marker", Fpoint_marker, Spoint_marker, 0, 0, 0,
256 doc: /* Return value of point, as a marker object. */)
257 ()
258 {
259 return buildmark (PT, PT_BYTE);
260 }
261
262 int
263 clip_to_bounds (lower, num, upper)
264 int lower, num, upper;
265 {
266 if (num < lower)
267 return lower;
268 else if (num > upper)
269 return upper;
270 else
271 return num;
272 }
273
274 DEFUN ("goto-char", Fgoto_char, Sgoto_char, 1, 1, "NGoto char: ",
275 doc: /* Set point to POSITION, a number or marker.
276 Beginning of buffer is position (point-min), end is (point-max). */)
277 (position)
278 register Lisp_Object position;
279 {
280 int pos;
281
282 if (MARKERP (position)
283 && current_buffer == XMARKER (position)->buffer)
284 {
285 pos = marker_position (position);
286 if (pos < BEGV)
287 SET_PT_BOTH (BEGV, BEGV_BYTE);
288 else if (pos > ZV)
289 SET_PT_BOTH (ZV, ZV_BYTE);
290 else
291 SET_PT_BOTH (pos, marker_byte_position (position));
292
293 return position;
294 }
295
296 CHECK_NUMBER_COERCE_MARKER (position);
297
298 pos = clip_to_bounds (BEGV, XINT (position), ZV);
299 SET_PT (pos);
300 return position;
301 }
302
303
304 /* Return the start or end position of the region.
305 BEGINNINGP non-zero means return the start.
306 If there is no region active, signal an error. */
307
308 static Lisp_Object
309 region_limit (beginningp)
310 int beginningp;
311 {
312 extern Lisp_Object Vmark_even_if_inactive; /* Defined in callint.c. */
313 Lisp_Object m;
314
315 if (!NILP (Vtransient_mark_mode)
316 && NILP (Vmark_even_if_inactive)
317 && NILP (current_buffer->mark_active))
318 Fsignal (Qmark_inactive, Qnil);
319
320 m = Fmarker_position (current_buffer->mark);
321 if (NILP (m))
322 error ("The mark is not set now, so there is no region");
323
324 if ((PT < XFASTINT (m)) == (beginningp != 0))
325 m = make_number (PT);
326 return m;
327 }
328
329 DEFUN ("region-beginning", Fregion_beginning, Sregion_beginning, 0, 0, 0,
330 doc: /* Return position of beginning of region, as an integer. */)
331 ()
332 {
333 return region_limit (1);
334 }
335
336 DEFUN ("region-end", Fregion_end, Sregion_end, 0, 0, 0,
337 doc: /* Return position of end of region, as an integer. */)
338 ()
339 {
340 return region_limit (0);
341 }
342
343 DEFUN ("mark-marker", Fmark_marker, Smark_marker, 0, 0, 0,
344 doc: /* Return this buffer's mark, as a marker object.
345 Watch out! Moving this marker changes the mark position.
346 If you set the marker not to point anywhere, the buffer will have no mark. */)
347 ()
348 {
349 return current_buffer->mark;
350 }
351
352 \f
353 /* Find all the overlays in the current buffer that touch position POS.
354 Return the number found, and store them in a vector in VEC
355 of length LEN. */
356
357 static int
358 overlays_around (pos, vec, len)
359 int pos;
360 Lisp_Object *vec;
361 int len;
362 {
363 Lisp_Object overlay, start, end;
364 struct Lisp_Overlay *tail;
365 int startpos, endpos;
366 int idx = 0;
367
368 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
369 {
370 XSETMISC (overlay, tail);
371
372 end = OVERLAY_END (overlay);
373 endpos = OVERLAY_POSITION (end);
374 if (endpos < pos)
375 break;
376 start = OVERLAY_START (overlay);
377 startpos = OVERLAY_POSITION (start);
378 if (startpos <= pos)
379 {
380 if (idx < len)
381 vec[idx] = overlay;
382 /* Keep counting overlays even if we can't return them all. */
383 idx++;
384 }
385 }
386
387 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
388 {
389 XSETMISC (overlay, tail);
390
391 start = OVERLAY_START (overlay);
392 startpos = OVERLAY_POSITION (start);
393 if (pos < startpos)
394 break;
395 end = OVERLAY_END (overlay);
396 endpos = OVERLAY_POSITION (end);
397 if (pos <= endpos)
398 {
399 if (idx < len)
400 vec[idx] = overlay;
401 idx++;
402 }
403 }
404
405 return idx;
406 }
407
408 /* Return the value of property PROP, in OBJECT at POSITION.
409 It's the value of PROP that a char inserted at POSITION would get.
410 OBJECT is optional and defaults to the current buffer.
411 If OBJECT is a buffer, then overlay properties are considered as well as
412 text properties.
413 If OBJECT is a window, then that window's buffer is used, but
414 window-specific overlays are considered only if they are associated
415 with OBJECT. */
416 Lisp_Object
417 get_pos_property (position, prop, object)
418 Lisp_Object position, object;
419 register Lisp_Object prop;
420 {
421 CHECK_NUMBER_COERCE_MARKER (position);
422
423 if (NILP (object))
424 XSETBUFFER (object, current_buffer);
425 else if (WINDOWP (object))
426 object = XWINDOW (object)->buffer;
427
428 if (!BUFFERP (object))
429 /* pos-property only makes sense in buffers right now, since strings
430 have no overlays and no notion of insertion for which stickiness
431 could be obeyed. */
432 return Fget_text_property (position, prop, object);
433 else
434 {
435 int posn = XINT (position);
436 int noverlays;
437 Lisp_Object *overlay_vec, tem;
438 struct buffer *obuf = current_buffer;
439
440 set_buffer_temp (XBUFFER (object));
441
442 /* First try with room for 40 overlays. */
443 noverlays = 40;
444 overlay_vec = (Lisp_Object *) alloca (noverlays * sizeof (Lisp_Object));
445 noverlays = overlays_around (posn, overlay_vec, noverlays);
446
447 /* If there are more than 40,
448 make enough space for all, and try again. */
449 if (noverlays > 40)
450 {
451 overlay_vec = (Lisp_Object *) alloca (noverlays * sizeof (Lisp_Object));
452 noverlays = overlays_around (posn, overlay_vec, noverlays);
453 }
454 noverlays = sort_overlays (overlay_vec, noverlays, NULL);
455
456 set_buffer_temp (obuf);
457
458 /* Now check the overlays in order of decreasing priority. */
459 while (--noverlays >= 0)
460 {
461 Lisp_Object ol = overlay_vec[noverlays];
462 tem = Foverlay_get (ol, prop);
463 if (!NILP (tem))
464 {
465 /* Check the overlay is indeed active at point. */
466 Lisp_Object start = OVERLAY_START (ol), finish = OVERLAY_END (ol);
467 if ((OVERLAY_POSITION (start) == posn
468 && XMARKER (start)->insertion_type == 1)
469 || (OVERLAY_POSITION (finish) == posn
470 && XMARKER (finish)->insertion_type == 0))
471 ; /* The overlay will not cover a char inserted at point. */
472 else
473 {
474 return tem;
475 }
476 }
477 }
478
479 { /* Now check the text-properties. */
480 int stickiness = text_property_stickiness (prop, position, object);
481 if (stickiness > 0)
482 return Fget_text_property (position, prop, object);
483 else if (stickiness < 0
484 && XINT (position) > BUF_BEGV (XBUFFER (object)))
485 return Fget_text_property (make_number (XINT (position) - 1),
486 prop, object);
487 else
488 return Qnil;
489 }
490 }
491 }
492
493 /* Find the field surrounding POS in *BEG and *END. If POS is nil,
494 the value of point is used instead. If BEG or END is null,
495 means don't store the beginning or end of the field.
496
497 BEG_LIMIT and END_LIMIT serve to limit the ranged of the returned
498 results; they do not effect boundary behavior.
499
500 If MERGE_AT_BOUNDARY is nonzero, then if POS is at the very first
501 position of a field, then the beginning of the previous field is
502 returned instead of the beginning of POS's field (since the end of a
503 field is actually also the beginning of the next input field, this
504 behavior is sometimes useful). Additionally in the MERGE_AT_BOUNDARY
505 true case, if two fields are separated by a field with the special
506 value `boundary', and POS lies within it, then the two separated
507 fields are considered to be adjacent, and POS between them, when
508 finding the beginning and ending of the "merged" field.
509
510 Either BEG or END may be 0, in which case the corresponding value
511 is not stored. */
512
513 static void
514 find_field (pos, merge_at_boundary, beg_limit, beg, end_limit, end)
515 Lisp_Object pos;
516 Lisp_Object merge_at_boundary;
517 Lisp_Object beg_limit, end_limit;
518 int *beg, *end;
519 {
520 /* Fields right before and after the point. */
521 Lisp_Object before_field, after_field;
522 /* 1 if POS counts as the start of a field. */
523 int at_field_start = 0;
524 /* 1 if POS counts as the end of a field. */
525 int at_field_end = 0;
526
527 if (NILP (pos))
528 XSETFASTINT (pos, PT);
529 else
530 CHECK_NUMBER_COERCE_MARKER (pos);
531
532 after_field
533 = get_char_property_and_overlay (pos, Qfield, Qnil, NULL);
534 before_field
535 = (XFASTINT (pos) > BEGV
536 ? get_char_property_and_overlay (make_number (XINT (pos) - 1),
537 Qfield, Qnil, NULL)
538 /* Using nil here would be a more obvious choice, but it would
539 fail when the buffer starts with a non-sticky field. */
540 : after_field);
541
542 /* See if we need to handle the case where MERGE_AT_BOUNDARY is nil
543 and POS is at beginning of a field, which can also be interpreted
544 as the end of the previous field. Note that the case where if
545 MERGE_AT_BOUNDARY is non-nil (see function comment) is actually the
546 more natural one; then we avoid treating the beginning of a field
547 specially. */
548 if (NILP (merge_at_boundary))
549 {
550 Lisp_Object field = get_pos_property (pos, Qfield, Qnil);
551 if (!EQ (field, after_field))
552 at_field_end = 1;
553 if (!EQ (field, before_field))
554 at_field_start = 1;
555 if (NILP (field) && at_field_start && at_field_end)
556 /* If an inserted char would have a nil field while the surrounding
557 text is non-nil, we're probably not looking at a
558 zero-length field, but instead at a non-nil field that's
559 not intended for editing (such as comint's prompts). */
560 at_field_end = at_field_start = 0;
561 }
562
563 /* Note about special `boundary' fields:
564
565 Consider the case where the point (`.') is between the fields `x' and `y':
566
567 xxxx.yyyy
568
569 In this situation, if merge_at_boundary is true, we consider the
570 `x' and `y' fields as forming one big merged field, and so the end
571 of the field is the end of `y'.
572
573 However, if `x' and `y' are separated by a special `boundary' field
574 (a field with a `field' char-property of 'boundary), then we ignore
575 this special field when merging adjacent fields. Here's the same
576 situation, but with a `boundary' field between the `x' and `y' fields:
577
578 xxx.BBBByyyy
579
580 Here, if point is at the end of `x', the beginning of `y', or
581 anywhere in-between (within the `boundary' field), we merge all
582 three fields and consider the beginning as being the beginning of
583 the `x' field, and the end as being the end of the `y' field. */
584
585 if (beg)
586 {
587 if (at_field_start)
588 /* POS is at the edge of a field, and we should consider it as
589 the beginning of the following field. */
590 *beg = XFASTINT (pos);
591 else
592 /* Find the previous field boundary. */
593 {
594 Lisp_Object p = pos;
595 if (!NILP (merge_at_boundary) && EQ (before_field, Qboundary))
596 /* Skip a `boundary' field. */
597 p = Fprevious_single_char_property_change (p, Qfield, Qnil,
598 beg_limit);
599
600 p = Fprevious_single_char_property_change (p, Qfield, Qnil,
601 beg_limit);
602 *beg = NILP (p) ? BEGV : XFASTINT (p);
603 }
604 }
605
606 if (end)
607 {
608 if (at_field_end)
609 /* POS is at the edge of a field, and we should consider it as
610 the end of the previous field. */
611 *end = XFASTINT (pos);
612 else
613 /* Find the next field boundary. */
614 {
615 if (!NILP (merge_at_boundary) && EQ (after_field, Qboundary))
616 /* Skip a `boundary' field. */
617 pos = Fnext_single_char_property_change (pos, Qfield, Qnil,
618 end_limit);
619
620 pos = Fnext_single_char_property_change (pos, Qfield, Qnil,
621 end_limit);
622 *end = NILP (pos) ? ZV : XFASTINT (pos);
623 }
624 }
625 }
626
627 \f
628 DEFUN ("delete-field", Fdelete_field, Sdelete_field, 0, 1, 0,
629 doc: /* Delete the field surrounding POS.
630 A field is a region of text with the same `field' property.
631 If POS is nil, the value of point is used for POS.
632
633 An `args-out-of-range' error is signaled if POS is outside the
634 buffer's accessible portion. */)
635 (pos)
636 Lisp_Object pos;
637 {
638 int beg, end;
639 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
640 if (beg != end)
641 del_range (beg, end);
642 return Qnil;
643 }
644
645 DEFUN ("field-string", Ffield_string, Sfield_string, 0, 1, 0,
646 doc: /* Return the contents of the field surrounding POS as a string.
647 A field is a region of text with the same `field' property.
648 If POS is nil, the value of point is used for POS.
649
650 An `args-out-of-range' error is signaled if POS is outside the
651 buffer's accessible portion. */)
652 (pos)
653 Lisp_Object pos;
654 {
655 int beg, end;
656 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
657 return make_buffer_string (beg, end, 1);
658 }
659
660 DEFUN ("field-string-no-properties", Ffield_string_no_properties, Sfield_string_no_properties, 0, 1, 0,
661 doc: /* Return the contents of the field around POS, without text-properties.
662 A field is a region of text with the same `field' property.
663 If POS is nil, the value of point is used for POS.
664
665 An `args-out-of-range' error is signaled if POS is outside the
666 buffer's accessible portion. */)
667 (pos)
668 Lisp_Object pos;
669 {
670 int beg, end;
671 find_field (pos, Qnil, Qnil, &beg, Qnil, &end);
672 return make_buffer_string (beg, end, 0);
673 }
674
675 DEFUN ("field-beginning", Ffield_beginning, Sfield_beginning, 0, 3, 0,
676 doc: /* Return the beginning of the field surrounding POS.
677 A field is a region of text with the same `field' property.
678 If POS is nil, the value of point is used for POS.
679 If ESCAPE-FROM-EDGE is non-nil and POS is at the beginning of its
680 field, then the beginning of the *previous* field is returned.
681 If LIMIT is non-nil, it is a buffer position; if the beginning of the field
682 is before LIMIT, then LIMIT will be returned instead.
683
684 An `args-out-of-range' error is signaled if POS is outside the
685 buffer's accessible portion. */)
686 (pos, escape_from_edge, limit)
687 Lisp_Object pos, escape_from_edge, limit;
688 {
689 int beg;
690 find_field (pos, escape_from_edge, limit, &beg, Qnil, 0);
691 return make_number (beg);
692 }
693
694 DEFUN ("field-end", Ffield_end, Sfield_end, 0, 3, 0,
695 doc: /* Return the end of the field surrounding POS.
696 A field is a region of text with the same `field' property.
697 If POS is nil, the value of point is used for POS.
698 If ESCAPE-FROM-EDGE is non-nil and POS is at the end of its field,
699 then the end of the *following* field is returned.
700 If LIMIT is non-nil, it is a buffer position; if the end of the field
701 is after LIMIT, then LIMIT will be returned instead.
702
703 An `args-out-of-range' error is signaled if POS is outside the
704 buffer's accessible portion. */)
705 (pos, escape_from_edge, limit)
706 Lisp_Object pos, escape_from_edge, limit;
707 {
708 int end;
709 find_field (pos, escape_from_edge, Qnil, 0, limit, &end);
710 return make_number (end);
711 }
712
713 DEFUN ("constrain-to-field", Fconstrain_to_field, Sconstrain_to_field, 2, 5, 0,
714 doc: /* Return the position closest to NEW-POS that is in the same field as OLD-POS.
715
716 A field is a region of text with the same `field' property.
717 If NEW-POS is nil, then the current point is used instead, and set to the
718 constrained position if that is different.
719
720 If OLD-POS is at the boundary of two fields, then the allowable
721 positions for NEW-POS depends on the value of the optional argument
722 ESCAPE-FROM-EDGE: If ESCAPE-FROM-EDGE is nil, then NEW-POS is
723 constrained to the field that has the same `field' char-property
724 as any new characters inserted at OLD-POS, whereas if ESCAPE-FROM-EDGE
725 is non-nil, NEW-POS is constrained to the union of the two adjacent
726 fields. Additionally, if two fields are separated by another field with
727 the special value `boundary', then any point within this special field is
728 also considered to be `on the boundary'.
729
730 If the optional argument ONLY-IN-LINE is non-nil and constraining
731 NEW-POS would move it to a different line, NEW-POS is returned
732 unconstrained. This useful for commands that move by line, like
733 \\[next-line] or \\[beginning-of-line], which should generally respect field boundaries
734 only in the case where they can still move to the right line.
735
736 If the optional argument INHIBIT-CAPTURE-PROPERTY is non-nil, and OLD-POS has
737 a non-nil property of that name, then any field boundaries are ignored.
738
739 Field boundaries are not noticed if `inhibit-field-text-motion' is non-nil. */)
740 (new_pos, old_pos, escape_from_edge, only_in_line, inhibit_capture_property)
741 Lisp_Object new_pos, old_pos;
742 Lisp_Object escape_from_edge, only_in_line, inhibit_capture_property;
743 {
744 /* If non-zero, then the original point, before re-positioning. */
745 int orig_point = 0;
746 int fwd;
747 Lisp_Object prev_old, prev_new;
748
749 if (NILP (new_pos))
750 /* Use the current point, and afterwards, set it. */
751 {
752 orig_point = PT;
753 XSETFASTINT (new_pos, PT);
754 }
755
756 CHECK_NUMBER_COERCE_MARKER (new_pos);
757 CHECK_NUMBER_COERCE_MARKER (old_pos);
758
759 fwd = (XFASTINT (new_pos) > XFASTINT (old_pos));
760
761 prev_old = make_number (XFASTINT (old_pos) - 1);
762 prev_new = make_number (XFASTINT (new_pos) - 1);
763
764 if (NILP (Vinhibit_field_text_motion)
765 && !EQ (new_pos, old_pos)
766 && (!NILP (Fget_char_property (new_pos, Qfield, Qnil))
767 || !NILP (Fget_char_property (old_pos, Qfield, Qnil))
768 /* To recognize field boundaries, we must also look at the
769 previous positions; we could use `get_pos_property'
770 instead, but in itself that would fail inside non-sticky
771 fields (like comint prompts). */
772 || (XFASTINT (new_pos) > BEGV
773 && !NILP (Fget_char_property (prev_new, Qfield, Qnil)))
774 || (XFASTINT (old_pos) > BEGV
775 && !NILP (Fget_char_property (prev_old, Qfield, Qnil))))
776 && (NILP (inhibit_capture_property)
777 /* Field boundaries are again a problem; but now we must
778 decide the case exactly, so we need to call
779 `get_pos_property' as well. */
780 || (NILP (get_pos_property (old_pos, inhibit_capture_property, Qnil))
781 && (XFASTINT (old_pos) <= BEGV
782 || NILP (Fget_char_property (old_pos, inhibit_capture_property, Qnil))
783 || NILP (Fget_char_property (prev_old, inhibit_capture_property, Qnil))))))
784 /* It is possible that NEW_POS is not within the same field as
785 OLD_POS; try to move NEW_POS so that it is. */
786 {
787 int shortage;
788 Lisp_Object field_bound;
789
790 if (fwd)
791 field_bound = Ffield_end (old_pos, escape_from_edge, new_pos);
792 else
793 field_bound = Ffield_beginning (old_pos, escape_from_edge, new_pos);
794
795 if (/* See if ESCAPE_FROM_EDGE caused FIELD_BOUND to jump to the
796 other side of NEW_POS, which would mean that NEW_POS is
797 already acceptable, and it's not necessary to constrain it
798 to FIELD_BOUND. */
799 ((XFASTINT (field_bound) < XFASTINT (new_pos)) ? fwd : !fwd)
800 /* NEW_POS should be constrained, but only if either
801 ONLY_IN_LINE is nil (in which case any constraint is OK),
802 or NEW_POS and FIELD_BOUND are on the same line (in which
803 case the constraint is OK even if ONLY_IN_LINE is non-nil). */
804 && (NILP (only_in_line)
805 /* This is the ONLY_IN_LINE case, check that NEW_POS and
806 FIELD_BOUND are on the same line by seeing whether
807 there's an intervening newline or not. */
808 || (scan_buffer ('\n',
809 XFASTINT (new_pos), XFASTINT (field_bound),
810 fwd ? -1 : 1, &shortage, 1),
811 shortage != 0)))
812 /* Constrain NEW_POS to FIELD_BOUND. */
813 new_pos = field_bound;
814
815 if (orig_point && XFASTINT (new_pos) != orig_point)
816 /* The NEW_POS argument was originally nil, so automatically set PT. */
817 SET_PT (XFASTINT (new_pos));
818 }
819
820 return new_pos;
821 }
822
823 \f
824 DEFUN ("line-beginning-position",
825 Fline_beginning_position, Sline_beginning_position, 0, 1, 0,
826 doc: /* Return the character position of the first character on the current line.
827 With argument N not nil or 1, move forward N - 1 lines first.
828 If scan reaches end of buffer, return that position.
829
830 This function constrains the returned position to the current field
831 unless that would be on a different line than the original,
832 unconstrained result. If N is nil or 1, and a front-sticky field
833 starts at point, the scan stops as soon as it starts. To ignore field
834 boundaries bind `inhibit-field-text-motion' to t.
835
836 This function does not move point. */)
837 (n)
838 Lisp_Object n;
839 {
840 int orig, orig_byte, end;
841 int count = SPECPDL_INDEX ();
842 specbind (Qinhibit_point_motion_hooks, Qt);
843
844 if (NILP (n))
845 XSETFASTINT (n, 1);
846 else
847 CHECK_NUMBER (n);
848
849 orig = PT;
850 orig_byte = PT_BYTE;
851 Fforward_line (make_number (XINT (n) - 1));
852 end = PT;
853
854 SET_PT_BOTH (orig, orig_byte);
855
856 unbind_to (count, Qnil);
857
858 /* Return END constrained to the current input field. */
859 return Fconstrain_to_field (make_number (end), make_number (orig),
860 XINT (n) != 1 ? Qt : Qnil,
861 Qt, Qnil);
862 }
863
864 DEFUN ("line-end-position", Fline_end_position, Sline_end_position, 0, 1, 0,
865 doc: /* Return the character position of the last character on the current line.
866 With argument N not nil or 1, move forward N - 1 lines first.
867 If scan reaches end of buffer, return that position.
868
869 This function constrains the returned position to the current field
870 unless that would be on a different line than the original,
871 unconstrained result. If N is nil or 1, and a rear-sticky field ends
872 at point, the scan stops as soon as it starts. To ignore field
873 boundaries bind `inhibit-field-text-motion' to t.
874
875 This function does not move point. */)
876 (n)
877 Lisp_Object n;
878 {
879 int end_pos;
880 int orig = PT;
881
882 if (NILP (n))
883 XSETFASTINT (n, 1);
884 else
885 CHECK_NUMBER (n);
886
887 end_pos = find_before_next_newline (orig, 0, XINT (n) - (XINT (n) <= 0));
888
889 /* Return END_POS constrained to the current input field. */
890 return Fconstrain_to_field (make_number (end_pos), make_number (orig),
891 Qnil, Qt, Qnil);
892 }
893
894 \f
895 Lisp_Object
896 save_excursion_save ()
897 {
898 int visible = (XBUFFER (XWINDOW (selected_window)->buffer)
899 == current_buffer);
900
901 return Fcons (Fpoint_marker (),
902 Fcons (Fcopy_marker (current_buffer->mark, Qnil),
903 Fcons (visible ? Qt : Qnil,
904 Fcons (current_buffer->mark_active,
905 selected_window))));
906 }
907
908 Lisp_Object
909 save_excursion_restore (info)
910 Lisp_Object info;
911 {
912 Lisp_Object tem, tem1, omark, nmark;
913 struct gcpro gcpro1, gcpro2, gcpro3;
914 int visible_p;
915
916 tem = Fmarker_buffer (XCAR (info));
917 /* If buffer being returned to is now deleted, avoid error */
918 /* Otherwise could get error here while unwinding to top level
919 and crash */
920 /* In that case, Fmarker_buffer returns nil now. */
921 if (NILP (tem))
922 return Qnil;
923
924 omark = nmark = Qnil;
925 GCPRO3 (info, omark, nmark);
926
927 Fset_buffer (tem);
928
929 /* Point marker. */
930 tem = XCAR (info);
931 Fgoto_char (tem);
932 unchain_marker (XMARKER (tem));
933
934 /* Mark marker. */
935 info = XCDR (info);
936 tem = XCAR (info);
937 omark = Fmarker_position (current_buffer->mark);
938 Fset_marker (current_buffer->mark, tem, Fcurrent_buffer ());
939 nmark = Fmarker_position (tem);
940 unchain_marker (XMARKER (tem));
941
942 /* visible */
943 info = XCDR (info);
944 visible_p = !NILP (XCAR (info));
945
946 #if 0 /* We used to make the current buffer visible in the selected window
947 if that was true previously. That avoids some anomalies.
948 But it creates others, and it wasn't documented, and it is simpler
949 and cleaner never to alter the window/buffer connections. */
950 tem1 = Fcar (tem);
951 if (!NILP (tem1)
952 && current_buffer != XBUFFER (XWINDOW (selected_window)->buffer))
953 Fswitch_to_buffer (Fcurrent_buffer (), Qnil);
954 #endif /* 0 */
955
956 /* Mark active */
957 info = XCDR (info);
958 tem = XCAR (info);
959 tem1 = current_buffer->mark_active;
960 current_buffer->mark_active = tem;
961
962 if (!NILP (Vrun_hooks))
963 {
964 /* If mark is active now, and either was not active
965 or was at a different place, run the activate hook. */
966 if (! NILP (current_buffer->mark_active))
967 {
968 if (! EQ (omark, nmark))
969 call1 (Vrun_hooks, intern ("activate-mark-hook"));
970 }
971 /* If mark has ceased to be active, run deactivate hook. */
972 else if (! NILP (tem1))
973 call1 (Vrun_hooks, intern ("deactivate-mark-hook"));
974 }
975
976 /* If buffer was visible in a window, and a different window was
977 selected, and the old selected window is still showing this
978 buffer, restore point in that window. */
979 tem = XCDR (info);
980 if (visible_p
981 && !EQ (tem, selected_window)
982 && (tem1 = XWINDOW (tem)->buffer,
983 (/* Window is live... */
984 BUFFERP (tem1)
985 /* ...and it shows the current buffer. */
986 && XBUFFER (tem1) == current_buffer)))
987 Fset_window_point (tem, make_number (PT));
988
989 UNGCPRO;
990 return Qnil;
991 }
992
993 DEFUN ("save-excursion", Fsave_excursion, Ssave_excursion, 0, UNEVALLED, 0,
994 doc: /* Save point, mark, and current buffer; execute BODY; restore those things.
995 Executes BODY just like `progn'.
996 The values of point, mark and the current buffer are restored
997 even in case of abnormal exit (throw or error).
998 The state of activation of the mark is also restored.
999
1000 This construct does not save `deactivate-mark', and therefore
1001 functions that change the buffer will still cause deactivation
1002 of the mark at the end of the command. To prevent that, bind
1003 `deactivate-mark' with `let'.
1004
1005 usage: (save-excursion &rest BODY) */)
1006 (args)
1007 Lisp_Object args;
1008 {
1009 register Lisp_Object val;
1010 int count = SPECPDL_INDEX ();
1011
1012 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1013
1014 val = Fprogn (args);
1015 return unbind_to (count, val);
1016 }
1017
1018 DEFUN ("save-current-buffer", Fsave_current_buffer, Ssave_current_buffer, 0, UNEVALLED, 0,
1019 doc: /* Save the current buffer; execute BODY; restore the current buffer.
1020 Executes BODY just like `progn'.
1021 usage: (save-current-buffer &rest BODY) */)
1022 (args)
1023 Lisp_Object args;
1024 {
1025 Lisp_Object val;
1026 int count = SPECPDL_INDEX ();
1027
1028 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
1029
1030 val = Fprogn (args);
1031 return unbind_to (count, val);
1032 }
1033 \f
1034 DEFUN ("buffer-size", Fbufsize, Sbufsize, 0, 1, 0,
1035 doc: /* Return the number of characters in the current buffer.
1036 If BUFFER, return the number of characters in that buffer instead. */)
1037 (buffer)
1038 Lisp_Object buffer;
1039 {
1040 if (NILP (buffer))
1041 return make_number (Z - BEG);
1042 else
1043 {
1044 CHECK_BUFFER (buffer);
1045 return make_number (BUF_Z (XBUFFER (buffer))
1046 - BUF_BEG (XBUFFER (buffer)));
1047 }
1048 }
1049
1050 DEFUN ("point-min", Fpoint_min, Spoint_min, 0, 0, 0,
1051 doc: /* Return the minimum permissible value of point in the current buffer.
1052 This is 1, unless narrowing (a buffer restriction) is in effect. */)
1053 ()
1054 {
1055 Lisp_Object temp;
1056 XSETFASTINT (temp, BEGV);
1057 return temp;
1058 }
1059
1060 DEFUN ("point-min-marker", Fpoint_min_marker, Spoint_min_marker, 0, 0, 0,
1061 doc: /* Return a marker to the minimum permissible value of point in this buffer.
1062 This is the beginning, unless narrowing (a buffer restriction) is in effect. */)
1063 ()
1064 {
1065 return buildmark (BEGV, BEGV_BYTE);
1066 }
1067
1068 DEFUN ("point-max", Fpoint_max, Spoint_max, 0, 0, 0,
1069 doc: /* Return the maximum permissible value of point in the current buffer.
1070 This is (1+ (buffer-size)), unless narrowing (a buffer restriction)
1071 is in effect, in which case it is less. */)
1072 ()
1073 {
1074 Lisp_Object temp;
1075 XSETFASTINT (temp, ZV);
1076 return temp;
1077 }
1078
1079 DEFUN ("point-max-marker", Fpoint_max_marker, Spoint_max_marker, 0, 0, 0,
1080 doc: /* Return a marker to the maximum permissible value of point in this buffer.
1081 This is (1+ (buffer-size)), unless narrowing (a buffer restriction)
1082 is in effect, in which case it is less. */)
1083 ()
1084 {
1085 return buildmark (ZV, ZV_BYTE);
1086 }
1087
1088 DEFUN ("gap-position", Fgap_position, Sgap_position, 0, 0, 0,
1089 doc: /* Return the position of the gap, in the current buffer.
1090 See also `gap-size'. */)
1091 ()
1092 {
1093 Lisp_Object temp;
1094 XSETFASTINT (temp, GPT);
1095 return temp;
1096 }
1097
1098 DEFUN ("gap-size", Fgap_size, Sgap_size, 0, 0, 0,
1099 doc: /* Return the size of the current buffer's gap.
1100 See also `gap-position'. */)
1101 ()
1102 {
1103 Lisp_Object temp;
1104 XSETFASTINT (temp, GAP_SIZE);
1105 return temp;
1106 }
1107
1108 DEFUN ("position-bytes", Fposition_bytes, Sposition_bytes, 1, 1, 0,
1109 doc: /* Return the byte position for character position POSITION.
1110 If POSITION is out of range, the value is nil. */)
1111 (position)
1112 Lisp_Object position;
1113 {
1114 CHECK_NUMBER_COERCE_MARKER (position);
1115 if (XINT (position) < BEG || XINT (position) > Z)
1116 return Qnil;
1117 return make_number (CHAR_TO_BYTE (XINT (position)));
1118 }
1119
1120 DEFUN ("byte-to-position", Fbyte_to_position, Sbyte_to_position, 1, 1, 0,
1121 doc: /* Return the character position for byte position BYTEPOS.
1122 If BYTEPOS is out of range, the value is nil. */)
1123 (bytepos)
1124 Lisp_Object bytepos;
1125 {
1126 CHECK_NUMBER (bytepos);
1127 if (XINT (bytepos) < BEG_BYTE || XINT (bytepos) > Z_BYTE)
1128 return Qnil;
1129 return make_number (BYTE_TO_CHAR (XINT (bytepos)));
1130 }
1131 \f
1132 DEFUN ("following-char", Ffollowing_char, Sfollowing_char, 0, 0, 0,
1133 doc: /* Return the character following point, as a number.
1134 At the end of the buffer or accessible region, return 0. */)
1135 ()
1136 {
1137 Lisp_Object temp;
1138 if (PT >= ZV)
1139 XSETFASTINT (temp, 0);
1140 else
1141 XSETFASTINT (temp, FETCH_CHAR (PT_BYTE));
1142 return temp;
1143 }
1144
1145 DEFUN ("preceding-char", Fprevious_char, Sprevious_char, 0, 0, 0,
1146 doc: /* Return the character preceding point, as a number.
1147 At the beginning of the buffer or accessible region, return 0. */)
1148 ()
1149 {
1150 Lisp_Object temp;
1151 if (PT <= BEGV)
1152 XSETFASTINT (temp, 0);
1153 else if (!NILP (current_buffer->enable_multibyte_characters))
1154 {
1155 int pos = PT_BYTE;
1156 DEC_POS (pos);
1157 XSETFASTINT (temp, FETCH_CHAR (pos));
1158 }
1159 else
1160 XSETFASTINT (temp, FETCH_BYTE (PT_BYTE - 1));
1161 return temp;
1162 }
1163
1164 DEFUN ("bobp", Fbobp, Sbobp, 0, 0, 0,
1165 doc: /* Return t if point is at the beginning of the buffer.
1166 If the buffer is narrowed, this means the beginning of the narrowed part. */)
1167 ()
1168 {
1169 if (PT == BEGV)
1170 return Qt;
1171 return Qnil;
1172 }
1173
1174 DEFUN ("eobp", Feobp, Seobp, 0, 0, 0,
1175 doc: /* Return t if point is at the end of the buffer.
1176 If the buffer is narrowed, this means the end of the narrowed part. */)
1177 ()
1178 {
1179 if (PT == ZV)
1180 return Qt;
1181 return Qnil;
1182 }
1183
1184 DEFUN ("bolp", Fbolp, Sbolp, 0, 0, 0,
1185 doc: /* Return t if point is at the beginning of a line. */)
1186 ()
1187 {
1188 if (PT == BEGV || FETCH_BYTE (PT_BYTE - 1) == '\n')
1189 return Qt;
1190 return Qnil;
1191 }
1192
1193 DEFUN ("eolp", Feolp, Seolp, 0, 0, 0,
1194 doc: /* Return t if point is at the end of a line.
1195 `End of a line' includes point being at the end of the buffer. */)
1196 ()
1197 {
1198 if (PT == ZV || FETCH_BYTE (PT_BYTE) == '\n')
1199 return Qt;
1200 return Qnil;
1201 }
1202
1203 DEFUN ("char-after", Fchar_after, Schar_after, 0, 1, 0,
1204 doc: /* Return character in current buffer at position POS.
1205 POS is an integer or a marker and defaults to point.
1206 If POS is out of range, the value is nil. */)
1207 (pos)
1208 Lisp_Object pos;
1209 {
1210 register int pos_byte;
1211
1212 if (NILP (pos))
1213 {
1214 pos_byte = PT_BYTE;
1215 XSETFASTINT (pos, PT);
1216 }
1217
1218 if (MARKERP (pos))
1219 {
1220 pos_byte = marker_byte_position (pos);
1221 if (pos_byte < BEGV_BYTE || pos_byte >= ZV_BYTE)
1222 return Qnil;
1223 }
1224 else
1225 {
1226 CHECK_NUMBER_COERCE_MARKER (pos);
1227 if (XINT (pos) < BEGV || XINT (pos) >= ZV)
1228 return Qnil;
1229
1230 pos_byte = CHAR_TO_BYTE (XINT (pos));
1231 }
1232
1233 return make_number (FETCH_CHAR (pos_byte));
1234 }
1235
1236 DEFUN ("char-before", Fchar_before, Schar_before, 0, 1, 0,
1237 doc: /* Return character in current buffer preceding position POS.
1238 POS is an integer or a marker and defaults to point.
1239 If POS is out of range, the value is nil. */)
1240 (pos)
1241 Lisp_Object pos;
1242 {
1243 register Lisp_Object val;
1244 register int pos_byte;
1245
1246 if (NILP (pos))
1247 {
1248 pos_byte = PT_BYTE;
1249 XSETFASTINT (pos, PT);
1250 }
1251
1252 if (MARKERP (pos))
1253 {
1254 pos_byte = marker_byte_position (pos);
1255
1256 if (pos_byte <= BEGV_BYTE || pos_byte > ZV_BYTE)
1257 return Qnil;
1258 }
1259 else
1260 {
1261 CHECK_NUMBER_COERCE_MARKER (pos);
1262
1263 if (XINT (pos) <= BEGV || XINT (pos) > ZV)
1264 return Qnil;
1265
1266 pos_byte = CHAR_TO_BYTE (XINT (pos));
1267 }
1268
1269 if (!NILP (current_buffer->enable_multibyte_characters))
1270 {
1271 DEC_POS (pos_byte);
1272 XSETFASTINT (val, FETCH_CHAR (pos_byte));
1273 }
1274 else
1275 {
1276 pos_byte--;
1277 XSETFASTINT (val, FETCH_BYTE (pos_byte));
1278 }
1279 return val;
1280 }
1281 \f
1282 DEFUN ("user-login-name", Fuser_login_name, Suser_login_name, 0, 1, 0,
1283 doc: /* Return the name under which the user logged in, as a string.
1284 This is based on the effective uid, not the real uid.
1285 Also, if the environment variables LOGNAME or USER are set,
1286 that determines the value of this function.
1287
1288 If optional argument UID is an integer, return the login name of the user
1289 with that uid, or nil if there is no such user. */)
1290 (uid)
1291 Lisp_Object uid;
1292 {
1293 struct passwd *pw;
1294
1295 /* Set up the user name info if we didn't do it before.
1296 (That can happen if Emacs is dumpable
1297 but you decide to run `temacs -l loadup' and not dump. */
1298 if (INTEGERP (Vuser_login_name))
1299 init_editfns ();
1300
1301 if (NILP (uid))
1302 return Vuser_login_name;
1303
1304 CHECK_NUMBER (uid);
1305 pw = (struct passwd *) getpwuid (XINT (uid));
1306 return (pw ? build_string (pw->pw_name) : Qnil);
1307 }
1308
1309 DEFUN ("user-real-login-name", Fuser_real_login_name, Suser_real_login_name,
1310 0, 0, 0,
1311 doc: /* Return the name of the user's real uid, as a string.
1312 This ignores the environment variables LOGNAME and USER, so it differs from
1313 `user-login-name' when running under `su'. */)
1314 ()
1315 {
1316 /* Set up the user name info if we didn't do it before.
1317 (That can happen if Emacs is dumpable
1318 but you decide to run `temacs -l loadup' and not dump. */
1319 if (INTEGERP (Vuser_login_name))
1320 init_editfns ();
1321 return Vuser_real_login_name;
1322 }
1323
1324 DEFUN ("user-uid", Fuser_uid, Suser_uid, 0, 0, 0,
1325 doc: /* Return the effective uid of Emacs.
1326 Value is an integer or float, depending on the value. */)
1327 ()
1328 {
1329 return make_fixnum_or_float (geteuid ());
1330 }
1331
1332 DEFUN ("user-real-uid", Fuser_real_uid, Suser_real_uid, 0, 0, 0,
1333 doc: /* Return the real uid of Emacs.
1334 Value is an integer or float, depending on the value. */)
1335 ()
1336 {
1337 return make_fixnum_or_float (getuid ());
1338 }
1339
1340 DEFUN ("user-full-name", Fuser_full_name, Suser_full_name, 0, 1, 0,
1341 doc: /* Return the full name of the user logged in, as a string.
1342 If the full name corresponding to Emacs's userid is not known,
1343 return "unknown".
1344
1345 If optional argument UID is an integer or float, return the full name
1346 of the user with that uid, or nil if there is no such user.
1347 If UID is a string, return the full name of the user with that login
1348 name, or nil if there is no such user. */)
1349 (uid)
1350 Lisp_Object uid;
1351 {
1352 struct passwd *pw;
1353 register unsigned char *p, *q;
1354 Lisp_Object full;
1355
1356 if (NILP (uid))
1357 return Vuser_full_name;
1358 else if (NUMBERP (uid))
1359 pw = (struct passwd *) getpwuid ((uid_t) XFLOATINT (uid));
1360 else if (STRINGP (uid))
1361 pw = (struct passwd *) getpwnam (SDATA (uid));
1362 else
1363 error ("Invalid UID specification");
1364
1365 if (!pw)
1366 return Qnil;
1367
1368 p = (unsigned char *) USER_FULL_NAME;
1369 /* Chop off everything after the first comma. */
1370 q = (unsigned char *) index (p, ',');
1371 full = make_string (p, q ? q - p : strlen (p));
1372
1373 #ifdef AMPERSAND_FULL_NAME
1374 p = SDATA (full);
1375 q = (unsigned char *) index (p, '&');
1376 /* Substitute the login name for the &, upcasing the first character. */
1377 if (q)
1378 {
1379 register unsigned char *r;
1380 Lisp_Object login;
1381
1382 login = Fuser_login_name (make_number (pw->pw_uid));
1383 r = (unsigned char *) alloca (strlen (p) + SCHARS (login) + 1);
1384 bcopy (p, r, q - p);
1385 r[q - p] = 0;
1386 strcat (r, SDATA (login));
1387 r[q - p] = UPCASE (r[q - p]);
1388 strcat (r, q + 1);
1389 full = build_string (r);
1390 }
1391 #endif /* AMPERSAND_FULL_NAME */
1392
1393 return full;
1394 }
1395
1396 DEFUN ("system-name", Fsystem_name, Ssystem_name, 0, 0, 0,
1397 doc: /* Return the name of the machine you are running on, as a string. */)
1398 ()
1399 {
1400 return Vsystem_name;
1401 }
1402
1403 /* For the benefit of callers who don't want to include lisp.h */
1404
1405 char *
1406 get_system_name ()
1407 {
1408 if (STRINGP (Vsystem_name))
1409 return (char *) SDATA (Vsystem_name);
1410 else
1411 return "";
1412 }
1413
1414 char *
1415 get_operating_system_release()
1416 {
1417 if (STRINGP (Voperating_system_release))
1418 return (char *) SDATA (Voperating_system_release);
1419 else
1420 return "";
1421 }
1422
1423 DEFUN ("emacs-pid", Femacs_pid, Semacs_pid, 0, 0, 0,
1424 doc: /* Return the process ID of Emacs, as an integer. */)
1425 ()
1426 {
1427 return make_number (getpid ());
1428 }
1429
1430 DEFUN ("current-time", Fcurrent_time, Scurrent_time, 0, 0, 0,
1431 doc: /* Return the current time, as the number of seconds since 1970-01-01 00:00:00.
1432 The time is returned as a list of three integers. The first has the
1433 most significant 16 bits of the seconds, while the second has the
1434 least significant 16 bits. The third integer gives the microsecond
1435 count.
1436
1437 The microsecond count is zero on systems that do not provide
1438 resolution finer than a second. */)
1439 ()
1440 {
1441 EMACS_TIME t;
1442 Lisp_Object result[3];
1443
1444 EMACS_GET_TIME (t);
1445 XSETINT (result[0], (EMACS_SECS (t) >> 16) & 0xffff);
1446 XSETINT (result[1], (EMACS_SECS (t) >> 0) & 0xffff);
1447 XSETINT (result[2], EMACS_USECS (t));
1448
1449 return Flist (3, result);
1450 }
1451
1452 DEFUN ("get-internal-run-time", Fget_internal_run_time, Sget_internal_run_time,
1453 0, 0, 0,
1454 doc: /* Return the current run time used by Emacs.
1455 The time is returned as a list of three integers. The first has the
1456 most significant 16 bits of the seconds, while the second has the
1457 least significant 16 bits. The third integer gives the microsecond
1458 count.
1459
1460 On systems that can't determine the run time, get-internal-run-time
1461 does the same thing as current-time. The microsecond count is zero on
1462 systems that do not provide resolution finer than a second. */)
1463 ()
1464 {
1465 #ifdef HAVE_GETRUSAGE
1466 struct rusage usage;
1467 Lisp_Object result[3];
1468 int secs, usecs;
1469
1470 if (getrusage (RUSAGE_SELF, &usage) < 0)
1471 /* This shouldn't happen. What action is appropriate? */
1472 Fsignal (Qerror, Qnil);
1473
1474 /* Sum up user time and system time. */
1475 secs = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec;
1476 usecs = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
1477 if (usecs >= 1000000)
1478 {
1479 usecs -= 1000000;
1480 secs++;
1481 }
1482
1483 XSETINT (result[0], (secs >> 16) & 0xffff);
1484 XSETINT (result[1], (secs >> 0) & 0xffff);
1485 XSETINT (result[2], usecs);
1486
1487 return Flist (3, result);
1488 #else
1489 return Fcurrent_time ();
1490 #endif
1491 }
1492 \f
1493
1494 int
1495 lisp_time_argument (specified_time, result, usec)
1496 Lisp_Object specified_time;
1497 time_t *result;
1498 int *usec;
1499 {
1500 if (NILP (specified_time))
1501 {
1502 if (usec)
1503 {
1504 EMACS_TIME t;
1505
1506 EMACS_GET_TIME (t);
1507 *usec = EMACS_USECS (t);
1508 *result = EMACS_SECS (t);
1509 return 1;
1510 }
1511 else
1512 return time (result) != -1;
1513 }
1514 else
1515 {
1516 Lisp_Object high, low;
1517 high = Fcar (specified_time);
1518 CHECK_NUMBER (high);
1519 low = Fcdr (specified_time);
1520 if (CONSP (low))
1521 {
1522 if (usec)
1523 {
1524 Lisp_Object usec_l = Fcdr (low);
1525 if (CONSP (usec_l))
1526 usec_l = Fcar (usec_l);
1527 if (NILP (usec_l))
1528 *usec = 0;
1529 else
1530 {
1531 CHECK_NUMBER (usec_l);
1532 *usec = XINT (usec_l);
1533 }
1534 }
1535 low = Fcar (low);
1536 }
1537 else if (usec)
1538 *usec = 0;
1539 CHECK_NUMBER (low);
1540 *result = (XINT (high) << 16) + (XINT (low) & 0xffff);
1541 return *result >> 16 == XINT (high);
1542 }
1543 }
1544
1545 DEFUN ("float-time", Ffloat_time, Sfloat_time, 0, 1, 0,
1546 doc: /* Return the current time, as a float number of seconds since the epoch.
1547 If SPECIFIED-TIME is given, it is the time to convert to float
1548 instead of the current time. The argument should have the form
1549 (HIGH LOW . IGNORED). Thus, you can use times obtained from
1550 `current-time' and from `file-attributes'. SPECIFIED-TIME can also
1551 have the form (HIGH . LOW), but this is considered obsolete.
1552
1553 WARNING: Since the result is floating point, it may not be exact.
1554 Do not use this function if precise time stamps are required. */)
1555 (specified_time)
1556 Lisp_Object specified_time;
1557 {
1558 time_t sec;
1559 int usec;
1560
1561 if (! lisp_time_argument (specified_time, &sec, &usec))
1562 error ("Invalid time specification");
1563
1564 return make_float ((sec * 1e6 + usec) / 1e6);
1565 }
1566
1567 /* Write information into buffer S of size MAXSIZE, according to the
1568 FORMAT of length FORMAT_LEN, using time information taken from *TP.
1569 Default to Universal Time if UT is nonzero, local time otherwise.
1570 Return the number of bytes written, not including the terminating
1571 '\0'. If S is NULL, nothing will be written anywhere; so to
1572 determine how many bytes would be written, use NULL for S and
1573 ((size_t) -1) for MAXSIZE.
1574
1575 This function behaves like emacs_strftimeu, except it allows null
1576 bytes in FORMAT. */
1577 static size_t
1578 emacs_memftimeu (s, maxsize, format, format_len, tp, ut)
1579 char *s;
1580 size_t maxsize;
1581 const char *format;
1582 size_t format_len;
1583 const struct tm *tp;
1584 int ut;
1585 {
1586 size_t total = 0;
1587
1588 /* Loop through all the null-terminated strings in the format
1589 argument. Normally there's just one null-terminated string, but
1590 there can be arbitrarily many, concatenated together, if the
1591 format contains '\0' bytes. emacs_strftimeu stops at the first
1592 '\0' byte so we must invoke it separately for each such string. */
1593 for (;;)
1594 {
1595 size_t len;
1596 size_t result;
1597
1598 if (s)
1599 s[0] = '\1';
1600
1601 result = emacs_strftimeu (s, maxsize, format, tp, ut);
1602
1603 if (s)
1604 {
1605 if (result == 0 && s[0] != '\0')
1606 return 0;
1607 s += result + 1;
1608 }
1609
1610 maxsize -= result + 1;
1611 total += result;
1612 len = strlen (format);
1613 if (len == format_len)
1614 return total;
1615 total++;
1616 format += len + 1;
1617 format_len -= len + 1;
1618 }
1619 }
1620
1621 DEFUN ("format-time-string", Fformat_time_string, Sformat_time_string, 1, 3, 0,
1622 doc: /* Use FORMAT-STRING to format the time TIME, or now if omitted.
1623 TIME is specified as (HIGH LOW . IGNORED), as returned by
1624 `current-time' or `file-attributes'. The obsolete form (HIGH . LOW)
1625 is also still accepted.
1626 The third, optional, argument UNIVERSAL, if non-nil, means describe TIME
1627 as Universal Time; nil means describe TIME in the local time zone.
1628 The value is a copy of FORMAT-STRING, but with certain constructs replaced
1629 by text that describes the specified date and time in TIME:
1630
1631 %Y is the year, %y within the century, %C the century.
1632 %G is the year corresponding to the ISO week, %g within the century.
1633 %m is the numeric month.
1634 %b and %h are the locale's abbreviated month name, %B the full name.
1635 %d is the day of the month, zero-padded, %e is blank-padded.
1636 %u is the numeric day of week from 1 (Monday) to 7, %w from 0 (Sunday) to 6.
1637 %a is the locale's abbreviated name of the day of week, %A the full name.
1638 %U is the week number starting on Sunday, %W starting on Monday,
1639 %V according to ISO 8601.
1640 %j is the day of the year.
1641
1642 %H is the hour on a 24-hour clock, %I is on a 12-hour clock, %k is like %H
1643 only blank-padded, %l is like %I blank-padded.
1644 %p is the locale's equivalent of either AM or PM.
1645 %M is the minute.
1646 %S is the second.
1647 %Z is the time zone name, %z is the numeric form.
1648 %s is the number of seconds since 1970-01-01 00:00:00 +0000.
1649
1650 %c is the locale's date and time format.
1651 %x is the locale's "preferred" date format.
1652 %D is like "%m/%d/%y".
1653
1654 %R is like "%H:%M", %T is like "%H:%M:%S", %r is like "%I:%M:%S %p".
1655 %X is the locale's "preferred" time format.
1656
1657 Finally, %n is a newline, %t is a tab, %% is a literal %.
1658
1659 Certain flags and modifiers are available with some format controls.
1660 The flags are `_', `-', `^' and `#'. For certain characters X,
1661 %_X is like %X, but padded with blanks; %-X is like %X,
1662 but without padding. %^X is like %X, but with all textual
1663 characters up-cased; %#X is like %X, but with letter-case of
1664 all textual characters reversed.
1665 %NX (where N stands for an integer) is like %X,
1666 but takes up at least N (a number) positions.
1667 The modifiers are `E' and `O'. For certain characters X,
1668 %EX is a locale's alternative version of %X;
1669 %OX is like %X, but uses the locale's number symbols.
1670
1671 For example, to produce full ISO 8601 format, use "%Y-%m-%dT%T%z". */)
1672 (format_string, time, universal)
1673 Lisp_Object format_string, time, universal;
1674 {
1675 time_t value;
1676 int size;
1677 struct tm *tm;
1678 int ut = ! NILP (universal);
1679
1680 CHECK_STRING (format_string);
1681
1682 if (! lisp_time_argument (time, &value, NULL))
1683 error ("Invalid time specification");
1684
1685 format_string = code_convert_string_norecord (format_string,
1686 Vlocale_coding_system, 1);
1687
1688 /* This is probably enough. */
1689 size = SBYTES (format_string) * 6 + 50;
1690
1691 tm = ut ? gmtime (&value) : localtime (&value);
1692 if (! tm)
1693 error ("Specified time is not representable");
1694
1695 synchronize_system_time_locale ();
1696
1697 while (1)
1698 {
1699 char *buf = (char *) alloca (size + 1);
1700 int result;
1701
1702 buf[0] = '\1';
1703 result = emacs_memftimeu (buf, size, SDATA (format_string),
1704 SBYTES (format_string),
1705 tm, ut);
1706 if ((result > 0 && result < size) || (result == 0 && buf[0] == '\0'))
1707 return code_convert_string_norecord (make_string (buf, result),
1708 Vlocale_coding_system, 0);
1709
1710 /* If buffer was too small, make it bigger and try again. */
1711 result = emacs_memftimeu (NULL, (size_t) -1,
1712 SDATA (format_string),
1713 SBYTES (format_string),
1714 tm, ut);
1715 size = result + 1;
1716 }
1717 }
1718
1719 DEFUN ("decode-time", Fdecode_time, Sdecode_time, 0, 1, 0,
1720 doc: /* Decode a time value as (SEC MINUTE HOUR DAY MONTH YEAR DOW DST ZONE).
1721 The optional SPECIFIED-TIME should be a list of (HIGH LOW . IGNORED),
1722 as from `current-time' and `file-attributes', or `nil' to use the
1723 current time. The obsolete form (HIGH . LOW) is also still accepted.
1724 The list has the following nine members: SEC is an integer between 0
1725 and 60; SEC is 60 for a leap second, which only some operating systems
1726 support. MINUTE is an integer between 0 and 59. HOUR is an integer
1727 between 0 and 23. DAY is an integer between 1 and 31. MONTH is an
1728 integer between 1 and 12. YEAR is an integer indicating the
1729 four-digit year. DOW is the day of week, an integer between 0 and 6,
1730 where 0 is Sunday. DST is t if daylight savings time is effect,
1731 otherwise nil. ZONE is an integer indicating the number of seconds
1732 east of Greenwich. (Note that Common Lisp has different meanings for
1733 DOW and ZONE.) */)
1734 (specified_time)
1735 Lisp_Object specified_time;
1736 {
1737 time_t time_spec;
1738 struct tm save_tm;
1739 struct tm *decoded_time;
1740 Lisp_Object list_args[9];
1741
1742 if (! lisp_time_argument (specified_time, &time_spec, NULL))
1743 error ("Invalid time specification");
1744
1745 decoded_time = localtime (&time_spec);
1746 if (! decoded_time)
1747 error ("Specified time is not representable");
1748 XSETFASTINT (list_args[0], decoded_time->tm_sec);
1749 XSETFASTINT (list_args[1], decoded_time->tm_min);
1750 XSETFASTINT (list_args[2], decoded_time->tm_hour);
1751 XSETFASTINT (list_args[3], decoded_time->tm_mday);
1752 XSETFASTINT (list_args[4], decoded_time->tm_mon + 1);
1753 /* On 64-bit machines an int is narrower than EMACS_INT, thus the
1754 cast below avoids overflow in int arithmetics. */
1755 XSETINT (list_args[5], TM_YEAR_BASE + (EMACS_INT) decoded_time->tm_year);
1756 XSETFASTINT (list_args[6], decoded_time->tm_wday);
1757 list_args[7] = (decoded_time->tm_isdst)? Qt : Qnil;
1758
1759 /* Make a copy, in case gmtime modifies the struct. */
1760 save_tm = *decoded_time;
1761 decoded_time = gmtime (&time_spec);
1762 if (decoded_time == 0)
1763 list_args[8] = Qnil;
1764 else
1765 XSETINT (list_args[8], tm_diff (&save_tm, decoded_time));
1766 return Flist (9, list_args);
1767 }
1768
1769 DEFUN ("encode-time", Fencode_time, Sencode_time, 6, MANY, 0,
1770 doc: /* Convert SECOND, MINUTE, HOUR, DAY, MONTH, YEAR and ZONE to internal time.
1771 This is the reverse operation of `decode-time', which see.
1772 ZONE defaults to the current time zone rule. This can
1773 be a string or t (as from `set-time-zone-rule'), or it can be a list
1774 \(as from `current-time-zone') or an integer (as from `decode-time')
1775 applied without consideration for daylight savings time.
1776
1777 You can pass more than 7 arguments; then the first six arguments
1778 are used as SECOND through YEAR, and the *last* argument is used as ZONE.
1779 The intervening arguments are ignored.
1780 This feature lets (apply 'encode-time (decode-time ...)) work.
1781
1782 Out-of-range values for SECOND, MINUTE, HOUR, DAY, or MONTH are allowed;
1783 for example, a DAY of 0 means the day preceding the given month.
1784 Year numbers less than 100 are treated just like other year numbers.
1785 If you want them to stand for years in this century, you must do that yourself.
1786
1787 Years before 1970 are not guaranteed to work. On some systems,
1788 year values as low as 1901 do work.
1789
1790 usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE) */)
1791 (nargs, args)
1792 int nargs;
1793 register Lisp_Object *args;
1794 {
1795 time_t time;
1796 struct tm tm;
1797 Lisp_Object zone = (nargs > 6 ? args[nargs - 1] : Qnil);
1798
1799 CHECK_NUMBER (args[0]); /* second */
1800 CHECK_NUMBER (args[1]); /* minute */
1801 CHECK_NUMBER (args[2]); /* hour */
1802 CHECK_NUMBER (args[3]); /* day */
1803 CHECK_NUMBER (args[4]); /* month */
1804 CHECK_NUMBER (args[5]); /* year */
1805
1806 tm.tm_sec = XINT (args[0]);
1807 tm.tm_min = XINT (args[1]);
1808 tm.tm_hour = XINT (args[2]);
1809 tm.tm_mday = XINT (args[3]);
1810 tm.tm_mon = XINT (args[4]) - 1;
1811 tm.tm_year = XINT (args[5]) - TM_YEAR_BASE;
1812 tm.tm_isdst = -1;
1813
1814 if (CONSP (zone))
1815 zone = Fcar (zone);
1816 if (NILP (zone))
1817 time = mktime (&tm);
1818 else
1819 {
1820 char tzbuf[100];
1821 char *tzstring;
1822 char **oldenv = environ, **newenv;
1823
1824 if (EQ (zone, Qt))
1825 tzstring = "UTC0";
1826 else if (STRINGP (zone))
1827 tzstring = (char *) SDATA (zone);
1828 else if (INTEGERP (zone))
1829 {
1830 int abszone = abs (XINT (zone));
1831 sprintf (tzbuf, "XXX%s%d:%02d:%02d", "-" + (XINT (zone) < 0),
1832 abszone / (60*60), (abszone/60) % 60, abszone % 60);
1833 tzstring = tzbuf;
1834 }
1835 else
1836 error ("Invalid time zone specification");
1837
1838 /* Set TZ before calling mktime; merely adjusting mktime's returned
1839 value doesn't suffice, since that would mishandle leap seconds. */
1840 set_time_zone_rule (tzstring);
1841
1842 time = mktime (&tm);
1843
1844 /* Restore TZ to previous value. */
1845 newenv = environ;
1846 environ = oldenv;
1847 xfree (newenv);
1848 #ifdef LOCALTIME_CACHE
1849 tzset ();
1850 #endif
1851 }
1852
1853 if (time == (time_t) -1)
1854 error ("Specified time is not representable");
1855
1856 return make_time (time);
1857 }
1858
1859 DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0,
1860 doc: /* Return the current time, as a human-readable string.
1861 Programs can use this function to decode a time,
1862 since the number of columns in each field is fixed
1863 if the year is in the range 1000-9999.
1864 The format is `Sun Sep 16 01:03:52 1973'.
1865 However, see also the functions `decode-time' and `format-time-string'
1866 which provide a much more powerful and general facility.
1867
1868 If SPECIFIED-TIME is given, it is a time to format instead of the
1869 current time. The argument should have the form (HIGH LOW . IGNORED).
1870 Thus, you can use times obtained from `current-time' and from
1871 `file-attributes'. SPECIFIED-TIME can also have the form (HIGH . LOW),
1872 but this is considered obsolete. */)
1873 (specified_time)
1874 Lisp_Object specified_time;
1875 {
1876 time_t value;
1877 struct tm *tm;
1878 register char *tem;
1879
1880 if (! lisp_time_argument (specified_time, &value, NULL))
1881 error ("Invalid time specification");
1882
1883 /* Convert to a string, checking for out-of-range time stamps.
1884 Don't use 'ctime', as that might dump core if VALUE is out of
1885 range. */
1886 tm = localtime (&value);
1887 if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year) && (tem = asctime (tm))))
1888 error ("Specified time is not representable");
1889
1890 /* Remove the trailing newline. */
1891 tem[strlen (tem) - 1] = '\0';
1892
1893 return build_string (tem);
1894 }
1895
1896 /* Yield A - B, measured in seconds.
1897 This function is copied from the GNU C Library. */
1898 static int
1899 tm_diff (a, b)
1900 struct tm *a, *b;
1901 {
1902 /* Compute intervening leap days correctly even if year is negative.
1903 Take care to avoid int overflow in leap day calculations,
1904 but it's OK to assume that A and B are close to each other. */
1905 int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3);
1906 int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3);
1907 int a100 = a4 / 25 - (a4 % 25 < 0);
1908 int b100 = b4 / 25 - (b4 % 25 < 0);
1909 int a400 = a100 >> 2;
1910 int b400 = b100 >> 2;
1911 int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
1912 int years = a->tm_year - b->tm_year;
1913 int days = (365 * years + intervening_leap_days
1914 + (a->tm_yday - b->tm_yday));
1915 return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
1916 + (a->tm_min - b->tm_min))
1917 + (a->tm_sec - b->tm_sec));
1918 }
1919
1920 DEFUN ("current-time-zone", Fcurrent_time_zone, Scurrent_time_zone, 0, 1, 0,
1921 doc: /* Return the offset and name for the local time zone.
1922 This returns a list of the form (OFFSET NAME).
1923 OFFSET is an integer number of seconds ahead of UTC (east of Greenwich).
1924 A negative value means west of Greenwich.
1925 NAME is a string giving the name of the time zone.
1926 If SPECIFIED-TIME is given, the time zone offset is determined from it
1927 instead of using the current time. The argument should have the form
1928 (HIGH LOW . IGNORED). Thus, you can use times obtained from
1929 `current-time' and from `file-attributes'. SPECIFIED-TIME can also
1930 have the form (HIGH . LOW), but this is considered obsolete.
1931
1932 Some operating systems cannot provide all this information to Emacs;
1933 in this case, `current-time-zone' returns a list containing nil for
1934 the data it can't find. */)
1935 (specified_time)
1936 Lisp_Object specified_time;
1937 {
1938 time_t value;
1939 struct tm *t;
1940 struct tm gmt;
1941
1942 if (lisp_time_argument (specified_time, &value, NULL)
1943 && (t = gmtime (&value)) != 0
1944 && (gmt = *t, t = localtime (&value)) != 0)
1945 {
1946 int offset = tm_diff (t, &gmt);
1947 char *s = 0;
1948 char buf[6];
1949 #ifdef HAVE_TM_ZONE
1950 if (t->tm_zone)
1951 s = (char *)t->tm_zone;
1952 #else /* not HAVE_TM_ZONE */
1953 #ifdef HAVE_TZNAME
1954 if (t->tm_isdst == 0 || t->tm_isdst == 1)
1955 s = tzname[t->tm_isdst];
1956 #endif
1957 #endif /* not HAVE_TM_ZONE */
1958
1959 #if defined HAVE_TM_ZONE || defined HAVE_TZNAME
1960 if (s)
1961 {
1962 /* On Japanese w32, we can get a Japanese string as time
1963 zone name. Don't accept that. */
1964 char *p;
1965 for (p = s; *p && (isalnum ((unsigned char)*p) || *p == ' '); ++p)
1966 ;
1967 if (p == s || *p)
1968 s = NULL;
1969 }
1970 #endif
1971
1972 if (!s)
1973 {
1974 /* No local time zone name is available; use "+-NNNN" instead. */
1975 int am = (offset < 0 ? -offset : offset) / 60;
1976 sprintf (buf, "%c%02d%02d", (offset < 0 ? '-' : '+'), am/60, am%60);
1977 s = buf;
1978 }
1979 return Fcons (make_number (offset), Fcons (build_string (s), Qnil));
1980 }
1981 else
1982 return Fmake_list (make_number (2), Qnil);
1983 }
1984
1985 /* This holds the value of `environ' produced by the previous
1986 call to Fset_time_zone_rule, or 0 if Fset_time_zone_rule
1987 has never been called. */
1988 static char **environbuf;
1989
1990 DEFUN ("set-time-zone-rule", Fset_time_zone_rule, Sset_time_zone_rule, 1, 1, 0,
1991 doc: /* Set the local time zone using TZ, a string specifying a time zone rule.
1992 If TZ is nil, use implementation-defined default time zone information.
1993 If TZ is t, use Universal Time. */)
1994 (tz)
1995 Lisp_Object tz;
1996 {
1997 char *tzstring;
1998
1999 if (NILP (tz))
2000 tzstring = 0;
2001 else if (EQ (tz, Qt))
2002 tzstring = "UTC0";
2003 else
2004 {
2005 CHECK_STRING (tz);
2006 tzstring = (char *) SDATA (tz);
2007 }
2008
2009 set_time_zone_rule (tzstring);
2010 if (environbuf)
2011 free (environbuf);
2012 environbuf = environ;
2013
2014 return Qnil;
2015 }
2016
2017 #ifdef LOCALTIME_CACHE
2018
2019 /* These two values are known to load tz files in buggy implementations,
2020 i.e. Solaris 1 executables running under either Solaris 1 or Solaris 2.
2021 Their values shouldn't matter in non-buggy implementations.
2022 We don't use string literals for these strings,
2023 since if a string in the environment is in readonly
2024 storage, it runs afoul of bugs in SVR4 and Solaris 2.3.
2025 See Sun bugs 1113095 and 1114114, ``Timezone routines
2026 improperly modify environment''. */
2027
2028 static char set_time_zone_rule_tz1[] = "TZ=GMT+0";
2029 static char set_time_zone_rule_tz2[] = "TZ=GMT+1";
2030
2031 #endif
2032
2033 /* Set the local time zone rule to TZSTRING.
2034 This allocates memory into `environ', which it is the caller's
2035 responsibility to free. */
2036
2037 void
2038 set_time_zone_rule (tzstring)
2039 char *tzstring;
2040 {
2041 int envptrs;
2042 char **from, **to, **newenv;
2043
2044 /* Make the ENVIRON vector longer with room for TZSTRING. */
2045 for (from = environ; *from; from++)
2046 continue;
2047 envptrs = from - environ + 2;
2048 newenv = to = (char **) xmalloc (envptrs * sizeof (char *)
2049 + (tzstring ? strlen (tzstring) + 4 : 0));
2050
2051 /* Add TZSTRING to the end of environ, as a value for TZ. */
2052 if (tzstring)
2053 {
2054 char *t = (char *) (to + envptrs);
2055 strcpy (t, "TZ=");
2056 strcat (t, tzstring);
2057 *to++ = t;
2058 }
2059
2060 /* Copy the old environ vector elements into NEWENV,
2061 but don't copy the TZ variable.
2062 So we have only one definition of TZ, which came from TZSTRING. */
2063 for (from = environ; *from; from++)
2064 if (strncmp (*from, "TZ=", 3) != 0)
2065 *to++ = *from;
2066 *to = 0;
2067
2068 environ = newenv;
2069
2070 /* If we do have a TZSTRING, NEWENV points to the vector slot where
2071 the TZ variable is stored. If we do not have a TZSTRING,
2072 TO points to the vector slot which has the terminating null. */
2073
2074 #ifdef LOCALTIME_CACHE
2075 {
2076 /* In SunOS 4.1.3_U1 and 4.1.4, if TZ has a value like
2077 "US/Pacific" that loads a tz file, then changes to a value like
2078 "XXX0" that does not load a tz file, and then changes back to
2079 its original value, the last change is (incorrectly) ignored.
2080 Also, if TZ changes twice in succession to values that do
2081 not load a tz file, tzset can dump core (see Sun bug#1225179).
2082 The following code works around these bugs. */
2083
2084 if (tzstring)
2085 {
2086 /* Temporarily set TZ to a value that loads a tz file
2087 and that differs from tzstring. */
2088 char *tz = *newenv;
2089 *newenv = (strcmp (tzstring, set_time_zone_rule_tz1 + 3) == 0
2090 ? set_time_zone_rule_tz2 : set_time_zone_rule_tz1);
2091 tzset ();
2092 *newenv = tz;
2093 }
2094 else
2095 {
2096 /* The implied tzstring is unknown, so temporarily set TZ to
2097 two different values that each load a tz file. */
2098 *to = set_time_zone_rule_tz1;
2099 to[1] = 0;
2100 tzset ();
2101 *to = set_time_zone_rule_tz2;
2102 tzset ();
2103 *to = 0;
2104 }
2105
2106 /* Now TZ has the desired value, and tzset can be invoked safely. */
2107 }
2108
2109 tzset ();
2110 #endif
2111 }
2112 \f
2113 /* Insert NARGS Lisp objects in the array ARGS by calling INSERT_FUNC
2114 (if a type of object is Lisp_Int) or INSERT_FROM_STRING_FUNC (if a
2115 type of object is Lisp_String). INHERIT is passed to
2116 INSERT_FROM_STRING_FUNC as the last argument. */
2117
2118 static void
2119 general_insert_function (insert_func, insert_from_string_func,
2120 inherit, nargs, args)
2121 void (*insert_func) P_ ((const unsigned char *, int));
2122 void (*insert_from_string_func) P_ ((Lisp_Object, int, int, int, int, int));
2123 int inherit, nargs;
2124 register Lisp_Object *args;
2125 {
2126 register int argnum;
2127 register Lisp_Object val;
2128
2129 for (argnum = 0; argnum < nargs; argnum++)
2130 {
2131 val = args[argnum];
2132 retry:
2133 if (INTEGERP (val))
2134 {
2135 unsigned char str[MAX_MULTIBYTE_LENGTH];
2136 int len;
2137
2138 if (!NILP (current_buffer->enable_multibyte_characters))
2139 len = CHAR_STRING (XFASTINT (val), str);
2140 else
2141 {
2142 str[0] = (SINGLE_BYTE_CHAR_P (XINT (val))
2143 ? XINT (val)
2144 : multibyte_char_to_unibyte (XINT (val), Qnil));
2145 len = 1;
2146 }
2147 (*insert_func) (str, len);
2148 }
2149 else if (STRINGP (val))
2150 {
2151 (*insert_from_string_func) (val, 0, 0,
2152 SCHARS (val),
2153 SBYTES (val),
2154 inherit);
2155 }
2156 else
2157 {
2158 val = wrong_type_argument (Qchar_or_string_p, val);
2159 goto retry;
2160 }
2161 }
2162 }
2163
2164 void
2165 insert1 (arg)
2166 Lisp_Object arg;
2167 {
2168 Finsert (1, &arg);
2169 }
2170
2171
2172 /* Callers passing one argument to Finsert need not gcpro the
2173 argument "array", since the only element of the array will
2174 not be used after calling insert or insert_from_string, so
2175 we don't care if it gets trashed. */
2176
2177 DEFUN ("insert", Finsert, Sinsert, 0, MANY, 0,
2178 doc: /* Insert the arguments, either strings or characters, at point.
2179 Point and before-insertion markers move forward to end up
2180 after the inserted text.
2181 Any other markers at the point of insertion remain before the text.
2182
2183 If the current buffer is multibyte, unibyte strings are converted
2184 to multibyte for insertion (see `string-make-multibyte').
2185 If the current buffer is unibyte, multibyte strings are converted
2186 to unibyte for insertion (see `string-make-unibyte').
2187
2188 When operating on binary data, it may be necessary to preserve the
2189 original bytes of a unibyte string when inserting it into a multibyte
2190 buffer; to accomplish this, apply `string-as-multibyte' to the string
2191 and insert the result.
2192
2193 usage: (insert &rest ARGS) */)
2194 (nargs, args)
2195 int nargs;
2196 register Lisp_Object *args;
2197 {
2198 general_insert_function (insert, insert_from_string, 0, nargs, args);
2199 return Qnil;
2200 }
2201
2202 DEFUN ("insert-and-inherit", Finsert_and_inherit, Sinsert_and_inherit,
2203 0, MANY, 0,
2204 doc: /* Insert the arguments at point, inheriting properties from adjoining text.
2205 Point and before-insertion markers move forward to end up
2206 after the inserted text.
2207 Any other markers at the point of insertion remain before the text.
2208
2209 If the current buffer is multibyte, unibyte strings are converted
2210 to multibyte for insertion (see `unibyte-char-to-multibyte').
2211 If the current buffer is unibyte, multibyte strings are converted
2212 to unibyte for insertion.
2213
2214 usage: (insert-and-inherit &rest ARGS) */)
2215 (nargs, args)
2216 int nargs;
2217 register Lisp_Object *args;
2218 {
2219 general_insert_function (insert_and_inherit, insert_from_string, 1,
2220 nargs, args);
2221 return Qnil;
2222 }
2223
2224 DEFUN ("insert-before-markers", Finsert_before_markers, Sinsert_before_markers, 0, MANY, 0,
2225 doc: /* Insert strings or characters at point, relocating markers after the text.
2226 Point and markers move forward to end up after the inserted text.
2227
2228 If the current buffer is multibyte, unibyte strings are converted
2229 to multibyte for insertion (see `unibyte-char-to-multibyte').
2230 If the current buffer is unibyte, multibyte strings are converted
2231 to unibyte for insertion.
2232
2233 usage: (insert-before-markers &rest ARGS) */)
2234 (nargs, args)
2235 int nargs;
2236 register Lisp_Object *args;
2237 {
2238 general_insert_function (insert_before_markers,
2239 insert_from_string_before_markers, 0,
2240 nargs, args);
2241 return Qnil;
2242 }
2243
2244 DEFUN ("insert-before-markers-and-inherit", Finsert_and_inherit_before_markers,
2245 Sinsert_and_inherit_before_markers, 0, MANY, 0,
2246 doc: /* Insert text at point, relocating markers and inheriting properties.
2247 Point and markers move forward to end up after the inserted text.
2248
2249 If the current buffer is multibyte, unibyte strings are converted
2250 to multibyte for insertion (see `unibyte-char-to-multibyte').
2251 If the current buffer is unibyte, multibyte strings are converted
2252 to unibyte for insertion.
2253
2254 usage: (insert-before-markers-and-inherit &rest ARGS) */)
2255 (nargs, args)
2256 int nargs;
2257 register Lisp_Object *args;
2258 {
2259 general_insert_function (insert_before_markers_and_inherit,
2260 insert_from_string_before_markers, 1,
2261 nargs, args);
2262 return Qnil;
2263 }
2264 \f
2265 DEFUN ("insert-char", Finsert_char, Sinsert_char, 2, 3, 0,
2266 doc: /* Insert COUNT (second arg) copies of CHARACTER (first arg).
2267 Both arguments are required.
2268 Point, and before-insertion markers, are relocated as in the function `insert'.
2269 The optional third arg INHERIT, if non-nil, says to inherit text properties
2270 from adjoining text, if those properties are sticky. */)
2271 (character, count, inherit)
2272 Lisp_Object character, count, inherit;
2273 {
2274 register unsigned char *string;
2275 register int strlen;
2276 register int i, n;
2277 int len;
2278 unsigned char str[MAX_MULTIBYTE_LENGTH];
2279
2280 CHECK_NUMBER (character);
2281 CHECK_NUMBER (count);
2282
2283 if (!NILP (current_buffer->enable_multibyte_characters))
2284 len = CHAR_STRING (XFASTINT (character), str);
2285 else
2286 str[0] = XFASTINT (character), len = 1;
2287 n = XINT (count) * len;
2288 if (n <= 0)
2289 return Qnil;
2290 strlen = min (n, 256 * len);
2291 string = (unsigned char *) alloca (strlen);
2292 for (i = 0; i < strlen; i++)
2293 string[i] = str[i % len];
2294 while (n >= strlen)
2295 {
2296 QUIT;
2297 if (!NILP (inherit))
2298 insert_and_inherit (string, strlen);
2299 else
2300 insert (string, strlen);
2301 n -= strlen;
2302 }
2303 if (n > 0)
2304 {
2305 if (!NILP (inherit))
2306 insert_and_inherit (string, n);
2307 else
2308 insert (string, n);
2309 }
2310 return Qnil;
2311 }
2312
2313 \f
2314 /* Making strings from buffer contents. */
2315
2316 /* Return a Lisp_String containing the text of the current buffer from
2317 START to END. If text properties are in use and the current buffer
2318 has properties in the range specified, the resulting string will also
2319 have them, if PROPS is nonzero.
2320
2321 We don't want to use plain old make_string here, because it calls
2322 make_uninit_string, which can cause the buffer arena to be
2323 compacted. make_string has no way of knowing that the data has
2324 been moved, and thus copies the wrong data into the string. This
2325 doesn't effect most of the other users of make_string, so it should
2326 be left as is. But we should use this function when conjuring
2327 buffer substrings. */
2328
2329 Lisp_Object
2330 make_buffer_string (start, end, props)
2331 int start, end;
2332 int props;
2333 {
2334 int start_byte = CHAR_TO_BYTE (start);
2335 int end_byte = CHAR_TO_BYTE (end);
2336
2337 return make_buffer_string_both (start, start_byte, end, end_byte, props);
2338 }
2339
2340 /* Return a Lisp_String containing the text of the current buffer from
2341 START / START_BYTE to END / END_BYTE.
2342
2343 If text properties are in use and the current buffer
2344 has properties in the range specified, the resulting string will also
2345 have them, if PROPS is nonzero.
2346
2347 We don't want to use plain old make_string here, because it calls
2348 make_uninit_string, which can cause the buffer arena to be
2349 compacted. make_string has no way of knowing that the data has
2350 been moved, and thus copies the wrong data into the string. This
2351 doesn't effect most of the other users of make_string, so it should
2352 be left as is. But we should use this function when conjuring
2353 buffer substrings. */
2354
2355 Lisp_Object
2356 make_buffer_string_both (start, start_byte, end, end_byte, props)
2357 int start, start_byte, end, end_byte;
2358 int props;
2359 {
2360 Lisp_Object result, tem, tem1;
2361
2362 if (start < GPT && GPT < end)
2363 move_gap (start);
2364
2365 if (! NILP (current_buffer->enable_multibyte_characters))
2366 result = make_uninit_multibyte_string (end - start, end_byte - start_byte);
2367 else
2368 result = make_uninit_string (end - start);
2369 bcopy (BYTE_POS_ADDR (start_byte), SDATA (result),
2370 end_byte - start_byte);
2371
2372 /* If desired, update and copy the text properties. */
2373 if (props)
2374 {
2375 update_buffer_properties (start, end);
2376
2377 tem = Fnext_property_change (make_number (start), Qnil, make_number (end));
2378 tem1 = Ftext_properties_at (make_number (start), Qnil);
2379
2380 if (XINT (tem) != end || !NILP (tem1))
2381 copy_intervals_to_string (result, current_buffer, start,
2382 end - start);
2383 }
2384
2385 return result;
2386 }
2387
2388 /* Call Vbuffer_access_fontify_functions for the range START ... END
2389 in the current buffer, if necessary. */
2390
2391 static void
2392 update_buffer_properties (start, end)
2393 int start, end;
2394 {
2395 /* If this buffer has some access functions,
2396 call them, specifying the range of the buffer being accessed. */
2397 if (!NILP (Vbuffer_access_fontify_functions))
2398 {
2399 Lisp_Object args[3];
2400 Lisp_Object tem;
2401
2402 args[0] = Qbuffer_access_fontify_functions;
2403 XSETINT (args[1], start);
2404 XSETINT (args[2], end);
2405
2406 /* But don't call them if we can tell that the work
2407 has already been done. */
2408 if (!NILP (Vbuffer_access_fontified_property))
2409 {
2410 tem = Ftext_property_any (args[1], args[2],
2411 Vbuffer_access_fontified_property,
2412 Qnil, Qnil);
2413 if (! NILP (tem))
2414 Frun_hook_with_args (3, args);
2415 }
2416 else
2417 Frun_hook_with_args (3, args);
2418 }
2419 }
2420
2421 DEFUN ("buffer-substring", Fbuffer_substring, Sbuffer_substring, 2, 2, 0,
2422 doc: /* Return the contents of part of the current buffer as a string.
2423 The two arguments START and END are character positions;
2424 they can be in either order.
2425 The string returned is multibyte if the buffer is multibyte.
2426
2427 This function copies the text properties of that part of the buffer
2428 into the result string; if you don't want the text properties,
2429 use `buffer-substring-no-properties' instead. */)
2430 (start, end)
2431 Lisp_Object start, end;
2432 {
2433 register int b, e;
2434
2435 validate_region (&start, &end);
2436 b = XINT (start);
2437 e = XINT (end);
2438
2439 return make_buffer_string (b, e, 1);
2440 }
2441
2442 DEFUN ("buffer-substring-no-properties", Fbuffer_substring_no_properties,
2443 Sbuffer_substring_no_properties, 2, 2, 0,
2444 doc: /* Return the characters of part of the buffer, without the text properties.
2445 The two arguments START and END are character positions;
2446 they can be in either order. */)
2447 (start, end)
2448 Lisp_Object start, end;
2449 {
2450 register int b, e;
2451
2452 validate_region (&start, &end);
2453 b = XINT (start);
2454 e = XINT (end);
2455
2456 return make_buffer_string (b, e, 0);
2457 }
2458
2459 DEFUN ("buffer-string", Fbuffer_string, Sbuffer_string, 0, 0, 0,
2460 doc: /* Return the contents of the current buffer as a string.
2461 If narrowing is in effect, this function returns only the visible part
2462 of the buffer. */)
2463 ()
2464 {
2465 return make_buffer_string (BEGV, ZV, 1);
2466 }
2467
2468 DEFUN ("insert-buffer-substring", Finsert_buffer_substring, Sinsert_buffer_substring,
2469 1, 3, 0,
2470 doc: /* Insert before point a substring of the contents of BUFFER.
2471 BUFFER may be a buffer or a buffer name.
2472 Arguments START and END are character positions specifying the substring.
2473 They default to the values of (point-min) and (point-max) in BUFFER. */)
2474 (buffer, start, end)
2475 Lisp_Object buffer, start, end;
2476 {
2477 register int b, e, temp;
2478 register struct buffer *bp, *obuf;
2479 Lisp_Object buf;
2480
2481 buf = Fget_buffer (buffer);
2482 if (NILP (buf))
2483 nsberror (buffer);
2484 bp = XBUFFER (buf);
2485 if (NILP (bp->name))
2486 error ("Selecting deleted buffer");
2487
2488 if (NILP (start))
2489 b = BUF_BEGV (bp);
2490 else
2491 {
2492 CHECK_NUMBER_COERCE_MARKER (start);
2493 b = XINT (start);
2494 }
2495 if (NILP (end))
2496 e = BUF_ZV (bp);
2497 else
2498 {
2499 CHECK_NUMBER_COERCE_MARKER (end);
2500 e = XINT (end);
2501 }
2502
2503 if (b > e)
2504 temp = b, b = e, e = temp;
2505
2506 if (!(BUF_BEGV (bp) <= b && e <= BUF_ZV (bp)))
2507 args_out_of_range (start, end);
2508
2509 obuf = current_buffer;
2510 set_buffer_internal_1 (bp);
2511 update_buffer_properties (b, e);
2512 set_buffer_internal_1 (obuf);
2513
2514 insert_from_buffer (bp, b, e - b, 0);
2515 return Qnil;
2516 }
2517
2518 DEFUN ("compare-buffer-substrings", Fcompare_buffer_substrings, Scompare_buffer_substrings,
2519 6, 6, 0,
2520 doc: /* Compare two substrings of two buffers; return result as number.
2521 the value is -N if first string is less after N-1 chars,
2522 +N if first string is greater after N-1 chars, or 0 if strings match.
2523 Each substring is represented as three arguments: BUFFER, START and END.
2524 That makes six args in all, three for each substring.
2525
2526 The value of `case-fold-search' in the current buffer
2527 determines whether case is significant or ignored. */)
2528 (buffer1, start1, end1, buffer2, start2, end2)
2529 Lisp_Object buffer1, start1, end1, buffer2, start2, end2;
2530 {
2531 register int begp1, endp1, begp2, endp2, temp;
2532 register struct buffer *bp1, *bp2;
2533 register Lisp_Object trt
2534 = (!NILP (current_buffer->case_fold_search)
2535 ? current_buffer->case_canon_table : Qnil);
2536 int chars = 0;
2537 int i1, i2, i1_byte, i2_byte;
2538
2539 /* Find the first buffer and its substring. */
2540
2541 if (NILP (buffer1))
2542 bp1 = current_buffer;
2543 else
2544 {
2545 Lisp_Object buf1;
2546 buf1 = Fget_buffer (buffer1);
2547 if (NILP (buf1))
2548 nsberror (buffer1);
2549 bp1 = XBUFFER (buf1);
2550 if (NILP (bp1->name))
2551 error ("Selecting deleted buffer");
2552 }
2553
2554 if (NILP (start1))
2555 begp1 = BUF_BEGV (bp1);
2556 else
2557 {
2558 CHECK_NUMBER_COERCE_MARKER (start1);
2559 begp1 = XINT (start1);
2560 }
2561 if (NILP (end1))
2562 endp1 = BUF_ZV (bp1);
2563 else
2564 {
2565 CHECK_NUMBER_COERCE_MARKER (end1);
2566 endp1 = XINT (end1);
2567 }
2568
2569 if (begp1 > endp1)
2570 temp = begp1, begp1 = endp1, endp1 = temp;
2571
2572 if (!(BUF_BEGV (bp1) <= begp1
2573 && begp1 <= endp1
2574 && endp1 <= BUF_ZV (bp1)))
2575 args_out_of_range (start1, end1);
2576
2577 /* Likewise for second substring. */
2578
2579 if (NILP (buffer2))
2580 bp2 = current_buffer;
2581 else
2582 {
2583 Lisp_Object buf2;
2584 buf2 = Fget_buffer (buffer2);
2585 if (NILP (buf2))
2586 nsberror (buffer2);
2587 bp2 = XBUFFER (buf2);
2588 if (NILP (bp2->name))
2589 error ("Selecting deleted buffer");
2590 }
2591
2592 if (NILP (start2))
2593 begp2 = BUF_BEGV (bp2);
2594 else
2595 {
2596 CHECK_NUMBER_COERCE_MARKER (start2);
2597 begp2 = XINT (start2);
2598 }
2599 if (NILP (end2))
2600 endp2 = BUF_ZV (bp2);
2601 else
2602 {
2603 CHECK_NUMBER_COERCE_MARKER (end2);
2604 endp2 = XINT (end2);
2605 }
2606
2607 if (begp2 > endp2)
2608 temp = begp2, begp2 = endp2, endp2 = temp;
2609
2610 if (!(BUF_BEGV (bp2) <= begp2
2611 && begp2 <= endp2
2612 && endp2 <= BUF_ZV (bp2)))
2613 args_out_of_range (start2, end2);
2614
2615 i1 = begp1;
2616 i2 = begp2;
2617 i1_byte = buf_charpos_to_bytepos (bp1, i1);
2618 i2_byte = buf_charpos_to_bytepos (bp2, i2);
2619
2620 while (i1 < endp1 && i2 < endp2)
2621 {
2622 /* When we find a mismatch, we must compare the
2623 characters, not just the bytes. */
2624 int c1, c2;
2625
2626 QUIT;
2627
2628 if (! NILP (bp1->enable_multibyte_characters))
2629 {
2630 c1 = BUF_FETCH_MULTIBYTE_CHAR (bp1, i1_byte);
2631 BUF_INC_POS (bp1, i1_byte);
2632 i1++;
2633 }
2634 else
2635 {
2636 c1 = BUF_FETCH_BYTE (bp1, i1);
2637 c1 = unibyte_char_to_multibyte (c1);
2638 i1++;
2639 }
2640
2641 if (! NILP (bp2->enable_multibyte_characters))
2642 {
2643 c2 = BUF_FETCH_MULTIBYTE_CHAR (bp2, i2_byte);
2644 BUF_INC_POS (bp2, i2_byte);
2645 i2++;
2646 }
2647 else
2648 {
2649 c2 = BUF_FETCH_BYTE (bp2, i2);
2650 c2 = unibyte_char_to_multibyte (c2);
2651 i2++;
2652 }
2653
2654 if (!NILP (trt))
2655 {
2656 c1 = CHAR_TABLE_TRANSLATE (trt, c1);
2657 c2 = CHAR_TABLE_TRANSLATE (trt, c2);
2658 }
2659 if (c1 < c2)
2660 return make_number (- 1 - chars);
2661 if (c1 > c2)
2662 return make_number (chars + 1);
2663
2664 chars++;
2665 }
2666
2667 /* The strings match as far as they go.
2668 If one is shorter, that one is less. */
2669 if (chars < endp1 - begp1)
2670 return make_number (chars + 1);
2671 else if (chars < endp2 - begp2)
2672 return make_number (- chars - 1);
2673
2674 /* Same length too => they are equal. */
2675 return make_number (0);
2676 }
2677 \f
2678 static Lisp_Object
2679 subst_char_in_region_unwind (arg)
2680 Lisp_Object arg;
2681 {
2682 return current_buffer->undo_list = arg;
2683 }
2684
2685 static Lisp_Object
2686 subst_char_in_region_unwind_1 (arg)
2687 Lisp_Object arg;
2688 {
2689 return current_buffer->filename = arg;
2690 }
2691
2692 DEFUN ("subst-char-in-region", Fsubst_char_in_region,
2693 Ssubst_char_in_region, 4, 5, 0,
2694 doc: /* From START to END, replace FROMCHAR with TOCHAR each time it occurs.
2695 If optional arg NOUNDO is non-nil, don't record this change for undo
2696 and don't mark the buffer as really changed.
2697 Both characters must have the same length of multi-byte form. */)
2698 (start, end, fromchar, tochar, noundo)
2699 Lisp_Object start, end, fromchar, tochar, noundo;
2700 {
2701 register int pos, pos_byte, stop, i, len, end_byte;
2702 int changed = 0;
2703 unsigned char fromstr[MAX_MULTIBYTE_LENGTH], tostr[MAX_MULTIBYTE_LENGTH];
2704 unsigned char *p;
2705 int count = SPECPDL_INDEX ();
2706 #define COMBINING_NO 0
2707 #define COMBINING_BEFORE 1
2708 #define COMBINING_AFTER 2
2709 #define COMBINING_BOTH (COMBINING_BEFORE | COMBINING_AFTER)
2710 int maybe_byte_combining = COMBINING_NO;
2711 int last_changed = 0;
2712 int multibyte_p = !NILP (current_buffer->enable_multibyte_characters);
2713
2714 validate_region (&start, &end);
2715 CHECK_NUMBER (fromchar);
2716 CHECK_NUMBER (tochar);
2717
2718 if (multibyte_p)
2719 {
2720 len = CHAR_STRING (XFASTINT (fromchar), fromstr);
2721 if (CHAR_STRING (XFASTINT (tochar), tostr) != len)
2722 error ("Characters in `subst-char-in-region' have different byte-lengths");
2723 if (!ASCII_BYTE_P (*tostr))
2724 {
2725 /* If *TOSTR is in the range 0x80..0x9F and TOCHAR is not a
2726 complete multibyte character, it may be combined with the
2727 after bytes. If it is in the range 0xA0..0xFF, it may be
2728 combined with the before and after bytes. */
2729 if (!CHAR_HEAD_P (*tostr))
2730 maybe_byte_combining = COMBINING_BOTH;
2731 else if (BYTES_BY_CHAR_HEAD (*tostr) > len)
2732 maybe_byte_combining = COMBINING_AFTER;
2733 }
2734 }
2735 else
2736 {
2737 len = 1;
2738 fromstr[0] = XFASTINT (fromchar);
2739 tostr[0] = XFASTINT (tochar);
2740 }
2741
2742 pos = XINT (start);
2743 pos_byte = CHAR_TO_BYTE (pos);
2744 stop = CHAR_TO_BYTE (XINT (end));
2745 end_byte = stop;
2746
2747 /* If we don't want undo, turn off putting stuff on the list.
2748 That's faster than getting rid of things,
2749 and it prevents even the entry for a first change.
2750 Also inhibit locking the file. */
2751 if (!NILP (noundo))
2752 {
2753 record_unwind_protect (subst_char_in_region_unwind,
2754 current_buffer->undo_list);
2755 current_buffer->undo_list = Qt;
2756 /* Don't do file-locking. */
2757 record_unwind_protect (subst_char_in_region_unwind_1,
2758 current_buffer->filename);
2759 current_buffer->filename = Qnil;
2760 }
2761
2762 if (pos_byte < GPT_BYTE)
2763 stop = min (stop, GPT_BYTE);
2764 while (1)
2765 {
2766 int pos_byte_next = pos_byte;
2767
2768 if (pos_byte >= stop)
2769 {
2770 if (pos_byte >= end_byte) break;
2771 stop = end_byte;
2772 }
2773 p = BYTE_POS_ADDR (pos_byte);
2774 if (multibyte_p)
2775 INC_POS (pos_byte_next);
2776 else
2777 ++pos_byte_next;
2778 if (pos_byte_next - pos_byte == len
2779 && p[0] == fromstr[0]
2780 && (len == 1
2781 || (p[1] == fromstr[1]
2782 && (len == 2 || (p[2] == fromstr[2]
2783 && (len == 3 || p[3] == fromstr[3]))))))
2784 {
2785 if (! changed)
2786 {
2787 changed = pos;
2788 modify_region (current_buffer, changed, XINT (end));
2789
2790 if (! NILP (noundo))
2791 {
2792 if (MODIFF - 1 == SAVE_MODIFF)
2793 SAVE_MODIFF++;
2794 if (MODIFF - 1 == current_buffer->auto_save_modified)
2795 current_buffer->auto_save_modified++;
2796 }
2797 }
2798
2799 /* Take care of the case where the new character
2800 combines with neighboring bytes. */
2801 if (maybe_byte_combining
2802 && (maybe_byte_combining == COMBINING_AFTER
2803 ? (pos_byte_next < Z_BYTE
2804 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
2805 : ((pos_byte_next < Z_BYTE
2806 && ! CHAR_HEAD_P (FETCH_BYTE (pos_byte_next)))
2807 || (pos_byte > BEG_BYTE
2808 && ! ASCII_BYTE_P (FETCH_BYTE (pos_byte - 1))))))
2809 {
2810 Lisp_Object tem, string;
2811
2812 struct gcpro gcpro1;
2813
2814 tem = current_buffer->undo_list;
2815 GCPRO1 (tem);
2816
2817 /* Make a multibyte string containing this single character. */
2818 string = make_multibyte_string (tostr, 1, len);
2819 /* replace_range is less efficient, because it moves the gap,
2820 but it handles combining correctly. */
2821 replace_range (pos, pos + 1, string,
2822 0, 0, 1);
2823 pos_byte_next = CHAR_TO_BYTE (pos);
2824 if (pos_byte_next > pos_byte)
2825 /* Before combining happened. We should not increment
2826 POS. So, to cancel the later increment of POS,
2827 decrease it now. */
2828 pos--;
2829 else
2830 INC_POS (pos_byte_next);
2831
2832 if (! NILP (noundo))
2833 current_buffer->undo_list = tem;
2834
2835 UNGCPRO;
2836 }
2837 else
2838 {
2839 if (NILP (noundo))
2840 record_change (pos, 1);
2841 for (i = 0; i < len; i++) *p++ = tostr[i];
2842 }
2843 last_changed = pos + 1;
2844 }
2845 pos_byte = pos_byte_next;
2846 pos++;
2847 }
2848
2849 if (changed)
2850 {
2851 signal_after_change (changed,
2852 last_changed - changed, last_changed - changed);
2853 update_compositions (changed, last_changed, CHECK_ALL);
2854 }
2855
2856 unbind_to (count, Qnil);
2857 return Qnil;
2858 }
2859
2860 DEFUN ("translate-region-internal", Ftranslate_region_internal,
2861 Stranslate_region_internal, 3, 3, 0,
2862 doc: /* Internal use only.
2863 From START to END, translate characters according to TABLE.
2864 TABLE is a string; the Nth character in it is the mapping
2865 for the character with code N.
2866 It returns the number of characters changed. */)
2867 (start, end, table)
2868 Lisp_Object start;
2869 Lisp_Object end;
2870 register Lisp_Object table;
2871 {
2872 register unsigned char *tt; /* Trans table. */
2873 register int nc; /* New character. */
2874 int cnt; /* Number of changes made. */
2875 int size; /* Size of translate table. */
2876 int pos, pos_byte, end_pos;
2877 int multibyte = !NILP (current_buffer->enable_multibyte_characters);
2878 int string_multibyte;
2879
2880 validate_region (&start, &end);
2881 if (CHAR_TABLE_P (table))
2882 {
2883 size = MAX_CHAR;
2884 tt = NULL;
2885 }
2886 else
2887 {
2888 CHECK_STRING (table);
2889
2890 if (! multibyte && (SCHARS (table) < SBYTES (table)))
2891 table = string_make_unibyte (table);
2892 string_multibyte = SCHARS (table) < SBYTES (table);
2893 size = SCHARS (table);
2894 tt = SDATA (table);
2895 }
2896
2897 pos = XINT (start);
2898 pos_byte = CHAR_TO_BYTE (pos);
2899 end_pos = XINT (end);
2900 modify_region (current_buffer, pos, XINT (end));
2901
2902 cnt = 0;
2903 for (; pos < end_pos; )
2904 {
2905 register unsigned char *p = BYTE_POS_ADDR (pos_byte);
2906 unsigned char *str, buf[MAX_MULTIBYTE_LENGTH];
2907 int len, str_len;
2908 int oc;
2909
2910 if (multibyte)
2911 oc = STRING_CHAR_AND_LENGTH (p, MAX_MULTIBYTE_LENGTH, len);
2912 else
2913 oc = *p, len = 1;
2914 if (oc < size)
2915 {
2916 if (tt)
2917 {
2918 /* Reload as signal_after_change in last iteration may GC. */
2919 tt = SDATA (table);
2920 if (string_multibyte)
2921 {
2922 str = tt + string_char_to_byte (table, oc);
2923 nc = STRING_CHAR_AND_LENGTH (str, MAX_MULTIBYTE_LENGTH,
2924 str_len);
2925 }
2926 else
2927 {
2928 nc = tt[oc];
2929 if (! ASCII_BYTE_P (nc) && multibyte)
2930 {
2931 str_len = CHAR_STRING (nc, buf);
2932 str = buf;
2933 }
2934 else
2935 {
2936 str_len = 1;
2937 str = tt + oc;
2938 }
2939 }
2940 }
2941 else
2942 {
2943 Lisp_Object val;
2944 int c;
2945
2946 nc = oc;
2947 val = CHAR_TABLE_REF (table, oc);
2948 if (INTEGERP (val)
2949 && (c = XINT (val), CHAR_VALID_P (c, 0)))
2950 {
2951 nc = c;
2952 str_len = CHAR_STRING (nc, buf);
2953 str = buf;
2954 }
2955 }
2956
2957 if (nc != oc)
2958 {
2959 if (len != str_len)
2960 {
2961 Lisp_Object string;
2962
2963 /* This is less efficient, because it moves the gap,
2964 but it should multibyte characters correctly. */
2965 string = make_multibyte_string (str, 1, str_len);
2966 replace_range (pos, pos + 1, string, 1, 0, 1);
2967 len = str_len;
2968 }
2969 else
2970 {
2971 record_change (pos, 1);
2972 while (str_len-- > 0)
2973 *p++ = *str++;
2974 signal_after_change (pos, 1, 1);
2975 update_compositions (pos, pos + 1, CHECK_BORDER);
2976 }
2977 ++cnt;
2978 }
2979 }
2980 pos_byte += len;
2981 pos++;
2982 }
2983
2984 return make_number (cnt);
2985 }
2986
2987 DEFUN ("delete-region", Fdelete_region, Sdelete_region, 2, 2, "r",
2988 doc: /* Delete the text between point and mark.
2989
2990 When called from a program, expects two arguments,
2991 positions (integers or markers) specifying the stretch to be deleted. */)
2992 (start, end)
2993 Lisp_Object start, end;
2994 {
2995 validate_region (&start, &end);
2996 del_range (XINT (start), XINT (end));
2997 return Qnil;
2998 }
2999
3000 DEFUN ("delete-and-extract-region", Fdelete_and_extract_region,
3001 Sdelete_and_extract_region, 2, 2, 0,
3002 doc: /* Delete the text between START and END and return it. */)
3003 (start, end)
3004 Lisp_Object start, end;
3005 {
3006 validate_region (&start, &end);
3007 if (XINT (start) == XINT (end))
3008 return build_string ("");
3009 return del_range_1 (XINT (start), XINT (end), 1, 1);
3010 }
3011 \f
3012 DEFUN ("widen", Fwiden, Swiden, 0, 0, "",
3013 doc: /* Remove restrictions (narrowing) from current buffer.
3014 This allows the buffer's full text to be seen and edited. */)
3015 ()
3016 {
3017 if (BEG != BEGV || Z != ZV)
3018 current_buffer->clip_changed = 1;
3019 BEGV = BEG;
3020 BEGV_BYTE = BEG_BYTE;
3021 SET_BUF_ZV_BOTH (current_buffer, Z, Z_BYTE);
3022 /* Changing the buffer bounds invalidates any recorded current column. */
3023 invalidate_current_column ();
3024 return Qnil;
3025 }
3026
3027 DEFUN ("narrow-to-region", Fnarrow_to_region, Snarrow_to_region, 2, 2, "r",
3028 doc: /* Restrict editing in this buffer to the current region.
3029 The rest of the text becomes temporarily invisible and untouchable
3030 but is not deleted; if you save the buffer in a file, the invisible
3031 text is included in the file. \\[widen] makes all visible again.
3032 See also `save-restriction'.
3033
3034 When calling from a program, pass two arguments; positions (integers
3035 or markers) bounding the text that should remain visible. */)
3036 (start, end)
3037 register Lisp_Object start, end;
3038 {
3039 CHECK_NUMBER_COERCE_MARKER (start);
3040 CHECK_NUMBER_COERCE_MARKER (end);
3041
3042 if (XINT (start) > XINT (end))
3043 {
3044 Lisp_Object tem;
3045 tem = start; start = end; end = tem;
3046 }
3047
3048 if (!(BEG <= XINT (start) && XINT (start) <= XINT (end) && XINT (end) <= Z))
3049 args_out_of_range (start, end);
3050
3051 if (BEGV != XFASTINT (start) || ZV != XFASTINT (end))
3052 current_buffer->clip_changed = 1;
3053
3054 SET_BUF_BEGV (current_buffer, XFASTINT (start));
3055 SET_BUF_ZV (current_buffer, XFASTINT (end));
3056 if (PT < XFASTINT (start))
3057 SET_PT (XFASTINT (start));
3058 if (PT > XFASTINT (end))
3059 SET_PT (XFASTINT (end));
3060 /* Changing the buffer bounds invalidates any recorded current column. */
3061 invalidate_current_column ();
3062 return Qnil;
3063 }
3064
3065 Lisp_Object
3066 save_restriction_save ()
3067 {
3068 if (BEGV == BEG && ZV == Z)
3069 /* The common case that the buffer isn't narrowed.
3070 We return just the buffer object, which save_restriction_restore
3071 recognizes as meaning `no restriction'. */
3072 return Fcurrent_buffer ();
3073 else
3074 /* We have to save a restriction, so return a pair of markers, one
3075 for the beginning and one for the end. */
3076 {
3077 Lisp_Object beg, end;
3078
3079 beg = buildmark (BEGV, BEGV_BYTE);
3080 end = buildmark (ZV, ZV_BYTE);
3081
3082 /* END must move forward if text is inserted at its exact location. */
3083 XMARKER(end)->insertion_type = 1;
3084
3085 return Fcons (beg, end);
3086 }
3087 }
3088
3089 Lisp_Object
3090 save_restriction_restore (data)
3091 Lisp_Object data;
3092 {
3093 if (CONSP (data))
3094 /* A pair of marks bounding a saved restriction. */
3095 {
3096 struct Lisp_Marker *beg = XMARKER (XCAR (data));
3097 struct Lisp_Marker *end = XMARKER (XCDR (data));
3098 struct buffer *buf = beg->buffer; /* END should have the same buffer. */
3099
3100 if (buf /* Verify marker still points to a buffer. */
3101 && (beg->charpos != BUF_BEGV (buf) || end->charpos != BUF_ZV (buf)))
3102 /* The restriction has changed from the saved one, so restore
3103 the saved restriction. */
3104 {
3105 int pt = BUF_PT (buf);
3106
3107 SET_BUF_BEGV_BOTH (buf, beg->charpos, beg->bytepos);
3108 SET_BUF_ZV_BOTH (buf, end->charpos, end->bytepos);
3109
3110 if (pt < beg->charpos || pt > end->charpos)
3111 /* The point is outside the new visible range, move it inside. */
3112 SET_BUF_PT_BOTH (buf,
3113 clip_to_bounds (beg->charpos, pt, end->charpos),
3114 clip_to_bounds (beg->bytepos, BUF_PT_BYTE (buf),
3115 end->bytepos));
3116
3117 buf->clip_changed = 1; /* Remember that the narrowing changed. */
3118 }
3119 }
3120 else
3121 /* A buffer, which means that there was no old restriction. */
3122 {
3123 struct buffer *buf = XBUFFER (data);
3124
3125 if (buf /* Verify marker still points to a buffer. */
3126 && (BUF_BEGV (buf) != BUF_BEG (buf) || BUF_ZV (buf) != BUF_Z (buf)))
3127 /* The buffer has been narrowed, get rid of the narrowing. */
3128 {
3129 SET_BUF_BEGV_BOTH (buf, BUF_BEG (buf), BUF_BEG_BYTE (buf));
3130 SET_BUF_ZV_BOTH (buf, BUF_Z (buf), BUF_Z_BYTE (buf));
3131
3132 buf->clip_changed = 1; /* Remember that the narrowing changed. */
3133 }
3134 }
3135
3136 return Qnil;
3137 }
3138
3139 DEFUN ("save-restriction", Fsave_restriction, Ssave_restriction, 0, UNEVALLED, 0,
3140 doc: /* Execute BODY, saving and restoring current buffer's restrictions.
3141 The buffer's restrictions make parts of the beginning and end invisible.
3142 (They are set up with `narrow-to-region' and eliminated with `widen'.)
3143 This special form, `save-restriction', saves the current buffer's restrictions
3144 when it is entered, and restores them when it is exited.
3145 So any `narrow-to-region' within BODY lasts only until the end of the form.
3146 The old restrictions settings are restored
3147 even in case of abnormal exit (throw or error).
3148
3149 The value returned is the value of the last form in BODY.
3150
3151 Note: if you are using both `save-excursion' and `save-restriction',
3152 use `save-excursion' outermost:
3153 (save-excursion (save-restriction ...))
3154
3155 usage: (save-restriction &rest BODY) */)
3156 (body)
3157 Lisp_Object body;
3158 {
3159 register Lisp_Object val;
3160 int count = SPECPDL_INDEX ();
3161
3162 record_unwind_protect (save_restriction_restore, save_restriction_save ());
3163 val = Fprogn (body);
3164 return unbind_to (count, val);
3165 }
3166 \f
3167 /* Buffer for the most recent text displayed by Fmessage_box. */
3168 static char *message_text;
3169
3170 /* Allocated length of that buffer. */
3171 static int message_length;
3172
3173 DEFUN ("message", Fmessage, Smessage, 1, MANY, 0,
3174 doc: /* Print a one-line message at the bottom of the screen.
3175 The message also goes into the `*Messages*' buffer.
3176 \(In keyboard macros, that's all it does.)
3177
3178 The first argument is a format control string, and the rest are data
3179 to be formatted under control of the string. See `format' for details.
3180
3181 If the first argument is nil or the empty string, the function clears
3182 any existing message; this lets the minibuffer contents show. See
3183 also `current-message'.
3184
3185 usage: (message FORMAT-STRING &rest ARGS) */)
3186 (nargs, args)
3187 int nargs;
3188 Lisp_Object *args;
3189 {
3190 if (NILP (args[0])
3191 || (STRINGP (args[0])
3192 && SBYTES (args[0]) == 0))
3193 {
3194 message (0);
3195 return args[0];
3196 }
3197 else
3198 {
3199 register Lisp_Object val;
3200 val = Fformat (nargs, args);
3201 message3 (val, SBYTES (val), STRING_MULTIBYTE (val));
3202 return val;
3203 }
3204 }
3205
3206 DEFUN ("message-box", Fmessage_box, Smessage_box, 1, MANY, 0,
3207 doc: /* Display a message, in a dialog box if possible.
3208 If a dialog box is not available, use the echo area.
3209 The first argument is a format control string, and the rest are data
3210 to be formatted under control of the string. See `format' for details.
3211
3212 If the first argument is nil or the empty string, clear any existing
3213 message; let the minibuffer contents show.
3214
3215 usage: (message-box FORMAT-STRING &rest ARGS) */)
3216 (nargs, args)
3217 int nargs;
3218 Lisp_Object *args;
3219 {
3220 if (NILP (args[0]))
3221 {
3222 message (0);
3223 return Qnil;
3224 }
3225 else
3226 {
3227 register Lisp_Object val;
3228 val = Fformat (nargs, args);
3229 #ifdef HAVE_MENUS
3230 /* The MS-DOS frames support popup menus even though they are
3231 not FRAME_WINDOW_P. */
3232 if (FRAME_WINDOW_P (XFRAME (selected_frame))
3233 || FRAME_MSDOS_P (XFRAME (selected_frame)))
3234 {
3235 Lisp_Object pane, menu, obj;
3236 struct gcpro gcpro1;
3237 pane = Fcons (Fcons (build_string ("OK"), Qt), Qnil);
3238 GCPRO1 (pane);
3239 menu = Fcons (val, pane);
3240 obj = Fx_popup_dialog (Qt, menu, Qt);
3241 UNGCPRO;
3242 return val;
3243 }
3244 #endif /* HAVE_MENUS */
3245 /* Copy the data so that it won't move when we GC. */
3246 if (! message_text)
3247 {
3248 message_text = (char *)xmalloc (80);
3249 message_length = 80;
3250 }
3251 if (SBYTES (val) > message_length)
3252 {
3253 message_length = SBYTES (val);
3254 message_text = (char *)xrealloc (message_text, message_length);
3255 }
3256 bcopy (SDATA (val), message_text, SBYTES (val));
3257 message2 (message_text, SBYTES (val),
3258 STRING_MULTIBYTE (val));
3259 return val;
3260 }
3261 }
3262 #ifdef HAVE_MENUS
3263 extern Lisp_Object last_nonmenu_event;
3264 #endif
3265
3266 DEFUN ("message-or-box", Fmessage_or_box, Smessage_or_box, 1, MANY, 0,
3267 doc: /* Display a message in a dialog box or in the echo area.
3268 If this command was invoked with the mouse, use a dialog box if
3269 `use-dialog-box' is non-nil.
3270 Otherwise, use the echo area.
3271 The first argument is a format control string, and the rest are data
3272 to be formatted under control of the string. See `format' for details.
3273
3274 If the first argument is nil or the empty string, clear any existing
3275 message; let the minibuffer contents show.
3276
3277 usage: (message-or-box FORMAT-STRING &rest ARGS) */)
3278 (nargs, args)
3279 int nargs;
3280 Lisp_Object *args;
3281 {
3282 #ifdef HAVE_MENUS
3283 if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event))
3284 && use_dialog_box)
3285 return Fmessage_box (nargs, args);
3286 #endif
3287 return Fmessage (nargs, args);
3288 }
3289
3290 DEFUN ("current-message", Fcurrent_message, Scurrent_message, 0, 0, 0,
3291 doc: /* Return the string currently displayed in the echo area, or nil if none. */)
3292 ()
3293 {
3294 return current_message ();
3295 }
3296
3297
3298 DEFUN ("propertize", Fpropertize, Spropertize, 1, MANY, 0,
3299 doc: /* Return a copy of STRING with text properties added.
3300 First argument is the string to copy.
3301 Remaining arguments form a sequence of PROPERTY VALUE pairs for text
3302 properties to add to the result.
3303 usage: (propertize STRING &rest PROPERTIES) */)
3304 (nargs, args)
3305 int nargs;
3306 Lisp_Object *args;
3307 {
3308 Lisp_Object properties, string;
3309 struct gcpro gcpro1, gcpro2;
3310 int i;
3311
3312 /* Number of args must be odd. */
3313 if ((nargs & 1) == 0 || nargs < 1)
3314 error ("Wrong number of arguments");
3315
3316 properties = string = Qnil;
3317 GCPRO2 (properties, string);
3318
3319 /* First argument must be a string. */
3320 CHECK_STRING (args[0]);
3321 string = Fcopy_sequence (args[0]);
3322
3323 for (i = 1; i < nargs; i += 2)
3324 properties = Fcons (args[i], Fcons (args[i + 1], properties));
3325
3326 Fadd_text_properties (make_number (0),
3327 make_number (SCHARS (string)),
3328 properties, string);
3329 RETURN_UNGCPRO (string);
3330 }
3331
3332
3333 /* Number of bytes that STRING will occupy when put into the result.
3334 MULTIBYTE is nonzero if the result should be multibyte. */
3335
3336 #define CONVERTED_BYTE_SIZE(MULTIBYTE, STRING) \
3337 (((MULTIBYTE) && ! STRING_MULTIBYTE (STRING)) \
3338 ? count_size_as_multibyte (SDATA (STRING), SBYTES (STRING)) \
3339 : SBYTES (STRING))
3340
3341 DEFUN ("format", Fformat, Sformat, 1, MANY, 0,
3342 doc: /* Format a string out of a format-string and arguments.
3343 The first argument is a format control string.
3344 The other arguments are substituted into it to make the result, a string.
3345 It may contain %-sequences meaning to substitute the next argument.
3346 %s means print a string argument. Actually, prints any object, with `princ'.
3347 %d means print as number in decimal (%o octal, %x hex).
3348 %X is like %x, but uses upper case.
3349 %e means print a number in exponential notation.
3350 %f means print a number in decimal-point notation.
3351 %g means print a number in exponential notation
3352 or decimal-point notation, whichever uses fewer characters.
3353 %c means print a number as a single character.
3354 %S means print any object as an s-expression (using `prin1').
3355 The argument used for %d, %o, %x, %e, %f, %g or %c must be a number.
3356 Use %% to put a single % into the output.
3357
3358 The basic structure of a %-sequence is
3359 % <flags> <width> <precision> character
3360 where flags is [- #0]+, width is [0-9]+, and precision is .[0-9]+
3361
3362 usage: (format STRING &rest OBJECTS) */)
3363 (nargs, args)
3364 int nargs;
3365 register Lisp_Object *args;
3366 {
3367 register int n; /* The number of the next arg to substitute */
3368 register int total; /* An estimate of the final length */
3369 char *buf, *p;
3370 register unsigned char *format, *end, *format_start;
3371 int nchars;
3372 /* Nonzero if the output should be a multibyte string,
3373 which is true if any of the inputs is one. */
3374 int multibyte = 0;
3375 /* When we make a multibyte string, we must pay attention to the
3376 byte combining problem, i.e., a byte may be combined with a
3377 multibyte charcter of the previous string. This flag tells if we
3378 must consider such a situation or not. */
3379 int maybe_combine_byte;
3380 unsigned char *this_format;
3381 /* Precision for each spec, or -1, a flag value meaning no precision
3382 was given in that spec. Element 0, corresonding to the format
3383 string itself, will not be used. Element NARGS, corresponding to
3384 no argument, *will* be assigned to in the case that a `%' and `.'
3385 occur after the final format specifier. */
3386 int *precision = (int *) (alloca((nargs + 1) * sizeof (int)));
3387 int longest_format;
3388 Lisp_Object val;
3389 int arg_intervals = 0;
3390 USE_SAFE_ALLOCA;
3391
3392 /* discarded[I] is 1 if byte I of the format
3393 string was not copied into the output.
3394 It is 2 if byte I was not the first byte of its character. */
3395 char *discarded = 0;
3396
3397 /* Each element records, for one argument,
3398 the start and end bytepos in the output string,
3399 and whether the argument is a string with intervals.
3400 info[0] is unused. Unused elements have -1 for start. */
3401 struct info
3402 {
3403 int start, end, intervals;
3404 } *info = 0;
3405
3406 /* It should not be necessary to GCPRO ARGS, because
3407 the caller in the interpreter should take care of that. */
3408
3409 /* Try to determine whether the result should be multibyte.
3410 This is not always right; sometimes the result needs to be multibyte
3411 because of an object that we will pass through prin1,
3412 and in that case, we won't know it here. */
3413 for (n = 0; n < nargs; n++)
3414 {
3415 if (STRINGP (args[n]) && STRING_MULTIBYTE (args[n]))
3416 multibyte = 1;
3417 /* Piggyback on this loop to initialize precision[N]. */
3418 precision[n] = -1;
3419 }
3420 precision[nargs] = -1;
3421
3422 CHECK_STRING (args[0]);
3423 /* We may have to change "%S" to "%s". */
3424 args[0] = Fcopy_sequence (args[0]);
3425
3426 /* GC should never happen here, so abort if it does. */
3427 abort_on_gc++;
3428
3429 /* If we start out planning a unibyte result,
3430 then discover it has to be multibyte, we jump back to retry.
3431 That can only happen from the first large while loop below. */
3432 retry:
3433
3434 format = SDATA (args[0]);
3435 format_start = format;
3436 end = format + SBYTES (args[0]);
3437 longest_format = 0;
3438
3439 /* Make room in result for all the non-%-codes in the control string. */
3440 total = 5 + CONVERTED_BYTE_SIZE (multibyte, args[0]) + 1;
3441
3442 /* Allocate the info and discarded tables. */
3443 {
3444 int nbytes = (nargs+1) * sizeof *info;
3445 int i;
3446 if (!info)
3447 info = (struct info *) alloca (nbytes);
3448 bzero (info, nbytes);
3449 for (i = 0; i <= nargs; i++)
3450 info[i].start = -1;
3451 if (!discarded)
3452 SAFE_ALLOCA (discarded, char *, SBYTES (args[0]));
3453 bzero (discarded, SBYTES (args[0]));
3454 }
3455
3456 /* Add to TOTAL enough space to hold the converted arguments. */
3457
3458 n = 0;
3459 while (format != end)
3460 if (*format++ == '%')
3461 {
3462 int thissize = 0;
3463 int actual_width = 0;
3464 unsigned char *this_format_start = format - 1;
3465 int field_width = 0;
3466
3467 /* General format specifications look like
3468
3469 '%' [flags] [field-width] [precision] format
3470
3471 where
3472
3473 flags ::= [- #0]+
3474 field-width ::= [0-9]+
3475 precision ::= '.' [0-9]*
3476
3477 If a field-width is specified, it specifies to which width
3478 the output should be padded with blanks, iff the output
3479 string is shorter than field-width.
3480
3481 If precision is specified, it specifies the number of
3482 digits to print after the '.' for floats, or the max.
3483 number of chars to print from a string. */
3484
3485 while (format != end
3486 && (*format == '-' || *format == '0' || *format == '#'
3487 || * format == ' '))
3488 ++format;
3489
3490 if (*format >= '0' && *format <= '9')
3491 {
3492 for (field_width = 0; *format >= '0' && *format <= '9'; ++format)
3493 field_width = 10 * field_width + *format - '0';
3494 }
3495
3496 /* N is not incremented for another few lines below, so refer to
3497 element N+1 (which might be precision[NARGS]). */
3498 if (*format == '.')
3499 {
3500 ++format;
3501 for (precision[n+1] = 0; *format >= '0' && *format <= '9'; ++format)
3502 precision[n+1] = 10 * precision[n+1] + *format - '0';
3503 }
3504
3505 if (format - this_format_start + 1 > longest_format)
3506 longest_format = format - this_format_start + 1;
3507
3508 if (format == end)
3509 error ("Format string ends in middle of format specifier");
3510 if (*format == '%')
3511 format++;
3512 else if (++n >= nargs)
3513 error ("Not enough arguments for format string");
3514 else if (*format == 'S')
3515 {
3516 /* For `S', prin1 the argument and then treat like a string. */
3517 register Lisp_Object tem;
3518 tem = Fprin1_to_string (args[n], Qnil);
3519 if (STRING_MULTIBYTE (tem) && ! multibyte)
3520 {
3521 multibyte = 1;
3522 goto retry;
3523 }
3524 args[n] = tem;
3525 /* If we restart the loop, we should not come here again
3526 because args[n] is now a string and calling
3527 Fprin1_to_string on it produces superflous double
3528 quotes. So, change "%S" to "%s" now. */
3529 *format = 's';
3530 goto string;
3531 }
3532 else if (SYMBOLP (args[n]))
3533 {
3534 args[n] = SYMBOL_NAME (args[n]);
3535 if (STRING_MULTIBYTE (args[n]) && ! multibyte)
3536 {
3537 multibyte = 1;
3538 goto retry;
3539 }
3540 goto string;
3541 }
3542 else if (STRINGP (args[n]))
3543 {
3544 string:
3545 if (*format != 's' && *format != 'S')
3546 error ("Format specifier doesn't match argument type");
3547 /* In the case (PRECISION[N] > 0), THISSIZE may not need
3548 to be as large as is calculated here. Easy check for
3549 the case PRECISION = 0. */
3550 thissize = precision[n] ? CONVERTED_BYTE_SIZE (multibyte, args[n]) : 0;
3551 actual_width = lisp_string_width (args[n], -1, NULL, NULL);
3552 }
3553 /* Would get MPV otherwise, since Lisp_Int's `point' to low memory. */
3554 else if (INTEGERP (args[n]) && *format != 's')
3555 {
3556 /* The following loop assumes the Lisp type indicates
3557 the proper way to pass the argument.
3558 So make sure we have a flonum if the argument should
3559 be a double. */
3560 if (*format == 'e' || *format == 'f' || *format == 'g')
3561 args[n] = Ffloat (args[n]);
3562 else
3563 if (*format != 'd' && *format != 'o' && *format != 'x'
3564 && *format != 'i' && *format != 'X' && *format != 'c')
3565 error ("Invalid format operation %%%c", *format);
3566
3567 thissize = 30;
3568 if (*format == 'c')
3569 {
3570 if (! SINGLE_BYTE_CHAR_P (XINT (args[n]))
3571 /* Note: No one can remember why we have to treat
3572 the character 0 as a multibyte character here.
3573 But, until it causes a real problem, let's
3574 don't change it. */
3575 || XINT (args[n]) == 0)
3576 {
3577 if (! multibyte)
3578 {
3579 multibyte = 1;
3580 goto retry;
3581 }
3582 args[n] = Fchar_to_string (args[n]);
3583 thissize = SBYTES (args[n]);
3584 }
3585 else if (! ASCII_BYTE_P (XINT (args[n])) && multibyte)
3586 {
3587 args[n]
3588 = Fchar_to_string (Funibyte_char_to_multibyte (args[n]));
3589 thissize = SBYTES (args[n]);
3590 }
3591 }
3592 }
3593 else if (FLOATP (args[n]) && *format != 's')
3594 {
3595 if (! (*format == 'e' || *format == 'f' || *format == 'g'))
3596 {
3597 if (*format != 'd' && *format != 'o' && *format != 'x'
3598 && *format != 'i' && *format != 'X' && *format != 'c')
3599 error ("Invalid format operation %%%c", *format);
3600 args[n] = Ftruncate (args[n], Qnil);
3601 }
3602
3603 /* Note that we're using sprintf to print floats,
3604 so we have to take into account what that function
3605 prints. */
3606 /* Filter out flag value of -1. */
3607 thissize = (MAX_10_EXP + 100
3608 + (precision[n] > 0 ? precision[n] : 0));
3609 }
3610 else
3611 {
3612 /* Anything but a string, convert to a string using princ. */
3613 register Lisp_Object tem;
3614 tem = Fprin1_to_string (args[n], Qt);
3615 if (STRING_MULTIBYTE (tem) && ! multibyte)
3616 {
3617 multibyte = 1;
3618 goto retry;
3619 }
3620 args[n] = tem;
3621 goto string;
3622 }
3623
3624 thissize += max (0, field_width - actual_width);
3625 total += thissize + 4;
3626 }
3627
3628 abort_on_gc--;
3629
3630 /* Now we can no longer jump to retry.
3631 TOTAL and LONGEST_FORMAT are known for certain. */
3632
3633 this_format = (unsigned char *) alloca (longest_format + 1);
3634
3635 /* Allocate the space for the result.
3636 Note that TOTAL is an overestimate. */
3637 SAFE_ALLOCA (buf, char *, total);
3638
3639 p = buf;
3640 nchars = 0;
3641 n = 0;
3642
3643 /* Scan the format and store result in BUF. */
3644 format = SDATA (args[0]);
3645 format_start = format;
3646 end = format + SBYTES (args[0]);
3647 maybe_combine_byte = 0;
3648 while (format != end)
3649 {
3650 if (*format == '%')
3651 {
3652 int minlen;
3653 int negative = 0;
3654 unsigned char *this_format_start = format;
3655
3656 discarded[format - format_start] = 1;
3657 format++;
3658
3659 while (index("-0# ", *format))
3660 {
3661 if (*format == '-')
3662 {
3663 negative = 1;
3664 }
3665 discarded[format - format_start] = 1;
3666 ++format;
3667 }
3668
3669 minlen = atoi (format);
3670
3671 while ((*format >= '0' && *format <= '9') || *format == '.')
3672 {
3673 discarded[format - format_start] = 1;
3674 format++;
3675 }
3676
3677 if (*format++ == '%')
3678 {
3679 *p++ = '%';
3680 nchars++;
3681 continue;
3682 }
3683
3684 ++n;
3685
3686 discarded[format - format_start - 1] = 1;
3687 info[n].start = nchars;
3688
3689 if (STRINGP (args[n]))
3690 {
3691 /* handle case (precision[n] >= 0) */
3692
3693 int width, padding;
3694 int nbytes, start, end;
3695 int nchars_string;
3696
3697 /* lisp_string_width ignores a precision of 0, but GNU
3698 libc functions print 0 characters when the precision
3699 is 0. Imitate libc behavior here. Changing
3700 lisp_string_width is the right thing, and will be
3701 done, but meanwhile we work with it. */
3702
3703 if (precision[n] == 0)
3704 width = nchars_string = nbytes = 0;
3705 else if (precision[n] > 0)
3706 width = lisp_string_width (args[n], precision[n], &nchars_string, &nbytes);
3707 else
3708 { /* no precision spec given for this argument */
3709 width = lisp_string_width (args[n], -1, NULL, NULL);
3710 nbytes = SBYTES (args[n]);
3711 nchars_string = SCHARS (args[n]);
3712 }
3713
3714 /* If spec requires it, pad on right with spaces. */
3715 padding = minlen - width;
3716 if (! negative)
3717 while (padding-- > 0)
3718 {
3719 *p++ = ' ';
3720 ++nchars;
3721 }
3722
3723 info[n].start = start = nchars;
3724 nchars += nchars_string;
3725 end = nchars;
3726
3727 if (p > buf
3728 && multibyte
3729 && !ASCII_BYTE_P (*((unsigned char *) p - 1))
3730 && STRING_MULTIBYTE (args[n])
3731 && !CHAR_HEAD_P (SREF (args[n], 0)))
3732 maybe_combine_byte = 1;
3733
3734 p += copy_text (SDATA (args[n]), p,
3735 nbytes,
3736 STRING_MULTIBYTE (args[n]), multibyte);
3737
3738 info[n].end = nchars;
3739
3740 if (negative)
3741 while (padding-- > 0)
3742 {
3743 *p++ = ' ';
3744 nchars++;
3745 }
3746
3747 /* If this argument has text properties, record where
3748 in the result string it appears. */
3749 if (STRING_INTERVALS (args[n]))
3750 info[n].intervals = arg_intervals = 1;
3751 }
3752 else if (INTEGERP (args[n]) || FLOATP (args[n]))
3753 {
3754 int this_nchars;
3755
3756 bcopy (this_format_start, this_format,
3757 format - this_format_start);
3758 this_format[format - this_format_start] = 0;
3759
3760 if (INTEGERP (args[n]))
3761 sprintf (p, this_format, XINT (args[n]));
3762 else
3763 sprintf (p, this_format, XFLOAT_DATA (args[n]));
3764
3765 if (p > buf
3766 && multibyte
3767 && !ASCII_BYTE_P (*((unsigned char *) p - 1))
3768 && !CHAR_HEAD_P (*((unsigned char *) p)))
3769 maybe_combine_byte = 1;
3770 this_nchars = strlen (p);
3771 if (multibyte)
3772 p += str_to_multibyte (p, buf + total - 1 - p, this_nchars);
3773 else
3774 p += this_nchars;
3775 nchars += this_nchars;
3776 info[n].end = nchars;
3777 }
3778
3779 }
3780 else if (STRING_MULTIBYTE (args[0]))
3781 {
3782 /* Copy a whole multibyte character. */
3783 if (p > buf
3784 && multibyte
3785 && !ASCII_BYTE_P (*((unsigned char *) p - 1))
3786 && !CHAR_HEAD_P (*format))
3787 maybe_combine_byte = 1;
3788 *p++ = *format++;
3789 while (! CHAR_HEAD_P (*format))
3790 {
3791 discarded[format - format_start] = 2;
3792 *p++ = *format++;
3793 }
3794 nchars++;
3795 }
3796 else if (multibyte)
3797 {
3798 /* Convert a single-byte character to multibyte. */
3799 int len = copy_text (format, p, 1, 0, 1);
3800
3801 p += len;
3802 format++;
3803 nchars++;
3804 }
3805 else
3806 *p++ = *format++, nchars++;
3807 }
3808
3809 if (p > buf + total)
3810 abort ();
3811
3812 if (maybe_combine_byte)
3813 nchars = multibyte_chars_in_text (buf, p - buf);
3814 val = make_specified_string (buf, nchars, p - buf, multibyte);
3815
3816 /* If we allocated BUF with malloc, free it too. */
3817 SAFE_FREE ();
3818
3819 /* If the format string has text properties, or any of the string
3820 arguments has text properties, set up text properties of the
3821 result string. */
3822
3823 if (STRING_INTERVALS (args[0]) || arg_intervals)
3824 {
3825 Lisp_Object len, new_len, props;
3826 struct gcpro gcpro1;
3827
3828 /* Add text properties from the format string. */
3829 len = make_number (SCHARS (args[0]));
3830 props = text_property_list (args[0], make_number (0), len, Qnil);
3831 GCPRO1 (props);
3832
3833 if (CONSP (props))
3834 {
3835 int bytepos = 0, position = 0, translated = 0, argn = 1;
3836 Lisp_Object list;
3837
3838 /* Adjust the bounds of each text property
3839 to the proper start and end in the output string. */
3840
3841 /* Put the positions in PROPS in increasing order, so that
3842 we can do (effectively) one scan through the position
3843 space of the format string. */
3844 props = Fnreverse (props);
3845
3846 /* BYTEPOS is the byte position in the format string,
3847 POSITION is the untranslated char position in it,
3848 TRANSLATED is the translated char position in BUF,
3849 and ARGN is the number of the next arg we will come to. */
3850 for (list = props; CONSP (list); list = XCDR (list))
3851 {
3852 Lisp_Object item;
3853 int pos;
3854
3855 item = XCAR (list);
3856
3857 /* First adjust the property start position. */
3858 pos = XINT (XCAR (item));
3859
3860 /* Advance BYTEPOS, POSITION, TRANSLATED and ARGN
3861 up to this position. */
3862 for (; position < pos; bytepos++)
3863 {
3864 if (! discarded[bytepos])
3865 position++, translated++;
3866 else if (discarded[bytepos] == 1)
3867 {
3868 position++;
3869 if (translated == info[argn].start)
3870 {
3871 translated += info[argn].end - info[argn].start;
3872 argn++;
3873 }
3874 }
3875 }
3876
3877 XSETCAR (item, make_number (translated));
3878
3879 /* Likewise adjust the property end position. */
3880 pos = XINT (XCAR (XCDR (item)));
3881
3882 for (; bytepos < pos; bytepos++)
3883 {
3884 if (! discarded[bytepos])
3885 position++, translated++;
3886 else if (discarded[bytepos] == 1)
3887 {
3888 position++;
3889 if (translated == info[argn].start)
3890 {
3891 translated += info[argn].end - info[argn].start;
3892 argn++;
3893 }
3894 }
3895 }
3896
3897 XSETCAR (XCDR (item), make_number (translated));
3898 }
3899
3900 add_text_properties_from_list (val, props, make_number (0));
3901 }
3902
3903 /* Add text properties from arguments. */
3904 if (arg_intervals)
3905 for (n = 1; n < nargs; ++n)
3906 if (info[n].intervals)
3907 {
3908 len = make_number (SCHARS (args[n]));
3909 new_len = make_number (info[n].end - info[n].start);
3910 props = text_property_list (args[n], make_number (0), len, Qnil);
3911 extend_property_ranges (props, len, new_len);
3912 /* If successive arguments have properites, be sure that
3913 the value of `composition' property be the copy. */
3914 if (n > 1 && info[n - 1].end)
3915 make_composition_value_copy (props);
3916 add_text_properties_from_list (val, props,
3917 make_number (info[n].start));
3918 }
3919
3920 UNGCPRO;
3921 }
3922
3923 return val;
3924 }
3925
3926 Lisp_Object
3927 format2 (string1, arg0, arg1)
3928 char *string1;
3929 Lisp_Object arg0, arg1;
3930 {
3931 Lisp_Object args[3];
3932 args[0] = build_string (string1);
3933 args[1] = arg0;
3934 args[2] = arg1;
3935 return Fformat (3, args);
3936 }
3937 \f
3938 DEFUN ("char-equal", Fchar_equal, Schar_equal, 2, 2, 0,
3939 doc: /* Return t if two characters match, optionally ignoring case.
3940 Both arguments must be characters (i.e. integers).
3941 Case is ignored if `case-fold-search' is non-nil in the current buffer. */)
3942 (c1, c2)
3943 register Lisp_Object c1, c2;
3944 {
3945 int i1, i2;
3946 CHECK_NUMBER (c1);
3947 CHECK_NUMBER (c2);
3948
3949 if (XINT (c1) == XINT (c2))
3950 return Qt;
3951 if (NILP (current_buffer->case_fold_search))
3952 return Qnil;
3953
3954 /* Do these in separate statements,
3955 then compare the variables.
3956 because of the way DOWNCASE uses temp variables. */
3957 i1 = DOWNCASE (XFASTINT (c1));
3958 i2 = DOWNCASE (XFASTINT (c2));
3959 return (i1 == i2 ? Qt : Qnil);
3960 }
3961 \f
3962 /* Transpose the markers in two regions of the current buffer, and
3963 adjust the ones between them if necessary (i.e.: if the regions
3964 differ in size).
3965
3966 START1, END1 are the character positions of the first region.
3967 START1_BYTE, END1_BYTE are the byte positions.
3968 START2, END2 are the character positions of the second region.
3969 START2_BYTE, END2_BYTE are the byte positions.
3970
3971 Traverses the entire marker list of the buffer to do so, adding an
3972 appropriate amount to some, subtracting from some, and leaving the
3973 rest untouched. Most of this is copied from adjust_markers in insdel.c.
3974
3975 It's the caller's job to ensure that START1 <= END1 <= START2 <= END2. */
3976
3977 static void
3978 transpose_markers (start1, end1, start2, end2,
3979 start1_byte, end1_byte, start2_byte, end2_byte)
3980 register int start1, end1, start2, end2;
3981 register int start1_byte, end1_byte, start2_byte, end2_byte;
3982 {
3983 register int amt1, amt1_byte, amt2, amt2_byte, diff, diff_byte, mpos;
3984 register struct Lisp_Marker *marker;
3985
3986 /* Update point as if it were a marker. */
3987 if (PT < start1)
3988 ;
3989 else if (PT < end1)
3990 TEMP_SET_PT_BOTH (PT + (end2 - end1),
3991 PT_BYTE + (end2_byte - end1_byte));
3992 else if (PT < start2)
3993 TEMP_SET_PT_BOTH (PT + (end2 - start2) - (end1 - start1),
3994 (PT_BYTE + (end2_byte - start2_byte)
3995 - (end1_byte - start1_byte)));
3996 else if (PT < end2)
3997 TEMP_SET_PT_BOTH (PT - (start2 - start1),
3998 PT_BYTE - (start2_byte - start1_byte));
3999
4000 /* We used to adjust the endpoints here to account for the gap, but that
4001 isn't good enough. Even if we assume the caller has tried to move the
4002 gap out of our way, it might still be at start1 exactly, for example;
4003 and that places it `inside' the interval, for our purposes. The amount
4004 of adjustment is nontrivial if there's a `denormalized' marker whose
4005 position is between GPT and GPT + GAP_SIZE, so it's simpler to leave
4006 the dirty work to Fmarker_position, below. */
4007
4008 /* The difference between the region's lengths */
4009 diff = (end2 - start2) - (end1 - start1);
4010 diff_byte = (end2_byte - start2_byte) - (end1_byte - start1_byte);
4011
4012 /* For shifting each marker in a region by the length of the other
4013 region plus the distance between the regions. */
4014 amt1 = (end2 - start2) + (start2 - end1);
4015 amt2 = (end1 - start1) + (start2 - end1);
4016 amt1_byte = (end2_byte - start2_byte) + (start2_byte - end1_byte);
4017 amt2_byte = (end1_byte - start1_byte) + (start2_byte - end1_byte);
4018
4019 for (marker = BUF_MARKERS (current_buffer); marker; marker = marker->next)
4020 {
4021 mpos = marker->bytepos;
4022 if (mpos >= start1_byte && mpos < end2_byte)
4023 {
4024 if (mpos < end1_byte)
4025 mpos += amt1_byte;
4026 else if (mpos < start2_byte)
4027 mpos += diff_byte;
4028 else
4029 mpos -= amt2_byte;
4030 marker->bytepos = mpos;
4031 }
4032 mpos = marker->charpos;
4033 if (mpos >= start1 && mpos < end2)
4034 {
4035 if (mpos < end1)
4036 mpos += amt1;
4037 else if (mpos < start2)
4038 mpos += diff;
4039 else
4040 mpos -= amt2;
4041 }
4042 marker->charpos = mpos;
4043 }
4044 }
4045
4046 DEFUN ("transpose-regions", Ftranspose_regions, Stranspose_regions, 4, 5, 0,
4047 doc: /* Transpose region STARTR1 to ENDR1 with STARTR2 to ENDR2.
4048 The regions may not be overlapping, because the size of the buffer is
4049 never changed in a transposition.
4050
4051 Optional fifth arg LEAVE-MARKERS, if non-nil, means don't update
4052 any markers that happen to be located in the regions.
4053
4054 Transposing beyond buffer boundaries is an error. */)
4055 (startr1, endr1, startr2, endr2, leave_markers)
4056 Lisp_Object startr1, endr1, startr2, endr2, leave_markers;
4057 {
4058 register int start1, end1, start2, end2;
4059 int start1_byte, start2_byte, len1_byte, len2_byte;
4060 int gap, len1, len_mid, len2;
4061 unsigned char *start1_addr, *start2_addr, *temp;
4062
4063 INTERVAL cur_intv, tmp_interval1, tmp_interval_mid, tmp_interval2;
4064 cur_intv = BUF_INTERVALS (current_buffer);
4065
4066 validate_region (&startr1, &endr1);
4067 validate_region (&startr2, &endr2);
4068
4069 start1 = XFASTINT (startr1);
4070 end1 = XFASTINT (endr1);
4071 start2 = XFASTINT (startr2);
4072 end2 = XFASTINT (endr2);
4073 gap = GPT;
4074
4075 /* Swap the regions if they're reversed. */
4076 if (start2 < end1)
4077 {
4078 register int glumph = start1;
4079 start1 = start2;
4080 start2 = glumph;
4081 glumph = end1;
4082 end1 = end2;
4083 end2 = glumph;
4084 }
4085
4086 len1 = end1 - start1;
4087 len2 = end2 - start2;
4088
4089 if (start2 < end1)
4090 error ("Transposed regions overlap");
4091 else if (start1 == end1 || start2 == end2)
4092 error ("Transposed region has length 0");
4093
4094 /* The possibilities are:
4095 1. Adjacent (contiguous) regions, or separate but equal regions
4096 (no, really equal, in this case!), or
4097 2. Separate regions of unequal size.
4098
4099 The worst case is usually No. 2. It means that (aside from
4100 potential need for getting the gap out of the way), there also
4101 needs to be a shifting of the text between the two regions. So
4102 if they are spread far apart, we are that much slower... sigh. */
4103
4104 /* It must be pointed out that the really studly thing to do would
4105 be not to move the gap at all, but to leave it in place and work
4106 around it if necessary. This would be extremely efficient,
4107 especially considering that people are likely to do
4108 transpositions near where they are working interactively, which
4109 is exactly where the gap would be found. However, such code
4110 would be much harder to write and to read. So, if you are
4111 reading this comment and are feeling squirrely, by all means have
4112 a go! I just didn't feel like doing it, so I will simply move
4113 the gap the minimum distance to get it out of the way, and then
4114 deal with an unbroken array. */
4115
4116 /* Make sure the gap won't interfere, by moving it out of the text
4117 we will operate on. */
4118 if (start1 < gap && gap < end2)
4119 {
4120 if (gap - start1 < end2 - gap)
4121 move_gap (start1);
4122 else
4123 move_gap (end2);
4124 }
4125
4126 start1_byte = CHAR_TO_BYTE (start1);
4127 start2_byte = CHAR_TO_BYTE (start2);
4128 len1_byte = CHAR_TO_BYTE (end1) - start1_byte;
4129 len2_byte = CHAR_TO_BYTE (end2) - start2_byte;
4130
4131 #ifdef BYTE_COMBINING_DEBUG
4132 if (end1 == start2)
4133 {
4134 if (count_combining_before (BYTE_POS_ADDR (start2_byte),
4135 len2_byte, start1, start1_byte)
4136 || count_combining_before (BYTE_POS_ADDR (start1_byte),
4137 len1_byte, end2, start2_byte + len2_byte)
4138 || count_combining_after (BYTE_POS_ADDR (start1_byte),
4139 len1_byte, end2, start2_byte + len2_byte))
4140 abort ();
4141 }
4142 else
4143 {
4144 if (count_combining_before (BYTE_POS_ADDR (start2_byte),
4145 len2_byte, start1, start1_byte)
4146 || count_combining_before (BYTE_POS_ADDR (start1_byte),
4147 len1_byte, start2, start2_byte)
4148 || count_combining_after (BYTE_POS_ADDR (start2_byte),
4149 len2_byte, end1, start1_byte + len1_byte)
4150 || count_combining_after (BYTE_POS_ADDR (start1_byte),
4151 len1_byte, end2, start2_byte + len2_byte))
4152 abort ();
4153 }
4154 #endif
4155
4156 /* Hmmm... how about checking to see if the gap is large
4157 enough to use as the temporary storage? That would avoid an
4158 allocation... interesting. Later, don't fool with it now. */
4159
4160 /* Working without memmove, for portability (sigh), so must be
4161 careful of overlapping subsections of the array... */
4162
4163 if (end1 == start2) /* adjacent regions */
4164 {
4165 modify_region (current_buffer, start1, end2);
4166 record_change (start1, len1 + len2);
4167
4168 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4169 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4170 Fset_text_properties (make_number (start1), make_number (end2),
4171 Qnil, Qnil);
4172
4173 /* First region smaller than second. */
4174 if (len1_byte < len2_byte)
4175 {
4176 USE_SAFE_ALLOCA;
4177
4178 SAFE_ALLOCA (temp, unsigned char *, len2_byte);
4179
4180 /* Don't precompute these addresses. We have to compute them
4181 at the last minute, because the relocating allocator might
4182 have moved the buffer around during the xmalloc. */
4183 start1_addr = BYTE_POS_ADDR (start1_byte);
4184 start2_addr = BYTE_POS_ADDR (start2_byte);
4185
4186 bcopy (start2_addr, temp, len2_byte);
4187 bcopy (start1_addr, start1_addr + len2_byte, len1_byte);
4188 bcopy (temp, start1_addr, len2_byte);
4189 SAFE_FREE ();
4190 }
4191 else
4192 /* First region not smaller than second. */
4193 {
4194 USE_SAFE_ALLOCA;
4195
4196 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4197 start1_addr = BYTE_POS_ADDR (start1_byte);
4198 start2_addr = BYTE_POS_ADDR (start2_byte);
4199 bcopy (start1_addr, temp, len1_byte);
4200 bcopy (start2_addr, start1_addr, len2_byte);
4201 bcopy (temp, start1_addr + len2_byte, len1_byte);
4202 SAFE_FREE ();
4203 }
4204 graft_intervals_into_buffer (tmp_interval1, start1 + len2,
4205 len1, current_buffer, 0);
4206 graft_intervals_into_buffer (tmp_interval2, start1,
4207 len2, current_buffer, 0);
4208 update_compositions (start1, start1 + len2, CHECK_BORDER);
4209 update_compositions (start1 + len2, end2, CHECK_TAIL);
4210 }
4211 /* Non-adjacent regions, because end1 != start2, bleagh... */
4212 else
4213 {
4214 len_mid = start2_byte - (start1_byte + len1_byte);
4215
4216 if (len1_byte == len2_byte)
4217 /* Regions are same size, though, how nice. */
4218 {
4219 USE_SAFE_ALLOCA;
4220
4221 modify_region (current_buffer, start1, end1);
4222 modify_region (current_buffer, start2, end2);
4223 record_change (start1, len1);
4224 record_change (start2, len2);
4225 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4226 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4227 Fset_text_properties (make_number (start1), make_number (end1),
4228 Qnil, Qnil);
4229 Fset_text_properties (make_number (start2), make_number (end2),
4230 Qnil, Qnil);
4231
4232 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4233 start1_addr = BYTE_POS_ADDR (start1_byte);
4234 start2_addr = BYTE_POS_ADDR (start2_byte);
4235 bcopy (start1_addr, temp, len1_byte);
4236 bcopy (start2_addr, start1_addr, len2_byte);
4237 bcopy (temp, start2_addr, len1_byte);
4238 SAFE_FREE ();
4239
4240 graft_intervals_into_buffer (tmp_interval1, start2,
4241 len1, current_buffer, 0);
4242 graft_intervals_into_buffer (tmp_interval2, start1,
4243 len2, current_buffer, 0);
4244 }
4245
4246 else if (len1_byte < len2_byte) /* Second region larger than first */
4247 /* Non-adjacent & unequal size, area between must also be shifted. */
4248 {
4249 USE_SAFE_ALLOCA;
4250
4251 modify_region (current_buffer, start1, end2);
4252 record_change (start1, (end2 - start1));
4253 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4254 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4255 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4256 Fset_text_properties (make_number (start1), make_number (end2),
4257 Qnil, Qnil);
4258
4259 /* holds region 2 */
4260 SAFE_ALLOCA (temp, unsigned char *, len2_byte);
4261 start1_addr = BYTE_POS_ADDR (start1_byte);
4262 start2_addr = BYTE_POS_ADDR (start2_byte);
4263 bcopy (start2_addr, temp, len2_byte);
4264 bcopy (start1_addr, start1_addr + len_mid + len2_byte, len1_byte);
4265 safe_bcopy (start1_addr + len1_byte, start1_addr + len2_byte, len_mid);
4266 bcopy (temp, start1_addr, len2_byte);
4267 SAFE_FREE ();
4268
4269 graft_intervals_into_buffer (tmp_interval1, end2 - len1,
4270 len1, current_buffer, 0);
4271 graft_intervals_into_buffer (tmp_interval_mid, start1 + len2,
4272 len_mid, current_buffer, 0);
4273 graft_intervals_into_buffer (tmp_interval2, start1,
4274 len2, current_buffer, 0);
4275 }
4276 else
4277 /* Second region smaller than first. */
4278 {
4279 USE_SAFE_ALLOCA;
4280
4281 record_change (start1, (end2 - start1));
4282 modify_region (current_buffer, start1, end2);
4283
4284 tmp_interval1 = copy_intervals (cur_intv, start1, len1);
4285 tmp_interval_mid = copy_intervals (cur_intv, end1, len_mid);
4286 tmp_interval2 = copy_intervals (cur_intv, start2, len2);
4287 Fset_text_properties (make_number (start1), make_number (end2),
4288 Qnil, Qnil);
4289
4290 /* holds region 1 */
4291 SAFE_ALLOCA (temp, unsigned char *, len1_byte);
4292 start1_addr = BYTE_POS_ADDR (start1_byte);
4293 start2_addr = BYTE_POS_ADDR (start2_byte);
4294 bcopy (start1_addr, temp, len1_byte);
4295 bcopy (start2_addr, start1_addr, len2_byte);
4296 bcopy (start1_addr + len1_byte, start1_addr + len2_byte, len_mid);
4297 bcopy (temp, start1_addr + len2_byte + len_mid, len1_byte);
4298 SAFE_FREE ();
4299
4300 graft_intervals_into_buffer (tmp_interval1, end2 - len1,
4301 len1, current_buffer, 0);
4302 graft_intervals_into_buffer (tmp_interval_mid, start1 + len2,
4303 len_mid, current_buffer, 0);
4304 graft_intervals_into_buffer (tmp_interval2, start1,
4305 len2, current_buffer, 0);
4306 }
4307
4308 update_compositions (start1, start1 + len2, CHECK_BORDER);
4309 update_compositions (end2 - len1, end2, CHECK_BORDER);
4310 }
4311
4312 /* When doing multiple transpositions, it might be nice
4313 to optimize this. Perhaps the markers in any one buffer
4314 should be organized in some sorted data tree. */
4315 if (NILP (leave_markers))
4316 {
4317 transpose_markers (start1, end1, start2, end2,
4318 start1_byte, start1_byte + len1_byte,
4319 start2_byte, start2_byte + len2_byte);
4320 fix_start_end_in_overlays (start1, end2);
4321 }
4322
4323 return Qnil;
4324 }
4325
4326 \f
4327 void
4328 syms_of_editfns ()
4329 {
4330 environbuf = 0;
4331
4332 Qbuffer_access_fontify_functions
4333 = intern ("buffer-access-fontify-functions");
4334 staticpro (&Qbuffer_access_fontify_functions);
4335
4336 DEFVAR_LISP ("inhibit-field-text-motion", &Vinhibit_field_text_motion,
4337 doc: /* Non-nil means text motion commands don't notice fields. */);
4338 Vinhibit_field_text_motion = Qnil;
4339
4340 DEFVAR_LISP ("buffer-access-fontify-functions",
4341 &Vbuffer_access_fontify_functions,
4342 doc: /* List of functions called by `buffer-substring' to fontify if necessary.
4343 Each function is called with two arguments which specify the range
4344 of the buffer being accessed. */);
4345 Vbuffer_access_fontify_functions = Qnil;
4346
4347 {
4348 Lisp_Object obuf;
4349 extern Lisp_Object Vprin1_to_string_buffer;
4350 obuf = Fcurrent_buffer ();
4351 /* Do this here, because init_buffer_once is too early--it won't work. */
4352 Fset_buffer (Vprin1_to_string_buffer);
4353 /* Make sure buffer-access-fontify-functions is nil in this buffer. */
4354 Fset (Fmake_local_variable (intern ("buffer-access-fontify-functions")),
4355 Qnil);
4356 Fset_buffer (obuf);
4357 }
4358
4359 DEFVAR_LISP ("buffer-access-fontified-property",
4360 &Vbuffer_access_fontified_property,
4361 doc: /* Property which (if non-nil) indicates text has been fontified.
4362 `buffer-substring' need not call the `buffer-access-fontify-functions'
4363 functions if all the text being accessed has this property. */);
4364 Vbuffer_access_fontified_property = Qnil;
4365
4366 DEFVAR_LISP ("system-name", &Vsystem_name,
4367 doc: /* The name of the machine Emacs is running on. */);
4368
4369 DEFVAR_LISP ("user-full-name", &Vuser_full_name,
4370 doc: /* The full name of the user logged in. */);
4371
4372 DEFVAR_LISP ("user-login-name", &Vuser_login_name,
4373 doc: /* The user's name, taken from environment variables if possible. */);
4374
4375 DEFVAR_LISP ("user-real-login-name", &Vuser_real_login_name,
4376 doc: /* The user's name, based upon the real uid only. */);
4377
4378 DEFVAR_LISP ("operating-system-release", &Voperating_system_release,
4379 doc: /* The release of the operating system Emacs is running on. */);
4380
4381 defsubr (&Spropertize);
4382 defsubr (&Schar_equal);
4383 defsubr (&Sgoto_char);
4384 defsubr (&Sstring_to_char);
4385 defsubr (&Schar_to_string);
4386 defsubr (&Sbuffer_substring);
4387 defsubr (&Sbuffer_substring_no_properties);
4388 defsubr (&Sbuffer_string);
4389
4390 defsubr (&Spoint_marker);
4391 defsubr (&Smark_marker);
4392 defsubr (&Spoint);
4393 defsubr (&Sregion_beginning);
4394 defsubr (&Sregion_end);
4395
4396 staticpro (&Qfield);
4397 Qfield = intern ("field");
4398 staticpro (&Qboundary);
4399 Qboundary = intern ("boundary");
4400 defsubr (&Sfield_beginning);
4401 defsubr (&Sfield_end);
4402 defsubr (&Sfield_string);
4403 defsubr (&Sfield_string_no_properties);
4404 defsubr (&Sdelete_field);
4405 defsubr (&Sconstrain_to_field);
4406
4407 defsubr (&Sline_beginning_position);
4408 defsubr (&Sline_end_position);
4409
4410 /* defsubr (&Smark); */
4411 /* defsubr (&Sset_mark); */
4412 defsubr (&Ssave_excursion);
4413 defsubr (&Ssave_current_buffer);
4414
4415 defsubr (&Sbufsize);
4416 defsubr (&Spoint_max);
4417 defsubr (&Spoint_min);
4418 defsubr (&Spoint_min_marker);
4419 defsubr (&Spoint_max_marker);
4420 defsubr (&Sgap_position);
4421 defsubr (&Sgap_size);
4422 defsubr (&Sposition_bytes);
4423 defsubr (&Sbyte_to_position);
4424
4425 defsubr (&Sbobp);
4426 defsubr (&Seobp);
4427 defsubr (&Sbolp);
4428 defsubr (&Seolp);
4429 defsubr (&Sfollowing_char);
4430 defsubr (&Sprevious_char);
4431 defsubr (&Schar_after);
4432 defsubr (&Schar_before);
4433 defsubr (&Sinsert);
4434 defsubr (&Sinsert_before_markers);
4435 defsubr (&Sinsert_and_inherit);
4436 defsubr (&Sinsert_and_inherit_before_markers);
4437 defsubr (&Sinsert_char);
4438
4439 defsubr (&Suser_login_name);
4440 defsubr (&Suser_real_login_name);
4441 defsubr (&Suser_uid);
4442 defsubr (&Suser_real_uid);
4443 defsubr (&Suser_full_name);
4444 defsubr (&Semacs_pid);
4445 defsubr (&Scurrent_time);
4446 defsubr (&Sget_internal_run_time);
4447 defsubr (&Sformat_time_string);
4448 defsubr (&Sfloat_time);
4449 defsubr (&Sdecode_time);
4450 defsubr (&Sencode_time);
4451 defsubr (&Scurrent_time_string);
4452 defsubr (&Scurrent_time_zone);
4453 defsubr (&Sset_time_zone_rule);
4454 defsubr (&Ssystem_name);
4455 defsubr (&Smessage);
4456 defsubr (&Smessage_box);
4457 defsubr (&Smessage_or_box);
4458 defsubr (&Scurrent_message);
4459 defsubr (&Sformat);
4460
4461 defsubr (&Sinsert_buffer_substring);
4462 defsubr (&Scompare_buffer_substrings);
4463 defsubr (&Ssubst_char_in_region);
4464 defsubr (&Stranslate_region_internal);
4465 defsubr (&Sdelete_region);
4466 defsubr (&Sdelete_and_extract_region);
4467 defsubr (&Swiden);
4468 defsubr (&Snarrow_to_region);
4469 defsubr (&Ssave_restriction);
4470 defsubr (&Stranspose_regions);
4471 }
4472
4473 /* arch-tag: fc3827d8-6f60-4067-b11e-c3218031b018
4474 (do not change this comment) */