X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Fmarker.c;h=0811ac03a337b91c59f279b9620db1c4356a39db;hb=4f29597e4f3696a59bb08ffece07183c1568c4a5;hp=88ef60b9762b11aacd6310e32af1463adf94f593;hpb=669565bfdc5d704dfb1d5ac1a0ec01fb3615a1ae;p=chise%2Fxemacs-chise.git- diff --git a/src/marker.c b/src/marker.c index 88ef60b..0811ac0 100644 --- a/src/marker.c +++ b/src/marker.c @@ -36,9 +36,9 @@ Boston, MA 02111-1307, USA. */ #include "buffer.h" static Lisp_Object -mark_marker (Lisp_Object obj, void (*markobj) (Lisp_Object)) +mark_marker (Lisp_Object obj) { - struct Lisp_Marker *marker = XMARKER (obj); + Lisp_Marker *marker = XMARKER (obj); Lisp_Object buf; /* DO NOT mark through the marker's chain. The buffer's markers chain does not preserve markers from gc; @@ -55,7 +55,7 @@ mark_marker (Lisp_Object obj, void (*markobj) (Lisp_Object)) static void print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) { - struct Lisp_Marker *marker = XMARKER (obj); + Lisp_Marker *marker = XMARKER (obj); char buf[200]; if (print_readably) @@ -66,7 +66,7 @@ print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) write_c_string (GETTEXT ("in no buffer"), printcharfun); else { - sprintf (buf, "at %d in ", marker_position (obj)); + sprintf (buf, "at %ld in ", (long) marker_position (obj)); write_c_string (buf, printcharfun); print_internal (marker->buffer->name, printcharfun, 0); } @@ -75,16 +75,15 @@ print_marker (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) } static int -marker_equal (Lisp_Object o1, Lisp_Object o2, int depth) +marker_equal (Lisp_Object obj1, Lisp_Object obj2, int depth) { - struct buffer *b1 = XMARKER (o1)->buffer; - if (b1 != XMARKER (o2)->buffer) - return (0); - else if (!b1) - /* All markers pointing nowhere are equal */ - return (1); - else - return ((XMARKER (o1)->memind == XMARKER (o2)->memind)); + Lisp_Marker *marker1 = XMARKER (obj1); + Lisp_Marker *marker2 = XMARKER (obj2); + + return ((marker1->buffer == marker2->buffer) && + (marker1->memind == marker2->memind || + /* All markers pointing nowhere are equal */ + !marker1->buffer)); } static unsigned long @@ -96,10 +95,17 @@ marker_hash (Lisp_Object obj, int depth) return hash; } +static const struct lrecord_description marker_description[] = { + { XD_LISP_OBJECT, offsetof (Lisp_Marker, next) }, + { XD_LISP_OBJECT, offsetof (Lisp_Marker, prev) }, + { XD_LISP_OBJECT, offsetof (Lisp_Marker, buffer) }, + { XD_END } +}; + DEFINE_BASIC_LRECORD_IMPLEMENTATION ("marker", marker, mark_marker, print_marker, 0, - marker_equal, marker_hash, - struct Lisp_Marker); + marker_equal, marker_hash, marker_description, + Lisp_Marker); /* Operations on markers. */ @@ -136,7 +142,7 @@ Return `nil' if marker doesn't point anywhere. static void check_marker_circularities (struct buffer *buf) { - struct Lisp_Marker *tortoise, *hare; + Lisp_Marker *tortoise, *hare; tortoise = BUF_MARKERS (buf); hare = tortoise; @@ -167,7 +173,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, { Bufpos charno; struct buffer *b; - struct Lisp_Marker *m; + Lisp_Marker *m; int point_p; CHECK_MARKER (marker); @@ -180,7 +186,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, (MARKERP (pos) && !XMARKER (pos)->buffer)) { if (point_p) - signal_simple_error ("can't make point-marker point nowhere", + signal_simple_error ("Can't make point-marker point nowhere", marker); if (XMARKER (marker)->buffer) unchain_marker (marker); @@ -199,7 +205,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, { if (point_p) signal_simple_error - ("can't move point-marker in a killed buffer", marker); + ("Can't move point-marker in a killed buffer", marker); if (XMARKER (marker)->buffer) unchain_marker (marker); return marker; @@ -237,7 +243,7 @@ set_marker_internal (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer, if (m->buffer != b) { if (point_p) - signal_simple_error ("can't change buffer of point-marker", marker); + signal_simple_error ("Can't change buffer of point-marker", marker); if (m->buffer != 0) unchain_marker (marker); m->buffer = b; @@ -283,7 +289,7 @@ set_marker_restricted (Lisp_Object marker, Lisp_Object pos, Lisp_Object buffer) void unchain_marker (Lisp_Object m) { - struct Lisp_Marker *marker = XMARKER (m); + Lisp_Marker *marker = XMARKER (m); struct buffer *b = marker->buffer; if (b == 0) @@ -310,7 +316,7 @@ unchain_marker (Lisp_Object m) Bytind bi_marker_position (Lisp_Object marker) { - struct Lisp_Marker *m = XMARKER (marker); + Lisp_Marker *m = XMARKER (marker); struct buffer *buf = m->buffer; Bytind pos; @@ -347,7 +353,7 @@ marker_position (Lisp_Object marker) void set_bi_marker_position (Lisp_Object marker, Bytind pos) { - struct Lisp_Marker *m = XMARKER (marker); + Lisp_Marker *m = XMARKER (marker); struct buffer *buf = m->buffer; if (!buf) @@ -454,7 +460,7 @@ Return t if there are markers pointing at POSITION in the current buffer. */ (position)) { - struct Lisp_Marker *marker; + Lisp_Marker *marker; Memind pos; /* A small optimization trick: convert POS to memind now, rather @@ -483,12 +489,12 @@ Return t if there are markers pointing at POSITION in the current buffer. int compute_buffer_marker_usage (struct buffer *b, struct overhead_stats *ovstats) { - struct Lisp_Marker *m; + Lisp_Marker *m; int total = 0; int overhead; for (m = BUF_MARKERS (b); m; m = m->next) - total += sizeof (struct Lisp_Marker); + total += sizeof (Lisp_Marker); ovstats->was_requested += total; overhead = fixed_type_block_overhead (total); /* #### claiming this is all malloc overhead is not really right, @@ -503,6 +509,8 @@ compute_buffer_marker_usage (struct buffer *b, struct overhead_stats *ovstats) void syms_of_marker (void) { + INIT_LRECORD_IMPLEMENTATION (marker); + DEFSUBR (Fmarker_position); DEFSUBR (Fmarker_buffer); DEFSUBR (Fset_marker); @@ -534,7 +542,7 @@ uninit_buffer_markers (struct buffer *b) { /* Unchain all markers of this buffer and leave them pointing nowhere. */ - REGISTER struct Lisp_Marker *m, *next; + REGISTER Lisp_Marker *m, *next; for (m = BUF_MARKERS (b); m; m = next) { m->buffer = 0;