Mercurial > emacs
annotate src/marker.c @ 21514:fa9ff387d260
Fix -Wimplicit warnings.
| author | Andreas Schwab <schwab@suse.de> |
|---|---|
| date | Tue, 14 Apr 1998 12:25:56 +0000 |
| parents | 837148a1541f |
| children | cabecb23d48c |
| 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 |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
35 /* 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
|
36 |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
37 static int byte_debug_flag; |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
38 |
| 21514 | 39 void |
|
20678
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
40 clear_charpos_cache (b) |
|
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
41 struct buffer *b; |
|
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
42 { |
|
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
43 if (cached_buffer == b) |
|
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
44 cached_buffer = 0; |
|
4c69e3503cfc
(clear_charpos_cache): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20563
diff
changeset
|
45 } |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
46 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
47 /* 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
|
48 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
49 /* 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
|
50 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
|
51 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
|
52 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
|
53 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
54 /* 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
|
55 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
56 /* 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
|
57 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
|
58 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
|
59 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
60 #define CONSIDER(CHARPOS, BYTEPOS) \ |
|
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 int this_charpos = (CHARPOS); \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
63 int changed = 0; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
64 \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
65 if (this_charpos == charpos) \ |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
66 { \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
67 int value = (BYTEPOS); \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
68 if (byte_debug_flag) \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
69 byte_char_debug_check (b, charpos, value); \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
70 return value; \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
71 } \ |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
72 else if (this_charpos > charpos) \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
73 { \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
74 if (this_charpos < best_above) \ |
|
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 best_above = this_charpos; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
77 best_above_byte = (BYTEPOS); \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
78 changed = 1; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
79 } \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
80 } \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
81 else if (this_charpos > best_below) \ |
|
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 best_below = this_charpos; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
84 best_below_byte = (BYTEPOS); \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
85 changed = 1; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
86 } \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
87 \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
88 if (changed) \ |
|
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 (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
|
91 { \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
92 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
|
93 if (byte_debug_flag) \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
94 byte_char_debug_check (b, charpos, value); \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
95 return value; \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
96 } \ |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
97 } \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
98 } |
|
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 int |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
101 byte_char_debug_check (b, charpos, bytepos) |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
102 struct buffer *b; |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
103 int charpos, bytepos; |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
104 { |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
105 int nchars = 0; |
|
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 if (bytepos > BUF_GPT_BYTE (b)) |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
108 { |
|
21219
29d2cf14040a
(byte_char_debug_check): Call multibyte_chars_in_text
Kenichi Handa <handa@m17n.org>
parents:
20872
diff
changeset
|
109 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
|
110 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
|
111 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
|
112 bytepos - BUF_GPT_BYTE (b)); |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
113 } |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
114 else |
|
21219
29d2cf14040a
(byte_char_debug_check): Call multibyte_chars_in_text
Kenichi Handa <handa@m17n.org>
parents:
20872
diff
changeset
|
115 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
|
116 bytepos - BUF_BEG_BYTE (b)); |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
117 |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
118 if (charpos - 1 != nchars) |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
119 abort (); |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
120 } |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
121 |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
122 int |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
123 charpos_to_bytepos (charpos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
124 int charpos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
125 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
126 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
|
127 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
128 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
129 int |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
130 buf_charpos_to_bytepos (b, charpos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
131 struct buffer *b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
132 int charpos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
133 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
134 Lisp_Object tail; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
135 int best_above, best_above_byte; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
136 int best_below, best_below_byte; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
137 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
138 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
|
139 abort (); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
140 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
141 best_above = BUF_Z (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
142 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
|
143 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
144 /* 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
|
145 each character must be one byte. |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
146 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
|
147 if (best_above == best_above_byte) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
148 return charpos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
149 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
150 best_below = 1; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
151 best_below_byte = 1; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
152 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
153 /* 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
|
154 the closest known point above CHARPOS, |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
155 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
|
156 the closest known point below CHARPOS, |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
157 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
158 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
|
159 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
|
160 we interpolate the result immediately. */ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
161 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
162 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
|
163 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
|
164 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
|
165 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
|
166 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
167 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
|
168 CONSIDER (cached_charpos, cached_bytepos); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
169 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
170 tail = BUF_MARKERS (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
171 while (XSYMBOL (tail) != XSYMBOL (Qnil)) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
172 { |
|
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
173 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
|
174 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
175 /* 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
|
176 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
|
177 scan the intervening chars directly now. */ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
178 if (best_above - best_below < 50) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
179 break; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
180 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
181 tail = XMARKER (tail)->chain; |
|
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 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
184 /* 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
|
185 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
|
186 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
|
187 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
188 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
|
189 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
190 int record = charpos - best_below > 5000; |
|
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 while (best_below != charpos) |
|
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 best_below++; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
195 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
|
196 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
197 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
198 /* 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
|
199 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
|
200 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
|
201 if (record) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
202 { |
|
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
203 Lisp_Object marker, buffer; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
204 marker = Fmake_marker (); |
|
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
205 XSETBUFFER (buffer, b); |
|
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
206 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
|
207 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
208 |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
209 if (byte_debug_flag) |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
210 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
|
211 |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
212 cached_buffer = b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
213 cached_modiff = BUF_MODIFF (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
214 cached_charpos = best_below; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
215 cached_bytepos = best_below_byte; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
216 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
217 return 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 else |
|
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 int record = best_above - charpos > 5000; |
|
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 while (best_above != charpos) |
|
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 best_above--; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
226 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
|
227 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
228 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
229 /* 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
|
230 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
|
231 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
|
232 if (record) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
233 { |
|
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
234 Lisp_Object marker, buffer; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
235 marker = Fmake_marker (); |
|
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
236 XSETBUFFER (buffer, b); |
|
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
237 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
|
238 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
239 |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
240 if (byte_debug_flag) |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
241 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
|
242 |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
243 cached_buffer = b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
244 cached_modiff = BUF_MODIFF (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
245 cached_charpos = best_above; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
246 cached_bytepos = best_above_byte; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
247 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
248 return 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 } |
|
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 #undef CONSIDER |
|
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 /* 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
|
255 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
256 /* 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
|
257 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
|
258 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
259 #define CONSIDER(BYTEPOS, CHARPOS) \ |
|
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 int this_bytepos = (BYTEPOS); \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
262 int changed = 0; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
263 \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
264 if (this_bytepos == bytepos) \ |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
265 { \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
266 int value = (CHARPOS); \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
267 if (byte_debug_flag) \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
268 byte_char_debug_check (b, value, bytepos); \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
269 return value; \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
270 } \ |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
271 else if (this_bytepos > bytepos) \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
272 { \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
273 if (this_bytepos < best_above_byte) \ |
|
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 best_above = (CHARPOS); \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
276 best_above_byte = this_bytepos; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
277 changed = 1; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
278 } \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
279 } \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
280 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
|
281 { \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
282 best_below = (CHARPOS); \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
283 best_below_byte = this_bytepos; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
284 changed = 1; \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
285 } \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
286 \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
287 if (changed) \ |
|
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 (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
|
290 { \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
291 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
|
292 if (byte_debug_flag) \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
293 byte_char_debug_check (b, value, bytepos); \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
294 return value; \ |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
295 } \ |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
296 } \ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
297 } |
|
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 int |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
300 bytepos_to_charpos (bytepos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
301 int bytepos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
302 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
303 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
|
304 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
305 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
306 int |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
307 buf_bytepos_to_charpos (b, bytepos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
308 struct buffer *b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
309 int bytepos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
310 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
311 Lisp_Object tail; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
312 int best_above, best_above_byte; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
313 int best_below, best_below_byte; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
314 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
315 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
|
316 abort (); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
317 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
318 best_above = BUF_Z (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
319 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
|
320 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
321 /* 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
|
322 each character must be one byte. |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
323 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
|
324 if (best_above == best_above_byte) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
325 return bytepos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
326 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
327 best_below = 1; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
328 best_below_byte = 1; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
329 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 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
|
334 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
335 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
|
336 CONSIDER (cached_bytepos, cached_charpos); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
337 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
338 tail = BUF_MARKERS (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
339 while (XSYMBOL (tail) != XSYMBOL (Qnil)) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
340 { |
|
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
341 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
|
342 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
343 /* 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
|
344 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
|
345 scan the intervening chars directly now. */ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
346 if (best_above - best_below < 50) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
347 break; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
348 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
349 tail = XMARKER (tail)->chain; |
|
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 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
352 /* 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
|
353 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
|
354 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
|
355 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
356 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
|
357 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
358 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
|
359 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
360 while (best_below_byte < bytepos) |
|
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 best_below++; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
363 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
|
364 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
365 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
366 /* 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
|
367 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
|
368 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
|
369 if (record) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
370 { |
|
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
371 Lisp_Object marker, buffer; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
372 marker = Fmake_marker (); |
|
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
373 XSETBUFFER (buffer, b); |
|
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
374 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
|
375 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
376 |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
377 if (byte_debug_flag) |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
378 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
|
379 |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
380 cached_buffer = b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
381 cached_modiff = BUF_MODIFF (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
382 cached_charpos = best_below; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
383 cached_bytepos = best_below_byte; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
384 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
385 return best_below; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
386 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
387 else |
|
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 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
|
390 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
391 while (best_above_byte > bytepos) |
|
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 best_above--; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
394 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
|
395 } |
|
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 /* 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
|
398 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
|
399 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
|
400 if (record) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
401 { |
|
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
402 Lisp_Object marker, buffer; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
403 marker = Fmake_marker (); |
|
21497
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
404 XSETBUFFER (buffer, b); |
|
837148a1541f
(buf_charpos_to_bytepos, buf_bytepos_to_charpos):
Karl Heuer <kwzh@gnu.org>
parents:
21458
diff
changeset
|
405 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
|
406 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
407 |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
408 if (byte_debug_flag) |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
409 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
|
410 |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
411 cached_buffer = b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
412 cached_modiff = BUF_MODIFF (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
413 cached_charpos = best_above; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
414 cached_bytepos = best_above_byte; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
415 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
416 return best_above; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
417 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
418 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
419 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
420 #undef CONSIDER |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
421 |
| 118 | 422 /* Operations on markers. */ |
| 423 | |
| 424 DEFUN ("marker-buffer", Fmarker_buffer, Smarker_buffer, 1, 1, 0, | |
| 425 "Return the buffer that MARKER points into, or nil if none.\n\ | |
| 426 Returns nil if MARKER points into a dead buffer.") | |
| 427 (marker) | |
| 428 register Lisp_Object marker; | |
| 429 { | |
| 430 register Lisp_Object buf; | |
| 431 CHECK_MARKER (marker, 0); | |
| 432 if (XMARKER (marker)->buffer) | |
| 433 { | |
|
9275
bb50d17f7441
(Fmarker_buffer): Use new accessor macros instead of calling XSET directly.
Karl Heuer <kwzh@gnu.org>
parents:
9121
diff
changeset
|
434 XSETBUFFER (buf, XMARKER (marker)->buffer); |
| 118 | 435 /* Return marker's buffer only if it is not dead. */ |
| 484 | 436 if (!NILP (XBUFFER (buf)->name)) |
| 118 | 437 return buf; |
| 438 } | |
| 439 return Qnil; | |
| 440 } | |
| 441 | |
| 442 DEFUN ("marker-position", Fmarker_position, Smarker_position, 1, 1, 0, | |
| 443 "Return the position MARKER points at, as a character number.") | |
| 444 (marker) | |
| 445 Lisp_Object marker; | |
| 446 { | |
| 447 register Lisp_Object pos; | |
| 448 register int i; | |
| 449 register struct buffer *buf; | |
| 450 | |
| 451 CHECK_MARKER (marker, 0); | |
| 452 if (XMARKER (marker)->buffer) | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
453 return make_number (XMARKER (marker)->charpos); |
| 118 | 454 |
| 455 return Qnil; | |
| 456 } | |
|
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
457 |
| 118 | 458 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
|
459 "Position MARKER before character number POSITION in BUFFER.\n\ |
| 118 | 460 BUFFER defaults to the current buffer.\n\ |
|
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
461 If POSITION is nil, makes marker point nowhere.\n\ |
| 118 | 462 Then it no longer slows down editing in any buffer.\n\ |
| 463 Returns MARKER.") | |
|
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
464 (marker, position, buffer) |
|
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
465 Lisp_Object marker, position, buffer; |
| 118 | 466 { |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
467 register int charno, bytepos; |
| 118 | 468 register struct buffer *b; |
| 469 register struct Lisp_Marker *m; | |
| 470 | |
| 471 CHECK_MARKER (marker, 0); | |
| 472 /* If position is nil or a marker that points nowhere, | |
| 473 make this marker point nowhere. */ | |
|
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
474 if (NILP (position) |
|
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
475 || (MARKERP (position) && !XMARKER (position)->buffer)) |
| 118 | 476 { |
| 477 unchain_marker (marker); | |
| 478 return marker; | |
| 479 } | |
| 480 | |
| 484 | 481 if (NILP (buffer)) |
| 118 | 482 b = current_buffer; |
| 483 else | |
| 484 { | |
| 485 CHECK_BUFFER (buffer, 1); | |
| 486 b = XBUFFER (buffer); | |
| 487 /* If buffer is dead, set marker to point nowhere. */ | |
| 488 if (EQ (b->name, Qnil)) | |
| 489 { | |
| 490 unchain_marker (marker); | |
| 491 return marker; | |
| 492 } | |
| 493 } | |
| 494 | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
495 m = XMARKER (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
496 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
497 /* 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
|
498 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
|
499 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
|
500 && b == m->buffer) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
501 { |
|
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
502 m->bytepos = XMARKER (position)->bytepos; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
503 m->charpos = XMARKER (position)->charpos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
504 return marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
505 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
506 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
507 CHECK_NUMBER_COERCE_MARKER (position, 1); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
508 |
|
14082
c6a1708f37d4
(Fset_marker): Harmonize arguments with documentation.
Erik Naggum <erik@naggum.no>
parents:
13327
diff
changeset
|
509 charno = XINT (position); |
| 118 | 510 |
| 511 if (charno < BUF_BEG (b)) | |
| 512 charno = BUF_BEG (b); | |
| 513 if (charno > BUF_Z (b)) | |
| 514 charno = BUF_Z (b); | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
515 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
516 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
|
517 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
518 /* 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
|
519 if (charno > bytepos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
520 abort (); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
521 |
|
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
522 m->bytepos = bytepos; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
523 m->charpos = charno; |
| 118 | 524 |
| 525 if (m->buffer != b) | |
| 526 { | |
| 527 unchain_marker (marker); | |
| 528 m->buffer = b; | |
|
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
529 m->chain = BUF_MARKERS (b); |
|
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
530 BUF_MARKERS (b) = marker; |
| 118 | 531 } |
| 532 | |
| 533 return marker; | |
| 534 } | |
| 535 | |
| 536 /* This version of Fset_marker won't let the position | |
| 537 be outside the visible part. */ | |
| 538 | |
| 539 Lisp_Object | |
| 540 set_marker_restricted (marker, pos, buffer) | |
| 541 Lisp_Object marker, pos, buffer; | |
| 542 { | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
543 register int charno, bytepos; |
| 118 | 544 register struct buffer *b; |
| 545 register struct Lisp_Marker *m; | |
| 546 | |
| 547 CHECK_MARKER (marker, 0); | |
| 548 /* If position is nil or a marker that points nowhere, | |
| 549 make this marker point nowhere. */ | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
550 if (NILP (pos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
551 || (MARKERP (pos) && !XMARKER (pos)->buffer)) |
| 118 | 552 { |
| 553 unchain_marker (marker); | |
| 554 return marker; | |
| 555 } | |
| 556 | |
| 484 | 557 if (NILP (buffer)) |
| 118 | 558 b = current_buffer; |
| 559 else | |
| 560 { | |
| 561 CHECK_BUFFER (buffer, 1); | |
| 562 b = XBUFFER (buffer); | |
| 563 /* If buffer is dead, set marker to point nowhere. */ | |
| 564 if (EQ (b->name, Qnil)) | |
| 565 { | |
| 566 unchain_marker (marker); | |
| 567 return marker; | |
| 568 } | |
| 569 } | |
| 570 | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
571 m = XMARKER (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
572 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
573 /* 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
|
574 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
|
575 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
|
576 && b == m->buffer) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
577 { |
|
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
578 m->bytepos = XMARKER (pos)->bytepos; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
579 m->charpos = XMARKER (pos)->charpos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
580 return marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
581 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
582 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
583 CHECK_NUMBER_COERCE_MARKER (pos, 1); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
584 |
| 118 | 585 charno = XINT (pos); |
| 586 | |
| 587 if (charno < BUF_BEGV (b)) | |
| 588 charno = BUF_BEGV (b); | |
| 589 if (charno > BUF_ZV (b)) | |
| 590 charno = BUF_ZV (b); | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
591 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
592 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
|
593 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
594 /* 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
|
595 if (charno > bytepos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
596 abort (); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
597 |
|
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
598 m->bytepos = bytepos; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
599 m->charpos = charno; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
600 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
601 if (m->buffer != b) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
602 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
603 unchain_marker (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
604 m->buffer = b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
605 m->chain = BUF_MARKERS (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
606 BUF_MARKERS (b) = marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
607 } |
|
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 return marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
610 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
611 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
612 /* 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
|
613 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
|
614 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
615 Lisp_Object |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
616 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
|
617 Lisp_Object marker, buffer; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
618 int charpos, bytepos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
619 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
620 register struct buffer *b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
621 register struct Lisp_Marker *m; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
622 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
623 CHECK_MARKER (marker, 0); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
624 /* If position is nil or a marker that points nowhere, |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
625 make this marker point nowhere. */ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
626 if (NILP (charpos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
627 || (MARKERP (charpos) && !XMARKER (charpos)->buffer)) |
|
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 unchain_marker (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
630 return marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
631 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
632 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
633 CHECK_NUMBER_COERCE_MARKER (charpos, 1); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
634 if (NILP (buffer)) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
635 b = current_buffer; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
636 else |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
637 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
638 CHECK_BUFFER (buffer, 1); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
639 b = XBUFFER (buffer); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
640 /* 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
|
641 if (EQ (b->name, Qnil)) |
|
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 unchain_marker (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
644 return marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
645 } |
|
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 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
648 m = XMARKER (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
649 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
650 /* 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
|
651 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
|
652 && 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 /* 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
|
655 if (charpos > bytepos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
656 abort (); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
657 |
|
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
658 m->bytepos = bytepos; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
659 m->charpos = charpos; |
| 118 | 660 |
| 661 if (m->buffer != b) | |
| 662 { | |
| 663 unchain_marker (marker); | |
| 664 m->buffer = b; | |
|
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
665 m->chain = BUF_MARKERS (b); |
|
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
666 BUF_MARKERS (b) = marker; |
| 118 | 667 } |
| 668 | |
| 669 return marker; | |
| 670 } | |
| 671 | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
672 /* 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
|
673 be outside the visible part. */ |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
674 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
675 Lisp_Object |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
676 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
|
677 Lisp_Object marker, buffer; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
678 int charpos, bytepos; |
|
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 register struct buffer *b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
681 register struct Lisp_Marker *m; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
682 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
683 CHECK_MARKER (marker, 0); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
684 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
685 if (NILP (buffer)) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
686 b = current_buffer; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
687 else |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
688 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
689 CHECK_BUFFER (buffer, 1); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
690 b = XBUFFER (buffer); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
691 /* 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
|
692 if (EQ (b->name, Qnil)) |
|
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 unchain_marker (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
695 return marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
696 } |
|
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 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
699 m = XMARKER (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
700 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
701 if (charpos < BUF_BEGV (b)) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
702 charpos = BUF_BEGV (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
703 if (charpos > BUF_ZV (b)) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
704 charpos = BUF_ZV (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
705 if (bytepos < BUF_BEGV_BYTE (b)) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
706 bytepos = BUF_BEGV_BYTE (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
707 if (bytepos > BUF_ZV_BYTE (b)) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
708 bytepos = BUF_ZV_BYTE (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
709 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
710 /* 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
|
711 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
|
712 && 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 /* 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
|
715 if (charpos > bytepos) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
716 abort (); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
717 |
|
20563
d4de7ffb567d
(buf_bytepos_to_charpos): Use marker bytepos, not bufpos.
Richard M. Stallman <rms@gnu.org>
parents:
20537
diff
changeset
|
718 m->bytepos = bytepos; |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
719 m->charpos = charpos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
720 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
721 if (m->buffer != b) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
722 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
723 unchain_marker (marker); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
724 m->buffer = b; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
725 m->chain = BUF_MARKERS (b); |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
726 BUF_MARKERS (b) = 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 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
729 return marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
730 } |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
731 |
| 118 | 732 /* This is called during garbage collection, |
| 733 so we must be careful to ignore and preserve mark bits, | |
| 734 including those in chain fields of markers. */ | |
| 735 | |
|
20301
6e2ea54ad704
(unchain_marker): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16418
diff
changeset
|
736 void |
| 118 | 737 unchain_marker (marker) |
| 738 register Lisp_Object marker; | |
| 739 { | |
| 740 register Lisp_Object tail, prev, next; | |
|
8829
6f0d48241807
(unchain_marker): Use EMACS_INT.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
741 register EMACS_INT omark; |
| 118 | 742 register struct buffer *b; |
| 743 | |
| 744 b = XMARKER (marker)->buffer; | |
| 745 if (b == 0) | |
| 746 return; | |
| 747 | |
| 748 if (EQ (b->name, Qnil)) | |
| 749 abort (); | |
| 750 | |
|
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
751 tail = BUF_MARKERS (b); |
| 118 | 752 prev = Qnil; |
| 753 while (XSYMBOL (tail) != XSYMBOL (Qnil)) | |
| 754 { | |
| 755 next = XMARKER (tail)->chain; | |
| 756 XUNMARK (next); | |
| 757 | |
| 758 if (XMARKER (marker) == XMARKER (tail)) | |
| 759 { | |
| 484 | 760 if (NILP (prev)) |
| 118 | 761 { |
|
10315
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
762 BUF_MARKERS (b) = next; |
|
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
763 /* Deleting first marker from the buffer's chain. Crash |
|
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
764 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
|
765 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
|
766 base buffer. */ |
|
84076f6a1f1b
(unchain_marker): Allow differing buffers
Richard M. Stallman <rms@gnu.org>
parents:
10315
diff
changeset
|
767 if (!NILP (next) && b->text != XMARKER (next)->buffer->text) |
| 118 | 768 abort (); |
| 769 } | |
| 770 else | |
| 771 { | |
| 772 omark = XMARKBIT (XMARKER (prev)->chain); | |
| 773 XMARKER (prev)->chain = next; | |
| 774 XSETMARKBIT (XMARKER (prev)->chain, omark); | |
| 775 } | |
| 776 break; | |
| 777 } | |
| 778 else | |
| 779 prev = tail; | |
| 780 tail = next; | |
| 781 } | |
| 782 XMARKER (marker)->buffer = 0; | |
| 783 } | |
| 784 | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
785 /* 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
|
786 |
|
c78d0bb85d30
Use BUF_MARKERS throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9315
diff
changeset
|
787 int |
| 118 | 788 marker_position (marker) |
| 789 Lisp_Object marker; | |
| 790 { | |
| 791 register struct Lisp_Marker *m = XMARKER (marker); | |
| 792 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
|
793 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
794 if (!buf) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
795 error ("Marker does not point anywhere"); |
|
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 return m->charpos; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
798 } |
|
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 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
|
801 |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
802 int |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
803 marker_byte_position (marker) |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
804 Lisp_Object marker; |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
805 { |
|
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
806 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
|
807 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
|
808 register int i = m->bytepos; |
| 118 | 809 |
| 810 if (!buf) | |
| 811 error ("Marker does not point anywhere"); | |
| 812 | |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
813 if (i < BUF_BEG_BYTE (buf) || i > BUF_Z_BYTE (buf)) |
| 118 | 814 abort (); |
| 815 | |
| 816 return i; | |
| 817 } | |
|
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
818 |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
819 DEFUN ("copy-marker", Fcopy_marker, Scopy_marker, 1, 2, 0, |
| 118 | 820 "Return a new marker pointing at the same place as MARKER.\n\ |
| 821 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
|
822 at that position in the current buffer.\n\ |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
823 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
|
824 see `marker-insertion-type'.") |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
825 (marker, type) |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
826 register Lisp_Object marker, type; |
| 118 | 827 { |
| 828 register Lisp_Object new; | |
| 829 | |
|
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
830 if (INTEGERP (marker) || MARKERP (marker)) |
| 118 | 831 { |
|
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
832 new = Fmake_marker (); |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
833 Fset_marker (new, marker, |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
834 (MARKERP (marker) ? Fmarker_buffer (marker) : Qnil)); |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
835 XMARKER (new)->insertion_type = !NILP (type); |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
836 return new; |
| 118 | 837 } |
|
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
838 else |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
839 marker = wrong_type_argument (Qinteger_or_marker_p, marker); |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
840 } |
|
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 DEFUN ("marker-insertion-type", Fmarker_insertion_type, |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
843 Smarker_insertion_type, 1, 1, 0, |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
844 "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
|
845 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
|
846 (marker) |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
847 register Lisp_Object marker; |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
848 { |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
849 register Lisp_Object buf; |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
850 CHECK_MARKER (marker, 0); |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
851 return XMARKER (marker)->insertion_type ? Qt : Qnil; |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
852 } |
|
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 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
|
855 Sset_marker_insertion_type, 2, 2, 0, |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
856 "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
|
857 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
|
858 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
|
859 (marker, type) |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
860 Lisp_Object marker, type; |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
861 { |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
862 CHECK_MARKER (marker, 0); |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
863 |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
864 XMARKER (marker)->insertion_type = ! NILP (type); |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
865 return type; |
| 118 | 866 } |
|
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
867 |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
868 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
|
869 1, 1, 0, |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
870 "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
|
871 (position) |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
872 Lisp_Object position; |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
873 { |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
874 register Lisp_Object tail; |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
875 register int charno; |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
876 |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
877 charno = XINT (position); |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
878 |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
879 if (charno < BEG) |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
880 charno = BEG; |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
881 if (charno > Z) |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
882 charno = Z; |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
883 |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
884 for (tail = BUF_MARKERS (current_buffer); |
|
21458
96dd58f4f3bb
(Fbuffer_has_markers_at): Fix termination condition.
Karl Heuer <kwzh@gnu.org>
parents:
21332
diff
changeset
|
885 !NILP (tail); |
|
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
886 tail = XMARKER (tail)->chain) |
|
20537
cc87b03bad13
(marker_byte_position): Renamed from marker_position.
Richard M. Stallman <rms@gnu.org>
parents:
20301
diff
changeset
|
887 if (XMARKER (tail)->charpos == charno) |
|
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
888 return Qt; |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
889 |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
890 return Qnil; |
|
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
891 } |
| 118 | 892 |
|
20301
6e2ea54ad704
(unchain_marker): Define as returning nothing.
Andreas Schwab <schwab@suse.de>
parents:
16418
diff
changeset
|
893 void |
| 118 | 894 syms_of_marker () |
| 895 { | |
| 896 defsubr (&Smarker_position); | |
| 897 defsubr (&Smarker_buffer); | |
| 898 defsubr (&Sset_marker); | |
| 899 defsubr (&Scopy_marker); | |
|
12999
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
900 defsubr (&Smarker_insertion_type); |
|
b889a50f71db
(Fcopy_marker): New arg TYPE.
Richard M. Stallman <rms@gnu.org>
parents:
12244
diff
changeset
|
901 defsubr (&Sset_marker_insertion_type); |
|
16418
cf4260218aec
(Fbuffer_has_markers_at): New function.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
902 defsubr (&Sbuffer_has_markers_at); |
|
20872
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
903 |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
904 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
|
905 "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
|
906 byte_debug_flag = 0; |
|
431f875501a6
(byte_char_debug_check): New function.
Richard M. Stallman <rms@gnu.org>
parents:
20706
diff
changeset
|
907 |
| 118 | 908 } |
