emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/xr 127d3fe 3/3: Escape control characters in warnings a


From: Mattias Engdegård
Subject: [elpa] externals/xr 127d3fe 3/3: Escape control characters in warnings and errors
Date: Thu, 21 Feb 2019 08:59:21 -0500 (EST)

branch: externals/xr
commit 127d3fee727367294dcff86c695fb154a30358e1
Author: Mattias Engdegård <address@hidden>
Commit: Mattias Engdegård <address@hidden>

    Escape control characters in warnings and errors
---
 xr-test.el |  5 +++--
 xr.el      | 65 ++++++++++++++++++++++++++++++++------------------------------
 2 files changed, 37 insertions(+), 33 deletions(-)

diff --git a/xr-test.el b/xr-test.el
index 0c686c1..0186fd2 100644
--- a/xr-test.el
+++ b/xr-test.el
@@ -266,11 +266,12 @@
                  '((1 . "Unescaped literal `*'"))))
   (should (equal (xr-lint "a[\\\\[]")
                  '((2 . "Escaped `\\' inside character alternative"))))
-  (should (equal (xr-lint "\\{\\(+\\|?\\)\\[\\]\\}")
+  (should (equal (xr-lint "\\{\\(+\\|?\\)\\[\\]\\}\\\t")
                  '((0 . "Escaped non-special character `{'")
                    (4 . "Unescaped literal `+'")
                    (7 . "Unescaped literal `?'")
-                   (14 . "Escaped non-special character `}'"))))
+                   (14 . "Escaped non-special character `}'")
+                   (16 . "Escaped non-special character `\\t'"))))
   (should (equal (xr-lint "\\}\\w\\a\\b\\%")
                  '((0 . "Escaped non-special character `}'")
                    (4 . "Escaped non-special character `a'")
diff --git a/xr.el b/xr.el
index 95845dd..142a7ab 100644
--- a/xr.el
+++ b/xr.el
@@ -244,7 +244,8 @@
                      (?|  . string-delimiter)
                      (?!  . comment-delimiter)))))
     (when (not sym)
-      (error "Unknown syntax code `%c'" syntax-code))
+      (error "Unknown syntax code `%s'"
+             (xr--escape-string (char-to-string syntax-code))))
     (let ((item (list 'syntax (cdr sym))))
       (if negated (list 'not item) item))))
 
@@ -455,7 +456,7 @@
           ;; makes it unlikely to be a serious error.
           (xr--report warnings (match-beginning 0)
                       (format "Escaped non-special character `%s'"
-                              (match-string 2)))))
+                              (xr--escape-string (match-string 2))))))
 
        (t (error "Backslash at end of regexp"))))
 
@@ -508,6 +509,36 @@ in RE-STRING."
     (xr--parse re-string warnings)
     (reverse (car warnings))))
 
+;; Escape non-printing characters in a string for maximum readability.
+(defun xr--escape-string (string)
+  ;; Translate control and raw chars to escape sequences for readability.
+  ;; We prefer hex escapes (\xHH) since that is usually what the user wants,
+  ;; but use octal (\OOO) if a legitimate hex digit follows, as
+  ;; hex escapes are not limited to two digits.
+  (replace-regexp-in-string
+   "[\x00-\x1f\"\\\x7f\x80-\xff][[:xdigit:]]?"
+   (lambda (s)
+     (let* ((c (logand (string-to-char s) #xff))
+            (xdigit (substring s 1))
+            (transl (assq c
+                          '((?\" . "\\\"")
+                            (?\\ . "\\\\")
+                            (?\a . "\\a")
+                            (?\b . "\\b")
+                            (?\t . "\\t")
+                            (?\n . "\\n")
+                            (?\v . "\\v")
+                            (?\f . "\\f")
+                            (?\r . "\\r")
+                            (?\e . "\\e")))))
+       (concat
+        (if transl
+            (cdr transl)
+          (format (if (zerop (length xdigit)) "\\x%02x" "\\%03o")
+                  c))
+        xdigit)))
+   string 'fixedcase 'literal))
+
 ;; Print a rx expression to a string, unformatted.
 (defun xr--rx-to-string (rx)
   (cond
@@ -522,35 +553,7 @@ in RE-STRING."
           (rest (mapcar #'xr--rx-to-string (cdr rx))))
       (concat "(" (mapconcat #'identity (cons first rest) " ") ")")))
    ((stringp rx)
-    ;; Translate control and raw chars to escape sequences for readability.
-    ;; We prefer hex escapes (\xHH) since that is usually what the user wants,
-    ;; but use octal (\OOO) if a legitimate hex digit follows, as
-    ;; hex escapes are not limited to two digits.
-    (concat "\""
-            (replace-regexp-in-string
-             "[\x00-\x1f\"\\\x7f\x80-\xff][[:xdigit:]]?"
-             (lambda (s)
-               (let* ((c (logand (string-to-char s) #xff))
-                      (xdigit (substring s 1))
-                      (transl (assq c
-                                    '((?\" . "\\\"")
-                                      (?\\ . "\\\\")
-                                      (?\a . "\\a")
-                                      (?\b . "\\b")
-                                      (?\t . "\\t")
-                                      (?\n . "\\n")
-                                      (?\v . "\\v")
-                                      (?\f . "\\f")
-                                      (?\r . "\\r")
-                                      (?\e . "\\e")))))
-                 (concat
-                  (if transl
-                      (cdr transl)
-                    (format (if (zerop (length xdigit)) "\\x%02x" "\\%03o")
-                            c))
-                  xdigit)))
-             rx 'fixedcase 'literal)
-            "\""))
+    (concat "\"" (xr--escape-string rx) "\""))
    (t (prin1-to-string rx))))
 
 (defun xr-pp-rx-to-str (rx)



reply via email to

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