bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

classic Classic list List threaded Threaded
39 messages Options
12
Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Konstantin Kharlamov
Hopefully, this is more readable compared to older "[0-9a-fA-F]",
because the intention is immediately obvious.

Fun fact: initially I started it because on my older Emacs this
resulted in better performance; the difference was about 10x times. But
I can't reproduce this on the current master anymore, i.e. the
performance matches. Oh, well. I'm thus not sending the patch replacing
[0-9] with [[:digit:]] because in terms of readability the intention is
clear there, however replacing the hex regexes should still make code
more readable.

P.S.: I'm not sure if the commit message looks okay, comments are
welcome.





Reply | Threaded
Open this post in threaded view
|

bug#36167: Acknowledgement ([PATCH] Replace manually crafted hex regexes with [[:xdigit:]])

Konstantin Kharlamov
Eh, sorry, git send-email is broken, complains on something about perl
SSL. This may take some time.





Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]

Konstantin Kharlamov
In reply to this post by Konstantin Kharlamov
* etc/schema/od-schema-v1.2-os.rnc: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/calc/calc-aent.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/calc/calc-ext.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/calc/calc-lang.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/cedet/semantic/java.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/cedet/semantic/lex.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/emulation/cua-rect.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/gnus/gnus-art.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/gnus/mml-sec.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/gnus/nneething.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/international/mule-cmds.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/net/shr-color.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/nxml/rng-cmpct.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/nxml/rng-uri.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/nxml/rng-xsd.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/nxml/xmltok.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/org/org-mobile.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/progmodes/ada-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/progmodes/cc-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/progmodes/cperl-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/progmodes/ebnf-dtd.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/progmodes/hideif.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/progmodes/prolog.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/textmodes/css-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/textmodes/sgml-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/version.el: replace [0-9a-fA-F] with [[:xdigit:]]
* lisp/xml.el: replace [0-9a-fA-F] with [[:xdigit:]]
* test/src/emacs-module-tests.el: replace [0-9a-fA-F] with [[:xdigit:]]
---
 etc/schema/od-schema-v1.2-os.rnc |  2 +-
 lisp/calc/calc-aent.el           |  2 +-
 lisp/calc/calc-ext.el            |  4 ++--
 lisp/calc/calc-lang.el           |  2 +-
 lisp/cedet/semantic/java.el      |  4 ++--
 lisp/cedet/semantic/lex.el       |  4 ++--
 lisp/emulation/cua-rect.el       |  2 +-
 lisp/gnus/gnus-art.el            |  8 ++++----
 lisp/gnus/mml-sec.el             |  2 +-
 lisp/gnus/nneething.el           |  2 +-
 lisp/international/mule-cmds.el  |  2 +-
 lisp/net/shr-color.el            |  2 +-
 lisp/nxml/rng-cmpct.el           |  2 +-
 lisp/nxml/rng-uri.el             | 10 +++++-----
 lisp/nxml/rng-xsd.el             |  2 +-
 lisp/nxml/xmltok.el              |  2 +-
 lisp/org/org-mobile.el           |  2 +-
 lisp/progmodes/ada-mode.el       |  2 +-
 lisp/progmodes/cc-mode.el        | 16 ++++++++--------
 lisp/progmodes/cperl-mode.el     |  8 ++++----
 lisp/progmodes/ebnf-dtd.el       | 14 +++++++-------
 lisp/progmodes/hideif.el         |  4 ++--
 lisp/progmodes/prolog.el         |  2 +-
 lisp/textmodes/css-mode.el       |  6 +++---
 lisp/textmodes/sgml-mode.el      |  2 +-
 lisp/version.el                  |  2 +-
 lisp/xml.el                      |  8 ++++----
 test/src/emacs-module-tests.el   |  2 +-
 28 files changed, 60 insertions(+), 60 deletions(-)

diff --git a/etc/schema/od-schema-v1.2-os.rnc b/etc/schema/od-schema-v1.2-os.rnc
index 8d679d62e4e..36e4645d7ee 100644
--- a/etc/schema/od-schema-v1.2-os.rnc
+++ b/etc/schema/od-schema-v1.2-os.rnc
@@ -6233,7 +6233,7 @@ signedZeroToHundredPercent =
 relativeLength = xsd:string { pattern = "[0-9]+\*" }
 coordinate = length
 distance = length
-color = xsd:string { pattern = "#[0-9a-fA-F]{6}" }
+color = xsd:string { pattern = "#[[:xdigit:]]{6}" }
 angle = xsd:string
 CURIE =
   xsd:string { pattern = "(([\i-[:]][\c-[:]]*)?:)?.+" minLength = "1" }
