emacs-diffs
[Top][All Lists]
Advanced

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

master 51d44fd705: Fix ietf-drums-remove-whitespace unmatched " and (


From: Lars Ingebrigtsen
Subject: master 51d44fd705: Fix ietf-drums-remove-whitespace unmatched " and (
Date: Sun, 13 Feb 2022 03:33:15 -0500 (EST)

branch: master
commit 51d44fd705a2779beeb3fe1d59af88caadbc247a
Author: Bob Rogers <rogers@rgrjr.com>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Fix ietf-drums-remove-whitespace unmatched " and (
    
    * lisp/mail/ietf-drums.el:
    + (ietf-drums-skip-comment):  New helper function.
    + (ietf-drums-remove-comments):  Use ietf-drums-skip-comment.
    + (ietf-drums-remove-whitespace):  Handle unterminated quotes and
    comments, as ietf-drums-remove-comments already does.
    * test/lisp/mail/ietf-drums-tests.el:
    + Test unterminated quote and comment for
    ietf-drums-remove-whitespace and ietf-drums-remove-comments (bug#53965).
---
 lisp/mail/ietf-drums.el            | 30 ++++++++++++++++++++----------
 test/lisp/mail/ietf-drums-tests.el | 16 ++++++++++++++++
 2 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/lisp/mail/ietf-drums.el b/lisp/mail/ietf-drums.el
index db77aba172..85aa27235f 100644
--- a/lisp/mail/ietf-drums.el
+++ b/lisp/mail/ietf-drums.el
@@ -65,6 +65,21 @@ backslash and doublequote.")
     (modify-syntax-entry ?\' "_" table)
     table))
 
+(defvar ietf-drums-comment-syntax-table
+  (let ((table (copy-syntax-table ietf-drums-syntax-table)))
+    (modify-syntax-entry ?\" "w" table)
+    table)
+  "In comments, DQUOTE is normal and does not start a string.")
+
+(defun ietf-drums--skip-comment ()
+  ;; From just before the start of a comment, go to the end.  Returns
+  ;; point.  If the comment is unterminated, go to point-max.
+  (condition-case ()
+      (with-syntax-table ietf-drums-comment-syntax-table
+       (forward-sexp 1))
+    (scan-error (goto-char (point-max))))
+  (point))
+
 (defun ietf-drums-token-to-list (token)
   "Translate TOKEN into a list of characters."
   (let ((i 0)
@@ -109,14 +124,7 @@ backslash and doublequote.")
              (forward-sexp 1)
            (error (goto-char (point-max)))))
         ((eq c ?\()
-         (delete-region
-              (point)
-              (condition-case nil
-                  (with-syntax-table (copy-syntax-table 
ietf-drums-syntax-table)
-                    (modify-syntax-entry ?\" "w")
-                    (forward-sexp 1)
-                    (point))
-                (error (point-max)))))
+         (delete-region (point) (ietf-drums--skip-comment)))
         (t
          (forward-char 1))))
       (buffer-string))))
@@ -130,9 +138,11 @@ backslash and doublequote.")
        (setq c (char-after))
        (cond
         ((eq c ?\")
-         (forward-sexp 1))
+         (condition-case ()
+             (forward-sexp 1)
+           (scan-error (goto-char (point-max)))))
         ((eq c ?\()
-         (forward-sexp 1))
+          (ietf-drums--skip-comment))
         ((memq c '(?\  ?\t ?\n ?\r))
          (delete-char 1))
         (t
diff --git a/test/lisp/mail/ietf-drums-tests.el 
b/test/lisp/mail/ietf-drums-tests.el
index 4cc38b8763..b13937bf73 100644
--- a/test/lisp/mail/ietf-drums-tests.el
+++ b/test/lisp/mail/ietf-drums-tests.el
@@ -40,6 +40,16 @@
   (should (equal (ietf-drums-remove-comments
                   "random (first) (second (and)) (third) not fourth")
                  "random    not fourth"))
+  ;; Test some unterminated comments.
+  (should (equal (ietf-drums-remove-comments "test an (unterminated comment")
+                 "test an "))
+  (should (equal (ietf-drums-remove-comments "test an \"unterminated quote")
+                 ;; returns the string unchanged (and doesn't barf).
+                 "test an \"unterminated quote"))
+  (should (equal (ietf-drums-remove-comments
+                  ;; note that double-quote is not special.
+                  "test (unterminated comments with \"quoted (\" )stuff")
+                 "test "))
 
   ;; ietf-drums-remove-whitespace
   (should (equal (ietf-drums-remove-whitespace "random string")
@@ -53,6 +63,12 @@
   (should (equal (ietf-drums-remove-whitespace
                   "random (first) (second (and)) (third) not fourth")
                  "random(first)(second (and))(third)notfourth"))
+  ;; Test some unterminated comments and quotes.
+  (should (equal (ietf-drums-remove-whitespace
+                  "random (first) (second (and)) (third unterminated")
+                 "random(first)(second (and))(third unterminated"))
+  (should (equal (ietf-drums-remove-whitespace "random \"non terminated 
string")
+                 "random\"non terminated string"))
 
   ;; ietf-drums-strip
   (should (equal (ietf-drums-strip "random string") "randomstring"))



reply via email to

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