emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] comment-cache 223d16f 2/3: Apply `comment-depth' text prop


From: Alan Mackenzie
Subject: [Emacs-diffs] comment-cache 223d16f 2/3: Apply `comment-depth' text properties when calling `back_comment'.
Date: Tue, 08 Mar 2016 13:25:31 +0000

branch: comment-cache
commit 223d16fbf4a48f43ebac075e58ae2e5bd8898d7d
Author: Alan Mackenzie <address@hidden>
Commit: Alan Mackenzie <address@hidden>

    Apply `comment-depth' text properties when calling `back_comment'.
    
    Change the definition of `comment-depth''s values from an atom to a cons so 
as
    to hold enough information to initiliaze `scan_sexps_forward''s state.
    
    * src/syntax.c (old_back_comment): renamed from `back_comment'.
    (back_comment): New function which, when `comment-cacheing-flag' is non-nil
    applies `comment-depth' text properties then (for now) calls
    `old-back-comment'.
    (scan_sexp_forward): Enhance values applied as `comment-depth''s values.
---
 src/syntax.c |   79 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 72 insertions(+), 7 deletions(-)

diff --git a/src/syntax.c b/src/syntax.c
index 0998453..c08e29a 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -674,10 +674,11 @@ prev_char_comend_first (ptrdiff_t pos, ptrdiff_t pos_byte)
    Global syntax data remains valid for backward search starting at
    the returned value (or at FROM, if the search was not successful).  */
 
+
 static bool
-back_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
-             bool comnested, int comstyle, ptrdiff_t *charpos_ptr,
-             ptrdiff_t *bytepos_ptr)
+old_back_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
+                  bool comnested, int comstyle, ptrdiff_t *charpos_ptr,
+                  ptrdiff_t *bytepos_ptr)
 {
   /* Look back, counting the parity of string-quotes,
      and recording the comment-starters seen.
@@ -956,6 +957,66 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, 
ptrdiff_t stop,
 
   return from != comment_end;
 }
+
+static bool
+back_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
+              bool comnested, int comstyle, ptrdiff_t *charpos_ptr,
+              ptrdiff_t *bytepos_ptr)
+{
+  ptrdiff_t hwm, hwm_byte;
+  struct lisp_parse_state state;
+  ptrdiff_t orig_begv = BEGV, orig_begv_byte = BEGV_BYTE;
+  Lisp_Object depth;
+
+  if (comment_cacheing_flag)
+    {
+      hwm = XINT (Vcomment_depth_hwm);
+      if (hwm < from)
+        {
+          hwm_byte = CHAR_TO_BYTE (hwm);
+          internalize_parse_state (Qnil, &state);
+          BEGV = BEG; BEGV_BYTE = BEG_BYTE;
+          if (hwm > BEG)
+            {
+              depth = Fget_text_property (make_number (hwm - 1),
+                                          Qcomment_depth, Qnil);
+              if (CONSP (depth))
+                {
+                  if (EQ (Fcar (depth), Qstring))
+                    {
+                      state.instring = XINT (Fcdr (depth));
+                      state.incomment = 0;
+                    }
+                  else if (EQ (Fcar (depth), make_number (0)))
+                    {
+                      state.instring = -1;
+                      state.incomment = 0;
+                    }
+                  else
+                    {
+                      state.instring = -1;
+                      state.incomment = XINT (Fcar (depth));
+                      state.comstyle = XINT (Fcdr (depth));
+                    }
+                }
+            }
+          while (hwm < from)
+            {
+              scan_sexps_forward (&state, hwm, hwm_byte, from,
+                                  -100, false,
+                                  -1, /* stop after literal boundary */
+                                  true);
+              hwm = state.location;
+              hwm_byte = state.location_byte;
+            }
+          Vcomment_depth_hwm = make_number (hwm);
+          BEGV = orig_begv; BEGV_BYTE = orig_begv_byte;
+        }
+    }
+
+  return old_back_comment (from, from_byte, stop, comnested, comstyle,
+                           charpos_ptr, bytepos_ptr);
+}
 
 DEFUN ("syntax-table-p", Fsyntax_table_p, Ssyntax_table_p, 1, 1, 0,
        doc: /* Return t if OBJECT is a syntax table.
@@ -3199,8 +3260,11 @@ do { prev_from = from;                           \
     }
 
   comment_depth_value = (state.instring != -1)
-    ? Qstring
-    : make_number (state.incomment);
+    ? Fcons (Qstring, make_number (state.instring))
+    : (state.incomment
+       ? Fcons (make_number (state.incomment),
+                make_number (state.comstyle))
+       : Fcons (make_number (0), make_number (0)));
   state.quoted = 0;
   mindepth = depth;
 
@@ -3441,8 +3505,9 @@ do { prev_from = from;                            \
     state.levelstarts = Fcons (make_number ((--curlevel)->last),
                               state.levelstarts);
   if (propertize && commentstop == -1)
-      Fput_text_property (orig_from, from, Qcomment_depth,
-                          comment_depth_value, Qnil);
+    Fput_text_property (make_number (orig_from), make_number (from),
+                        Qcomment_depth,
+                        comment_depth_value, Qnil);
 
   immediate_quit = 0;
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]