comparison src/marker.c @ 398:74fd4e045ea6 r21-2-29

Import from CVS: tag r21-2-29
author cvs
date Mon, 13 Aug 2007 11:13:30 +0200
parents 8626e4521993
children a86b2b5e0111
comparison
equal deleted inserted replaced
397:f4aeb21a5bad 398:74fd4e045ea6
34 #include "lisp.h" 34 #include "lisp.h"
35 35
36 #include "buffer.h" 36 #include "buffer.h"
37 37
38 static Lisp_Object 38 static Lisp_Object
39 mark_marker (Lisp_Object obj, void (*markobj) (Lisp_Object)) 39 mark_marker (Lisp_Object obj)
40 { 40 {
41 struct Lisp_Marker *marker = XMARKER (obj); 41 Lisp_Marker *marker = XMARKER (obj);
42 Lisp_Object buf; 42 Lisp_Object buf;
43 /* DO NOT mark through the marker's chain. 43 /* DO NOT mark through the marker's chain.
44 The buffer's markers chain does not preserve markers from gc; 44 The buffer's markers chain does not preserve markers from gc;
45 Instead, markers are removed from the chain when they are freed 45 Instead, markers are removed from the chain when they are freed
46 by gc. 46 by gc.
53 } 53 }
54 54
55 static void 55 static void
56 print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) 56 print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
57 { 57 {
58 struct Lisp_Marker *marker = XMARKER (obj); 58 Lisp_Marker *marker = XMARKER (obj);
59 char buf[200]; 59 char buf[200];
60 60
61 if (print_readably) 61 if (print_readably)
62 error ("printing unreadable object #<marker 0x%lx>", (long) marker); 62 error ("printing unreadable object #<marker 0x%lx>", (long) marker);
63 63
64 write_c_string (GETTEXT ("#<marker "), printcharfun); 64 write_c_string (GETTEXT ("#<marker "), printcharfun);
65 if (!marker->buffer) 65 if (!marker->buffer)
66 write_c_string (GETTEXT ("in no buffer"), printcharfun); 66 write_c_string (GETTEXT ("in no buffer"), printcharfun);
67 else 67 else
68 { 68 {
69 sprintf (buf, "at %d in ", marker_position (obj)); 69 sprintf (buf, "at %ld in ", (long) marker_position (obj));
70 write_c_string (buf, printcharfun); 70 write_c_string (buf, printcharfun);
71 print_internal (marker->buffer->name, printcharfun, 0); 71 print_internal (marker->buffer->name, printcharfun, 0);
72 } 72 }
73 sprintf (buf, " 0x%lx>", (long) marker); 73 sprintf (buf, " 0x%lx>", (long) marker);
74 write_c_string (buf, printcharfun); 74 write_c_string (buf, printcharfun);
75 } 75 }
76 76
77 static int 77 static int
78 marker_equal (Lisp_Object obj1, Lisp_Object obj2, int depth) 78 marker_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
79 { 79 {
80 struct Lisp_Marker *marker1 = XMARKER (obj1); 80 Lisp_Marker *marker1 = XMARKER (obj1);
81 struct Lisp_Marker *marker2 = XMARKER (obj2); 81 Lisp_Marker *marker2 = XMARKER (obj2);
82 82
83 return ((marker1->buffer == marker2->buffer) && 83 return ((marker1->buffer == marker2->buffer) &&
84 (marker1->memind == marker2->memind || 84 (marker1->memind == marker2->memind ||
85 /* All markers pointing nowhere are equal */ 85 /* All markers pointing nowhere are equal */
86 !marker1->buffer)); 86 !marker1->buffer));
93 if (hash) 93 if (hash)
94 hash = HASH2 (hash, XMARKER (obj)->memind); 94 hash = HASH2 (hash, XMARKER (obj)->memind);
95 return hash; 95 return hash;
96 } 96 }
97 97
98 static const struct lrecord_description marker_description[] = {
99 { XD_LISP_OBJECT, offsetof (Lisp_Marker, next) },
100 { XD_LISP_OBJECT, offsetof (Lisp_Marker, prev) },
101 { XD_LISP_OBJECT, offsetof (Lisp_Marker, buffer) },
102 { XD_END }
103 };
104
98 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("marker", marker, 105 DEFINE_BASIC_LRECORD_IMPLEMENTATION ("marker", marker,
99 mark_marker, print_marker, 0, 106 mark_marker, print_marker, 0,
100 marker_equal, marker_hash, 107 marker_equal, marker_hash, marker_description,
101 struct Lisp_Marker); 108 Lisp_Marker);
102 109
103 /* Operations on markers. */ 110 /* Operations on markers. */
104 111
105 DEFUN ("marker-buffer", Fmarker_buffer, 1, 1, 0, /* 112 DEFUN ("marker-buffer", Fmarker_buffer, 1, 1, 0, /*
106 Return the buffer that MARKER points into, or nil if none. 113 Return the buffer that MARKER points into, or nil if none.
133 #if 0 /* useful debugging function */ 140 #if 0 /* useful debugging function */
134 141
135 static void 142 static void
136 check_marker_circularities (struct buffer *buf) 143 check_marker_circularities (struct buffer *buf)
137 { 144 {
138 struct Lisp_Marker *tortoise, *hare; 145 Lisp_Marker *tortoise, *hare;
139 146
140 tortoise = BUF_MARKERS (buf); 147 tortoise = BUF_MARKERS (buf);
141 hare = tortoise; 148 hare = tortoise;
142 149
143 if (!tortoise) 150 if (!tortoise)
164 set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, 171 set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer,
165 int restricted_p) 172 int restricted_p)
166 { 173 {
167 Bufpos charno; 174 Bufpos charno;
168 struct buffer *b; 175 struct buffer *b;
169 struct Lisp_Marker *m; 176 Lisp_Marker *m;
170 int point_p; 177 int point_p;
171 178
172 CHECK_MARKER (marker); 179 CHECK_MARKER (marker);
173 180
174 point_p = POINT_MARKER_P (marker); 181 point_p = POINT_MARKER_P (marker);
280 including those in chain fields of markers. */ 287 including those in chain fields of markers. */
281 288
282 void 289 void
283 unchain_marker (Lisp_Object m) 290 unchain_marker (Lisp_Object m)
284 { 291 {
285 struct Lisp_Marker *marker = XMARKER (m); 292 Lisp_Marker *marker = XMARKER (m);
286 struct buffer *b = marker->buffer; 293 struct buffer *b = marker->buffer;
287 294
288 if (b == 0) 295 if (b == 0)
289 return; 296 return;
290 297
307 } 314 }
308 315
309 Bytind 316 Bytind
310 bi_marker_position (Lisp_Object marker) 317 bi_marker_position (Lisp_Object marker)
311 { 318 {
312 struct Lisp_Marker *m = XMARKER (marker); 319 Lisp_Marker *m = XMARKER (marker);
313 struct buffer *buf = m->buffer; 320 struct buffer *buf = m->buffer;
314 Bytind pos; 321 Bytind pos;
315 322
316 if (!buf) 323 if (!buf)
317 error ("Marker does not point anywhere"); 324 error ("Marker does not point anywhere");
344 } 351 }
345 352
346 void 353 void
347 set_bi_marker_position (Lisp_Object marker, Bytind pos) 354 set_bi_marker_position (Lisp_Object marker, Bytind pos)
348 { 355 {
349 struct Lisp_Marker *m = XMARKER (marker); 356 Lisp_Marker *m = XMARKER (marker);
350 struct buffer *buf = m->buffer; 357 struct buffer *buf = m->buffer;
351 358
352 if (!buf) 359 if (!buf)
353 error ("Marker does not point anywhere"); 360 error ("Marker does not point anywhere");
354 361
451 xxDEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, 1, 1, 0, /* 458 xxDEFUN ("buffer-has-markers-at", Fbuffer_has_markers_at, 1, 1, 0, /*
452 Return t if there are markers pointing at POSITION in the current buffer. 459 Return t if there are markers pointing at POSITION in the current buffer.
453 */ 460 */
454 (position)) 461 (position))
455 { 462 {
456 struct Lisp_Marker *marker; 463 Lisp_Marker *marker;
457 Memind pos; 464 Memind pos;
458 465
459 /* A small optimization trick: convert POS to memind now, rather 466 /* A small optimization trick: convert POS to memind now, rather
460 than converting every marker's memory index to bufpos. */ 467 than converting every marker's memory index to bufpos. */
461 pos = bytind_to_memind (current_buffer, 468 pos = bytind_to_memind (current_buffer,
480 #ifdef MEMORY_USAGE_STATS 487 #ifdef MEMORY_USAGE_STATS
481 488
482 int 489 int
483 compute_buffer_marker_usage (struct buffer *b, struct overhead_stats *ovstats) 490 compute_buffer_marker_usage (struct buffer *b, struct overhead_stats *ovstats)
484 { 491 {
485 struct Lisp_Marker *m; 492 Lisp_Marker *m;
486 int total = 0; 493 int total = 0;
487 int overhead; 494 int overhead;
488 495
489 for (m = BUF_MARKERS (b); m; m = m->next) 496 for (m = BUF_MARKERS (b); m; m = m->next)
490 total += sizeof (struct Lisp_Marker); 497 total += sizeof (Lisp_Marker);
491 ovstats->was_requested += total; 498 ovstats->was_requested += total;
492 overhead = fixed_type_block_overhead (total); 499 overhead = fixed_type_block_overhead (total);
493 /* #### claiming this is all malloc overhead is not really right, 500 /* #### claiming this is all malloc overhead is not really right,
494 but it has to go somewhere. */ 501 but it has to go somewhere. */
495 ovstats->malloc_overhead += overhead; 502 ovstats->malloc_overhead += overhead;
531 void 538 void
532 uninit_buffer_markers (struct buffer *b) 539 uninit_buffer_markers (struct buffer *b)
533 { 540 {
534 /* Unchain all markers of this buffer 541 /* Unchain all markers of this buffer
535 and leave them pointing nowhere. */ 542 and leave them pointing nowhere. */
536 REGISTER struct Lisp_Marker *m, *next; 543 REGISTER Lisp_Marker *m, *next;
537 for (m = BUF_MARKERS (b); m; m = next) 544 for (m = BUF_MARKERS (b); m; m = next)
538 { 545 {
539 m->buffer = 0; 546 m->buffer = 0;
540 next = marker_next (m); 547 next = marker_next (m);
541 marker_next (m) = 0; 548 marker_next (m) = 0;