# HG changeset patch # User Miles Bader # Date 1016093435 0 # Node ID fccc867cca64e8658ece058388d18890258b0562 # Parent c246c4abd79eb91afd7a496ddec77d896169ddb3 (text_property_stickiness): Function moved here from `editfns.c'. diff -r c246c4abd79e -r fccc867cca64 src/textprop.c --- a/src/textprop.c Thu Mar 14 08:09:59 2002 +0000 +++ b/src/textprop.c Thu Mar 14 08:10:35 2002 +0000 @@ -1,5 +1,5 @@ /* Interface code for dealing with text properties. - Copyright (C) 1993, 1994, 1995, 1997, 1999, 2000, 2001 + Copyright (C) 1993, 1994, 1995, 1997, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -1554,6 +1554,63 @@ } return Qnil; } + + +/* Return the direction from which the text-property PROP would be + inherited by any new text inserted at POS: 1 if it would be + inherited from the char after POS, -1 if it would be inherited from + the char before POS, and 0 if from neither. */ + +int +text_property_stickiness (prop, pos) + Lisp_Object prop; + Lisp_Object pos; +{ + Lisp_Object prev_pos, front_sticky; + int is_rear_sticky = 1, is_front_sticky = 0; /* defaults */ + + if (XINT (pos) > BEGV) + /* Consider previous character. */ + { + Lisp_Object rear_non_sticky; + + prev_pos = make_number (XINT (pos) - 1); + rear_non_sticky = Fget_text_property (prev_pos, Qrear_nonsticky, Qnil); + + if (!NILP (CONSP (rear_non_sticky) + ? Fmemq (prop, rear_non_sticky) + : rear_non_sticky)) + /* PROP is rear-non-sticky. */ + is_rear_sticky = 0; + } + + /* Consider following character. */ + front_sticky = Fget_text_property (pos, Qfront_sticky, Qnil); + + if (EQ (front_sticky, Qt) + || (CONSP (front_sticky) + && !NILP (Fmemq (prop, front_sticky)))) + /* PROP is inherited from after. */ + is_front_sticky = 1; + + /* Simple cases, where the properties are consistent. */ + if (is_rear_sticky && !is_front_sticky) + return -1; + else if (!is_rear_sticky && is_front_sticky) + return 1; + else if (!is_rear_sticky && !is_front_sticky) + return 0; + + /* The stickiness properties are inconsistent, so we have to + disambiguate. Basically, rear-sticky wins, _except_ if the + property that would be inherited has a value of nil, in which case + front-sticky wins. */ + if (XINT (pos) == BEGV || NILP (Fget_text_property (prev_pos, prop, Qnil))) + return 1; + else + return -1; +} + /* I don't think this is the right interface to export; how often do you want to do something like this, other than when you're copying objects