diff options
author | Miles Bader <miles@gnu.org> | 2007-04-11 00:17:47 +0000 |
---|---|---|
committer | Miles Bader <miles@gnu.org> | 2007-04-11 00:17:47 +0000 |
commit | 57cb2e6f261bb0aad81a9f7e6f3017b54adee068 (patch) | |
tree | 6ceb46f2e3bf08f16468d77f4fbfd201f637596a /src/intervals.c | |
parent | 3bd1d328e94787ac52ef6ba5dfec3b94ba23917a (diff) | |
parent | c429815a6b9d271a57eed4956125f6bc89d1d72b (diff) | |
download | emacs-57cb2e6f261bb0aad81a9f7e6f3017b54adee068.tar.gz |
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 675-697)
- Update from CVS
- Merge from gnus--rel--5.10
- Release ERC 5.2.
* gnus--rel--5.10 (patch 211-215)
- Update from CVS
- Merge from emacs--devo--0
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-189
Diffstat (limited to 'src/intervals.c')
-rw-r--r-- | src/intervals.c | 68 |
1 files changed, 39 insertions, 29 deletions
diff --git a/src/intervals.c b/src/intervals.c index ef97aa4973a..33ff321f0db 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -125,18 +125,24 @@ merge_properties (source, target) while (CONSP (o)) { sym = XCAR (o); - val = Fmemq (sym, target->plist); + o = XCDR (o); + CHECK_CONS (o); + + val = target->plist; + while (CONSP (val) && !EQ (XCAR (val), sym)) + { + val = XCDR (val); + if (!CONSP (val)) + break; + val = XCDR (val); + } if (NILP (val)) { - o = XCDR (o); - CHECK_CONS (o); val = XCAR (o); target->plist = Fcons (sym, Fcons (val, target->plist)); - o = XCDR (o); } - else - o = Fcdr (XCDR (o)); + o = XCDR (o); } } @@ -147,8 +153,8 @@ int intervals_equal (i0, i1) INTERVAL i0, i1; { - register Lisp_Object i0_cdr, i0_sym, i1_val; - register int i1_len; + register Lisp_Object i0_cdr, i0_sym; + register Lisp_Object i1_cdr, i1_val; if (DEFAULT_INTERVAL_P (i0) && DEFAULT_INTERVAL_P (i1)) return 1; @@ -156,39 +162,43 @@ intervals_equal (i0, i1) if (DEFAULT_INTERVAL_P (i0) || DEFAULT_INTERVAL_P (i1)) return 0; - i1_len = XFASTINT (Flength (i1->plist)); - if (i1_len & 0x1) /* Paranoia -- plists are always even */ - abort (); - i1_len /= 2; i0_cdr = i0->plist; - while (CONSP (i0_cdr)) + i1_cdr = i1->plist; + while (CONSP (i0_cdr) && CONSP (i1_cdr)) { - /* Lengths of the two plists were unequal. */ - if (i1_len == 0) - return 0; - i0_sym = XCAR (i0_cdr); - i1_val = Fmemq (i0_sym, i1->plist); + i0_cdr = XCDR (i0_cdr); + if (!CONSP (i0_cdr)) + return 0; /* abort (); */ + i1_val = i1->plist; + while (CONSP (i1_val) && !EQ (XCAR (i1_val), i0_sym)) + { + i1_val = XCDR (i1_val); + if (!CONSP (i1_val)) + return 0; /* abort (); */ + i1_val = XCDR (i1_val); + } /* i0 has something i1 doesn't. */ if (EQ (i1_val, Qnil)) return 0; /* i0 and i1 both have sym, but it has different values in each. */ - i0_cdr = XCDR (i0_cdr); - CHECK_CONS (i0_cdr); - if (!EQ (Fcar (Fcdr (i1_val)), XCAR (i0_cdr))) + if (!CONSP (i1_val) + || (i1_val = XCDR (i1_val), !CONSP (i1_val)) + || !EQ (XCAR (i1_val), XCAR (i0_cdr))) return 0; i0_cdr = XCDR (i0_cdr); - i1_len--; - } - /* Lengths of the two plists were unequal. */ - if (i1_len > 0) - return 0; + i1_cdr = XCDR (i1_cdr); + if (!CONSP (i1_cdr)) + return 0; /* abort (); */ + i1_cdr = XCDR (i1_cdr); + } - return 1; + /* Lengths of the two plists were equal. */ + return (NILP (i0_cdr) && NILP (i1_cdr)); } @@ -2538,7 +2548,7 @@ set_intervals_multibyte_1 (i, multi_flag, start, start_byte, end, end_byte) temp = CHAR_TO_BYTE (left_end); /* If LEFT_END_BYTE is in the middle of a character, - adjust it and LEFT_END to a char boundary. */ + adjust it and LEFT_END to a char boundary. */ if (left_end_byte > temp) { left_end_byte = temp; @@ -2570,7 +2580,7 @@ set_intervals_multibyte_1 (i, multi_flag, start, start_byte, end, end_byte) right_start = BYTE_TO_CHAR (right_start_byte); /* If RIGHT_START_BYTE is in the middle of a character, - adjust it and RIGHT_START to a char boundary. */ + adjust it and RIGHT_START to a char boundary. */ temp = CHAR_TO_BYTE (right_start); if (right_start_byte < temp) |