Mercurial > hg > xemacs-beta
comparison src/buffer.h @ 428:3ecd8885ac67 r21-2-22
Import from CVS: tag r21-2-22
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:28:15 +0200 |
parents | |
children | 9d177e8d4150 |
comparison
equal
deleted
inserted
replaced
427:0a0253eac470 | 428:3ecd8885ac67 |
---|---|
1 /* Header file for the buffer manipulation primitives. | |
2 Copyright (C) 1985, 1986, 1992, 1993, 1994, 1995 | |
3 Free Software Foundation, Inc. | |
4 Copyright (C) 1995 Sun Microsystems, Inc. | |
5 | |
6 This file is part of XEmacs. | |
7 | |
8 XEmacs is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
10 Free Software Foundation; either version 2, or (at your option) any | |
11 later version. | |
12 | |
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with XEmacs; see the file COPYING. If not, write to | |
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
21 Boston, MA 02111-1307, USA. */ | |
22 | |
23 /* Synched up with: FSF 19.30. */ | |
24 | |
25 /* Authorship: | |
26 | |
27 FSF: long ago. | |
28 JWZ: separated out bufslots.h, early in Lemacs. | |
29 Ben Wing: almost completely rewritten for Mule, 19.12. | |
30 */ | |
31 | |
32 #ifndef _XEMACS_BUFFER_H_ | |
33 #define _XEMACS_BUFFER_H_ | |
34 | |
35 #ifdef MULE | |
36 #include "mule-charset.h" | |
37 #endif | |
38 | |
39 /************************************************************************/ | |
40 /* */ | |
41 /* definition of Lisp buffer object */ | |
42 /* */ | |
43 /************************************************************************/ | |
44 | |
45 /* Note: we keep both Bytind and Bufpos versions of some of the | |
46 important buffer positions because they are accessed so much. | |
47 If we didn't do this, we would constantly be invalidating the | |
48 bufpos<->bytind cache under Mule. | |
49 | |
50 Note that under non-Mule, both versions will always be the | |
51 same so we don't really need to keep track of them. But it | |
52 simplifies the logic to go ahead and do so all the time and | |
53 the memory loss is insignificant. */ | |
54 | |
55 /* Formerly, it didn't much matter what went inside the struct buffer_text | |
56 and what went outside it. Now it does, with the advent of "indirect | |
57 buffers" that share text with another buffer. An indirect buffer | |
58 shares the same *text* as another buffer, but has its own buffer-local | |
59 variables, its own accessible region, and its own markers and extents. | |
60 (Due to the nature of markers, it doesn't actually matter much whether | |
61 we stick them inside or out of the struct buffer_text -- the user won't | |
62 notice any difference -- but we go ahead and put them outside for | |
63 consistency and overall saneness of algorithm.) | |
64 | |
65 FSFmacs gets away with not maintaining any "children" pointers from | |
66 a buffer to the indirect buffers that refer to it by putting the | |
67 markers inside of the struct buffer_text, using markers to keep track | |
68 of BEGV and ZV in indirect buffers, and relying on the fact that | |
69 all intervals (text properties and overlays) use markers for their | |
70 start and end points. We don't do this for extents (markers are | |
71 inefficient anyway and take up space), so we have to maintain | |
72 children pointers. This is not terribly hard, though, and the | |
73 code to maintain this is just like the code already present in | |
74 extent-parent and extent-children. | |
75 */ | |
76 | |
77 struct buffer_text | |
78 { | |
79 Bufbyte *beg; /* Actual address of buffer contents. */ | |
80 Bytind gpt; /* Index of gap in buffer. */ | |
81 Bytind z; /* Index of end of buffer. */ | |
82 Bufpos bufz; /* Equivalent as a Bufpos. */ | |
83 int gap_size; /* Size of buffer's gap */ | |
84 int end_gap_size; /* Size of buffer's end gap */ | |
85 long modiff; /* This counts buffer-modification events | |
86 for this buffer. It is incremented for | |
87 each such event, and never otherwise | |
88 changed. */ | |
89 long save_modiff; /* Previous value of modiff, as of last | |
90 time buffer visited or saved a file. */ | |
91 | |
92 #ifdef MULE | |
93 /* We keep track of a "known" region for very fast access. | |
94 This information is text-only so it goes here. */ | |
95 Bufpos mule_bufmin, mule_bufmax; | |
96 Bytind mule_bytmin, mule_bytmax; | |
97 int mule_shifter, mule_three_p; | |
98 | |
99 /* And we also cache 16 positions for fairly fast access near those | |
100 positions. */ | |
101 Bufpos mule_bufpos_cache[16]; | |
102 Bytind mule_bytind_cache[16]; | |
103 #endif | |
104 | |
105 /* Similar to the above, we keep track of positions for which line | |
106 number has last been calculated. See line-number.c. */ | |
107 Lisp_Object line_number_cache; | |
108 | |
109 /* Change data that goes with the text. */ | |
110 struct buffer_text_change_data *changes; | |
111 | |
112 }; | |
113 | |
114 struct buffer | |
115 { | |
116 struct lcrecord_header header; | |
117 | |
118 /* This structure holds the coordinates of the buffer contents | |
119 in ordinary buffers. In indirect buffers, this is not used. */ | |
120 struct buffer_text own_text; | |
121 | |
122 /* This points to the `struct buffer_text' that is used for this buffer. | |
123 In an ordinary buffer, this is the own_text field above. | |
124 In an indirect buffer, this is the own_text field of another buffer. */ | |
125 struct buffer_text *text; | |
126 | |
127 Bytind pt; /* Position of point in buffer. */ | |
128 Bufpos bufpt; /* Equivalent as a Bufpos. */ | |
129 Bytind begv; /* Index of beginning of accessible range. */ | |
130 Bufpos bufbegv; /* Equivalent as a Bufpos. */ | |
131 Bytind zv; /* Index of end of accessible range. */ | |
132 Bufpos bufzv; /* Equivalent as a Bufpos. */ | |
133 | |
134 int face_change; /* This is set when a change in how the text should | |
135 be displayed (e.g., font, color) is made. */ | |
136 | |
137 /* change data indicating what portion of the text has changed | |
138 since the last time this was reset. Used by redisplay. | |
139 Logically we should keep this with the text structure, but | |
140 redisplay resets it for each buffer individually and we don't | |
141 want interference between an indirect buffer and its base | |
142 buffer. */ | |
143 struct each_buffer_change_data *changes; | |
144 | |
145 #ifdef REGION_CACHE_NEEDS_WORK | |
146 /* If the long line scan cache is enabled (i.e. the buffer-local | |
147 variable cache-long-line-scans is non-nil), newline_cache | |
148 points to the newline cache, and width_run_cache points to the | |
149 width run cache. | |
150 | |
151 The newline cache records which stretches of the buffer are | |
152 known *not* to contain newlines, so that they can be skipped | |
153 quickly when we search for newlines. | |
154 | |
155 The width run cache records which stretches of the buffer are | |
156 known to contain characters whose widths are all the same. If | |
157 the width run cache maps a character to a value > 0, that value | |
158 is the character's width; if it maps a character to zero, we | |
159 don't know what its width is. This allows compute_motion to | |
160 process such regions very quickly, using algebra instead of | |
161 inspecting each character. See also width_table, below. */ | |
162 struct region_cache *newline_cache; | |
163 struct region_cache *width_run_cache; | |
164 #endif /* REGION_CACHE_NEEDS_WORK */ | |
165 | |
166 /* The markers that refer to this buffer. This is actually a single | |
167 marker -- successive elements in its marker `chain' are the other | |
168 markers referring to this buffer */ | |
169 struct Lisp_Marker *markers; | |
170 | |
171 /* The buffer's extent info. This is its own type, an extent-info | |
172 object (done this way for ease in marking / finalizing). */ | |
173 Lisp_Object extent_info; | |
174 | |
175 /* ----------------------------------------------------------------- */ | |
176 /* All the stuff above this line is the responsibility of insdel.c, | |
177 with some help from marker.c and extents.c. | |
178 All the stuff below this line is the responsibility of buffer.c. */ | |
179 | |
180 /* In an indirect buffer, this points to the base buffer. | |
181 In an ordinary buffer, it is 0. | |
182 We DO mark through this slot. */ | |
183 struct buffer *base_buffer; | |
184 | |
185 /* List of indirect buffers whose base is this buffer. | |
186 If we are an indirect buffer, this will be nil. | |
187 Do NOT mark through this. */ | |
188 Lisp_Object indirect_children; | |
189 | |
190 /* Flags saying which DEFVAR_PER_BUFFER variables | |
191 are local to this buffer. */ | |
192 int local_var_flags; | |
193 | |
194 /* Set to the modtime of the visited file when read or written. | |
195 -1 means visited file was nonexistent. | |
196 0 means visited file modtime unknown; in no case complain | |
197 about any mismatch on next save attempt. */ | |
198 int modtime; | |
199 | |
200 /* the value of text->modiff at the last auto-save. */ | |
201 int auto_save_modified; | |
202 | |
203 /* The time at which we detected a failure to auto-save, | |
204 Or -1 if we didn't have a failure. */ | |
205 int auto_save_failure_time; | |
206 | |
207 /* Position in buffer at which display started | |
208 the last time this buffer was displayed. */ | |
209 int last_window_start; | |
210 | |
211 /* Everything from here down must be a Lisp_Object */ | |
212 | |
213 #define MARKED_SLOT(x) Lisp_Object x | |
214 #include "bufslots.h" | |
215 #undef MARKED_SLOT | |
216 }; | |
217 | |
218 DECLARE_LRECORD (buffer, struct buffer); | |
219 #define XBUFFER(x) XRECORD (x, buffer, struct buffer) | |
220 #define XSETBUFFER(x, p) XSETRECORD (x, p, buffer) | |
221 #define BUFFERP(x) RECORDP (x, buffer) | |
222 #define CHECK_BUFFER(x) CHECK_RECORD (x, buffer) | |
223 #define CONCHECK_BUFFER(x) CONCHECK_RECORD (x, buffer) | |
224 | |
225 #define BUFFER_LIVE_P(b) (!NILP ((b)->name)) | |
226 | |
227 #define CHECK_LIVE_BUFFER(x) do { \ | |
228 CHECK_BUFFER (x); \ | |
229 if (!BUFFER_LIVE_P (XBUFFER (x))) \ | |
230 dead_wrong_type_argument (Qbuffer_live_p, (x)); \ | |
231 } while (0) | |
232 | |
233 #define CONCHECK_LIVE_BUFFER(x) do { \ | |
234 CONCHECK_BUFFER (x); \ | |
235 if (!BUFFER_LIVE_P (XBUFFER (x))) \ | |
236 x = wrong_type_argument (Qbuffer_live_p, (x)); \ | |
237 } while (0) | |
238 | |
239 | |
240 #define BUFFER_BASE_BUFFER(b) ((b)->base_buffer ? (b)->base_buffer : (b)) | |
241 | |
242 /* Map over buffers sharing the same text as MPS_BUF. MPS_BUFVAR is a | |
243 variable that gets the buffer values (beginning with the base | |
244 buffer, then the children), and MPS_BUFCONS should be a temporary | |
245 Lisp_Object variable. */ | |
246 #define MAP_INDIRECT_BUFFERS(mps_buf, mps_bufvar, mps_bufcons) \ | |
247 for (mps_bufcons = Qunbound, \ | |
248 mps_bufvar = BUFFER_BASE_BUFFER (mps_buf); \ | |
249 UNBOUNDP (mps_bufcons) ? \ | |
250 (mps_bufcons = mps_bufvar->indirect_children, \ | |
251 1) \ | |
252 : (!NILP (mps_bufcons) \ | |
253 && (mps_bufvar = XBUFFER (XCAR (mps_bufcons)), 1) \ | |
254 && (mps_bufcons = XCDR (mps_bufcons), 1)); \ | |
255 ) | |
256 | |
257 | |
258 | |
259 /************************************************************************/ | |
260 /* */ | |
261 /* working with raw internal-format data */ | |
262 /* */ | |
263 /************************************************************************/ | |
264 | |
265 /* NOTE: In all the following macros, we follow these rules concerning | |
266 multiple evaluation of the arguments: | |
267 | |
268 1) Anything that's an lvalue can be evaluated more than once. | |
269 2) Anything that's a Lisp Object can be evaluated more than once. | |
270 This should probably be changed, but this follows the way | |
271 that all the macros in lisp.h do things. | |
272 3) 'struct buffer *' arguments can be evaluated more than once. | |
273 4) Nothing else can be evaluated more than once. Use inline | |
274 functions, if necessary, to prevent multiple evaluation. | |
275 5) An exception to (4) is that there are some macros below that | |
276 may evaluate their arguments more than once. They are all | |
277 denoted with the word "unsafe" in their name and are generally | |
278 meant to be called only by other macros that have already | |
279 stored the calling values in temporary variables. | |
280 | |
281 | |
282 Use the following functions/macros on contiguous strings of data. | |
283 If the text you're operating on is known to come from a buffer, use | |
284 the buffer-level functions below -- they know about the gap and may | |
285 be more efficient. | |
286 | |
287 | |
288 (A) For working with charptr's (pointers to internally-formatted text): | |
289 ----------------------------------------------------------------------- | |
290 | |
291 VALID_CHARPTR_P (ptr): | |
292 Given a charptr, does it point to the beginning of a character? | |
293 | |
294 ASSERT_VALID_CHARPTR (ptr): | |
295 If error-checking is enabled, assert that the given charptr | |
296 points to the beginning of a character. Otherwise, do nothing. | |
297 | |
298 INC_CHARPTR (ptr): | |
299 Given a charptr (assumed to point at the beginning of a character), | |
300 modify that pointer so it points to the beginning of the next | |
301 character. | |
302 | |
303 DEC_CHARPTR (ptr): | |
304 Given a charptr (assumed to point at the beginning of a | |
305 character or at the very end of the text), modify that pointer | |
306 so it points to the beginning of the previous character. | |
307 | |
308 VALIDATE_CHARPTR_BACKWARD (ptr): | |
309 Make sure that PTR is pointing to the beginning of a character. | |
310 If not, back up until this is the case. Note that there are not | |
311 too many places where it is legitimate to do this sort of thing. | |
312 It's an error if you're passed an "invalid" char * pointer. | |
313 NOTE: PTR *must* be pointing to a valid part of the string (i.e. | |
314 not the very end, unless the string is zero-terminated or | |
315 something) in order for this function to not cause crashes. | |
316 | |
317 VALIDATE_CHARPTR_FORWARD (ptr): | |
318 Make sure that PTR is pointing to the beginning of a character. | |
319 If not, move forward until this is the case. Note that there | |
320 are not too many places where it is legitimate to do this sort | |
321 of thing. It's an error if you're passed an "invalid" char * | |
322 pointer. | |
323 | |
324 | |
325 (B) For working with the length (in bytes and characters) of a | |
326 section of internally-formatted text: | |
327 -------------------------------------------------------------- | |
328 | |
329 bytecount_to_charcount (ptr, nbi): | |
330 Given a pointer to a text string and a length in bytes, | |
331 return the equivalent length in characters. | |
332 | |
333 charcount_to_bytecount (ptr, nch): | |
334 Given a pointer to a text string and a length in characters, | |
335 return the equivalent length in bytes. | |
336 | |
337 charptr_n_addr (ptr, n): | |
338 Return a pointer to the beginning of the character offset N | |
339 (in characters) from PTR. | |
340 | |
341 | |
342 (C) For retrieving or changing the character pointed to by a charptr: | |
343 --------------------------------------------------------------------- | |
344 | |
345 charptr_emchar (ptr): | |
346 Retrieve the character pointed to by PTR as an Emchar. | |
347 | |
348 charptr_emchar_n (ptr, n): | |
349 Retrieve the character at offset N (in characters) from PTR, | |
350 as an Emchar. | |
351 | |
352 set_charptr_emchar (ptr, ch): | |
353 Store the character CH (an Emchar) as internally-formatted | |
354 text starting at PTR. Return the number of bytes stored. | |
355 | |
356 charptr_copy_char (ptr, ptr2): | |
357 Retrieve the character pointed to by PTR and store it as | |
358 internally-formatted text in PTR2. | |
359 | |
360 | |
361 (D) For working with Emchars: | |
362 ----------------------------- | |
363 | |
364 [Note that there are other functions/macros for working with Emchars | |
365 in mule-charset.h, for retrieving the charset of an Emchar | |
366 and such. These are only valid when MULE is defined.] | |
367 | |
368 valid_char_p (ch): | |
369 Return whether the given Emchar is valid. | |
370 | |
371 CHARP (ch): | |
372 Return whether the given Lisp_Object is a character. | |
373 | |
374 CHECK_CHAR_COERCE_INT (ch): | |
375 Signal an error if CH is not a valid character or integer Lisp_Object. | |
376 If CH is an integer Lisp_Object, convert it to a character Lisp_Object, | |
377 but merely by repackaging, without performing tests for char validity. | |
378 | |
379 MAX_EMCHAR_LEN: | |
380 Maximum number of buffer bytes per Emacs character. | |
381 | |
382 */ | |
383 | |
384 | |
385 /* ---------------------------------------------------------------------- */ | |
386 /* (A) For working with charptr's (pointers to internally-formatted text) */ | |
387 /* ---------------------------------------------------------------------- */ | |
388 | |
389 #ifdef MULE | |
390 # define VALID_CHARPTR_P(ptr) BUFBYTE_FIRST_BYTE_P (* (unsigned char *) ptr) | |
391 #else | |
392 # define VALID_CHARPTR_P(ptr) 1 | |
393 #endif | |
394 | |
395 #ifdef ERROR_CHECK_BUFPOS | |
396 # define ASSERT_VALID_CHARPTR(ptr) assert (VALID_CHARPTR_P (ptr)) | |
397 #else | |
398 # define ASSERT_VALID_CHARPTR(ptr) | |
399 #endif | |
400 | |
401 /* Note that INC_CHARPTR() and DEC_CHARPTR() have to be written in | |
402 completely separate ways. INC_CHARPTR() cannot use the DEC_CHARPTR() | |
403 trick of looking for a valid first byte because it might run off | |
404 the end of the string. DEC_CHARPTR() can't use the INC_CHARPTR() | |
405 method because it doesn't have easy access to the first byte of | |
406 the character it's moving over. */ | |
407 | |
408 #define REAL_INC_CHARPTR(ptr) \ | |
409 ((void) ((ptr) += REP_BYTES_BY_FIRST_BYTE (* (unsigned char *) (ptr)))) | |
410 | |
411 #define REAL_INC_CHARBYTIND(ptr,pos) \ | |
412 (pos += REP_BYTES_BY_FIRST_BYTE (* (unsigned char *) (ptr))) | |
413 | |
414 #define REAL_DEC_CHARPTR(ptr) do { \ | |
415 (ptr)--; \ | |
416 } while (!VALID_CHARPTR_P (ptr)) | |
417 | |
418 #ifdef ERROR_CHECK_BUFPOS | |
419 #define INC_CHARPTR(ptr) do { \ | |
420 ASSERT_VALID_CHARPTR (ptr); \ | |
421 REAL_INC_CHARPTR (ptr); \ | |
422 } while (0) | |
423 | |
424 #define INC_CHARBYTIND(ptr,pos) do { \ | |
425 ASSERT_VALID_CHARPTR (ptr); \ | |
426 REAL_INC_CHARBYTIND (ptr,pos); \ | |
427 } while (0) | |
428 | |
429 #define DEC_CHARPTR(ptr) do { \ | |
430 CONST Bufbyte *dc_ptr1 = (ptr); \ | |
431 CONST Bufbyte *dc_ptr2 = dc_ptr1; \ | |
432 REAL_DEC_CHARPTR (dc_ptr2); \ | |
433 assert (dc_ptr1 - dc_ptr2 == \ | |
434 REP_BYTES_BY_FIRST_BYTE (*dc_ptr2)); \ | |
435 (ptr) = dc_ptr2; \ | |
436 } while (0) | |
437 | |
438 #else /* ! ERROR_CHECK_BUFPOS */ | |
439 #define INC_CHARBYTIND(ptr,pos) REAL_INC_CHARBYTIND (ptr,pos) | |
440 #define INC_CHARPTR(ptr) REAL_INC_CHARPTR (ptr) | |
441 #define DEC_CHARPTR(ptr) REAL_DEC_CHARPTR (ptr) | |
442 #endif /* ! ERROR_CHECK_BUFPOS */ | |
443 | |
444 #ifdef MULE | |
445 | |
446 #define VALIDATE_CHARPTR_BACKWARD(ptr) do { \ | |
447 while (!VALID_CHARPTR_P (ptr)) ptr--; \ | |
448 } while (0) | |
449 | |
450 /* This needs to be trickier to avoid the possibility of running off | |
451 the end of the string. */ | |
452 | |
453 #define VALIDATE_CHARPTR_FORWARD(ptr) do { \ | |
454 Bufbyte *vcf_ptr = (ptr); \ | |
455 VALIDATE_CHARPTR_BACKWARD (vcf_ptr); \ | |
456 if (vcf_ptr != (ptr)) \ | |
457 { \ | |
458 (ptr) = vcf_ptr; \ | |
459 INC_CHARPTR (ptr); \ | |
460 } \ | |
461 } while (0) | |
462 | |
463 #else /* not MULE */ | |
464 #define VALIDATE_CHARPTR_BACKWARD(ptr) | |
465 #define VALIDATE_CHARPTR_FORWARD(ptr) | |
466 #endif /* not MULE */ | |
467 | |
468 /* -------------------------------------------------------------- */ | |
469 /* (B) For working with the length (in bytes and characters) of a */ | |
470 /* section of internally-formatted text */ | |
471 /* -------------------------------------------------------------- */ | |
472 | |
473 INLINE CONST Bufbyte *charptr_n_addr (CONST Bufbyte *ptr, Charcount offset); | |
474 INLINE CONST Bufbyte * | |
475 charptr_n_addr (CONST Bufbyte *ptr, Charcount offset) | |
476 { | |
477 return ptr + charcount_to_bytecount (ptr, offset); | |
478 } | |
479 | |
480 /* -------------------------------------------------------------------- */ | |
481 /* (C) For retrieving or changing the character pointed to by a charptr */ | |
482 /* -------------------------------------------------------------------- */ | |
483 | |
484 #define simple_charptr_emchar(ptr) ((Emchar) (ptr)[0]) | |
485 #define simple_set_charptr_emchar(ptr, x) ((ptr)[0] = (Bufbyte) (x), 1) | |
486 #define simple_charptr_copy_char(ptr, ptr2) ((ptr2)[0] = *(ptr), 1) | |
487 | |
488 #ifdef MULE | |
489 | |
490 Emchar non_ascii_charptr_emchar (CONST Bufbyte *ptr); | |
491 Bytecount non_ascii_set_charptr_emchar (Bufbyte *ptr, Emchar c); | |
492 Bytecount non_ascii_charptr_copy_char (CONST Bufbyte *ptr, Bufbyte *ptr2); | |
493 | |
494 INLINE Emchar charptr_emchar (CONST Bufbyte *ptr); | |
495 INLINE Emchar | |
496 charptr_emchar (CONST Bufbyte *ptr) | |
497 { | |
498 return BYTE_ASCII_P (*ptr) ? | |
499 simple_charptr_emchar (ptr) : | |
500 non_ascii_charptr_emchar (ptr); | |
501 } | |
502 | |
503 INLINE Bytecount set_charptr_emchar (Bufbyte *ptr, Emchar x); | |
504 INLINE Bytecount | |
505 set_charptr_emchar (Bufbyte *ptr, Emchar x) | |
506 { | |
507 return !CHAR_MULTIBYTE_P (x) ? | |
508 simple_set_charptr_emchar (ptr, x) : | |
509 non_ascii_set_charptr_emchar (ptr, x); | |
510 } | |
511 | |
512 INLINE Bytecount charptr_copy_char (CONST Bufbyte *ptr, Bufbyte *ptr2); | |
513 INLINE Bytecount | |
514 charptr_copy_char (CONST Bufbyte *ptr, Bufbyte *ptr2) | |
515 { | |
516 return BYTE_ASCII_P (*ptr) ? | |
517 simple_charptr_copy_char (ptr, ptr2) : | |
518 non_ascii_charptr_copy_char (ptr, ptr2); | |
519 } | |
520 | |
521 #else /* not MULE */ | |
522 | |
523 # define charptr_emchar(ptr) simple_charptr_emchar (ptr) | |
524 # define set_charptr_emchar(ptr, x) simple_set_charptr_emchar (ptr, x) | |
525 # define charptr_copy_char(ptr, ptr2) simple_charptr_copy_char (ptr, ptr2) | |
526 | |
527 #endif /* not MULE */ | |
528 | |
529 #define charptr_emchar_n(ptr, offset) \ | |
530 charptr_emchar (charptr_n_addr (ptr, offset)) | |
531 | |
532 | |
533 /* ---------------------------- */ | |
534 /* (D) For working with Emchars */ | |
535 /* ---------------------------- */ | |
536 | |
537 #ifdef MULE | |
538 | |
539 int non_ascii_valid_char_p (Emchar ch); | |
540 | |
541 INLINE int valid_char_p (Emchar ch); | |
542 INLINE int | |
543 valid_char_p (Emchar ch) | |
544 { | |
545 return ((unsigned int) (ch) <= 0xff) || non_ascii_valid_char_p (ch); | |
546 } | |
547 | |
548 #else /* not MULE */ | |
549 | |
550 #define valid_char_p(ch) ((unsigned int) (ch) <= 0xff) | |
551 | |
552 #endif /* not MULE */ | |
553 | |
554 #define CHAR_INTP(x) (INTP (x) && valid_char_p (XINT (x))) | |
555 | |
556 #define CHAR_OR_CHAR_INTP(x) (CHARP (x) || CHAR_INTP (x)) | |
557 | |
558 #ifdef ERROR_CHECK_TYPECHECK | |
559 | |
560 INLINE Emchar XCHAR_OR_CHAR_INT (Lisp_Object obj); | |
561 INLINE Emchar | |
562 XCHAR_OR_CHAR_INT (Lisp_Object obj) | |
563 { | |
564 assert (CHAR_OR_CHAR_INTP (obj)); | |
565 return CHARP (obj) ? XCHAR (obj) : XINT (obj); | |
566 } | |
567 | |
568 #else | |
569 | |
570 #define XCHAR_OR_CHAR_INT(obj) (CHARP (obj) ? XCHAR (obj) : XINT (obj)) | |
571 | |
572 #endif | |
573 | |
574 #define CHECK_CHAR_COERCE_INT(x) do { \ | |
575 if (CHARP (x)) \ | |
576 ; \ | |
577 else if (CHAR_INTP (x)) \ | |
578 x = make_char (XINT (x)); \ | |
579 else \ | |
580 x = wrong_type_argument (Qcharacterp, x); \ | |
581 } while (0) | |
582 | |
583 #ifdef MULE | |
584 # define MAX_EMCHAR_LEN 4 | |
585 #else | |
586 # define MAX_EMCHAR_LEN 1 | |
587 #endif | |
588 | |
589 | |
590 /*----------------------------------------------------------------------*/ | |
591 /* Accessor macros for important positions in a buffer */ | |
592 /*----------------------------------------------------------------------*/ | |
593 | |
594 /* We put them here because some stuff below wants them before the | |
595 place where we would normally put them. */ | |
596 | |
597 /* None of these are lvalues. Use the settor macros below to change | |
598 the positions. */ | |
599 | |
600 /* Beginning of buffer. */ | |
601 #define BI_BUF_BEG(buf) ((Bytind) 1) | |
602 #define BUF_BEG(buf) ((Bufpos) 1) | |
603 | |
604 /* Beginning of accessible range of buffer. */ | |
605 #define BI_BUF_BEGV(buf) ((buf)->begv + 0) | |
606 #define BUF_BEGV(buf) ((buf)->bufbegv + 0) | |
607 | |
608 /* End of accessible range of buffer. */ | |
609 #define BI_BUF_ZV(buf) ((buf)->zv + 0) | |
610 #define BUF_ZV(buf) ((buf)->bufzv + 0) | |
611 | |
612 /* End of buffer. */ | |
613 #define BI_BUF_Z(buf) ((buf)->text->z + 0) | |
614 #define BUF_Z(buf) ((buf)->text->bufz + 0) | |
615 | |
616 /* Point. */ | |
617 #define BI_BUF_PT(buf) ((buf)->pt + 0) | |
618 #define BUF_PT(buf) ((buf)->bufpt + 0) | |
619 | |
620 /*----------------------------------------------------------------------*/ | |
621 /* Converting between positions and addresses */ | |
622 /*----------------------------------------------------------------------*/ | |
623 | |
624 /* Convert the address of a byte in the buffer into a position. */ | |
625 INLINE Bytind BI_BUF_PTR_BYTE_POS (struct buffer *buf, Bufbyte *ptr); | |
626 INLINE Bytind | |
627 BI_BUF_PTR_BYTE_POS (struct buffer *buf, Bufbyte *ptr) | |
628 { | |
629 return (ptr - buf->text->beg + 1 | |
630 - ((ptr - buf->text->beg + 1) > buf->text->gpt | |
631 ? buf->text->gap_size : 0)); | |
632 } | |
633 | |
634 #define BUF_PTR_BYTE_POS(buf, ptr) \ | |
635 bytind_to_bufpos (buf, BI_BUF_PTR_BYTE_POS (buf, ptr)) | |
636 | |
637 /* Address of byte at position POS in buffer. */ | |
638 INLINE Bufbyte * BI_BUF_BYTE_ADDRESS (struct buffer *buf, Bytind pos); | |
639 INLINE Bufbyte * | |
640 BI_BUF_BYTE_ADDRESS (struct buffer *buf, Bytind pos) | |
641 { | |
642 return (buf->text->beg + | |
643 ((pos >= buf->text->gpt ? (pos + buf->text->gap_size) : pos) | |
644 - 1)); | |
645 } | |
646 | |
647 #define BUF_BYTE_ADDRESS(buf, pos) \ | |
648 BI_BUF_BYTE_ADDRESS (buf, bufpos_to_bytind (buf, pos)) | |
649 | |
650 /* Address of byte before position POS in buffer. */ | |
651 INLINE Bufbyte * BI_BUF_BYTE_ADDRESS_BEFORE (struct buffer *buf, Bytind pos); | |
652 INLINE Bufbyte * | |
653 BI_BUF_BYTE_ADDRESS_BEFORE (struct buffer *buf, Bytind pos) | |
654 { | |
655 return (buf->text->beg + | |
656 ((pos > buf->text->gpt ? (pos + buf->text->gap_size) : pos) | |
657 - 2)); | |
658 } | |
659 | |
660 #define BUF_BYTE_ADDRESS_BEFORE(buf, pos) \ | |
661 BI_BUF_BYTE_ADDRESS_BEFORE (buf, bufpos_to_bytind (buf, pos)) | |
662 | |
663 /*----------------------------------------------------------------------*/ | |
664 /* Converting between byte indices and memory indices */ | |
665 /*----------------------------------------------------------------------*/ | |
666 | |
667 INLINE int valid_memind_p (struct buffer *buf, Memind x); | |
668 INLINE int | |
669 valid_memind_p (struct buffer *buf, Memind x) | |
670 { | |
671 return ((x >= 1 && x <= (Memind) buf->text->gpt) || | |
672 (x > (Memind) (buf->text->gpt + buf->text->gap_size) && | |
673 x <= (Memind) (buf->text->z + buf->text->gap_size))); | |
674 } | |
675 | |
676 INLINE Memind bytind_to_memind (struct buffer *buf, Bytind x); | |
677 INLINE Memind | |
678 bytind_to_memind (struct buffer *buf, Bytind x) | |
679 { | |
680 return (Memind) ((x > buf->text->gpt) ? (x + buf->text->gap_size) : x); | |
681 } | |
682 | |
683 | |
684 INLINE Bytind memind_to_bytind (struct buffer *buf, Memind x); | |
685 INLINE Bytind | |
686 memind_to_bytind (struct buffer *buf, Memind x) | |
687 { | |
688 #ifdef ERROR_CHECK_BUFPOS | |
689 assert (valid_memind_p (buf, x)); | |
690 #endif | |
691 return (Bytind) ((x > (Memind) buf->text->gpt) ? | |
692 x - buf->text->gap_size : | |
693 x); | |
694 } | |
695 | |
696 #define memind_to_bufpos(buf, x) \ | |
697 bytind_to_bufpos (buf, memind_to_bytind (buf, x)) | |
698 #define bufpos_to_memind(buf, x) \ | |
699 bytind_to_memind (buf, bufpos_to_bytind (buf, x)) | |
700 | |
701 /* These macros generalize many standard buffer-position functions to | |
702 either a buffer or a string. */ | |
703 | |
704 /* Converting between Meminds and Bytinds, for a buffer-or-string. | |
705 For strings, this is a no-op. For buffers, this resolves | |
706 to the standard memind<->bytind converters. */ | |
707 | |
708 #define buffer_or_string_bytind_to_memind(obj, ind) \ | |
709 (BUFFERP (obj) ? bytind_to_memind (XBUFFER (obj), ind) : (Memind) ind) | |
710 | |
711 #define buffer_or_string_memind_to_bytind(obj, ind) \ | |
712 (BUFFERP (obj) ? memind_to_bytind (XBUFFER (obj), ind) : (Bytind) ind) | |
713 | |
714 /* Converting between Bufpos's and Bytinds, for a buffer-or-string. | |
715 For strings, this maps to the bytecount<->charcount converters. */ | |
716 | |
717 #define buffer_or_string_bufpos_to_bytind(obj, pos) \ | |
718 (BUFFERP (obj) ? bufpos_to_bytind (XBUFFER (obj), pos) : \ | |
719 (Bytind) charcount_to_bytecount (XSTRING_DATA (obj), pos)) | |
720 | |
721 #define buffer_or_string_bytind_to_bufpos(obj, ind) \ | |
722 (BUFFERP (obj) ? bytind_to_bufpos (XBUFFER (obj), ind) : \ | |
723 (Bufpos) bytecount_to_charcount (XSTRING_DATA (obj), ind)) | |
724 | |
725 /* Similar for Bufpos's and Meminds. */ | |
726 | |
727 #define buffer_or_string_bufpos_to_memind(obj, pos) \ | |
728 (BUFFERP (obj) ? bufpos_to_memind (XBUFFER (obj), pos) : \ | |
729 (Memind) charcount_to_bytecount (XSTRING_DATA (obj), pos)) | |
730 | |
731 #define buffer_or_string_memind_to_bufpos(obj, ind) \ | |
732 (BUFFERP (obj) ? memind_to_bufpos (XBUFFER (obj), ind) : \ | |
733 (Bufpos) bytecount_to_charcount (XSTRING_DATA (obj), ind)) | |
734 | |
735 /************************************************************************/ | |
736 /* */ | |
737 /* working with buffer-level data */ | |
738 /* */ | |
739 /************************************************************************/ | |
740 | |
741 /* | |
742 | |
743 (A) Working with byte indices: | |
744 ------------------------------ | |
745 | |
746 VALID_BYTIND_P(buf, bi): | |
747 Given a byte index, does it point to the beginning of a character? | |
748 | |
749 ASSERT_VALID_BYTIND_UNSAFE(buf, bi): | |
750 If error-checking is enabled, assert that the given byte index | |
751 is within range and points to the beginning of a character | |
752 or to the end of the buffer. Otherwise, do nothing. | |
753 | |
754 ASSERT_VALID_BYTIND_BACKWARD_UNSAFE(buf, bi): | |
755 If error-checking is enabled, assert that the given byte index | |
756 is within range and satisfies ASSERT_VALID_BYTIND() and also | |
757 does not refer to the beginning of the buffer. (i.e. movement | |
758 backwards is OK.) Otherwise, do nothing. | |
759 | |
760 ASSERT_VALID_BYTIND_FORWARD_UNSAFE(buf, bi): | |
761 If error-checking is enabled, assert that the given byte index | |
762 is within range and satisfies ASSERT_VALID_BYTIND() and also | |
763 does not refer to the end of the buffer. (i.e. movement | |
764 forwards is OK.) Otherwise, do nothing. | |
765 | |
766 VALIDATE_BYTIND_BACKWARD(buf, bi): | |
767 Make sure that the given byte index is pointing to the beginning | |
768 of a character. If not, back up until this is the case. Note | |
769 that there are not too many places where it is legitimate to do | |
770 this sort of thing. It's an error if you're passed an "invalid" | |
771 byte index. | |
772 | |
773 VALIDATE_BYTIND_FORWARD(buf, bi): | |
774 Make sure that the given byte index is pointing to the beginning | |
775 of a character. If not, move forward until this is the case. | |
776 Note that there are not too many places where it is legitimate | |
777 to do this sort of thing. It's an error if you're passed an | |
778 "invalid" byte index. | |
779 | |
780 INC_BYTIND(buf, bi): | |
781 Given a byte index (assumed to point at the beginning of a | |
782 character), modify that value so it points to the beginning | |
783 of the next character. | |
784 | |
785 DEC_BYTIND(buf, bi): | |
786 Given a byte index (assumed to point at the beginning of a | |
787 character), modify that value so it points to the beginning | |
788 of the previous character. Unlike for DEC_CHARPTR(), we can | |
789 do all the assert()s because there are sentinels at the | |
790 beginning of the gap and the end of the buffer. | |
791 | |
792 BYTIND_INVALID: | |
793 A constant representing an invalid Bytind. Valid Bytinds | |
794 can never have this value. | |
795 | |
796 | |
797 (B) Converting between Bufpos's and Bytinds: | |
798 -------------------------------------------- | |
799 | |
800 bufpos_to_bytind(buf, bu): | |
801 Given a Bufpos, return the equivalent Bytind. | |
802 | |
803 bytind_to_bufpos(buf, bi): | |
804 Given a Bytind, return the equivalent Bufpos. | |
805 | |
806 make_bufpos(buf, bi): | |
807 Given a Bytind, return the equivalent Bufpos as a Lisp Object. | |
808 */ | |
809 | |
810 | |
811 /*----------------------------------------------------------------------*/ | |
812 /* working with byte indices */ | |
813 /*----------------------------------------------------------------------*/ | |
814 | |
815 #ifdef MULE | |
816 # define VALID_BYTIND_P(buf, x) \ | |
817 BUFBYTE_FIRST_BYTE_P (*BI_BUF_BYTE_ADDRESS (buf, x)) | |
818 #else | |
819 # define VALID_BYTIND_P(buf, x) 1 | |
820 #endif | |
821 | |
822 #ifdef ERROR_CHECK_BUFPOS | |
823 | |
824 # define ASSERT_VALID_BYTIND_UNSAFE(buf, x) do { \ | |
825 assert (BUFFER_LIVE_P (buf)); \ | |
826 assert ((x) >= BI_BUF_BEG (buf) && x <= BI_BUF_Z (buf)); \ | |
827 assert (VALID_BYTIND_P (buf, x)); \ | |
828 } while (0) | |
829 # define ASSERT_VALID_BYTIND_BACKWARD_UNSAFE(buf, x) do { \ | |
830 assert (BUFFER_LIVE_P (buf)); \ | |
831 assert ((x) > BI_BUF_BEG (buf) && x <= BI_BUF_Z (buf)); \ | |
832 assert (VALID_BYTIND_P (buf, x)); \ | |
833 } while (0) | |
834 # define ASSERT_VALID_BYTIND_FORWARD_UNSAFE(buf, x) do { \ | |
835 assert (BUFFER_LIVE_P (buf)); \ | |
836 assert ((x) >= BI_BUF_BEG (buf) && x < BI_BUF_Z (buf)); \ | |
837 assert (VALID_BYTIND_P (buf, x)); \ | |
838 } while (0) | |
839 | |
840 #else /* not ERROR_CHECK_BUFPOS */ | |
841 # define ASSERT_VALID_BYTIND_UNSAFE(buf, x) | |
842 # define ASSERT_VALID_BYTIND_BACKWARD_UNSAFE(buf, x) | |
843 # define ASSERT_VALID_BYTIND_FORWARD_UNSAFE(buf, x) | |
844 | |
845 #endif /* not ERROR_CHECK_BUFPOS */ | |
846 | |
847 /* Note that, although the Mule version will work fine for non-Mule | |
848 as well (it should reduce down to nothing), we provide a separate | |
849 version to avoid compilation warnings and possible non-optimal | |
850 results with stupid compilers. */ | |
851 | |
852 #ifdef MULE | |
853 # define VALIDATE_BYTIND_BACKWARD(buf, x) do { \ | |
854 Bufbyte *VBB_ptr = BI_BUF_BYTE_ADDRESS (buf, x); \ | |
855 while (!BUFBYTE_FIRST_BYTE_P (*VBB_ptr)) \ | |
856 VBB_ptr--, (x)--; \ | |
857 } while (0) | |
858 #else | |
859 # define VALIDATE_BYTIND_BACKWARD(buf, x) | |
860 #endif | |
861 | |
862 /* Note that, although the Mule version will work fine for non-Mule | |
863 as well (it should reduce down to nothing), we provide a separate | |
864 version to avoid compilation warnings and possible non-optimal | |
865 results with stupid compilers. */ | |
866 | |
867 #ifdef MULE | |
868 # define VALIDATE_BYTIND_FORWARD(buf, x) do { \ | |
869 Bufbyte *VBF_ptr = BI_BUF_BYTE_ADDRESS (buf, x); \ | |
870 while (!BUFBYTE_FIRST_BYTE_P (*VBF_ptr)) \ | |
871 VBF_ptr++, (x)++; \ | |
872 } while (0) | |
873 #else | |
874 # define VALIDATE_BYTIND_FORWARD(buf, x) | |
875 #endif | |
876 | |
877 /* Note that in the simplest case (no MULE, no ERROR_CHECK_BUFPOS), | |
878 this crap reduces down to simply (x)++. */ | |
879 | |
880 #define INC_BYTIND(buf, x) do \ | |
881 { \ | |
882 ASSERT_VALID_BYTIND_FORWARD_UNSAFE (buf, x); \ | |
883 /* Note that we do the increment first to \ | |
884 make sure that the pointer in \ | |
885 VALIDATE_BYTIND_FORWARD() ends up on \ | |
886 the correct side of the gap */ \ | |
887 (x)++; \ | |
888 VALIDATE_BYTIND_FORWARD (buf, x); \ | |
889 } while (0) | |
890 | |
891 /* Note that in the simplest case (no MULE, no ERROR_CHECK_BUFPOS), | |
892 this crap reduces down to simply (x)--. */ | |
893 | |
894 #define DEC_BYTIND(buf, x) do \ | |
895 { \ | |
896 ASSERT_VALID_BYTIND_BACKWARD_UNSAFE (buf, x); \ | |
897 /* Note that we do the decrement first to \ | |
898 make sure that the pointer in \ | |
899 VALIDATE_BYTIND_BACKWARD() ends up on \ | |
900 the correct side of the gap */ \ | |
901 (x)--; \ | |
902 VALIDATE_BYTIND_BACKWARD (buf, x); \ | |
903 } while (0) | |
904 | |
905 INLINE Bytind prev_bytind (struct buffer *buf, Bytind x); | |
906 INLINE Bytind | |
907 prev_bytind (struct buffer *buf, Bytind x) | |
908 { | |
909 DEC_BYTIND (buf, x); | |
910 return x; | |
911 } | |
912 | |
913 INLINE Bytind next_bytind (struct buffer *buf, Bytind x); | |
914 INLINE Bytind | |
915 next_bytind (struct buffer *buf, Bytind x) | |
916 { | |
917 INC_BYTIND (buf, x); | |
918 return x; | |
919 } | |
920 | |
921 #define BYTIND_INVALID ((Bytind) -1) | |
922 | |
923 /*----------------------------------------------------------------------*/ | |
924 /* Converting between buffer positions and byte indices */ | |
925 /*----------------------------------------------------------------------*/ | |
926 | |
927 #ifdef MULE | |
928 | |
929 Bytind bufpos_to_bytind_func (struct buffer *buf, Bufpos x); | |
930 Bufpos bytind_to_bufpos_func (struct buffer *buf, Bytind x); | |
931 | |
932 /* The basic algorithm we use is to keep track of a known region of | |
933 characters in each buffer, all of which are of the same width. We | |
934 keep track of the boundaries of the region in both Bufpos and | |
935 Bytind coordinates and also keep track of the char width, which | |
936 is 1 - 4 bytes. If the position we're translating is not in | |
937 the known region, then we invoke a function to update the known | |
938 region to surround the position in question. This assumes | |
939 locality of reference, which is usually the case. | |
940 | |
941 Note that the function to update the known region can be simple | |
942 or complicated depending on how much information we cache. | |
943 For the moment, we don't cache any information, and just move | |
944 linearly forward or back from the known region, with a few | |
945 shortcuts to catch all-ASCII buffers. (Note that this will | |
946 thrash with bad locality of reference.) A smarter method would | |
947 be to keep some sort of pseudo-extent layer over the buffer; | |
948 maybe keep track of the bufpos/bytind correspondence at the | |
949 beginning of each line, which would allow us to do a binary | |
950 search over the pseudo-extents to narrow things down to the | |
951 correct line, at which point you could use a linear movement | |
952 method. This would also mesh well with efficiently | |
953 implementing a line-numbering scheme. | |
954 | |
955 Note also that we have to multiply or divide by the char width | |
956 in order to convert the positions. We do some tricks to avoid | |
957 ever actually having to do a multiply or divide, because that | |
958 is typically an expensive operation (esp. divide). Multiplying | |
959 or dividing by 1, 2, or 4 can be implemented simply as a | |
960 shift left or shift right, and we keep track of a shifter value | |
961 (0, 1, or 2) indicating how much to shift. Multiplying by 3 | |
962 can be implemented by doubling and then adding the original | |
963 value. Dividing by 3, alas, cannot be implemented in any | |
964 simple shift/subtract method, as far as I know; so we just | |
965 do a table lookup. For simplicity, we use a table of size | |
966 128K, which indexes the "divide-by-3" values for the first | |
967 64K non-negative numbers. (Note that we can increase the | |
968 size up to 384K, i.e. indexing the first 192K non-negative | |
969 numbers, while still using shorts in the array.) This also | |
970 means that the size of the known region can be at most | |
971 64K for width-three characters. | |
972 */ | |
973 | |
974 extern short three_to_one_table[]; | |
975 | |
976 INLINE int real_bufpos_to_bytind (struct buffer *buf, Bufpos x); | |
977 INLINE int | |
978 real_bufpos_to_bytind (struct buffer *buf, Bufpos x) | |
979 { | |
980 if (x >= buf->text->mule_bufmin && x <= buf->text->mule_bufmax) | |
981 return (buf->text->mule_bytmin + | |
982 ((x - buf->text->mule_bufmin) << buf->text->mule_shifter) + | |
983 (buf->text->mule_three_p ? (x - buf->text->mule_bufmin) : 0)); | |
984 else | |
985 return bufpos_to_bytind_func (buf, x); | |
986 } | |
987 | |
988 INLINE int real_bytind_to_bufpos (struct buffer *buf, Bytind x); | |
989 INLINE int | |
990 real_bytind_to_bufpos (struct buffer *buf, Bytind x) | |
991 { | |
992 if (x >= buf->text->mule_bytmin && x <= buf->text->mule_bytmax) | |
993 return (buf->text->mule_bufmin + | |
994 ((buf->text->mule_three_p | |
995 ? three_to_one_table[x - buf->text->mule_bytmin] | |
996 : (x - buf->text->mule_bytmin) >> buf->text->mule_shifter))); | |
997 else | |
998 return bytind_to_bufpos_func (buf, x); | |
999 } | |
1000 | |
1001 #else /* not MULE */ | |
1002 | |
1003 # define real_bufpos_to_bytind(buf, x) ((Bytind) x) | |
1004 # define real_bytind_to_bufpos(buf, x) ((Bufpos) x) | |
1005 | |
1006 #endif /* not MULE */ | |
1007 | |
1008 #ifdef ERROR_CHECK_BUFPOS | |
1009 | |
1010 Bytind bufpos_to_bytind (struct buffer *buf, Bufpos x); | |
1011 Bufpos bytind_to_bufpos (struct buffer *buf, Bytind x); | |
1012 | |
1013 #else /* not ERROR_CHECK_BUFPOS */ | |
1014 | |
1015 #define bufpos_to_bytind real_bufpos_to_bytind | |
1016 #define bytind_to_bufpos real_bytind_to_bufpos | |
1017 | |
1018 #endif /* not ERROR_CHECK_BUFPOS */ | |
1019 | |
1020 #define make_bufpos(buf, ind) make_int (bytind_to_bufpos (buf, ind)) | |
1021 | |
1022 /*----------------------------------------------------------------------*/ | |
1023 /* Converting between buffer bytes and Emacs characters */ | |
1024 /*----------------------------------------------------------------------*/ | |
1025 | |
1026 /* The character at position POS in buffer. */ | |
1027 #define BI_BUF_FETCH_CHAR(buf, pos) \ | |
1028 charptr_emchar (BI_BUF_BYTE_ADDRESS (buf, pos)) | |
1029 #define BUF_FETCH_CHAR(buf, pos) \ | |
1030 BI_BUF_FETCH_CHAR (buf, bufpos_to_bytind (buf, pos)) | |
1031 | |
1032 /* The character at position POS in buffer, as a string. This is | |
1033 equivalent to set_charptr_emchar (str, BUF_FETCH_CHAR (buf, pos)) | |
1034 but is faster for Mule. */ | |
1035 | |
1036 # define BI_BUF_CHARPTR_COPY_CHAR(buf, pos, str) \ | |
1037 charptr_copy_char (BI_BUF_BYTE_ADDRESS (buf, pos), str) | |
1038 #define BUF_CHARPTR_COPY_CHAR(buf, pos, str) \ | |
1039 BI_BUF_CHARPTR_COPY_CHAR (buf, bufpos_to_bytind (buf, pos), str) | |
1040 | |
1041 | |
1042 | |
1043 | |
1044 /************************************************************************/ | |
1045 /* */ | |
1046 /* working with externally-formatted data */ | |
1047 /* */ | |
1048 /************************************************************************/ | |
1049 | |
1050 /* Sometimes strings need to be converted into one or another | |
1051 external format, for passing to a library function. (Note | |
1052 that we encapsulate and automatically convert the arguments | |
1053 of some functions, but not others.) At times this conversion | |
1054 also has to go the other way -- i.e. when we get external- | |
1055 format strings back from a library function. | |
1056 */ | |
1057 | |
1058 #ifdef FILE_CODING | |
1059 | |
1060 /* WARNING: These use a static buffer. This can lead to disaster if | |
1061 these functions are not used *very* carefully. Under normal | |
1062 circumstances, do not call these functions; call the front ends | |
1063 below. */ | |
1064 | |
1065 Extbyte *convert_to_external_format (CONST Bufbyte *ptr, | |
1066 Bytecount len, | |
1067 Extcount *len_out, | |
1068 enum external_data_format fmt); | |
1069 Bufbyte *convert_from_external_format (CONST Extbyte *ptr, | |
1070 Extcount len, | |
1071 Bytecount *len_out, | |
1072 enum external_data_format fmt); | |
1073 | |
1074 #else /* ! MULE */ | |
1075 | |
1076 #define convert_to_external_format(ptr, len, len_out, fmt) \ | |
1077 (*(len_out) = (int) (len), (Extbyte *) (ptr)) | |
1078 #define convert_from_external_format(ptr, len, len_out, fmt) \ | |
1079 (*(len_out) = (Bytecount) (len), (Bufbyte *) (ptr)) | |
1080 | |
1081 #endif /* ! MULE */ | |
1082 | |
1083 /* In all of the following macros we use the following general principles: | |
1084 | |
1085 -- Functions that work with charptr's accept two sorts of charptr's: | |
1086 | |
1087 a) Pointers to memory with a length specified. The pointer will be | |
1088 fundamentally of type `unsigned char *' (although labelled | |
1089 as `Bufbyte *' for internal-format data and `Extbyte *' for | |
1090 external-format data) and the length will be fundamentally of | |
1091 type `int' (although labelled as `Bytecount' for internal-format | |
1092 data and `Extcount' for external-format data). The length is | |
1093 always a count in bytes. | |
1094 b) Zero-terminated pointers; no length specified. The pointer | |
1095 is of type `char *', whether the data pointed to is internal-format | |
1096 or external-format. These sorts of pointers are available for | |
1097 convenience in working with C library functions and literal | |
1098 strings. In general you should use these sorts of pointers only | |
1099 to interface to library routines and not for general manipulation, | |
1100 as you are liable to lose embedded nulls and such. This could | |
1101 be a big problem for routines that want Unicode-formatted data, | |
1102 which is likely to have lots of embedded nulls in it. | |
1103 (In the real world, though, external Unicode data will be UTF-8, | |
1104 which will not have embedded nulls and is ASCII-compatible - martin) | |
1105 | |
1106 -- Functions that work with Lisp strings accept strings as Lisp Objects | |
1107 (as opposed to the `struct Lisp_String *' for some of the other | |
1108 string accessors). This is for convenience in working with the | |
1109 functions, as otherwise you will almost always have to call | |
1110 XSTRING() on the object. | |
1111 | |
1112 -- Functions that work with charptr's are not guaranteed to copy | |
1113 their data into alloca()ed space. Functions that work with | |
1114 Lisp strings are, however. The reason is that Lisp strings can | |
1115 be relocated any time a GC happens, and it could happen at some | |
1116 rather unexpected times. The internal-external conversion is | |
1117 rarely done in time-critical functions, and so the slight | |
1118 extra time required for alloca() and copy is well-worth the | |
1119 safety of knowing your string data won't be relocated out from | |
1120 under you. | |
1121 */ | |
1122 | |
1123 | |
1124 /* Maybe convert charptr's data into ext-format and store the result in | |
1125 alloca()'ed space. | |
1126 | |
1127 You may wonder why this is written in this fashion and not as a | |
1128 function call. With a little trickery it could certainly be | |
1129 written this way, but it won't work because of those DAMN GCC WANKERS | |
1130 who couldn't be bothered to handle alloca() properly on the x86 | |
1131 architecture. (If you put a call to alloca() in the argument to | |
1132 a function call, the stack space gets allocated right in the | |
1133 middle of the arguments to the function call and you are unbelievably | |
1134 hosed.) */ | |
1135 | |
1136 #ifdef MULE | |
1137 | |
1138 #define GET_CHARPTR_EXT_DATA_ALLOCA(ptr, len, fmt, ptr_out, len_out) do \ | |
1139 { \ | |
1140 Bytecount gceda_len_in = (Bytecount) (len); \ | |
1141 Extcount gceda_len_out; \ | |
1142 CONST Bufbyte *gceda_ptr_in = (ptr); \ | |
1143 Extbyte *gceda_ptr_out = \ | |
1144 convert_to_external_format (gceda_ptr_in, gceda_len_in, \ | |
1145 &gceda_len_out, fmt); \ | |
1146 /* If the new string is identical to the old (will be the case most \ | |
1147 of the time), just return the same string back. This saves \ | |
1148 on alloca()ing, which can be useful on C alloca() machines and \ | |
1149 on stack-space-challenged environments. */ \ | |
1150 \ | |
1151 if (gceda_len_in == gceda_len_out && \ | |
1152 !memcmp (gceda_ptr_in, gceda_ptr_out, gceda_len_out)) \ | |
1153 { \ | |
1154 (ptr_out) = (Extbyte *) gceda_ptr_in; \ | |
1155 } \ | |
1156 else \ | |
1157 { \ | |
1158 (ptr_out) = (Extbyte *) alloca (1 + gceda_len_out); \ | |
1159 memcpy ((void *) ptr_out, gceda_ptr_out, 1 + gceda_len_out); \ | |
1160 } \ | |
1161 (len_out) = gceda_len_out; \ | |
1162 } while (0) | |
1163 | |
1164 #else /* ! MULE */ | |
1165 | |
1166 #define GET_CHARPTR_EXT_DATA_ALLOCA(ptr, len, fmt, ptr_out, len_out) do \ | |
1167 { \ | |
1168 (ptr_out) = (Extbyte *) (ptr); \ | |
1169 (len_out) = (Extcount) (len); \ | |
1170 } while (0) | |
1171 | |
1172 #endif /* ! MULE */ | |
1173 | |
1174 #define GET_C_CHARPTR_EXT_DATA_ALLOCA(ptr, fmt, ptr_out) do \ | |
1175 { \ | |
1176 Extcount gcceda_ignored_len; \ | |
1177 CONST Bufbyte *gcceda_ptr_in = (CONST Bufbyte *) (ptr); \ | |
1178 Extbyte *gcceda_ptr_out; \ | |
1179 \ | |
1180 GET_CHARPTR_EXT_DATA_ALLOCA (gcceda_ptr_in, \ | |
1181 strlen ((char *) gcceda_ptr_in), \ | |
1182 fmt, \ | |
1183 gcceda_ptr_out, \ | |
1184 gcceda_ignored_len); \ | |
1185 (ptr_out) = (char *) gcceda_ptr_out; \ | |
1186 } while (0) | |
1187 | |
1188 #define GET_C_CHARPTR_EXT_BINARY_DATA_ALLOCA(ptr, ptr_out) \ | |
1189 GET_C_CHARPTR_EXT_DATA_ALLOCA (ptr, FORMAT_BINARY, ptr_out) | |
1190 #define GET_CHARPTR_EXT_BINARY_DATA_ALLOCA(ptr, len, ptr_out, len_out) \ | |
1191 GET_CHARPTR_EXT_DATA_ALLOCA (ptr, len, FORMAT_BINARY, ptr_out, len_out) | |
1192 | |
1193 #define GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA(ptr, ptr_out) \ | |
1194 GET_C_CHARPTR_EXT_DATA_ALLOCA (ptr, FORMAT_FILENAME, ptr_out) | |
1195 #define GET_CHARPTR_EXT_FILENAME_DATA_ALLOCA(ptr, len, ptr_out, len_out) \ | |
1196 GET_CHARPTR_EXT_DATA_ALLOCA (ptr, len, FORMAT_FILENAME, ptr_out, len_out) | |
1197 | |
1198 #define GET_C_CHARPTR_EXT_CTEXT_DATA_ALLOCA(ptr, ptr_out) \ | |
1199 GET_C_CHARPTR_EXT_DATA_ALLOCA (ptr, FORMAT_CTEXT, ptr_out) | |
1200 #define GET_CHARPTR_EXT_CTEXT_DATA_ALLOCA(ptr, len, ptr_out, len_out) \ | |
1201 GET_CHARPTR_EXT_DATA_ALLOCA (ptr, len, FORMAT_CTEXT, ptr_out, len_out) | |
1202 | |
1203 /* Maybe convert external charptr's data into internal format and store | |
1204 the result in alloca()'ed space. | |
1205 | |
1206 You may wonder why this is written in this fashion and not as a | |
1207 function call. With a little trickery it could certainly be | |
1208 written this way, but it won't work because of those DAMN GCC WANKERS | |
1209 who couldn't be bothered to handle alloca() properly on the x86 | |
1210 architecture. (If you put a call to alloca() in the argument to | |
1211 a function call, the stack space gets allocated right in the | |
1212 middle of the arguments to the function call and you are unbelievably | |
1213 hosed.) */ | |
1214 | |
1215 #ifdef MULE | |
1216 | |
1217 #define GET_CHARPTR_INT_DATA_ALLOCA(ptr, len, fmt, ptr_out, len_out) do \ | |
1218 { \ | |
1219 Extcount gcida_len_in = (Extcount) (len); \ | |
1220 Bytecount gcida_len_out; \ | |
1221 CONST Extbyte *gcida_ptr_in = (ptr); \ | |
1222 Bufbyte *gcida_ptr_out = \ | |
1223 convert_from_external_format (gcida_ptr_in, gcida_len_in, \ | |
1224 &gcida_len_out, fmt); \ | |
1225 /* If the new string is identical to the old (will be the case most \ | |
1226 of the time), just return the same string back. This saves \ | |
1227 on alloca()ing, which can be useful on C alloca() machines and \ | |
1228 on stack-space-challenged environments. */ \ | |
1229 \ | |
1230 if (gcida_len_in == gcida_len_out && \ | |
1231 !memcmp (gcida_ptr_in, gcida_ptr_out, gcida_len_out)) \ | |
1232 { \ | |
1233 (ptr_out) = (Bufbyte *) gcida_ptr_in; \ | |
1234 } \ | |
1235 else \ | |
1236 { \ | |
1237 (ptr_out) = (Extbyte *) alloca (1 + gcida_len_out); \ | |
1238 memcpy ((void *) ptr_out, gcida_ptr_out, 1 + gcida_len_out); \ | |
1239 } \ | |
1240 (len_out) = gcida_len_out; \ | |
1241 } while (0) | |
1242 | |
1243 #else /* ! MULE */ | |
1244 | |
1245 #define GET_CHARPTR_INT_DATA_ALLOCA(ptr, len, fmt, ptr_out, len_out) do \ | |
1246 { \ | |
1247 (ptr_out) = (Bufbyte *) (ptr); \ | |
1248 (len_out) = (Bytecount) (len); \ | |
1249 } while (0) | |
1250 | |
1251 #endif /* ! MULE */ | |
1252 | |
1253 #define GET_C_CHARPTR_INT_DATA_ALLOCA(ptr, fmt, ptr_out) do \ | |
1254 { \ | |
1255 Bytecount gccida_ignored_len; \ | |
1256 CONST Extbyte *gccida_ptr_in = (CONST Extbyte *) (ptr); \ | |
1257 Bufbyte *gccida_ptr_out; \ | |
1258 \ | |
1259 GET_CHARPTR_INT_DATA_ALLOCA (gccida_ptr_in, \ | |
1260 strlen ((char *) gccida_ptr_in), \ | |
1261 fmt, \ | |
1262 gccida_ptr_out, \ | |
1263 gccida_ignored_len); \ | |
1264 (ptr_out) = gccida_ptr_out; \ | |
1265 } while (0) | |
1266 | |
1267 #define GET_C_CHARPTR_INT_BINARY_DATA_ALLOCA(ptr, ptr_out) \ | |
1268 GET_C_CHARPTR_INT_DATA_ALLOCA (ptr, FORMAT_BINARY, ptr_out) | |
1269 #define GET_CHARPTR_INT_BINARY_DATA_ALLOCA(ptr, len, ptr_out, len_out) \ | |
1270 GET_CHARPTR_INT_DATA_ALLOCA (ptr, len, FORMAT_BINARY, ptr_out, len_out) | |
1271 | |
1272 #define GET_C_CHARPTR_INT_FILENAME_DATA_ALLOCA(ptr, ptr_out) \ | |
1273 GET_C_CHARPTR_INT_DATA_ALLOCA (ptr, FORMAT_FILENAME, ptr_out) | |
1274 #define GET_CHARPTR_INT_FILENAME_DATA_ALLOCA(ptr, len, ptr_out, len_out) \ | |
1275 GET_CHARPTR_INT_DATA_ALLOCA (ptr, len, FORMAT_FILENAME, ptr_out, len_out) | |
1276 | |
1277 #define GET_C_CHARPTR_INT_CTEXT_DATA_ALLOCA(ptr, ptr_out) \ | |
1278 GET_C_CHARPTR_INT_DATA_ALLOCA (ptr, FORMAT_CTEXT, ptr_out) | |
1279 #define GET_CHARPTR_INT_CTEXT_DATA_ALLOCA(ptr, len, ptr_out, len_out) \ | |
1280 GET_CHARPTR_INT_DATA_ALLOCA (ptr, len, FORMAT_CTEXT, ptr_out, len_out) | |
1281 | |
1282 | |
1283 /* Maybe convert Lisp string's data into ext-format and store the result in | |
1284 alloca()'ed space. | |
1285 | |
1286 You may wonder why this is written in this fashion and not as a | |
1287 function call. With a little trickery it could certainly be | |
1288 written this way, but it won't work because of those DAMN GCC WANKERS | |
1289 who couldn't be bothered to handle alloca() properly on the x86 | |
1290 architecture. (If you put a call to alloca() in the argument to | |
1291 a function call, the stack space gets allocated right in the | |
1292 middle of the arguments to the function call and you are unbelievably | |
1293 hosed.) */ | |
1294 | |
1295 #define GET_STRING_EXT_DATA_ALLOCA(s, fmt, ptr_out, len_out) do \ | |
1296 { \ | |
1297 Extcount gseda_len_out; \ | |
1298 struct Lisp_String *gseda_s = XSTRING (s); \ | |
1299 Extbyte * gseda_ptr_out = \ | |
1300 convert_to_external_format (string_data (gseda_s), \ | |
1301 string_length (gseda_s), \ | |
1302 &gseda_len_out, fmt); \ | |
1303 (ptr_out) = (Extbyte *) alloca (1 + gseda_len_out); \ | |
1304 memcpy ((void *) ptr_out, gseda_ptr_out, 1 + gseda_len_out); \ | |
1305 (len_out) = gseda_len_out; \ | |
1306 } while (0) | |
1307 | |
1308 | |
1309 #define GET_C_STRING_EXT_DATA_ALLOCA(s, fmt, ptr_out) do \ | |
1310 { \ | |
1311 Extcount gcseda_ignored_len; \ | |
1312 Extbyte *gcseda_ptr_out; \ | |
1313 \ | |
1314 GET_STRING_EXT_DATA_ALLOCA (s, fmt, gcseda_ptr_out, \ | |
1315 gcseda_ignored_len); \ | |
1316 (ptr_out) = (char *) gcseda_ptr_out; \ | |
1317 } while (0) | |
1318 | |
1319 #define GET_STRING_BINARY_DATA_ALLOCA(s, ptr_out, len_out) \ | |
1320 GET_STRING_EXT_DATA_ALLOCA (s, FORMAT_BINARY, ptr_out, len_out) | |
1321 #define GET_C_STRING_BINARY_DATA_ALLOCA(s, ptr_out) \ | |
1322 GET_C_STRING_EXT_DATA_ALLOCA (s, FORMAT_BINARY, ptr_out) | |
1323 | |
1324 #define GET_STRING_FILENAME_DATA_ALLOCA(s, ptr_out, len_out) \ | |
1325 GET_STRING_EXT_DATA_ALLOCA (s, FORMAT_FILENAME, ptr_out, len_out) | |
1326 #define GET_C_STRING_FILENAME_DATA_ALLOCA(s, ptr_out) \ | |
1327 GET_C_STRING_EXT_DATA_ALLOCA (s, FORMAT_FILENAME, ptr_out) | |
1328 | |
1329 #define GET_STRING_OS_DATA_ALLOCA(s, ptr_out, len_out) \ | |
1330 GET_STRING_EXT_DATA_ALLOCA (s, FORMAT_OS, ptr_out, len_out) | |
1331 #define GET_C_STRING_OS_DATA_ALLOCA(s, ptr_out) \ | |
1332 GET_C_STRING_EXT_DATA_ALLOCA (s, FORMAT_OS, ptr_out) | |
1333 | |
1334 #define GET_STRING_CTEXT_DATA_ALLOCA(s, ptr_out, len_out) \ | |
1335 GET_STRING_EXT_DATA_ALLOCA (s, FORMAT_CTEXT, ptr_out, len_out) | |
1336 #define GET_C_STRING_CTEXT_DATA_ALLOCA(s, ptr_out) \ | |
1337 GET_C_STRING_EXT_DATA_ALLOCA (s, FORMAT_CTEXT, ptr_out) | |
1338 | |
1339 | |
1340 | |
1341 /************************************************************************/ | |
1342 /* */ | |
1343 /* fake charset functions */ | |
1344 /* */ | |
1345 /************************************************************************/ | |
1346 | |
1347 /* used when MULE is not defined, so that Charset-type stuff can still | |
1348 be done */ | |
1349 | |
1350 #ifndef MULE | |
1351 | |
1352 #define Vcharset_ascii Qnil | |
1353 | |
1354 #define CHAR_CHARSET(ch) Vcharset_ascii | |
1355 #define CHAR_LEADING_BYTE(ch) LEADING_BYTE_ASCII | |
1356 #define LEADING_BYTE_ASCII 0x80 | |
1357 #define NUM_LEADING_BYTES 1 | |
1358 #define MIN_LEADING_BYTE 0x80 | |
1359 #define CHARSETP(cs) 1 | |
1360 #define CHARSET_BY_LEADING_BYTE(lb) Vcharset_ascii | |
1361 #define XCHARSET_LEADING_BYTE(cs) LEADING_BYTE_ASCII | |
1362 #define XCHARSET_GRAPHIC(cs) -1 | |
1363 #define XCHARSET_COLUMNS(cs) 1 | |
1364 #define XCHARSET_DIMENSION(cs) 1 | |
1365 #define REP_BYTES_BY_FIRST_BYTE(fb) 1 | |
1366 #define BREAKUP_CHAR(ch, charset, byte1, byte2) do { \ | |
1367 (charset) = Vcharset_ascii; \ | |
1368 (byte1) = (ch); \ | |
1369 (byte2) = 0; \ | |
1370 } while (0) | |
1371 #define BYTE_ASCII_P(byte) 1 | |
1372 | |
1373 #endif /* ! MULE */ | |
1374 | |
1375 /************************************************************************/ | |
1376 /* */ | |
1377 /* higher-level buffer-position functions */ | |
1378 /* */ | |
1379 /************************************************************************/ | |
1380 | |
1381 /*----------------------------------------------------------------------*/ | |
1382 /* Settor macros for important positions in a buffer */ | |
1383 /*----------------------------------------------------------------------*/ | |
1384 | |
1385 /* Set beginning of accessible range of buffer. */ | |
1386 #define SET_BOTH_BUF_BEGV(buf, val, bival) \ | |
1387 do \ | |
1388 { \ | |
1389 (buf)->begv = (bival); \ | |
1390 (buf)->bufbegv = (val); \ | |
1391 } while (0) | |
1392 | |
1393 /* Set end of accessible range of buffer. */ | |
1394 #define SET_BOTH_BUF_ZV(buf, val, bival) \ | |
1395 do \ | |
1396 { \ | |
1397 (buf)->zv = (bival); \ | |
1398 (buf)->bufzv = (val); \ | |
1399 } while (0) | |
1400 | |
1401 /* Set point. */ | |
1402 /* Since BEGV and ZV are almost never set, it's reasonable to enforce | |
1403 the restriction that the Bufpos and Bytind values must both be | |
1404 specified. However, point is set in lots and lots of places. So | |
1405 we provide the ability to specify both (for efficiency) or just | |
1406 one. */ | |
1407 #define BOTH_BUF_SET_PT(buf, val, bival) set_buffer_point (buf, val, bival) | |
1408 #define BI_BUF_SET_PT(buf, bival) \ | |
1409 BOTH_BUF_SET_PT (buf, bytind_to_bufpos (buf, bival), bival) | |
1410 #define BUF_SET_PT(buf, value) \ | |
1411 BOTH_BUF_SET_PT (buf, value, bufpos_to_bytind (buf, value)) | |
1412 | |
1413 | |
1414 #if 0 /* FSFmacs */ | |
1415 /* These macros exist in FSFmacs because SET_PT() in FSFmacs incorrectly | |
1416 does too much stuff, such as moving out of invisible extents. */ | |
1417 #define TEMP_SET_PT(position) (temp_set_point ((position), current_buffer)) | |
1418 #define SET_BUF_PT(buf, value) ((buf)->pt = (value)) | |
1419 #endif /* FSFmacs */ | |
1420 | |
1421 /*----------------------------------------------------------------------*/ | |
1422 /* Miscellaneous buffer values */ | |
1423 /*----------------------------------------------------------------------*/ | |
1424 | |
1425 /* Number of characters in buffer */ | |
1426 #define BUF_SIZE(buf) (BUF_Z (buf) - BUF_BEG (buf)) | |
1427 | |
1428 /* Is this buffer narrowed? */ | |
1429 #define BUF_NARROWED(buf) \ | |
1430 ((BI_BUF_BEGV (buf) != BI_BUF_BEG (buf)) || \ | |
1431 (BI_BUF_ZV (buf) != BI_BUF_Z (buf))) | |
1432 | |
1433 /* Modification count. */ | |
1434 #define BUF_MODIFF(buf) ((buf)->text->modiff) | |
1435 | |
1436 /* Saved modification count. */ | |
1437 #define BUF_SAVE_MODIFF(buf) ((buf)->text->save_modiff) | |
1438 | |
1439 /* Face changed. */ | |
1440 #define BUF_FACECHANGE(buf) ((buf)->face_change) | |
1441 | |
1442 #define POINT_MARKER_P(marker) \ | |
1443 (XMARKER (marker)->buffer != 0 && \ | |
1444 EQ ((marker), XMARKER (marker)->buffer->point_marker)) | |
1445 | |
1446 #define BUF_MARKERS(buf) ((buf)->markers) | |
1447 | |
1448 /* WARNING: | |
1449 | |
1450 The new definitions of CEILING_OF() and FLOOR_OF() differ semantically | |
1451 from the old ones (in FSF Emacs and XEmacs 19.11 and before). | |
1452 Conversion is as follows: | |
1453 | |
1454 OLD_BI_CEILING_OF(n) = NEW_BI_CEILING_OF(n) - 1 | |
1455 OLD_BI_FLOOR_OF(n) = NEW_BI_FLOOR_OF(n + 1) | |
1456 | |
1457 The definitions were changed because the new definitions are more | |
1458 consistent with the way everything else works in Emacs. | |
1459 */ | |
1460 | |
1461 /* Properties of CEILING_OF and FLOOR_OF (also apply to BI_ variants): | |
1462 | |
1463 1) FLOOR_OF (CEILING_OF (n)) = n | |
1464 CEILING_OF (FLOOR_OF (n)) = n | |
1465 | |
1466 2) CEILING_OF (n) = n if and only if n = ZV | |
1467 FLOOR_OF (n) = n if and only if n = BEGV | |
1468 | |
1469 3) CEILING_OF (CEILING_OF (n)) = ZV | |
1470 FLOOR_OF (FLOOR_OF (n)) = BEGV | |
1471 | |
1472 4) The bytes in the regions | |
1473 | |
1474 [BYTE_ADDRESS (n), BYTE_ADDRESS_BEFORE (CEILING_OF (n))] | |
1475 | |
1476 and | |
1477 | |
1478 [BYTE_ADDRESS (FLOOR_OF (n)), BYTE_ADDRESS_BEFORE (n)] | |
1479 | |
1480 are contiguous. | |
1481 */ | |
1482 | |
1483 | |
1484 /* Return the maximum index in the buffer it is safe to scan forwards | |
1485 past N to. This is used to prevent buffer scans from running into | |
1486 the gap (e.g. search.c). All characters between N and CEILING_OF(N) | |
1487 are located contiguous in memory. Note that the character *at* | |
1488 CEILING_OF(N) is not contiguous in memory. */ | |
1489 #define BI_BUF_CEILING_OF(b, n) \ | |
1490 ((n) < (b)->text->gpt && (b)->text->gpt < BI_BUF_ZV (b) ? \ | |
1491 (b)->text->gpt : BI_BUF_ZV (b)) | |
1492 #define BUF_CEILING_OF(b, n) \ | |
1493 bytind_to_bufpos (b, BI_BUF_CEILING_OF (b, bufpos_to_bytind (b, n))) | |
1494 | |
1495 /* Return the minimum index in the buffer it is safe to scan backwards | |
1496 past N to. All characters between FLOOR_OF(N) and N are located | |
1497 contiguous in memory. Note that the character *at* N may not be | |
1498 contiguous in memory. */ | |
1499 #define BI_BUF_FLOOR_OF(b, n) \ | |
1500 (BI_BUF_BEGV (b) < (b)->text->gpt && (b)->text->gpt < (n) ? \ | |
1501 (b)->text->gpt : BI_BUF_BEGV (b)) | |
1502 #define BUF_FLOOR_OF(b, n) \ | |
1503 bytind_to_bufpos (b, BI_BUF_FLOOR_OF (b, bufpos_to_bytind (b, n))) | |
1504 | |
1505 #define BI_BUF_CEILING_OF_IGNORE_ACCESSIBLE(b, n) \ | |
1506 ((n) < (b)->text->gpt && (b)->text->gpt < BI_BUF_Z (b) ? \ | |
1507 (b)->text->gpt : BI_BUF_Z (b)) | |
1508 #define BUF_CEILING_OF_IGNORE_ACCESSIBLE(b, n) \ | |
1509 bytind_to_bufpos \ | |
1510 (b, BI_BUF_CEILING_OF_IGNORE_ACCESSIBLE (b, bufpos_to_bytind (b, n))) | |
1511 | |
1512 #define BI_BUF_FLOOR_OF_IGNORE_ACCESSIBLE(b, n) \ | |
1513 (BI_BUF_BEG (b) < (b)->text->gpt && (b)->text->gpt < (n) ? \ | |
1514 (b)->text->gpt : BI_BUF_BEG (b)) | |
1515 #define BUF_FLOOR_OF_IGNORE_ACCESSIBLE(b, n) \ | |
1516 bytind_to_bufpos \ | |
1517 (b, BI_BUF_FLOOR_OF_IGNORE_ACCESSIBLE (b, bufpos_to_bytind (b, n))) | |
1518 | |
1519 | |
1520 extern struct buffer *current_buffer; | |
1521 | |
1522 /* This is the initial (startup) directory, as used for the *scratch* buffer. | |
1523 We're making this a global to make others aware of the startup directory. | |
1524 `initial_directory' is stored in external format. | |
1525 */ | |
1526 extern char initial_directory[]; | |
1527 extern void init_initial_directory (void); /* initialize initial_directory */ | |
1528 | |
1529 EXFUN (Fbuffer_disable_undo, 1); | |
1530 EXFUN (Fbuffer_modified_p, 1); | |
1531 EXFUN (Fbuffer_name, 1); | |
1532 EXFUN (Fcurrent_buffer, 0); | |
1533 EXFUN (Ferase_buffer, 1); | |
1534 EXFUN (Fget_buffer, 1); | |
1535 EXFUN (Fget_buffer_create, 1); | |
1536 EXFUN (Fget_file_buffer, 1); | |
1537 EXFUN (Fkill_buffer, 1); | |
1538 EXFUN (Fother_buffer, 3); | |
1539 EXFUN (Frecord_buffer, 1); | |
1540 EXFUN (Fset_buffer, 1); | |
1541 EXFUN (Fset_buffer_modified_p, 2); | |
1542 | |
1543 extern Lisp_Object QSscratch, Qafter_change_function, Qafter_change_functions; | |
1544 extern Lisp_Object Qbefore_change_function, Qbefore_change_functions; | |
1545 extern Lisp_Object Qbuffer_or_string_p, Qdefault_directory, Qfirst_change_hook; | |
1546 extern Lisp_Object Qpermanent_local, Vafter_change_function; | |
1547 extern Lisp_Object Vafter_change_functions, Vbefore_change_function; | |
1548 extern Lisp_Object Vbefore_change_functions, Vbuffer_alist, Vbuffer_defaults; | |
1549 extern Lisp_Object Vinhibit_read_only, Vtransient_mark_mode; | |
1550 | |
1551 /* This structure marks which slots in a buffer have corresponding | |
1552 default values in Vbuffer_defaults. | |
1553 Each such slot has a nonzero value in this structure. | |
1554 The value has only one nonzero bit. | |
1555 | |
1556 When a buffer has its own local value for a slot, | |
1557 the bit for that slot (found in the same slot in this structure) | |
1558 is turned on in the buffer's local_var_flags slot. | |
1559 | |
1560 If a slot in this structure is zero, then even though there may | |
1561 be a DEFVAR_BUFFER_LOCAL for the slot, there is no default value for it; | |
1562 and the corresponding slot in Vbuffer_defaults is not used. */ | |
1563 | |
1564 extern struct buffer buffer_local_flags; | |
1565 | |
1566 | |
1567 /* Allocation of buffer data. */ | |
1568 | |
1569 #ifdef REL_ALLOC | |
1570 | |
1571 char *r_alloc (unsigned char **, unsigned long); | |
1572 char *r_re_alloc (unsigned char **, unsigned long); | |
1573 void r_alloc_free (unsigned char **); | |
1574 | |
1575 #define BUFFER_ALLOC(data, size) \ | |
1576 ((Bufbyte *) r_alloc ((unsigned char **) &data, (size) * sizeof(Bufbyte))) | |
1577 #define BUFFER_REALLOC(data, size) \ | |
1578 ((Bufbyte *) r_re_alloc ((unsigned char **) &data, (size) * sizeof(Bufbyte))) | |
1579 #define BUFFER_FREE(data) r_alloc_free ((unsigned char **) &(data)) | |
1580 #define R_ALLOC_DECLARE(var,data) r_alloc_declare (&(var), data) | |
1581 | |
1582 #else /* !REL_ALLOC */ | |
1583 | |
1584 #define BUFFER_ALLOC(data,size)\ | |
1585 (data = xnew_array (Bufbyte, size)) | |
1586 #define BUFFER_REALLOC(data,size)\ | |
1587 ((Bufbyte *) xrealloc (data, (size) * sizeof(Bufbyte))) | |
1588 /* Avoid excess parentheses, or syntax errors may rear their heads. */ | |
1589 #define BUFFER_FREE(data) xfree (data) | |
1590 #define R_ALLOC_DECLARE(var,data) | |
1591 | |
1592 #endif /* !REL_ALLOC */ | |
1593 | |
1594 extern Lisp_Object Vbuffer_alist; | |
1595 void set_buffer_internal (struct buffer *b); | |
1596 struct buffer *decode_buffer (Lisp_Object buffer, int allow_string); | |
1597 | |
1598 /* from editfns.c */ | |
1599 void widen_buffer (struct buffer *b, int no_clip); | |
1600 int beginning_of_line_p (struct buffer *b, Bufpos pt); | |
1601 | |
1602 /* from insdel.c */ | |
1603 void set_buffer_point (struct buffer *buf, Bufpos pos, Bytind bipos); | |
1604 void find_charsets_in_bufbyte_string (unsigned char *charsets, | |
1605 CONST Bufbyte *str, | |
1606 Bytecount len); | |
1607 void find_charsets_in_emchar_string (unsigned char *charsets, | |
1608 CONST Emchar *str, | |
1609 Charcount len); | |
1610 int bufbyte_string_displayed_columns (CONST Bufbyte *str, Bytecount len); | |
1611 int emchar_string_displayed_columns (CONST Emchar *str, Charcount len); | |
1612 void convert_bufbyte_string_into_emchar_dynarr (CONST Bufbyte *str, | |
1613 Bytecount len, | |
1614 Emchar_dynarr *dyn); | |
1615 Charcount convert_bufbyte_string_into_emchar_string (CONST Bufbyte *str, | |
1616 Bytecount len, | |
1617 Emchar *arr); | |
1618 void convert_emchar_string_into_bufbyte_dynarr (Emchar *arr, int nels, | |
1619 Bufbyte_dynarr *dyn); | |
1620 Bufbyte *convert_emchar_string_into_malloced_string (Emchar *arr, int nels, | |
1621 Bytecount *len_out); | |
1622 /* from marker.c */ | |
1623 void init_buffer_markers (struct buffer *b); | |
1624 void uninit_buffer_markers (struct buffer *b); | |
1625 | |
1626 /* flags for get_buffer_pos_char(), get_buffer_range_char(), etc. */ | |
1627 /* At most one of GB_COERCE_RANGE and GB_NO_ERROR_IF_BAD should be | |
1628 specified. At most one of GB_NEGATIVE_FROM_END and GB_NO_ERROR_IF_BAD | |
1629 should be specified. */ | |
1630 | |
1631 #define GB_ALLOW_PAST_ACCESSIBLE (1 << 0) | |
1632 #define GB_ALLOW_NIL (1 << 1) | |
1633 #define GB_CHECK_ORDER (1 << 2) | |
1634 #define GB_COERCE_RANGE (1 << 3) | |
1635 #define GB_NO_ERROR_IF_BAD (1 << 4) | |
1636 #define GB_NEGATIVE_FROM_END (1 << 5) | |
1637 #define GB_HISTORICAL_STRING_BEHAVIOR (GB_NEGATIVE_FROM_END | GB_ALLOW_NIL) | |
1638 | |
1639 Bufpos get_buffer_pos_char (struct buffer *b, Lisp_Object pos, | |
1640 unsigned int flags); | |
1641 Bytind get_buffer_pos_byte (struct buffer *b, Lisp_Object pos, | |
1642 unsigned int flags); | |
1643 void get_buffer_range_char (struct buffer *b, Lisp_Object from, Lisp_Object to, | |
1644 Bufpos *from_out, Bufpos *to_out, | |
1645 unsigned int flags); | |
1646 void get_buffer_range_byte (struct buffer *b, Lisp_Object from, Lisp_Object to, | |
1647 Bytind *from_out, Bytind *to_out, | |
1648 unsigned int flags); | |
1649 Charcount get_string_pos_char (Lisp_Object string, Lisp_Object pos, | |
1650 unsigned int flags); | |
1651 Bytecount get_string_pos_byte (Lisp_Object string, Lisp_Object pos, | |
1652 unsigned int flags); | |
1653 void get_string_range_char (Lisp_Object string, Lisp_Object from, | |
1654 Lisp_Object to, Charcount *from_out, | |
1655 Charcount *to_out, unsigned int flags); | |
1656 void get_string_range_byte (Lisp_Object string, Lisp_Object from, | |
1657 Lisp_Object to, Bytecount *from_out, | |
1658 Bytecount *to_out, unsigned int flags); | |
1659 Bufpos get_buffer_or_string_pos_char (Lisp_Object object, Lisp_Object pos, | |
1660 unsigned int flags); | |
1661 Bytind get_buffer_or_string_pos_byte (Lisp_Object object, Lisp_Object pos, | |
1662 unsigned int flags); | |
1663 void get_buffer_or_string_range_char (Lisp_Object object, Lisp_Object from, | |
1664 Lisp_Object to, Bufpos *from_out, | |
1665 Bufpos *to_out, unsigned int flags); | |
1666 void get_buffer_or_string_range_byte (Lisp_Object object, Lisp_Object from, | |
1667 Lisp_Object to, Bytind *from_out, | |
1668 Bytind *to_out, unsigned int flags); | |
1669 Bufpos buffer_or_string_accessible_begin_char (Lisp_Object object); | |
1670 Bufpos buffer_or_string_accessible_end_char (Lisp_Object object); | |
1671 Bytind buffer_or_string_accessible_begin_byte (Lisp_Object object); | |
1672 Bytind buffer_or_string_accessible_end_byte (Lisp_Object object); | |
1673 Bufpos buffer_or_string_absolute_begin_char (Lisp_Object object); | |
1674 Bufpos buffer_or_string_absolute_end_char (Lisp_Object object); | |
1675 Bytind buffer_or_string_absolute_begin_byte (Lisp_Object object); | |
1676 Bytind buffer_or_string_absolute_end_byte (Lisp_Object object); | |
1677 void record_buffer (Lisp_Object buf); | |
1678 Lisp_Object get_buffer (Lisp_Object name, | |
1679 int error_if_deleted_or_does_not_exist); | |
1680 int map_over_sharing_buffers (struct buffer *buf, | |
1681 int (*mapfun) (struct buffer *buf, | |
1682 void *closure), | |
1683 void *closure); | |
1684 | |
1685 | |
1686 /************************************************************************/ | |
1687 /* Case conversion */ | |
1688 /************************************************************************/ | |
1689 | |
1690 /* A "trt" table is a mapping from characters to other characters, | |
1691 typically used to convert between uppercase and lowercase. For | |
1692 compatibility reasons, trt tables are currently in the form of | |
1693 a Lisp string of 256 characters, specifying the conversion for each | |
1694 of the first 256 Emacs characters (i.e. the 256 Latin-1 characters). | |
1695 This should be generalized at some point to support conversions for | |
1696 all of the allowable Mule characters. | |
1697 */ | |
1698 | |
1699 /* The _1 macros are named as such because they assume that you have | |
1700 already guaranteed that the character values are all in the range | |
1701 0 - 255. Bad lossage will happen otherwise. */ | |
1702 | |
1703 # define MAKE_TRT_TABLE() Fmake_string (make_int (256), make_char (0)) | |
1704 # define TRT_TABLE_AS_STRING(table) XSTRING_DATA (table) | |
1705 # define TRT_TABLE_CHAR_1(table, ch) \ | |
1706 string_char (XSTRING (table), (Charcount) ch) | |
1707 # define SET_TRT_TABLE_CHAR_1(table, ch1, ch2) \ | |
1708 set_string_char (XSTRING (table), (Charcount) ch1, ch2) | |
1709 | |
1710 #ifdef MULE | |
1711 # define MAKE_MIRROR_TRT_TABLE() make_opaque (256, 0) | |
1712 # define MIRROR_TRT_TABLE_AS_STRING(table) ((Bufbyte *) XOPAQUE_DATA (table)) | |
1713 # define MIRROR_TRT_TABLE_CHAR_1(table, ch) \ | |
1714 ((Emchar) (MIRROR_TRT_TABLE_AS_STRING (table)[ch])) | |
1715 # define SET_MIRROR_TRT_TABLE_CHAR_1(table, ch1, ch2) \ | |
1716 (MIRROR_TRT_TABLE_AS_STRING (table)[ch1] = (Bufbyte) (ch2)) | |
1717 #endif | |
1718 | |
1719 # define IN_TRT_TABLE_DOMAIN(c) (((EMACS_UINT) (c)) <= 255) | |
1720 | |
1721 #ifdef MULE | |
1722 #define MIRROR_DOWNCASE_TABLE_AS_STRING(buf) \ | |
1723 MIRROR_TRT_TABLE_AS_STRING (buf->mirror_downcase_table) | |
1724 #define MIRROR_UPCASE_TABLE_AS_STRING(buf) \ | |
1725 MIRROR_TRT_TABLE_AS_STRING (buf->mirror_upcase_table) | |
1726 #define MIRROR_CANON_TABLE_AS_STRING(buf) \ | |
1727 MIRROR_TRT_TABLE_AS_STRING (buf->mirror_case_canon_table) | |
1728 #define MIRROR_EQV_TABLE_AS_STRING(buf) \ | |
1729 MIRROR_TRT_TABLE_AS_STRING (buf->mirror_case_eqv_table) | |
1730 #else | |
1731 #define MIRROR_DOWNCASE_TABLE_AS_STRING(buf) \ | |
1732 TRT_TABLE_AS_STRING (buf->downcase_table) | |
1733 #define MIRROR_UPCASE_TABLE_AS_STRING(buf) \ | |
1734 TRT_TABLE_AS_STRING (buf->upcase_table) | |
1735 #define MIRROR_CANON_TABLE_AS_STRING(buf) \ | |
1736 TRT_TABLE_AS_STRING (buf->case_canon_table) | |
1737 #define MIRROR_EQV_TABLE_AS_STRING(buf) \ | |
1738 TRT_TABLE_AS_STRING (buf->case_eqv_table) | |
1739 #endif | |
1740 | |
1741 INLINE Emchar TRT_TABLE_OF (Lisp_Object trt, Emchar c); | |
1742 INLINE Emchar | |
1743 TRT_TABLE_OF (Lisp_Object trt, Emchar c) | |
1744 { | |
1745 return IN_TRT_TABLE_DOMAIN (c) ? TRT_TABLE_CHAR_1 (trt, c) : c; | |
1746 } | |
1747 | |
1748 /* Macros used below. */ | |
1749 #define DOWNCASE_TABLE_OF(buf, c) TRT_TABLE_OF (buf->downcase_table, c) | |
1750 #define UPCASE_TABLE_OF(buf, c) TRT_TABLE_OF (buf->upcase_table, c) | |
1751 | |
1752 /* 1 if CH is upper case. */ | |
1753 | |
1754 INLINE int UPPERCASEP (struct buffer *buf, Emchar ch); | |
1755 INLINE int | |
1756 UPPERCASEP (struct buffer *buf, Emchar ch) | |
1757 { | |
1758 return DOWNCASE_TABLE_OF (buf, ch) != ch; | |
1759 } | |
1760 | |
1761 /* 1 if CH is lower case. */ | |
1762 | |
1763 INLINE int LOWERCASEP (struct buffer *buf, Emchar ch); | |
1764 INLINE int | |
1765 LOWERCASEP (struct buffer *buf, Emchar ch) | |
1766 { | |
1767 return (UPCASE_TABLE_OF (buf, ch) != ch && | |
1768 DOWNCASE_TABLE_OF (buf, ch) == ch); | |
1769 } | |
1770 | |
1771 /* 1 if CH is neither upper nor lower case. */ | |
1772 | |
1773 INLINE int NOCASEP (struct buffer *buf, Emchar ch); | |
1774 INLINE int | |
1775 NOCASEP (struct buffer *buf, Emchar ch) | |
1776 { | |
1777 return UPCASE_TABLE_OF (buf, ch) == ch; | |
1778 } | |
1779 | |
1780 /* Upcase a character, or make no change if that cannot be done. */ | |
1781 | |
1782 INLINE Emchar UPCASE (struct buffer *buf, Emchar ch); | |
1783 INLINE Emchar | |
1784 UPCASE (struct buffer *buf, Emchar ch) | |
1785 { | |
1786 return (DOWNCASE_TABLE_OF (buf, ch) == ch) ? UPCASE_TABLE_OF (buf, ch) : ch; | |
1787 } | |
1788 | |
1789 /* Upcase a character known to be not upper case. Unused. */ | |
1790 | |
1791 #define UPCASE1(buf, ch) UPCASE_TABLE_OF (buf, ch) | |
1792 | |
1793 /* Downcase a character, or make no change if that cannot be done. */ | |
1794 | |
1795 #define DOWNCASE(buf, ch) DOWNCASE_TABLE_OF (buf, ch) | |
1796 | |
1797 #endif /* _XEMACS_BUFFER_H_ */ |