Mercurial > emacs
annotate src/marker.c @ 32038:0cb9cab990cb
(keymap_memberp): New function.
(Fset_keymap_parent): Use it.
(fix_submap_inheritance): Use get_keyelt, get_keymap_1 and KEYMAPP.
Use keymap_memberp to avoid creating cycles.
(access_keymap): Use KEYMAPP.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Sat, 30 Sep 2000 17:00:15 +0000 |
parents | cf1b4094811a |
children | c0953f8a8dff |
rev | line source |
---|---|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
1 /* Markers: examining, setting and deleting. |
20706 | 2 Copyright (C) 1985, 1997, 1998 Free Software Foundation, Inc. |
118 | 3 |
4 This file is part of GNU Emacs. | |
5 | |
6 GNU Emacs is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
12244 | 8 the Free Software Foundation; either version 2, or (at your option) |
118 | 9 any later version. |
10 | |
11 GNU Emacs is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14082
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14082
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
118 | 20 |
21 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
484
diff
changeset
|
22 #include <config.h> |
118 | 23 #include "lisp.h" |
24 #include "buffer.h" | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
25 #include "charset.h" |
118 | 26 |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
27 /* Record one cached position found recently by |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
28 buf_charpos_to_bytepos or buf_bytepos_to_charpos. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
29 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
30 static int cached_charpos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
31 static int cached_bytepos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
32 static struct buffer *cached_buffer; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
33 static int cached_modiff; |
20678
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
34 |
31830
cf1b4094811a
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
28417
diff
changeset
|
35 static void byte_char_debug_check P_ ((struct buffer *, int, int)); |
cf1b4094811a
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
28417
diff
changeset
|
36 |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
37 /* Nonzero means enable debugging checks on byte/char correspondences. */ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
38 |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
39 static int byte_debug_flag; |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
40 |
21514 | 41 void |
20678
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
42 clear_charpos_cache (b) |
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
43 struct buffer *b; |
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
44 { |
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
45 if (cached_buffer == b) |
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
46 cached_buffer = 0; |
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
47 } |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
48 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
49 /* Converting between character positions and byte positions. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
50 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
51 /* There are several places in the buffer where we know |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
52 the corrspondence: BEG, BEGV, PT, GPT, ZV and Z, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
53 and everywhere there is a marker. So we find the one of these places |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
54 that is closest to the specified position, and scan from there. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
55 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
56 /* charpos_to_bytepos returns the byte position corresponding to CHARPOS. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
57 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
58 /* This macro is a subroutine of charpos_to_bytepos. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
59 Note that it is desirable that BYTEPOS is not evaluated |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
60 except when we really want its value. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
61 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
62 #define CONSIDER(CHARPOS, BYTEPOS) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
63 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
64 int this_charpos = (CHARPOS); \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
65 int changed = 0; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
66 \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
67 if (this_charpos == charpos) \ |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
68 { \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
69 int value = (BYTEPOS); \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
70 if (byte_debug_flag) \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
71 byte_char_debug_check (b, charpos, value); \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
72 return value; \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
73 } \ |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
74 else if (this_charpos > charpos) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
75 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
76 if (this_charpos < best_above) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
77 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
78 best_above = this_charpos; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
79 best_above_byte = (BYTEPOS); \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
80 changed = 1; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
81 } \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
82 } \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
83 else if (this_charpos > best_below) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
84 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
85 best_below = this_charpos; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
86 best_below_byte = (BYTEPOS); \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
87 changed = 1; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
88 } \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
89 \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
90 if (changed) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
91 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
92 if (best_above - best_below == best_above_byte - best_below_byte) \ |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
93 { \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
94 int value = best_below_byte + (charpos - best_below); \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
95 if (byte_debug_flag) \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
96 byte_char_debug_check (b, charpos, value); \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
97 return value; \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
98 } \ |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
99 } \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
100 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
101 |
31830
cf1b4094811a
Avoid some more compiler warnings.
Gerd Moellmann <gerd@gnu.org>
parents:
28417
diff
changeset
|
102 static void |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
103 byte_char_debug_check (b, charpos, bytepos) |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
104 struct buffer *b; |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
105 int charpos, bytepos; |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
106 { |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
107 int nchars = 0; |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
108 |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
109 if (bytepos > BUF_GPT_BYTE (b)) |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
110 { |
21219
29d2cf14040a
(byte_char_debug_check): Call multibyte_chars_in_text
Kenichi Handa <handa@m17n.org>
parents:
20872
diff
changeset
|
111 nchars = multibyte_chars_in_text (BUF_BEG_ADDR (b), |
29d2cf14040a
(byte_char_debug_check): Call multibyte_chars_in_text
Kenichi Handa <handa@m17n.org>
parents:
20872
diff
changeset
|
112 BUF_GPT_BYTE (b) - BUF_BEG_BYTE (b)); |
29d2cf14040a
(byte_char_debug_check): Call multibyte_chars_in_text
Kenichi Handa <handa@m17n.org>
parents:
20872
diff
changeset
|
113 nchars += multibyte_chars_in_text (BUF_GAP_END_ADDR (b), |
29d2cf14040a
(byte_char_debug_check): Call multibyte_chars_in_text
Kenichi Handa <handa@m17n.org>
parents:
20872
diff
changeset
|
114 bytepos - BUF_GPT_BYTE (b)); |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
115 } |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
116 else |
21219
29d2cf14040a
(byte_char_debug_check): Call multibyte_chars_in_text
Kenichi Handa <handa@m17n.org>
parents:
20872
diff
changeset
|
117 nchars = multibyte_chars_in_text (BUF_BEG_ADDR (b), |
29d2cf14040a
(byte_char_debug_check): Call multibyte_chars_in_text
Kenichi Handa <handa@m17n.org>
parents:
20872
diff
changeset
|
118 bytepos - BUF_BEG_BYTE (b)); |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
119 |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
120 if (charpos - 1 != nchars) |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
121 abort (); |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
122 } |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
123 |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
124 int |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
125 charpos_to_bytepos (charpos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
126 int charpos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
127 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
128 return buf_charpos_to_bytepos (current_buffer, charpos); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
129 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
130 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
131 int |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
132 buf_charpos_to_bytepos (b, charpos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
133 struct buffer *b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
134 int charpos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
135 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
136 Lisp_Object tail; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
137 int best_above, best_above_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
138 int best_below, best_below_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
139 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
140 if (charpos < BUF_BEG (b) || charpos > BUF_Z (b)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
141 abort (); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
142 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
143 best_above = BUF_Z (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
144 best_above_byte = BUF_Z_BYTE (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
145 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
146 /* If this buffer has as many characters as bytes, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
147 each character must be one byte. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
148 This takes care of the case where enable-multibyte-characters is nil. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
149 if (best_above == best_above_byte) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
150 return charpos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
151 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
152 best_below = 1; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
153 best_below_byte = 1; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
154 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
155 /* We find in best_above and best_above_byte |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
156 the closest known point above CHARPOS, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
157 and in best_below and best_below_byte |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
158 the closest known point below CHARPOS, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
159 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
160 If at any point we can tell that the space between those |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
161 two best approximations is all single-byte, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
162 we interpolate the result immediately. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
163 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
164 CONSIDER (BUF_PT (b), BUF_PT_BYTE (b)); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
165 CONSIDER (BUF_GPT (b), BUF_GPT_BYTE (b)); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
166 CONSIDER (BUF_BEGV (b), BUF_BEGV_BYTE (b)); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
167 CONSIDER (BUF_ZV (b), BUF_ZV_BYTE (b)); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
168 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
169 if (b == cached_buffer && BUF_MODIFF (b) == cached_modiff) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
170 CONSIDER (cached_charpos, cached_bytepos); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
171 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
172 tail = BUF_MARKERS (b); |
28417
4b675266db04
* lisp.h (XCONS, XSTRING, XSYMBOL, XFLOAT, XPROCESS, XWINDOW, XSUBR, XBUFFER):
Ken Raeburn <raeburn@raeburn.org>
parents:
22744
diff
changeset
|
173 while (! NILP (tail)) |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
174 { |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
175 CONSIDER (XMARKER (tail)->charpos, XMARKER (tail)->bytepos); |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
176 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
177 /* If we are down to a range of 50 chars, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
178 don't bother checking any other markers; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
179 scan the intervening chars directly now. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
180 if (best_above - best_below < 50) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
181 break; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
182 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
183 tail = XMARKER (tail)->chain; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
184 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
185 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
186 /* We get here if we did not exactly hit one of the known places. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
187 We have one known above and one known below. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
188 Scan, counting characters, from whichever one is closer. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
189 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
190 if (charpos - best_below < best_above - charpos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
191 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
192 int record = charpos - best_below > 5000; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
193 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
194 while (best_below != charpos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
195 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
196 best_below++; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
197 BUF_INC_POS (b, best_below_byte); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
198 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
199 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
200 /* If this position is quite far from the nearest known position, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
201 cache the correspondence by creating a marker here. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
202 It will last until the next GC. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
203 if (record) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
204 { |
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
205 Lisp_Object marker, buffer; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
206 marker = Fmake_marker (); |
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
207 XSETBUFFER (buffer, b); |
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
208 set_marker_both (marker, buffer, best_below, best_below_byte); |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
209 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
210 |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
211 if (byte_debug_flag) |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
212 byte_char_debug_check (b, charpos, best_below_byte); |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
213 |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
214 cached_buffer = b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
215 cached_modiff = BUF_MODIFF (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
216 cached_charpos = best_below; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
217 cached_bytepos = best_below_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
218 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
219 return best_below_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
220 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
221 else |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
222 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
223 int record = best_above - charpos > 5000; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
224 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
225 while (best_above != charpos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
226 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
227 best_above--; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
228 BUF_DEC_POS (b, best_above_byte); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
229 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
230 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
231 /* If this position is quite far from the nearest known position, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
232 cache the correspondence by creating a marker here. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
233 It will last until the next GC. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
234 if (record) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
235 { |
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
236 Lisp_Object marker, buffer; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
237 marker = Fmake_marker (); |
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
238 XSETBUFFER (buffer, b); |
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
239 set_marker_both (marker, buffer, best_above, best_above_byte); |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
240 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
241 |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
242 if (byte_debug_flag) |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
243 byte_char_debug_check (b, charpos, best_above_byte); |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
244 |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
245 cached_buffer = b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
246 cached_modiff = BUF_MODIFF (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
247 cached_charpos = best_above; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
248 cached_bytepos = best_above_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
249 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
250 return best_above_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
251 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
252 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
253 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
254 #undef CONSIDER |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
255 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
256 /* bytepos_to_charpos returns the char position corresponding to BYTEPOS. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
257 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
258 /* This macro is a subroutine of bytepos_to_charpos. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
259 It is used when BYTEPOS is actually the byte position. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
260 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
261 #define CONSIDER(BYTEPOS, CHARPOS) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
262 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
263 int this_bytepos = (BYTEPOS); \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
264 int changed = 0; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
265 \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
266 if (this_bytepos == bytepos) \ |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
267 { \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
268 int value = (CHARPOS); \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
269 if (byte_debug_flag) \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
270 byte_char_debug_check (b, value, bytepos); \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
271 return value; \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
272 } \ |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
273 else if (this_bytepos > bytepos) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
274 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
275 if (this_bytepos < best_above_byte) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
276 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
277 best_above = (CHARPOS); \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
278 best_above_byte = this_bytepos; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
279 changed = 1; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
280 } \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
281 } \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
282 else if (this_bytepos > best_below_byte) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
283 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
284 best_below = (CHARPOS); \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
285 best_below_byte = this_bytepos; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
286 changed = 1; \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
287 } \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
288 \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
289 if (changed) \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
290 { \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
291 if (best_above - best_below == best_above_byte - best_below_byte) \ |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
292 { \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
293 int value = best_below + (bytepos - best_below_byte); \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
294 if (byte_debug_flag) \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
295 byte_char_debug_check (b, value, bytepos); \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
296 return value; \ |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
297 } \ |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
298 } \ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
299 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
300 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
301 int |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
302 bytepos_to_charpos (bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
303 int bytepos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
304 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
305 return buf_bytepos_to_charpos (current_buffer, bytepos); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
306 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
307 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
308 int |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
309 buf_bytepos_to_charpos (b, bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
310 struct buffer *b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
311 int bytepos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
312 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
313 Lisp_Object tail; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
314 int best_above, best_above_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
315 int best_below, best_below_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
316 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
317 if (bytepos < BUF_BEG_BYTE (b) || bytepos > BUF_Z_BYTE (b)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
318 abort (); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
319 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
320 best_above = BUF_Z (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
321 best_above_byte = BUF_Z_BYTE (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
322 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
323 /* If this buffer has as many characters as bytes, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
324 each character must be one byte. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
325 This takes care of the case where enable-multibyte-characters is nil. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
326 if (best_above == best_above_byte) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
327 return bytepos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
328 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
329 best_below = 1; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
330 best_below_byte = 1; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
331 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
332 CONSIDER (BUF_PT_BYTE (b), BUF_PT (b)); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
333 CONSIDER (BUF_GPT_BYTE (b), BUF_GPT (b)); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
334 CONSIDER (BUF_BEGV_BYTE (b), BUF_BEGV (b)); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
335 CONSIDER (BUF_ZV_BYTE (b), BUF_ZV (b)); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
336 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
337 if (b == cached_buffer && BUF_MODIFF (b) == cached_modiff) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
338 CONSIDER (cached_bytepos, cached_charpos); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
339 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
340 tail = BUF_MARKERS (b); |
28417
4b675266db04
* lisp.h (XCONS, XSTRING, XSYMBOL, XFLOAT, XPROCESS, XWINDOW, XSUBR, XBUFFER):
Ken Raeburn <raeburn@raeburn.org>
parents:
22744
diff
changeset
|
341 while (! NILP (tail)) |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
342 { |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
343 CONSIDER (XMARKER (tail)->bytepos, XMARKER (tail)->charpos); |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
344 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
345 /* If we are down to a range of 50 chars, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
346 don't bother checking any other markers; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
347 scan the intervening chars directly now. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
348 if (best_above - best_below < 50) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
349 break; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
350 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
351 tail = XMARKER (tail)->chain; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
352 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
353 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
354 /* We get here if we did not exactly hit one of the known places. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
355 We have one known above and one known below. |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
356 Scan, counting characters, from whichever one is closer. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
357 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
358 if (bytepos - best_below_byte < best_above_byte - bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
359 { |
22022
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
360 int record = bytepos - best_below_byte > 5000; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
361 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
362 while (best_below_byte < bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
363 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
364 best_below++; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
365 BUF_INC_POS (b, best_below_byte); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
366 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
367 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
368 /* If this position is quite far from the nearest known position, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
369 cache the correspondence by creating a marker here. |
22022
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
370 It will last until the next GC. |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
371 But don't do it if BUF_MARKERS is nil; |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
372 that is a signal from Fset_buffer_multibyte. */ |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
373 if (record && ! NILP (BUF_MARKERS (b))) |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
374 { |
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
375 Lisp_Object marker, buffer; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
376 marker = Fmake_marker (); |
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
377 XSETBUFFER (buffer, b); |
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
378 set_marker_both (marker, buffer, best_below, best_below_byte); |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
379 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
380 |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
381 if (byte_debug_flag) |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
382 byte_char_debug_check (b, best_below, bytepos); |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
383 |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
384 cached_buffer = b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
385 cached_modiff = BUF_MODIFF (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
386 cached_charpos = best_below; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
387 cached_bytepos = best_below_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
388 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
389 return best_below; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
390 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
391 else |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
392 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
393 int record = best_above_byte - bytepos > 5000; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
394 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
395 while (best_above_byte > bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
396 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
397 best_above--; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
398 BUF_DEC_POS (b, best_above_byte); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
399 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
400 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
401 /* If this position is quite far from the nearest known position, |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
402 cache the correspondence by creating a marker here. |
22022
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
403 It will last until the next GC. |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
404 But don't do it if BUF_MARKERS is nil; |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
405 that is a signal from Fset_buffer_multibyte. */ |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
406 if (record && ! NILP (BUF_MARKERS (b))) |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
407 { |
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
408 Lisp_Object marker, buffer; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
409 marker = Fmake_marker (); |
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
410 XSETBUFFER (buffer, b); |
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
411 set_marker_both (marker, buffer, best_above, best_above_byte); |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
412 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
413 |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
414 if (byte_debug_flag) |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
415 byte_char_debug_check (b, best_above, bytepos); |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
416 |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
417 cached_buffer = b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
418 cached_modiff = BUF_MODIFF (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
419 cached_charpos = best_above; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
420 cached_bytepos = best_above_byte; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
421 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
422 return best_above; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
423 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
424 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
425 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
426 #undef CONSIDER |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
427 |
118 | 428 /* Operations on markers. */ |
429 | |
430 DEFUN ("marker-buffer", Fmarker_buffer, Smarker_buffer, 1, 1, 0, | |
431 "Return the buffer that MARKER points into, or nil if none.\n\ | |
432 Returns nil if MARKER points into a dead buffer.") | |
433 (marker) | |
434 register Lisp_Object marker; | |
435 { | |
436 register Lisp_Object buf; | |
437 CHECK_MARKER (marker, 0); | |
438 if (XMARKER (marker)->buffer) | |
439 { | |
9275
bb50d17f7441
(Fmarker_buffer): Use new accessor macros instead of calling XSET directly.
Karl Heuer <kwzh@gnu.org>
parents:
9121
diff
changeset
|
440 XSETBUFFER (buf, XMARKER (marker)->buffer); |
118 | 441 /* Return marker's buffer only if it is not dead. */ |
484 | 442 if (!NILP (XBUFFER (buf)->name)) |
118 | 443 return buf; |
444 } | |
445 return Qnil; | |
446 } | |
447 | |
448 DEFUN ("marker-position", Fmarker_position, Smarker_position, 1, 1, 0, | |
449 "Return the position MARKER points at, as a character number.") | |
450 (marker) | |
451 Lisp_Object marker; | |
452 { | |
453 register Lisp_Object pos; | |
454 register int i; | |
455 register struct buffer *buf; | |
456 | |
457 CHECK_MARKER (marker, 0); | |
458 if (XMARKER (marker)->buffer) | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
459 return make_number (XMARKER (marker)->charpos); |
118 | 460 |
461 return Qnil; | |
462 } | |
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
463 |
118 | 464 DEFUN ("set-marker", Fset_marker, Sset_marker, 2, 3, 0, |
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
465 "Position MARKER before character number POSITION in BUFFER.\n\ |
118 | 466 BUFFER defaults to the current buffer.\n\ |
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
467 If POSITION is nil, makes marker point nowhere.\n\ |
118 | 468 Then it no longer slows down editing in any buffer.\n\ |
469 Returns MARKER.") | |
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
470 (marker, position, buffer) |
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
471 Lisp_Object marker, position, buffer; |
118 | 472 { |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
473 register int charno, bytepos; |
118 | 474 register struct buffer *b; |
475 register struct Lisp_Marker *m; | |
476 | |
477 CHECK_MARKER (marker, 0); | |
478 /* If position is nil or a marker that points nowhere, | |
479 make this marker point nowhere. */ | |
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
480 if (NILP (position) |
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
481 || (MARKERP (position) && !XMARKER (position)->buffer)) |
118 | 482 { |
483 unchain_marker (marker); | |
484 return marker; | |
485 } | |
486 | |
484 | 487 if (NILP (buffer)) |
118 | 488 b = current_buffer; |
489 else | |
490 { | |
491 CHECK_BUFFER (buffer, 1); | |
492 b = XBUFFER (buffer); | |
493 /* If buffer is dead, set marker to point nowhere. */ | |
494 if (EQ (b->name, Qnil)) | |
495 { | |
496 unchain_marker (marker); | |
497 return marker; | |
498 } | |
499 } | |
500 | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
501 m = XMARKER (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
502 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
503 /* Optimize the special case where we are copying the position |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
504 of an existing marker, and MARKER is already in the same buffer. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
505 if (MARKERP (position) && b == XMARKER (position)->buffer |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
506 && b == m->buffer) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
507 { |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
508 m->bytepos = XMARKER (position)->bytepos; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
509 m->charpos = XMARKER (position)->charpos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
510 return marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
511 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
512 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
513 CHECK_NUMBER_COERCE_MARKER (position, 1); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
514 |
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
515 charno = XINT (position); |
118 | 516 |
517 if (charno < BUF_BEG (b)) | |
518 charno = BUF_BEG (b); | |
519 if (charno > BUF_Z (b)) | |
520 charno = BUF_Z (b); | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
521 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
522 bytepos = buf_charpos_to_bytepos (b, charno); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
523 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
524 /* Every character is at least one byte. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
525 if (charno > bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
526 abort (); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
527 |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
528 m->bytepos = bytepos; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
529 m->charpos = charno; |
118 | 530 |
531 if (m->buffer != b) | |
532 { | |
533 unchain_marker (marker); | |
534 m->buffer = b; | |
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
535 m->chain = BUF_MARKERS (b); |
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
536 BUF_MARKERS (b) = marker; |
118 | 537 } |
538 | |
539 return marker; | |
540 } | |
541 | |
542 /* This version of Fset_marker won't let the position | |
543 be outside the visible part. */ | |
544 | |
545 Lisp_Object | |
546 set_marker_restricted (marker, pos, buffer) | |
547 Lisp_Object marker, pos, buffer; | |
548 { | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
549 register int charno, bytepos; |
118 | 550 register struct buffer *b; |
551 register struct Lisp_Marker *m; | |
552 | |
553 CHECK_MARKER (marker, 0); | |
554 /* If position is nil or a marker that points nowhere, | |
555 make this marker point nowhere. */ | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
556 if (NILP (pos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
557 || (MARKERP (pos) && !XMARKER (pos)->buffer)) |
118 | 558 { |
559 unchain_marker (marker); | |
560 return marker; | |
561 } | |
562 | |
484 | 563 if (NILP (buffer)) |
118 | 564 b = current_buffer; |
565 else | |
566 { | |
567 CHECK_BUFFER (buffer, 1); | |
568 b = XBUFFER (buffer); | |
569 /* If buffer is dead, set marker to point nowhere. */ | |
570 if (EQ (b->name, Qnil)) | |
571 { | |
572 unchain_marker (marker); | |
573 return marker; | |
574 } | |
575 } | |
576 | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
577 m = XMARKER (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
578 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
579 /* Optimize the special case where we are copying the position |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
580 of an existing marker, and MARKER is already in the same buffer. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
581 if (MARKERP (pos) && b == XMARKER (pos)->buffer |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
582 && b == m->buffer) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
583 { |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
584 m->bytepos = XMARKER (pos)->bytepos; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
585 m->charpos = XMARKER (pos)->charpos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
586 return marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
587 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
588 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
589 CHECK_NUMBER_COERCE_MARKER (pos, 1); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
590 |
118 | 591 charno = XINT (pos); |
592 | |
593 if (charno < BUF_BEGV (b)) | |
594 charno = BUF_BEGV (b); | |
595 if (charno > BUF_ZV (b)) | |
596 charno = BUF_ZV (b); | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
597 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
598 bytepos = buf_charpos_to_bytepos (b, charno); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
599 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
600 /* Every character is at least one byte. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
601 if (charno > bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
602 abort (); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
603 |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
604 m->bytepos = bytepos; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
605 m->charpos = charno; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
606 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
607 if (m->buffer != b) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
608 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
609 unchain_marker (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
610 m->buffer = b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
611 m->chain = BUF_MARKERS (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
612 BUF_MARKERS (b) = marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
613 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
614 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
615 return marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
616 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
617 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
618 /* Set the position of MARKER, specifying both the |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
619 character position and the corresponding byte position. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
620 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
621 Lisp_Object |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
622 set_marker_both (marker, buffer, charpos, bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
623 Lisp_Object marker, buffer; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
624 int charpos, bytepos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
625 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
626 register struct buffer *b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
627 register struct Lisp_Marker *m; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
628 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
629 CHECK_MARKER (marker, 0); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
630 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
631 if (NILP (buffer)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
632 b = current_buffer; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
633 else |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
634 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
635 CHECK_BUFFER (buffer, 1); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
636 b = XBUFFER (buffer); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
637 /* If buffer is dead, set marker to point nowhere. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
638 if (EQ (b->name, Qnil)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
639 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
640 unchain_marker (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
641 return marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
642 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
643 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
644 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
645 m = XMARKER (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
646 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
647 /* In a single-byte buffer, the two positions must be equal. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
648 if (BUF_Z (b) == BUF_Z_BYTE (b) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
649 && charpos != bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
650 abort (); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
651 /* Every character is at least one byte. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
652 if (charpos > bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
653 abort (); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
654 |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
655 m->bytepos = bytepos; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
656 m->charpos = charpos; |
118 | 657 |
658 if (m->buffer != b) | |
659 { | |
660 unchain_marker (marker); | |
661 m->buffer = b; | |
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
662 m->chain = BUF_MARKERS (b); |
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
663 BUF_MARKERS (b) = marker; |
118 | 664 } |
665 | |
666 return marker; | |
667 } | |
668 | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
669 /* This version of set_marker_both won't let the position |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
670 be outside the visible part. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
671 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
672 Lisp_Object |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
673 set_marker_restricted_both (marker, buffer, charpos, bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
674 Lisp_Object marker, buffer; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
675 int charpos, bytepos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
676 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
677 register struct buffer *b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
678 register struct Lisp_Marker *m; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
679 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
680 CHECK_MARKER (marker, 0); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
681 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
682 if (NILP (buffer)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
683 b = current_buffer; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
684 else |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
685 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
686 CHECK_BUFFER (buffer, 1); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
687 b = XBUFFER (buffer); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
688 /* If buffer is dead, set marker to point nowhere. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
689 if (EQ (b->name, Qnil)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
690 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
691 unchain_marker (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
692 return marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
693 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
694 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
695 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
696 m = XMARKER (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
697 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
698 if (charpos < BUF_BEGV (b)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
699 charpos = BUF_BEGV (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
700 if (charpos > BUF_ZV (b)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
701 charpos = BUF_ZV (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
702 if (bytepos < BUF_BEGV_BYTE (b)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
703 bytepos = BUF_BEGV_BYTE (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
704 if (bytepos > BUF_ZV_BYTE (b)) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
705 bytepos = BUF_ZV_BYTE (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
706 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
707 /* In a single-byte buffer, the two positions must be equal. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
708 if (BUF_Z (b) == BUF_Z_BYTE (b) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
709 && charpos != bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
710 abort (); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
711 /* Every character is at least one byte. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
712 if (charpos > bytepos) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
713 abort (); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
714 |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
715 m->bytepos = bytepos; |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
716 m->charpos = charpos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
717 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
718 if (m->buffer != b) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
719 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
720 unchain_marker (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
721 m->buffer = b; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
722 m->chain = BUF_MARKERS (b); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
723 BUF_MARKERS (b) = marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
724 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
725 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
726 return marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
727 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
728 |
118 | 729 /* This is called during garbage collection, |
730 so we must be careful to ignore and preserve mark bits, | |
731 including those in chain fields of markers. */ | |
732 | |
20301
6e2ea54ad704
(unchain_marker): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16418
diff
changeset
|
733 void |
118 | 734 unchain_marker (marker) |
735 register Lisp_Object marker; | |
736 { | |
737 register Lisp_Object tail, prev, next; | |
8829
6f0d48241807
(unchain_marker): Use EMACS_INT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
738 register EMACS_INT omark; |
118 | 739 register struct buffer *b; |
740 | |
741 b = XMARKER (marker)->buffer; | |
742 if (b == 0) | |
743 return; | |
744 | |
745 if (EQ (b->name, Qnil)) | |
746 abort (); | |
747 | |
22022
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
748 XMARKER (marker)->buffer = 0; |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
749 |
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
750 tail = BUF_MARKERS (b); |
118 | 751 prev = Qnil; |
28417
4b675266db04
* lisp.h (XCONS, XSTRING, XSYMBOL, XFLOAT, XPROCESS, XWINDOW, XSUBR, XBUFFER):
Ken Raeburn <raeburn@raeburn.org>
parents:
22744
diff
changeset
|
752 while (! GC_NILP (tail)) |
118 | 753 { |
754 next = XMARKER (tail)->chain; | |
755 XUNMARK (next); | |
756 | |
757 if (XMARKER (marker) == XMARKER (tail)) | |
758 { | |
484 | 759 if (NILP (prev)) |
118 | 760 { |
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
761 BUF_MARKERS (b) = next; |
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
762 /* Deleting first marker from the buffer's chain. Crash |
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
763 if new first marker in chain does not say it belongs |
10999
84076f6a1f1b
(unchain_marker): Allow differing buffers
Richard M. Stallman <rms@gnu.org>
parents:
10315
diff
changeset
|
764 to the same buffer, or at least that they have the same |
84076f6a1f1b
(unchain_marker): Allow differing buffers
Richard M. Stallman <rms@gnu.org>
parents:
10315
diff
changeset
|
765 base buffer. */ |
84076f6a1f1b
(unchain_marker): Allow differing buffers
Richard M. Stallman <rms@gnu.org>
parents:
10315
diff
changeset
|
766 if (!NILP (next) && b->text != XMARKER (next)->buffer->text) |
118 | 767 abort (); |
768 } | |
769 else | |
770 { | |
771 omark = XMARKBIT (XMARKER (prev)->chain); | |
772 XMARKER (prev)->chain = next; | |
773 XSETMARKBIT (XMARKER (prev)->chain, omark); | |
774 } | |
22022
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
775 /* We have removed the marker from the chain; |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
776 no need to scan the rest of the chain. */ |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
777 return; |
118 | 778 } |
779 else | |
780 prev = tail; | |
781 tail = next; | |
782 } | |
22022
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
783 |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
784 /* Marker was not in its chain. */ |
64ac294567a6
(unchain_marker): Abort if the marker is not in its buffer's chain.
Richard M. Stallman <rms@gnu.org>
parents:
21528
diff
changeset
|
785 abort (); |
118 | 786 } |
787 | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
788 /* Return the char position of marker MARKER, as a C integer. */ |
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
789 |
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
790 int |
118 | 791 marker_position (marker) |
792 Lisp_Object marker; | |
793 { | |
794 register struct Lisp_Marker *m = XMARKER (marker); | |
795 register struct buffer *buf = m->buffer; | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
796 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
797 if (!buf) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
798 error ("Marker does not point anywhere"); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
799 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
800 return m->charpos; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
801 } |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
802 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
803 /* Return the byte position of marker MARKER, as a C integer. */ |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
804 |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
805 int |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
806 marker_byte_position (marker) |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
807 Lisp_Object marker; |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
808 { |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
809 register struct Lisp_Marker *m = XMARKER (marker); |
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
810 register struct buffer *buf = m->buffer; |
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
811 register int i = m->bytepos; |
118 | 812 |
813 if (!buf) | |
814 error ("Marker does not point anywhere"); | |
815 | |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
816 if (i < BUF_BEG_BYTE (buf) || i > BUF_Z_BYTE (buf)) |
118 | 817 abort (); |
818 | |
819 return i; | |
820 } | |
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
821 |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
822 DEFUN ("copy-marker", Fcopy_marker, Scopy_marker, 1, 2, 0, |
118 | 823 "Return a new marker pointing at the same place as MARKER.\n\ |
824 If argument is a number, makes a new marker pointing\n\ | |
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
825 at that position in the current buffer.\n\ |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
826 The optional argument TYPE specifies the insertion type of the new marker;\n\ |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
827 see `marker-insertion-type'.") |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
828 (marker, type) |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
829 register Lisp_Object marker, type; |
118 | 830 { |
831 register Lisp_Object new; | |
832 | |
22744
79ca732d9740
(Fcopy_marker): Make return from wrong_type_argument
Karl Heuer <kwzh@gnu.org>
parents:
22022
diff
changeset
|
833 if (! (INTEGERP (marker) || MARKERP (marker))) |
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
834 marker = wrong_type_argument (Qinteger_or_marker_p, marker); |
22744
79ca732d9740
(Fcopy_marker): Make return from wrong_type_argument
Karl Heuer <kwzh@gnu.org>
parents:
22022
diff
changeset
|
835 |
79ca732d9740
(Fcopy_marker): Make return from wrong_type_argument
Karl Heuer <kwzh@gnu.org>
parents:
22022
diff
changeset
|
836 new = Fmake_marker (); |
79ca732d9740
(Fcopy_marker): Make return from wrong_type_argument
Karl Heuer <kwzh@gnu.org>
parents:
22022
diff
changeset
|
837 Fset_marker (new, marker, |
79ca732d9740
(Fcopy_marker): Make return from wrong_type_argument
Karl Heuer <kwzh@gnu.org>
parents:
22022
diff
changeset
|
838 (MARKERP (marker) ? Fmarker_buffer (marker) : Qnil)); |
79ca732d9740
(Fcopy_marker): Make return from wrong_type_argument
Karl Heuer <kwzh@gnu.org>
parents:
22022
diff
changeset
|
839 XMARKER (new)->insertion_type = !NILP (type); |
79ca732d9740
(Fcopy_marker): Make return from wrong_type_argument
Karl Heuer <kwzh@gnu.org>
parents:
22022
diff
changeset
|
840 return new; |
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
841 } |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
842 |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
843 DEFUN ("marker-insertion-type", Fmarker_insertion_type, |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
844 Smarker_insertion_type, 1, 1, 0, |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
845 "Return insertion type of MARKER: t if it stays after inserted text.\n\ |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
846 nil means the marker stays before text inserted there.") |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
847 (marker) |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
848 register Lisp_Object marker; |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
849 { |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
850 register Lisp_Object buf; |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
851 CHECK_MARKER (marker, 0); |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
852 return XMARKER (marker)->insertion_type ? Qt : Qnil; |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
853 } |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
854 |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
855 DEFUN ("set-marker-insertion-type", Fset_marker_insertion_type, |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
856 Sset_marker_insertion_type, 2, 2, 0, |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
857 "Set the insertion-type of MARKER to TYPE.\n\ |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
858 If TYPE is t, it means the marker advances when you insert text at it.\n\ |
13327
e518c2be8d7b
(Fset_marker_insertion_type): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
12999
diff
changeset
|
859 If TYPE is nil, it means the marker stays behind when you insert text at it.") |
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
860 (marker, type) |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
861 Lisp_Object marker, type; |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
862 { |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
863 CHECK_MARKER (marker, 0); |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
864 |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
865 XMARKER (marker)->insertion_type = ! NILP (type); |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
866 return type; |
118 | 867 } |
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
868 |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
869 DEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, Sbuffer_has_markers_at, |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
870 1, 1, 0, |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
871 "Return t if there are markers pointing at POSITION in the current buffer.") |
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
872 (position) |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
873 Lisp_Object position; |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
874 { |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
875 register Lisp_Object tail; |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
876 register int charno; |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
877 |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
878 charno = XINT (position); |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
879 |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
880 if (charno < BEG) |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
881 charno = BEG; |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
882 if (charno > Z) |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
883 charno = Z; |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
884 |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
885 for (tail = BUF_MARKERS (current_buffer); |
21458
96dd58f4f3bb
(Fbuffer_has_markers_at): Fix termination condition.
Karl Heuer <kwzh@gnu.org>
parents:
21332
diff
changeset
|
886 !NILP (tail); |
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
887 tail = XMARKER (tail)->chain) |
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
888 if (XMARKER (tail)->charpos == charno) |
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
889 return Qt; |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
890 |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
891 return Qnil; |
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
892 } |
118 | 893 |
20301
6e2ea54ad704
(unchain_marker): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16418
diff
changeset
|
894 void |
118 | 895 syms_of_marker () |
896 { | |
897 defsubr (&Smarker_position); | |
898 defsubr (&Smarker_buffer); | |
899 defsubr (&Sset_marker); | |
900 defsubr (&Scopy_marker); | |
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
901 defsubr (&Smarker_insertion_type); |
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
902 defsubr (&Sset_marker_insertion_type); |
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
903 defsubr (&Sbuffer_has_markers_at); |
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
904 |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
905 DEFVAR_BOOL ("byte-debug-flag", &byte_debug_flag, |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
906 "Non-nil enables debugging checks in byte/char position conversions."); |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
907 byte_debug_flag = 0; |
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
908 |
118 | 909 } |