diff --git a/lisp/calc/calc-aent.el b/lisp/calc/calc-aent.el
index f16e665fc34..f1ef5c170bc 100644
--- a/lisp/calc/calc-aent.el
+++ b/lisp/calc/calc-aent.el
@@ -728,7 +728,7 @@ math-read-token
  math-exp-str (1- math-exp-pos))
    (1- math-exp-pos))))))
      (or (and (memq calc-language calc-lang-c-type-hex)
-      (eq (string-match "0[xX][0-9a-fA-F]+" math-exp-str
+      (eq (string-match "0[xX][[:xdigit:]]+" math-exp-str
                                         math-exp-pos)
                           math-exp-pos))
  (string-match "_?\\([0-9]+.?0*@ *\\)?\\([0-9]+.?0*' *\\)?\\(0*\\([2-9]\\|1[0-4]\\)\\(#[#]?\\|\\^\\^\\)[0-9a-dA-D.]+[eE][-+_]?[0-9]+\\|0*\\([2-9]\\|[0-2][0-9]\\|3[0-6]\\)\\(#[#]?\\|\\^\\^\\)[0-9a-zA-Zα-ωΑ-Ω:.]+\\|[0-9]+:[0-9:]+\\|[0-9.]+\\([eE][-+_]?[0-9]+\\)?\"?\\)?"
diff --git a/lisp/calc/calc-ext.el b/lisp/calc/calc-ext.el
index 1456fb28570..c7b4c3b091d 100644
--- a/lisp/calc/calc-ext.el
+++ b/lisp/calc/calc-ext.el
@@ -3019,13 +3019,13 @@ math-read-number-fancy
 
    ;; C language hexadecimal notation
    ((and (eq calc-language 'c)
- (string-match "^0[xX]\\([0-9a-fA-F]+\\)$" s))
+ (string-match "^0[xX]\\([[:xdigit:]]+\\)$" s))
     (let ((digs (math-match-substring s 1)))
       (math-read-radix digs 16)))
 
    ;; Pascal language hexadecimal notation
    ((and (eq calc-language 'pascal)
- (string-match "^\\$\\([0-9a-fA-F]+\\)$" s))
+ (string-match "^\\$\\([[:xdigit:]]+\\)$" s))
     (let ((digs (math-match-substring s 1)))
       (math-read-radix digs 16)))
 
diff --git a/lisp/calc/calc-lang.el b/lisp/calc/calc-lang.el
index ee107df39c1..4a9771d7438 100644
--- a/lisp/calc/calc-lang.el
+++ b/lisp/calc/calc-lang.el
@@ -243,7 +243,7 @@ calc-pascal-language
 (put 'pascal 'math-lang-read-symbol
      '((?\$
         (eq (string-match
-             "\\(\\$[0-9a-fA-F]+\\)\\($\\|[^0-9a-zA-Zα-ωΑ-Ω]\\)"
+             "\\(\\$[[:xdigit:]]+\\)\\($\\|[^0-9a-zA-Zα-ωΑ-Ω]\\)"
              math-exp-str math-exp-pos)
             math-exp-pos)
         (setq math-exp-token 'number
diff --git a/lisp/cedet/semantic/java.el b/lisp/cedet/semantic/java.el
index 54cce965459..7f9c93b906f 100644
--- a/lisp/cedet/semantic/java.el
+++ b/lisp/cedet/semantic/java.el
@@ -51,7 +51,7 @@ semantic-java-number-regexp
             "\\|"
             "\\<[0-9]+[eE][-+]?[0-9]+[fFdD]?\\>"
             "\\|"
-            "\\<0[xX][0-9a-fA-F]+[lL]?\\>"
+            "\\<0[xX][[:xdigit:]]+[lL]?\\>"
             "\\|"
             "\\<[0-9]+[lLfFdD]?\\>"
             "\\)"
@@ -63,7 +63,7 @@ semantic-java-number-regexp
     [1-9][0-9]*
   ;
 HEX_LITERAL:
-    0[xX][0-9a-fA-F]+
+    0[xX][[:xdigit:]]+
   ;
 OCTAL_LITERAL:
     0[0-7]*
diff --git a/lisp/cedet/semantic/lex.el b/lisp/cedet/semantic/lex.el
index 2690122f067..f1c6b014182 100644
--- a/lisp/cedet/semantic/lex.el
+++ b/lisp/cedet/semantic/lex.el
@@ -596,7 +596,7 @@ semantic-lex-number-expression
             "\\|"
             "\\<[0-9]+[eE][-+]?[0-9]+[fFdD]?\\>"
             "\\|"
-            "\\<0[xX][0-9a-fA-F]+[lL]?\\>"
+            "\\<0[xX][[:xdigit:]]+[lL]?\\>"
             "\\|"
             "\\<[0-9]+[lLfFdD]?\\>"
             "\\)"
@@ -609,7 +609,7 @@ semantic-lex-number-expression
     [1-9][0-9]*
   ;
 HEX_LITERAL:
-    0[xX][0-9a-fA-F]+
+    0[xX][[:xdigit:]]+
   ;
 OCTAL_LITERAL:
     0[0-7]*
diff --git a/lisp/emulation/cua-rect.el b/lisp/emulation/cua-rect.el
index 706634a5017..1a19cc2910e 100644
--- a/lisp/emulation/cua-rect.el
+++ b/lisp/emulation/cua-rect.el
@@ -1127,7 +1127,7 @@ cua-incr-rectangle
   (cua--rectangle-operation 'keep nil t 1 nil
      (lambda (_s e _l _r)
         (cond
-         ((re-search-forward "0x\\([0-9a-fA-F]+\\)" e t)
+         ((re-search-forward "0x\\([[:xdigit:]]+\\)" e t)
           (let* ((txt (cua--filter-buffer-noprops (match-beginning 1) (match-end 1)))
                  (n (string-to-number txt 16))
                  (fmt (format "0x%%0%dx" (length txt))))
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index d826faca5bd..e6a75660fe8 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -7426,10 +7426,10 @@ gnus-button-mid-or-mail-heuristic-alist
     (-2.0  . "^[0-9]")
     (-1.0  . "^[0-9][0-9]")
     ;;
-    ;; -3.0 /^[0-9][0-9a-fA-F]{2,2}/;
-    (-3.0  . "^[0-9][0-9a-fA-F][0-9a-fA-F][^0-9a-fA-F]")
-    ;; -5.0 /^[0-9][0-9a-fA-F]{3,3}/;
-    (-5.0  . "^[0-9][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][^0-9a-fA-F]")
+    ;; -3.0 /^[0-9][[:xdigit:]]{2,2}/;
+    (-3.0  . "^[0-9][[:xdigit:]][[:xdigit:]][^0-9a-fA-F]")
+    ;; -5.0 /^[0-9][[:xdigit:]]{3,3}/;
+    (-5.0  . "^[0-9][[:xdigit:]][[:xdigit:]][[:xdigit:]][^0-9a-fA-F]")
     ;;
     (-3.0  .  "[0-9][0-9][0-9][0-9][0-9][^0-9].*@") ;; "[0-9]{5,}.*\@"
     (-3.0  .  "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][^0-9].*@")
diff --git a/lisp/gnus/mml-sec.el b/lisp/gnus/mml-sec.el
index db7489fbf1c..02a27b367cd 100644
--- a/lisp/gnus/mml-sec.el
+++ b/lisp/gnus/mml-sec.el
@@ -725,7 +725,7 @@ mml-secure-find-usable-keys
 is expired or revoked.
 If optional JUSTONE is not nil, return the first key instead of a list."
   (let* ((keys (epg-list-keys context name))
- (iskeyid (string-match "\\(0x\\)?\\([0-9a-fA-F]\\{8,\\}\\)" name))
+ (iskeyid (string-match "\\(0x\\)?\\([[:xdigit:]]\\{8,\\}\\)" name))
  (fingerprint (match-string 2 name))
  result)
     (when (and iskeyid (>= (length keys) 2))
diff --git a/lisp/gnus/nneething.el b/lisp/gnus/nneething.el
index f64007aaf79..c3d511bc6e0 100644
--- a/lisp/gnus/nneething.el
+++ b/lisp/gnus/nneething.el
@@ -297,7 +297,7 @@ nneething-encode-file-name
 (defun nneething-decode-file-name (file &optional coding-system)
   "Decode the name of the FILE is encoded in CODING-SYSTEM."
   (let ((pos 0) buf)
-    (while (string-match "%\\([0-9a-fA-F][0-9a-fA-F]\\)" file pos)
+    (while (string-match "%\\([[:xdigit:]][[:xdigit:]]\\)" file pos)
       (setq buf (cons (string (string-to-number (match-string 1 file) 16))
       (cons (substring file pos (match-beginning 0)) buf))
     pos (match-end 0)))
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index 47b07479c3c..1edf80d14c8 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -3079,7 +3079,7 @@ read-char-by-name
  (char
           (cond
            ((char-from-name input t))
-           ((string-match-p "\\`[0-9a-fA-F]+\\'" input)
+           ((string-match-p "\\`[[:xdigit:]]+\\'" input)
             (ignore-errors (string-to-number input 16)))
            ((string-match-p "\\`#\\([bBoOxX]\\|[0-9]+[rR]\\)[0-9a-zA-Z]+\\'"
                             input)
diff --git a/lisp/net/shr-color.el b/lisp/net/shr-color.el
index 2d6cf68d8ff..af0b99c76f4 100644
--- a/lisp/net/shr-color.el
+++ b/lisp/net/shr-color.el
@@ -235,7 +235,7 @@ shr-color->hexadecimal
     (cond
      ;; Hexadecimal color: #abc or #aabbcc
      ((string-match
-       "\\(#[0-9a-fA-F]\\{3\\}[0-9a-fA-F]\\{3\\}?\\)"
+       "\\(#[[:xdigit:]]\\{3\\}[[:xdigit:]]\\{3\\}?\\)"
        color)
       (match-string 1 color))
      ;; rgb() or rgba() colors
diff --git a/lisp/nxml/rng-cmpct.el b/lisp/nxml/rng-cmpct.el
index d36f9d92f26..60c871990e1 100644
--- a/lisp/nxml/rng-cmpct.el
+++ b/lisp/nxml/rng-cmpct.el
@@ -369,7 +369,7 @@ rng-c-process-escapes
     (and pos
  (rng-c-error "Nul character found (binary file?)")))
   (let ((offset 0))
-    (while (re-search-forward "\\\\x+{\\([0-9a-fA-F]+\\)}"
+    (while (re-search-forward "\\\\x+{\\([[:xdigit:]]+\\)}"
       (point-max)
       t)
       (let* ((ch (decode-char 'ucs (string-to-number (match-string 1) 16))))
diff --git a/lisp/nxml/rng-uri.el b/lisp/nxml/rng-uri.el
index 798475bbc3d..5a67cc7f145 100644
--- a/lisp/nxml/rng-uri.el
+++ b/lisp/nxml/rng-uri.el
@@ -68,7 +68,7 @@ rng-uri-pattern-file-name-replace-match
 
 ;; pattern is either nil or match or replace
 (defun rng-uri-file-name-1 (uri pattern)
-  (unless (string-match "\\`\\(?:[^%]\\|%[0-9a-fA-F]{2}\\)*\\'" uri)
+  (unless (string-match "\\`\\(?:[^%]\\|%[[:xdigit:]]{2}\\)*\\'" uri)
     (rng-uri-error "Bad escapes in URI `%s'" uri))
   (setq uri (rng-uri-unescape-multibyte uri))
   (let* ((components
@@ -299,7 +299,7 @@ rng-join-path
        (mapconcat 'identity segments "/")))
 
 (defun rng-uri-unescape-multibyte (str)
-  (replace-regexp-in-string "\\(?:%[89a-fA-F][0-9a-fA-F]\\)+"
+  (replace-regexp-in-string "\\(?:%[89a-fA-F][[:xdigit:]]\\)+"
     'rng-multibyte-percent-decode
     str))
 
@@ -310,7 +310,7 @@ rng-multibyte-percent-decode
  'utf-8))
 
 (defun rng-uri-unescape-unibyte (str)
-  (replace-regexp-in-string "%[0-7][0-9a-fA-F]"
+  (replace-regexp-in-string "%[0-7][[:xdigit:]]"
     (lambda (h)
       (string-to-number (substring h 1) 16))
     str
@@ -318,7 +318,7 @@ rng-uri-unescape-unibyte
     t))
 
 (defun rng-uri-unescape-unibyte-match (str)
-  (replace-regexp-in-string "%[0-7][0-9a-fA-F]\\|[^%]"
+  (replace-regexp-in-string "%[0-7][[:xdigit:]]\\|[^%]"
     (lambda (match)
       (if (string= match "*")
   "\\([^/]*\\)"
@@ -333,7 +333,7 @@ rng-uri-unescape-unibyte-match
 
 (defun rng-uri-unescape-unibyte-replace (str next-match-index)
   (replace-regexp-in-string
-   "%[0-7][0-9a-fA-F]\\|[^%]"
+   "%[0-7][[:xdigit:]]\\|[^%]"
    (lambda (match)
      (if (string= match "*")
  (let ((n next-match-index))
diff --git a/lisp/nxml/rng-xsd.el b/lisp/nxml/rng-xsd.el
index f308b049f3b..c0c679532ac 100644
--- a/lisp/nxml/rng-xsd.el
+++ b/lisp/nxml/rng-xsd.el
@@ -360,7 +360,7 @@ rng-xsd-base64-binary-length
       n)))
 
 (defun rng-xsd-convert-any-uri (string)
-  (and (string-match "\\`\\(?:[^%]\\|%[0-9a-fA-F][0-9a-fA-F]\\)*\\'" string)
+  (and (string-match "\\`\\(?:[^%]\\|%[[:xdigit:]][[:xdigit:]]\\)*\\'" string)
        (string-match "\\`[^#]*\\(?:#[^#]*\\)?\\'" string)
        (string-match "\\`\\(?:[a-zA-Z][-+.A-Za-z0-9]*:.+\\|[^:]*\\(?:[#/?].*\\)?\\)\\'" string)
        string))
diff --git a/lisp/nxml/xmltok.el b/lisp/nxml/xmltok.el
index afa33e064f3..3cab5ed9b7b 100644
--- a/lisp/nxml/xmltok.el
+++ b/lisp/nxml/xmltok.el
@@ -413,7 +413,7 @@ xmltok-forward
    (xmltok-g decimal-ref-close ";") opt))
  (hex-ref
   (xmltok+ "x" open
-   (xmltok-g hex "[0-9a-fA-F]" +)
+   (xmltok-g hex "[[:xdigit:]]" +)
    (xmltok-g hex-ref-close ";") opt
    close opt))
  (char-ref
diff --git a/lisp/org/org-mobile.el b/lisp/org/org-mobile.el
index 8b4e8953889..e24ee8ed7c5 100644
--- a/lisp/org/org-mobile.el
+++ b/lisp/org/org-mobile.el
@@ -761,7 +761,7 @@ org-mobile-update-checksum-for-capture-file
  (buffer (find-file-noselect file)))
     (when buffer
       (with-current-buffer buffer
- (when (re-search-forward (concat "\\([0-9a-fA-F]\\{30,\\}\\).*?"
+ (when (re-search-forward (concat "\\([[:xdigit:]]\\{30,\\}\\).*?"
  (regexp-quote org-mobile-capture-file)
  "[ \t]*$") nil t)
   (goto-char (match-beginning 1))
diff --git a/lisp/progmodes/ada-mode.el b/lisp/progmodes/ada-mode.el
index 77c1e5e2d87..ded9a08d0ee 100644
--- a/lisp/progmodes/ada-mode.el
+++ b/lisp/progmodes/ada-mode.el
@@ -909,7 +909,7 @@ ada-mode-symbol-syntax-table
        change))
     (replace-match "'A'"))
   (goto-char from)
-  (while (re-search-forward "\\(#[0-9a-fA-F]*#\\)" to t)
+  (while (re-search-forward "\\(#[[:xdigit:]]*#\\)" to t)
     (setq change (cons (list (match-beginning 1)
      (length (match-string 1))
      (match-string 1))
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 6afcb08a7ca..6feb326cf16 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -1415,7 +1415,7 @@ c-after-change-mark-abnormal-strings
 (defconst c-maybe-quoted-number-head
   (concat
    "\\(0\\("
-       "\\([Xx]\\([0-9a-fA-F]\\('[0-9a-fA-F]\\|[0-9a-fA-F]\\)*'?\\)?\\)"
+       "\\([Xx]\\([[:xdigit:]]\\('[[:xdigit:]]\\|[[:xdigit:]]\\)*'?\\)?\\)"
        "\\|"
        "\\([Bb]\\([01]\\('[01]\\|[01]\\)*'?\\)?\\)"
        "\\|"
@@ -1449,7 +1449,7 @@ c-quoted-number-head-before-point
 (defconst c-maybe-quoted-number-tail
   (concat
    "\\("
-       "\\([xX']?[0-9a-fA-F]\\('[0-9a-fA-F]\\|[0-9a-fA-F]\\)*\\)"
+       "\\([xX']?[[:xdigit:]]\\('[[:xdigit:]]\\|[[:xdigit:]]\\)*\\)"
    "\\|"
        "\\([bB']?[01]\\('[01]\\|[01]\\)*\\)"
    "\\|"
@@ -1469,7 +1469,7 @@ c-quoted-number-tail-after-point
 (defconst c-maybe-quoted-number
   (concat
    "\\(0\\("
-       "\\([Xx][0-9a-fA-F]\\('[0-9a-fA-F]\\|[0-9a-fA-F]\\)*\\)"
+       "\\([Xx][[:xdigit:]]\\('[[:xdigit:]]\\|[[:xdigit:]]\\)*\\)"
        "\\|"
        "\\([Bb][01]\\('[01]\\|[01]\\)*\\)"
        "\\|"
@@ -1530,7 +1530,7 @@ c-parse-quotes-before-change
  (if (>= (point) c-new-BEG)
     (setq c-new-BEG (match-beginning 0))))
        ((looking-at
- "\\([^'\\]\\|\\\\\\([0-7]\\{1,3\\}\\|[xuU][0-9a-fA-F]+\\|.\\)\\)'")
+ "\\([^'\\]\\|\\\\\\([0-7]\\{1,3\\}\\|[xuU][[:xdigit:]]+\\|.\\)\\)'")
  (goto-char (match-end 0))
  (if (> (match-end 0) c-new-BEG)
     (setq c-new-BEG (1- (match-beginning 0)))))
@@ -1559,7 +1559,7 @@ c-parse-quotes-before-change
  (if (> (match-end 0) c-new-END)
     (setq c-new-END (match-end 0))))
        ((looking-at
- "\\([^'\\]\\|\\\\\\([0-7]\\{1,3\\}\\|[xuU][0-9a-fA-F]+\\|.\\)\\)'")
+ "\\([^'\\]\\|\\\\\\([0-7]\\{1,3\\}\\|[xuU][[:xdigit:]]+\\|.\\)\\)'")
  (goto-char (match-end 0))
  (if (> (match-end 0) c-new-END)
     (setq c-new-END (match-end 0))))
@@ -1579,8 +1579,8 @@ c-parse-quotes-before-change
      ((c-quoted-number-tail-after-point)
       (setq c-new-END (match-end 0)))
      ((looking-at
-       "\\(\\\\\\([0-7]\\{1,3\\}\\|[xuU][0-9a-fA-F]+\\|.\\)\\|.\\)?\
-\\('\\([^'\\]\\|\\\\\\([0-7]\\{1,3\\}\\|[xuU][0-9a-fA-F]+\\|.\\)\\)\\)*'")
+       "\\(\\\\\\([0-7]\\{1,3\\}\\|[xuU][[:xdigit:]]+\\|.\\)\\|.\\)?\
+\\('\\([^'\\]\\|\\\\\\([0-7]\\{1,3\\}\\|[xuU][[:xdigit:]]+\\|.\\)\\)\\)*'")
       (setq c-new-END (match-end 0))))
 
     ;; Remove the '(1) syntax-table property from any "'"s within (c-new-BEG
@@ -1632,7 +1632,7 @@ c-parse-quotes-after-change
       'c-digit-separator t ?')
        (goto-char num-end))
       ((looking-at
- "\\([^\\']\\|\\\\\\([0-7]\\{1,3\\}\\|[xuU][0-9a-fA-F]+\\|.\\)\
+ "\\([^\\']\\|\\\\\\([0-7]\\{1,3\\}\\|[xuU][[:xdigit:]]+\\|.\\)\
 \\)'") ; balanced quoted expression.
        (goto-char (match-end 0)))
       ((looking-at "\\\\'") ; Anomalous construct.
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index ba007d67c0d..c58acf0c2ff 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -3507,18 +3507,18 @@ cperl-look-at-leading-count
 (defsubst cperl-highlight-charclass (endbracket dashface bsface onec-space)
   (let ((l '(1 5 7)) ll lle lll
  ;; 2 groups, the first takes the whole match (include \[trnfabe])
- (singleChar (concat "\\(" "[^\\]" "\\|" "\\\\[^cdg-mo-qsu-zA-Z0-9_]" "\\|" "\\\\c." "\\|" "\\\\x" "\\([0-9a-fA-F][0-9a-fA-F]?\\|\\={[0-9a-fA-F]+}\\)" "\\|" "\\\\0?[0-7][0-7]?[0-7]?" "\\|" "\\\\N{[^{}]*}" "\\)")))
+ (singleChar (concat "\\(" "[^\\]" "\\|" "\\\\[^cdg-mo-qsu-zA-Z0-9_]" "\\|" "\\\\c." "\\|" "\\\\x" "\\([[:xdigit:]][[:xdigit:]]?\\|\\={[[:xdigit:]]+}\\)" "\\|" "\\\\0?[0-7][0-7]?[0-7]?" "\\|" "\\\\N{[^{}]*}" "\\)")))
     (while ; look for unescaped - between non-classes
  (re-search-forward
  ;; On 19.33, certain simplifications lead
  ;; to bugs (as in  [^a-z] \\| [trnfabe]  )
  (concat       ; 1: SingleChar (include \[trnfabe])
   singleChar
-  ;;"\\(" "[^\\]" "\\|" "\\\\[^cdg-mo-qsu-zA-Z0-9_]" "\\|" "\\\\c." "\\|" "\\\\x" "\\([0-9a-fA-F][0-9a-fA-F]?\\|\\={[0-9a-fA-F]+}\\)" "\\|" "\\\\0?[0-7][0-7]?[0-7]?" "\\|" "\\\\N{[^{}]*}" "\\)"
+  ;;"\\(" "[^\\]" "\\|" "\\\\[^cdg-mo-qsu-zA-Z0-9_]" "\\|" "\\\\c." "\\|" "\\\\x" "\\([[:xdigit:]][[:xdigit:]]?\\|\\={[[:xdigit:]]+}\\)" "\\|" "\\\\0?[0-7][0-7]?[0-7]?" "\\|" "\\\\N{[^{}]*}" "\\)"
   "\\(" ; 3: DASH SingleChar (match optionally)
     "\\(-\\)" ; 4: DASH
     singleChar ; 5: SingleChar
-    ;;"\\(" "[^\\]" "\\|" "\\\\[^cdg-mo-qsu-zA-Z0-9_]" "\\|" "\\\\c." "\\|" "\\\\x" "\\([0-9a-fA-F][0-9a-fA-F]?\\|\\={[0-9a-fA-F]+}\\)" "\\|" "\\\\0?[0-7][0-7]?[0-7]?" "\\|" "\\\\N{[^{}]*}" "\\)"
+    ;;"\\(" "[^\\]" "\\|" "\\\\[^cdg-mo-qsu-zA-Z0-9_]" "\\|" "\\\\c." "\\|" "\\\\x" "\\([[:xdigit:]][[:xdigit:]]?\\|\\={[[:xdigit:]]+}\\)" "\\|" "\\\\0?[0-7][0-7]?[0-7]?" "\\|" "\\\\N{[^{}]*}" "\\)"
   "\\)?"
   "\\|"
   "\\(" ; 7: other escapes
@@ -4420,7 +4420,7 @@ cperl-find-pods-heres
     "\\=[0123456789]*" (1- e) 'to-end))
       (and (eq qtag ?x)
    (re-search-forward
-    "\\=[0-9a-fA-F][0-9a-fA-F]?\\|\\={[0-9a-fA-F]+}"
+    "\\=[[:xdigit:]][[:xdigit:]]?\\|\\={[[:xdigit:]]+}"
     (1- e) 'to-end))
       (and (memq qtag (append "pPN" nil))
    (re-search-forward "\\={[^{}]+}\\|."
diff --git a/lisp/progmodes/ebnf-dtd.el b/lisp/progmodes/ebnf-dtd.el
index 94d96432614..17c7aebf2a9 100644
--- a/lisp/progmodes/ebnf-dtd.el
+++ b/lisp/progmodes/ebnf-dtd.el
@@ -324,7 +324,7 @@
 ;; /* Character Reference */
 ;;
 ;; CharRef ::= '&#' [0-9]+ ';'
-;;           | '&#x' [0-9a-fA-F]+ ';'
+;;           | '&#x' [[:xdigit:]]+ ';'
 ;;           [WFC: Legal Character]
 ;;
 ;;
@@ -915,9 +915,9 @@ ebnf-dtd-operators
 ;;; EntityRef ::= '&' Name ';'
 ;;;
 ;;; CharRef ::= '&#' [0-9]+ ';'
-;;;           | '&#x' [0-9a-fA-F]+ ';'
+;;;           | '&#x' [[:xdigit:]]+ ';'
 
-;;; "^\\(&\\([A-Za-z_:][-A-Za-z0-9._:]*\\|#\\(x[0-9a-fA-F]+\\|[0-9]+\\)\\);\\|[^<&]\\)*$"
+;;; "^\\(&\\([A-Za-z_:][-A-Za-z0-9._:]*\\|#\\(x[[:xdigit:]]+\\|[0-9]+\\)\\);\\|[^<&]\\)*$"
 
 
 (defun ebnf-dtd-attlistdecl ()
@@ -945,7 +945,7 @@ ebnf-dtd-attlistdecl
      (setq token (ebnf-dtd-lex)))
  (or (and (eq token 'string)
  (string-match
-  "^\\(&\\([A-Za-z_:][-A-Za-z0-9._:]*\\|#\\(x[0-9a-fA-F]+\\|[0-9]+\\)\\);\\|[^<&]\\)*$"
+  "^\\(&\\([A-Za-z_:][-A-Za-z0-9._:]*\\|#\\(x[[:xdigit:]]+\\|[0-9]+\\)\\);\\|[^<&]\\)*$"
   ebnf-dtd-lex))
     (error "Invalid default value in ATTLIST declaration"))))
     (or (eq token 'end-decl)
@@ -986,9 +986,9 @@ ebnf-dtd-namelist
 ;;; EntityRef ::= '&' Name ';'
 ;;;
 ;;; CharRef ::= '&#' [0-9]+ ';'
-;;;           | '&#x' [0-9a-fA-F]+ ';'
+;;;           | '&#x' [[:xdigit:]]+ ';'
 
-;;; "^\\(%[A-Za-z_:][-A-Za-z0-9._:]*;\\|&\\([A-Za-z_:][-A-Za-z0-9._:]*\\|#\\(x[0-9a-fA-F]+\\|[0-9]+\\)\\);\\|[^%&]\\)*$"
+;;; "^\\(%[A-Za-z_:][-A-Za-z0-9._:]*;\\|&\\([A-Za-z_:][-A-Za-z0-9._:]*\\|#\\(x[[:xdigit:]]+\\|[0-9]+\\)\\);\\|[^%&]\\)*$"
 
 
 (defun ebnf-dtd-entitydecl ()
@@ -1001,7 +1001,7 @@ ebnf-dtd-entitydecl
     (setq token (ebnf-dtd-lex))
     (if (eq token 'string)
  (if (string-match
-     "^\\(%[A-Za-z_:][-A-Za-z0-9._:]*;\\|&\\([A-Za-z_:][-A-Za-z0-9._:]*\\|#\\(x[0-9a-fA-F]+\\|[0-9]+\\)\\);\\|[^%&]\\)*$"
+     "^\\(%[A-Za-z_:][-A-Za-z0-9._:]*;\\|&\\([A-Za-z_:][-A-Za-z0-9._:]*\\|#\\(x[[:xdigit:]]+\\|[0-9]+\\)\\);\\|[^%&]\\)*$"
      ebnf-dtd-lex)
     (setq token (ebnf-dtd-lex))
   (error "Invalid ENTITY definition"))
diff --git a/lisp/progmodes/hideif.el b/lisp/progmodes/hideif.el
index 32b0b7551f9..1b06077005c 100644
--- a/lisp/progmodes/hideif.el
+++ b/lisp/progmodes/hideif.el
@@ -540,7 +540,7 @@ hif-valid-token-list
 
 (defconst hif-token-regexp
   (concat (regexp-opt (mapcar 'car hif-token-alist))
-          "\\|0x[0-9a-fA-F]+\\.?[0-9a-fA-F]*"
+          "\\|0x[[:xdigit:]]+\\.?[[:xdigit:]]*"
           "\\|[0-9]+\\.?[0-9]*"  ;; decimal/octal
           "\\|\\w+"))
 
@@ -595,7 +595,7 @@ hif-tokenize
                    ;; 1. postfix 'l', 'll', 'ul' and 'ull'
                    ;; 2. floating number formats (like 1.23e4)
                    ;; 3. 098 is interpreted as octal conversion error
-                   (if (string-match "0x\\([0-9a-fA-F]+\\.?[0-9a-fA-F]*\\)"
+                   (if (string-match "0x\\([[:xdigit:]]+\\.?[[:xdigit:]]*\\)"
                                      token)
                        (hif-string-to-number (match-string 1 token) 16)) ;; hex
                    (if (string-match "\\`0[0-9]+\\(\\.[0-9]+\\)?\\'" token)
diff --git a/lisp/progmodes/prolog.el b/lisp/progmodes/prolog.el
index 296a7ac3c95..780eff2d8a0 100644
--- a/lisp/progmodes/prolog.el
+++ b/lisp/progmodes/prolog.el
@@ -1071,7 +1071,7 @@ prolog-syntax-propertize-function
      ;; Supposedly, ISO-Prolog wants \NNN\ for octal and \xNNN\ for hexadecimal
      ;; escape sequences in atoms, so be careful not to let the terminating \
      ;; escape a subsequent quote.
-     ("\\\\[x0-7][0-9a-fA-F]*\\(\\\\\\)" (1 "_"))
+     ("\\\\[x0-7][[:xdigit:]]*\\(\\\\\\)" (1 "_"))
      )))
 
 (defun prolog-mode-variables ()
diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el
index 5d5d787945d..b0653bce81c 100644
--- a/lisp/textmodes/css-mode.el
+++ b/lisp/textmodes/css-mode.el
@@ -873,7 +873,7 @@ css-syntax-propertize-function
    (css--uri-re (1 "|") (2 "|"))))
 
 (defconst css-escapes-re
-  "\\\\\\(?:[^\000-\037\177]\\|[0-9a-fA-F]+[ \n\t\r\f]?\\)")
+  "\\\\\\(?:[^\000-\037\177]\\|[[:xdigit:]]+[ \n\t\r\f]?\\)")
 (defconst css-nmchar-re (concat "\\(?:[-[:alnum:]]\\|" css-escapes-re "\\)"))
 (defconst css-nmstart-re (concat "\\(?:[[:alpha:]]\\|" css-escapes-re "\\)"))
 (defconst css-ident-re ;; (concat css-nmstart-re css-nmchar-re "*")
@@ -1079,10 +1079,10 @@ css--colors-regexp
    (regexp-opt (mapcar #'car css--color-map) 'symbols)
    "\\|"
    ;; Short hex.  css-color-4 adds alpha.
-   "\\(#[0-9a-fA-F]\\{3,4\\}\\b\\)"
+   "\\(#[[:xdigit:]]\\{3,4\\}\\b\\)"
    "\\|"
    ;; Long hex.  css-color-4 adds alpha.
-   "\\(#\\(?:[0-9a-fA-F][0-9a-fA-F]\\)\\{3,4\\}\\b\\)"
+   "\\(#\\(?:[[:xdigit:]][[:xdigit:]]\\)\\{3,4\\}\\b\\)"
    "\\|"
    ;; RGB.
    "\\(\\_<rgba?(\\)"
diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el
index 0c5d5e56a69..602effe9afa 100644
--- a/lisp/textmodes/sgml-mode.el
+++ b/lisp/textmodes/sgml-mode.el
@@ -1293,7 +1293,7 @@ sgml-quote
     (if unquotep
  ;; FIXME: We should unquote other named character references as well.
  (while (re-search-forward
- "\\(&\\(amp\\|quot\\|lt\\|gt\\|#\\([0-9]+\\|[xX][0-9a-fA-F]+\\)\\)\\)\\([][<>&;\n\t \"%!'(),/=?]\\|$\\)"
+ "\\(&\\(amp\\|quot\\|lt\\|gt\\|#\\([0-9]+\\|[xX][[:xdigit:]]+\\)\\)\\)\\([][<>&;\n\t \"%!'(),/=?]\\|$\\)"
  nil t)
           (replace-match
            (string
diff --git a/lisp/version.el b/lisp/version.el
index d13d8c31e80..b9e2e50d1f7 100644
--- a/lisp/version.el
+++ b/lisp/version.el
@@ -120,7 +120,7 @@ emacs-repository-version-git
        (with-demoted-errors "Error running git rev-parse: %S"
  (call-process "git" nil '(t nil) nil "rev-parse" "HEAD")))
    (progn (goto-char (point-min))
-  (looking-at "[0-9a-fA-F]\\{40\\}"))
+  (looking-at "[[:xdigit:]]\\{40\\}"))
    (match-string 0)))))
 
 (defun emacs-repository-get-version (&optional dir external)
diff --git a/lisp/xml.el b/lisp/xml.el
index 09ec72f792f..833eb8aced2 100644
--- a/lisp/xml.el
+++ b/lisp/xml.el
@@ -194,13 +194,13 @@ xml-nmtoken-re
 ;; [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*
 (defconst xml-nmtokens-re (concat xml-nmtoken-re "\\(?: " xml-name-re "\\)*"))
 
-;; [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
-(defconst xml-char-ref-re  "\\(?:&#[0-9]+;\\|&#x[0-9a-fA-F]+;\\)")
+;; [66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [[:xdigit:]]+ ';'
+(defconst xml-char-ref-re  "\\(?:&#[0-9]+;\\|&#x[[:xdigit:]]+;\\)")
 
 ;; [68] EntityRef   ::= '&' Name ';'
 (defconst xml-entity-ref (concat "&" xml-name-re ";"))
 
-(defconst xml-entity-or-char-ref-re (concat "&\\(?:#\\(x\\)?\\([0-9a-fA-F]+\\)\\|\\("
+(defconst xml-entity-or-char-ref-re (concat "&\\(?:#\\(x\\)?\\([[:xdigit:]]+\\)\\|\\("
     xml-name-re "\\)\\);"))
 
 ;; [69] PEReference ::= '%' Name ';'
@@ -889,7 +889,7 @@ xml--entity-replacement-text
 The replacement text is obtained by replacing character
 references and parameter-entity references."
   (let ((ref-re (eval-when-compile
-  (concat "\\(?:&#\\([0-9]+\\)\\|&#x\\([0-9a-fA-F]+\\)\\|%\\("
+  (concat "\\(?:&#\\([0-9]+\\)\\|&#x\\([[:xdigit:]]+\\)\\|%\\("
   xml-name-re "\\)\\);")))
  children)
     (while (string-match ref-re string)
diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el
index 5349de055ed..96a604f9824 100644
--- a/test/src/emacs-module-tests.el
+++ b/test/src/emacs-module-tests.el
@@ -60,7 +60,7 @@ mod-test-sum-test
     (should (eq 0
                 (string-match
                  (concat "#<module function "
-                         "\\(at \\(0x\\)?[0-9a-fA-F]+\\( from .*\\)?"
+                         "\\(at \\(0x\\)?[[:xdigit:]]+\\( from .*\\)?"
                          "\\|Fmod_test_sum from .*\\)>")
                  (prin1-to-string (nth 1 descr)))))
     (should (= (nth 2 descr) 3)))
--
2.22.0




Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]

Robert Pluim
>>>>> On Tue, 11 Jun 2019 15:29:25 +0300, Konstantin Kharlamov <[hidden email]> said:

If this is fixing a bug, then please put '(Bug#36167)' somewhere in
the commit message (I normally put it as the last thing in the
preamble, before the detailed list of changes). See 'Commit messages'
in CONTRIBUTE for extensive documentation.

    Konstantin> * etc/schema/od-schema-v1.2-os.rnc: replace
    Konstantin> [0-9a-fA-F] with [[:xdigit:]]
   
This is the org schema file for OpenDocument export, not emacs
lisp. Does that support :xdigit: syntax?

    Konstantin> * lisp/calc/calc-aent.el: replace [0-9a-fA-F] with
    Konstantin> [[:xdigit:]]
   
Normally, you'd mention the containing function in the ChangeLog
entry. Using 'C-x 4 a' (ie 'add-change-log-entry-other-window') with
point on the code youʼre changing does that for you.

    Konstantin> * lisp/calc/calc-ext.el: replace [0-9a-fA-F] with
    Konstantin> [[:xdigit:]]
   
And then on subsequent similar changes you can say 'Likewise.' (whilst
still mentioning the enclosing function)

    Konstantin> * lisp/calc/calc-lang.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/cedet/semantic/java.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/cedet/semantic/lex.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/emulation/cua-rect.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/gnus/gnus-art.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/gnus/mml-sec.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/gnus/nneething.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/international/mule-cmds.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/net/shr-color.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/nxml/rng-cmpct.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/nxml/rng-uri.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/nxml/rng-xsd.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/nxml/xmltok.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/org/org-mobile.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/progmodes/ada-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/progmodes/cc-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/progmodes/cperl-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/progmodes/ebnf-dtd.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/progmodes/hideif.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/progmodes/prolog.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/textmodes/css-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/textmodes/sgml-mode.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/version.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * lisp/xml.el: replace [0-9a-fA-F] with [[:xdigit:]]
    Konstantin> * test/src/emacs-module-tests.el: replace [0-9a-fA-F] with [[:xdigit:]]

Robert



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]

Konstantin Kharlamov


On Вт, июн 11, 2019 at 15:03, Robert Pluim <[hidden email]>
wrote:

>>>>>>  On Tue, 11 Jun 2019 15:29:25 +0300, Konstantin Kharlamov
>>>>>> <[hidden email]> said:
>
> If this is fixing a bug, then please put '(Bug#36167)' somewhere in
> the commit message (I normally put it as the last thing in the
> preamble, before the detailed list of changes). See 'Commit messages'
> in CONTRIBUTE for extensive documentation.
>
>     Konstantin> * etc/schema/od-schema-v1.2-os.rnc: replace
>     Konstantin> [0-9a-fA-F] with [[:xdigit:]]
>
> This is the org schema file for OpenDocument export, not emacs
> lisp. Does that support :xdigit: syntax?

Oh, okay, thanks, I couldn't figure out what it is because Wikipedia
says that .rnc is just a variation of XML, and README just says it's
something to map some xml schemas to documents. So I deemed these
regexps are too used by ELisp.

Can I test it somehow? Either way, not a big deal, I can just drop that
one.

>     Konstantin> * lisp/calc/calc-aent.el: replace [0-9a-fA-F] with
>     Konstantin> [[:xdigit:]]
>
> Normally, you'd mention the containing function in the ChangeLog
> entry. Using 'C-x 4 a' (ie 'add-change-log-entry-other-window') with
> point on the code youʼre changing does that for you.

Ah, thanks. At this point I'll probably ask on emacs-devel about adding
to prepare-commit-msg a code to pre-format the changes, because clearly
that's a lot of manual work for something that should be automated.

>     Konstantin> * lisp/calc/calc-ext.el: replace [0-9a-fA-F] with
>     Konstantin> [[:xdigit:]]
>
> And then on subsequent similar changes you can say 'Likewise.' (whilst
> still mentioning the enclosing function)
>
>     Konstantin> * lisp/calc/calc-lang.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/cedet/semantic/java.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>     Konstantin> * lisp/cedet/semantic/lex.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>     Konstantin> * lisp/emulation/cua-rect.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>     Konstantin> * lisp/gnus/gnus-art.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/gnus/mml-sec.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/gnus/nneething.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/international/mule-cmds.el: replace
> [0-9a-fA-F] with [[:xdigit:]]
>     Konstantin> * lisp/net/shr-color.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/nxml/rng-cmpct.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/nxml/rng-uri.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/nxml/rng-xsd.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/nxml/xmltok.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/org/org-mobile.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/progmodes/ada-mode.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>     Konstantin> * lisp/progmodes/cc-mode.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/progmodes/cperl-mode.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>     Konstantin> * lisp/progmodes/ebnf-dtd.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>     Konstantin> * lisp/progmodes/hideif.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/progmodes/prolog.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/textmodes/css-mode.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>     Konstantin> * lisp/textmodes/sgml-mode.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>     Konstantin> * lisp/version.el: replace [0-9a-fA-F] with
> [[:xdigit:]]
>     Konstantin> * lisp/xml.el: replace [0-9a-fA-F] with [[:xdigit:]]
>     Konstantin> * test/src/emacs-module-tests.el: replace [0-9a-fA-F]
> with [[:xdigit:]]
>
> Robert





Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]

Robert Pluim
>>>>> On Tue, 11 Jun 2019 16:17:10 +0300, Konstantin Kharlamov <[hidden email]> said:

    Konstantin> * etc/schema/od-schema-v1.2-os.rnc: replace
    Konstantin> [0-9a-fA-F] with [[:xdigit:]]
    >>
    >> This is the org schema file for OpenDocument export, not emacs
    >> lisp. Does that support :xdigit: syntax?

    Konstantin> Oh, okay, thanks, I couldn't figure out what it is because Wikipedia
    Konstantin> says that .rnc is just a variation of XML, and README just says it's
    Konstantin> something to map some xml schemas to documents. So I deemed these
    Konstantin> regexps are too used by ELisp.

    Konstantin> Can I test it somehow? Either way, not a big deal, I can just drop
    Konstantin> that one.

If I remember correctly, the schema is copied into the resulting
OpenDocument file, so itʼs probably safest not to touch it.

    Konstantin> * lisp/calc/calc-aent.el: replace [0-9a-fA-F] with
    Konstantin> [[:xdigit:]]
    >>
    >> Normally, you'd mention the containing function in the ChangeLog
    >> entry. Using 'C-x 4 a' (ie 'add-change-log-entry-other-window') with
    >> point on the code youʼre changing does that for you.

    Konstantin> Ah, thanks. At this point I'll probably ask on emacs-devel about
    Konstantin> adding to prepare-commit-msg a code to pre-format the changes, because
    Konstantin> clearly that's a lot of manual work for something that should be
    Konstantin> automated.

Itʼs pretty automated:

- Do M-x vc-dir in your emacs repository to see which files are changed
- Do C-x 4 a to prepare the ChangeLog entries
- Mark the files you want you commit
- Commit from the vc-dir buffer. This will copy the earlier ChangeLog
 entries into the commit message buffer

Unless you meant completely automatically generating the ChangeLog
entries, which is a wholly different can of worms.

Robert



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]

Noam Postavsky
In reply to this post by Robert Pluim
Robert Pluim <[hidden email]> writes:

> And then on subsequent similar changes you can say 'Likewise.' (whilst
> still mentioning the enclosing function)

There's no need to say 'Likewise', just leave all but the last entry
without a message, see CONTRIBUTE:

    - Preferred form for several entries with the same content:

        * lisp/menu-bar.el (clipboard-yank, clipboard-kill-ring-save)
        (clipboard-kill-region):
        * lisp/eshell/esh-io.el (eshell-virtual-targets)
        (eshell-clipboard-append):
        Replace option gui-select-enable-clipboard with
        select-enable-clipboard; renamed October 2014.  (Bug#25145)

      (Rather than anything involving "ditto" and suchlike.)



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Paul Eggert
In reply to this post by Konstantin Kharlamov
If we're going to make such a change we should be systematic about it.
Unfortunately the currently-proposed patches don't handle examples like
these:

[A-Fa-f0-9] (in dnd.el)

[0-9a-fA-F.] (in org/org-table.el)

[0-9a-fA-FxXzZ_] (in progmodes/vera-mode.el)

(skip-chars-backward "0-9a-fA-F'") (in progmodes/cc-mode.el)

I will cc this message to Mattias Engdegård, as he has a good scanner
for regular expressions and patterns. Mattias, the bug-report thread is
here:

https://debbugs.gnu.org/36167




Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]

Eli Zaretskii
In reply to this post by Noam Postavsky
> From: [hidden email]
> Date: Tue, 11 Jun 2019 09:32:23 -0400
> Cc: [hidden email]
>
> Robert Pluim <[hidden email]> writes:
>
> > And then on subsequent similar changes you can say 'Likewise.' (whilst
> > still mentioning the enclosing function)
>
> There's no need to say 'Likewise', just leave all but the last entry
> without a message, see CONTRIBUTE:
>
>     - Preferred form for several entries with the same content:
>
>         * lisp/menu-bar.el (clipboard-yank, clipboard-kill-ring-save)
>         (clipboard-kill-region):
>         * lisp/eshell/esh-io.el (eshell-virtual-targets)
>         (eshell-clipboard-append):
>         Replace option gui-select-enable-clipboard with
>         select-enable-clipboard; renamed October 2014.  (Bug#25145)
>
>       (Rather than anything involving "ditto" and suchlike.)

Yes, the above is the preferred format.  "Likewise", "ditto", etc. are
just useless noise, since you have to go to the first entry anyway to
understand what was done.

Also, please note that typing "C-x 4 a" in several functions without
adding any text after the colon will automatically extend the list of
names in parentheses, so all you have to do is write the description
of the change once after you type "C-x 4 a" in all the functions where
you made the same change.



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Konstantin Kharlamov
In reply to this post by Paul Eggert


On Вт, июн 11, 2019 at 07:26, Paul Eggert <[hidden email]>
wrote:
> If we're going to make such a change we should be systematic about
> it. Unfortunately the currently-proposed patches don't handle
> examples like these:
>
> [A-Fa-f0-9] (in dnd.el)
>
> [0-9a-fA-F.] (in org/org-table.el)
>
> [0-9a-fA-FxXzZ_] (in progmodes/vera-mode.el)

This one doesn't look like hex. At least :xdigit: sure doesn't match X
and Z. Although this probably could be replaced with [[[:digit:]]xXzZ]
(didn't test this one). But I imagine such change may better be a
separate patch, as it's somewhat different from all the other changes.


> (skip-chars-backward "0-9a-fA-F'") (in progmodes/cc-mode.el)

Same here.

> I will cc this message to Mattias Engdegård, as he has a good
> scanner for regular expressions and patterns. Mattias, the bug-report
> thread is here:
>
> https://debbugs.gnu.org/36167

Either way, thanks, I already figured too that there are some regexes
in a different order. I'm using ack to find them, this should work:

        ack "\[[-09afAF]{9}\]"

I'll post an updated patch later.





Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Paul Eggert
On 6/11/19 7:37 AM, Konstantin Kharlamov wrote:
> this probably could be replaced with [[[:digit:]]xXzZ] (didn't test
> this one).

That's right, though it should be [[:xdigit:]xXzZ].

> But I imagine such change may better be a separate patch, as it's
> somewhat different from all the other changes.

No, it's basically the same thing; we're looking for any place that
[:xdigit:] would be useful in clarifying patterns intended to max
hexadecimal digits (and perhaps some other things). Also, the skip-chars
arguments are also the same thing. Let's do all these.




Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Mattias Engdegård-2
11 juni 2019 kl. 17.37 skrev Paul Eggert <[hidden email]>:
>
> No, it's basically the same thing; we're looking for any place that [:xdigit:] would be useful in clarifying patterns intended to max hexadecimal digits (and perhaps some other things). Also, the skip-chars arguments are also the same thing. Let's do all these.

Since you asked, I've attached a relint run with xr modified to find parts of character alternatives and skip-sets that could be replaced with [:xdigit:], on Emacs .el files in master; it was quick work.

However, I'm not really convinced that the risks of making mistakes in the translation would outweigh the benefits. We could make an automatic verification, but [0-9A-Fa-f] still has one advantage: the reader, and the writer, know exactly which characters are included without looking it up. For example:

- whether upper case, lower case, or both are accepted
- whether non-ascii digits are accepted (included in [:digit:] on many platforms)

But it's not up to me; should your judgement tell you otherwise, go ahead! I don't mind the use of [:xdigit:] at all, it's just the wholesale replacement.


xdigit.log (54K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Drew Adams
> [0-9A-Fa-f] still has one advantage: the reader, and the
> writer, know exactly which characters are included without looking it up. For
> example:
>
> - whether upper case, lower case, or both are accepted
> - whether non-ascii digits are accepted (included in [:digit:] on many
> platforms)

+1.  At least the doc for [:digit:] should say exactly
what it matches.  Then it'll be clear for readers and
writers.



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Eli Zaretskii
> Date: Tue, 11 Jun 2019 09:50:24 -0700 (PDT)
> From: Drew Adams <[hidden email]>
> Cc: [hidden email], Konstantin Kharlamov <[hidden email]>
>
> > [0-9A-Fa-f] still has one advantage: the reader, and the
> > writer, know exactly which characters are included without looking it up. For
> > example:
> >
> > - whether upper case, lower case, or both are accepted
> > - whether non-ascii digits are accepted (included in [:digit:] on many
> > platforms)
>
> +1.  At least the doc for [:digit:] should say exactly
> what it matches.  Then it'll be clear for readers and
> writers.

Isn't it clear already?  Here's what the documentation says now:

  ‘[:digit:]’
       This matches ‘0’ through ‘9’.  Thus, ‘[-+[:digit:]]’ matches any
       digit, as well as ‘+’ and ‘-’.

Is anything missing here?  Where did the question about non-ASCII
digits come from, given this text?



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Paul Eggert
On 6/11/19 10:04 AM, Eli Zaretskii wrote:
> Where did the question about non-ASCII
> digits come from, given this text?

It came from POSIX, where [:xdigit:] and [:digit:] might match other
characters. Similarly, in POSIX [a-f] might match characters other than
'a', 'b', 'c', 'd', 'e', 'f'. We don't need to worry about this in
Emacs, since Emacs regexps don't have that particular misfeature of POSIX.

I'm on the fence about replacing 0-9A-Fa-f with [:xdigit:], as I can see
both sides of the argument. If Mattias is dubious, then perhaps we
should leave the regexps alone - he's had more experience than the rest
of us when it comes to scanning for dubious regexp constructions.




Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Drew Adams
In reply to this post by Eli Zaretskii
> > > [0-9A-Fa-f] still has one advantage: the reader, and the
> > > writer, know exactly which characters are included without looking it up.
> For
> > > example:
> > >
> > > - whether upper case, lower case, or both are accepted
> > > - whether non-ascii digits are accepted (included in [:digit:] on many
> > > platforms)
> >
> > +1.  At least the doc for [:digit:] should say exactly
> > what it matches.  Then it'll be clear for readers and
> > writers.
>
> Isn't it clear already?

I meant [:xdigit:], not [:digit:], in my reply.  Sorry for
the typo.



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Eli Zaretskii
In reply to this post by Paul Eggert
> Cc: [hidden email], [hidden email], [hidden email]
> From: Paul Eggert <[hidden email]>
> Date: Tue, 11 Jun 2019 10:18:44 -0700
>
> On 6/11/19 10:04 AM, Eli Zaretskii wrote:
> > Where did the question about non-ASCII
> > digits come from, given this text?
>
> It came from POSIX, where [:xdigit:] and [:digit:] might match other
> characters.

Yes, but when using Emacs and coding for Emacs, one must read the
Emacs documentation, which clearly says what these do in Emacs.



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Eli Zaretskii
In reply to this post by Drew Adams
> Date: Tue, 11 Jun 2019 10:19:17 -0700 (PDT)
> From: Drew Adams <[hidden email]>
> Cc: [hidden email], [hidden email], [hidden email],
>         [hidden email]
>
> > Isn't it clear already?
>
> I meant [:xdigit:], not [:digit:], in my reply.  Sorry for
> the typo.

:xdigit: is also clearly documented:

  ‘[:xdigit:]’
       This matches the hexadecimal digits: ‘0’ through ‘9’, ‘a’ through
       ‘f’ and ‘A’ through ‘F’.




Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Noam Postavsky
In reply to this post by Eli Zaretskii
Eli Zaretskii <[hidden email]> writes:

>> > [0-9A-Fa-f] still has one advantage: the reader, and the
>> > writer, know exactly which characters are included without looking it up.
                                                        ^^^^^^^^^^^^^^^^^^^^^
>> > - whether non-ascii digits are accepted

>  ‘[:digit:]’
>       This matches ‘0’ through ‘9’.  Thus, ‘[-+[:digit:]]’ matches any
>       digit, as well as ‘+’ and ‘-’.

> Is anything missing here?  Where did the question about non-ASCII
> digits come from, given this text?

It came from (a hypothetical) user who doesn't remember (or hasn't read)
the documentation.  The advantage of [0-9A-Fa-f] vs [[:xdigit:]] here is
similar to explicit comparison against (point-min) vs (bobp) that you
pointed out in #35967.



Reply | Threaded
Open this post in threaded view
|

bug#36167: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Eli Zaretskii
> From: [hidden email]
> Cc: Drew Adams <[hidden email]>,  [hidden email],  [hidden email],  [hidden email],  [hidden email]
> Date: Tue, 11 Jun 2019 13:50:49 -0400
>
> The advantage of [0-9A-Fa-f] vs [[:xdigit:]] here is similar to
> explicit comparison against (point-min) vs (bobp) that you pointed
> out in #35967.

I'm not against the replacement, I responded to the request to have a
clear documentation of these character classes.  Which we do have, so
I was puzzled why people pretend we don't.



12