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).
This commit is contained in:
Bob Rogers 2022-02-13 09:32:13 +01:00 committed by Lars Ingebrigtsen
parent ae13948ff5
commit 51d44fd705
2 changed files with 36 additions and 10 deletions

View file

@ -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

View file

@ -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"))