Mercurial > emacs
changeset 17467:98c47e7857f3
Style of comments corrected.
(interval_of): New function.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Tue, 15 Apr 1997 04:58:34 +0000 |
parents | c6ba5208968b |
children | 94face85736e |
files | src/textprop.c |
diffstat | 1 files changed, 69 insertions(+), 27 deletions(-) [+] |
line wrap: on
line diff
--- a/src/textprop.c Tue Apr 15 04:56:39 1997 +0000 +++ b/src/textprop.c Tue Apr 15 04:58:34 1997 +0000 @@ -1,5 +1,5 @@ /* Interface code for dealing with text properties. - Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -44,12 +44,12 @@ only once on the list. Although some code i.e., remove_properties, handles the more general case, the uniqueness of properties is necessary for the system to remain consistent. This requirement - is enforced by the subrs installing properties onto the intervals. */ + is enforced by the subrs installing properties onto the intervals. */ /* The rest of the file is within this conditional */ #ifdef USE_TEXT_PROPERTIES -/* Types of hooks. */ +/* Types of hooks. */ Lisp_Object Qmouse_left; Lisp_Object Qmouse_entered; Lisp_Object Qpoint_left; @@ -57,7 +57,7 @@ Lisp_Object Qcategory; Lisp_Object Qlocal_map; -/* Visual properties text (including strings) may have. */ +/* Visual properties text (including strings) may have. */ Lisp_Object Qforeground, Qbackground, Qfont, Qunderline, Qstipple; Lisp_Object Qinvisible, Qread_only, Qintangible; @@ -116,7 +116,7 @@ CHECK_NUMBER_COERCE_MARKER (*end, 0); /* If we are asked for a point, but from a subr which operates - on a range, then return nothing. */ + on a range, then return nothing. */ if (EQ (*begin, *end) && begin != end) return NULL_INTERVAL; @@ -137,7 +137,7 @@ args_out_of_range (*begin, *end); i = BUF_INTERVALS (b); - /* If there's no text, there are no properties. */ + /* If there's no text, there are no properties. */ if (BUF_BEGV (b) == BUF_ZV (b)) return NULL_INTERVAL; @@ -171,7 +171,7 @@ /* Validate LIST as a property list. If LIST is not a list, then make one consisting of (LIST nil). Otherwise, verify that LIST - is even numbered and thus suitable as a plist. */ + is even numbered and thus suitable as a plist. */ static Lisp_Object validate_plist (list) @@ -198,7 +198,7 @@ } /* Return nonzero if interval I has all the properties, - with the same values, of list PLIST. */ + with the same values, of list PLIST. */ static int interval_has_all_properties (plist, i) @@ -208,7 +208,7 @@ register Lisp_Object tail1, tail2, sym1, sym2; register int found; - /* Go through each element of PLIST. */ + /* Go through each element of PLIST. */ for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) { sym1 = Fcar (tail1); @@ -219,11 +219,11 @@ if (EQ (sym1, Fcar (tail2))) { /* Found the same property on both lists. If the - values are unequal, return zero. */ + values are unequal, return zero. */ if (! EQ (Fcar (Fcdr (tail1)), Fcar (Fcdr (tail2)))) return 0; - /* Property has same value on both lists; go to next one. */ + /* Property has same value on both lists; go to next one. */ found = 1; break; } @@ -236,7 +236,7 @@ } /* Return nonzero if the plist of interval I has any of the - properties of PLIST, regardless of their values. */ + properties of PLIST, regardless of their values. */ static INLINE int interval_has_some_properties (plist, i) @@ -245,7 +245,7 @@ { register Lisp_Object tail1, tail2, sym; - /* Go through each element of PLIST. */ + /* Go through each element of PLIST. */ for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) { sym = Fcar (tail1); @@ -349,7 +349,7 @@ I and its plist are also protected, via OBJECT. */ GCPRO3 (tail1, sym1, val1); - /* Go through each element of PLIST. */ + /* Go through each element of PLIST. */ for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) { sym1 = Fcar (tail1); @@ -365,11 +365,11 @@ register Lisp_Object this_cdr; this_cdr = Fcdr (tail2); - /* Found the property. Now check its value. */ + /* Found the property. Now check its value. */ found = 1; /* The properties have the same value on both lists. - Continue to the next property. */ + Continue to the next property. */ if (EQ (val1, Fcar (this_cdr))) break; @@ -418,7 +418,7 @@ register int changed = 0; current_plist = i->plist; - /* Go through each element of plist. */ + /* Go through each element of plist. */ for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) { sym = Fcar (tail1); @@ -465,7 +465,7 @@ #if 0 /* Remove all properties from interval I. Return non-zero - if this changes the interval. */ + if this changes the interval. */ static INLINE int erase_properties (i) @@ -479,6 +479,48 @@ } #endif +/* Returns the interval of the POSITION in OBJECT. + POSITION is BEG-based. */ + +INTERVAL +interval_of (position, object) + int position; + Lisp_Object object; +{ + register INTERVAL i; + int beg, end; + + if (NILP (object)) + XSETBUFFER (object, current_buffer); + + CHECK_STRING_OR_BUFFER (object, 0); + + if (BUFFERP (object)) + { + register struct buffer *b = XBUFFER (object); + + beg = BUF_BEGV (b); + end = BUF_ZV (b); + i = BUF_INTERVALS (b); + } + else + { + register struct Lisp_String *s = XSTRING (object); + + /* We expect position to be 1-based. */ + beg = BEG; + end = s->size + BEG; + i = s->intervals; + } + + if (!(beg <= position && position <= end)) + args_out_of_range (position, position); + if (beg == end || NULL_INTERVAL_P (i)) + return NULL_INTERVAL; + + return find_interval (i, position); +} + DEFUN ("text-properties-at", Ftext_properties_at, Stext_properties_at, 1, 2, 0, "Return the list of properties held by the character at POSITION\n\ @@ -900,11 +942,11 @@ GCPRO1 (properties); /* If we're not starting on an interval boundary, we have to - split this interval. */ + split this interval. */ if (i->position != s) { /* If this interval already has the properties, we can - skip it. */ + skip it. */ if (interval_has_all_properties (properties, i)) { int got = (LENGTH (i) - (s - i->position)); @@ -1155,7 +1197,7 @@ if (i->position != s) { /* No properties on this first interval -- return if - it covers the entire region. */ + it covers the entire region. */ if (! interval_has_some_properties (properties, i)) { int got = (LENGTH (i) - (s - i->position)); @@ -1315,7 +1357,7 @@ register int got; register INTERVAL unchanged = i; - /* If there are properties here, then this text will be modified. */ + /* If there are properties here, then this text will be modified. */ if (! NILP (i->plist)) { i = split_interval_right (unchanged, s - unchanged->position); @@ -1340,7 +1382,7 @@ else if (LENGTH (i) - (s - i->position) <= len) return Qnil; /* The amount of text to change extends past I, so just note - how much we've gotten. */ + how much we've gotten. */ else got = LENGTH (i) - (s - i->position); @@ -1349,7 +1391,7 @@ i = next_interval (i); } - /* We are starting at the beginning of an interval, I. */ + /* We are starting at the beginning of an interval, I. */ while (len > 0) { if (LENGTH (i) >= len) @@ -1383,7 +1425,7 @@ else { modified += ! NILP (i->plist); - /* Merging I will give it the properties of PREV_CHANGED. */ + /* Merging I will give it the properties of PREV_CHANGED. */ prev_changed = i = merge_interval_left (i); } @@ -1463,7 +1505,7 @@ if (! NILP (plist)) { /* Must defer modifications to the interval tree in case src - and dest refer to the same string or buffer. */ + and dest refer to the same string or buffer. */ stuff = Fcons (Fcons (make_number (p), Fcons (make_number (p + len), Fcons (plist, Qnil))), @@ -1572,7 +1614,7 @@ if (NILP (Vinhibit_read_only) || CONSP (Vinhibit_read_only)) { /* If I and PREV differ we need to check for the read-only - property together with its stickiness. If either I or + property together with its stickiness. If either I or PREV are 0, this check is all we need. We have to take special care, since read-only may be indirectly defined via the category property. */