summaryrefslogtreecommitdiff
path: root/src/intervals.c
diff options
context:
space:
mode:
authorMiles Bader <miles@gnu.org>2007-04-11 00:17:47 +0000
committerMiles Bader <miles@gnu.org>2007-04-11 00:17:47 +0000
commit57cb2e6f261bb0aad81a9f7e6f3017b54adee068 (patch)
tree6ceb46f2e3bf08f16468d77f4fbfd201f637596a /src/intervals.c
parent3bd1d328e94787ac52ef6ba5dfec3b94ba23917a (diff)
parentc429815a6b9d271a57eed4956125f6bc89d1d72b (diff)
downloademacs-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.c68
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)