GNU bug report logs - #36167
[PATCH] Replace manually crafted hex regexes with [[:xdigit:]]

Previous Next

Package: emacs;

Reported by: Konstantin Kharlamov <hi-angel <at> yandex.ru>

Date: Tue, 11 Jun 2019 12:00:02 UTC

Severity: wishlist

Tags: patch

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 36167 in the body.
You can then email your comments to 36167 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 12:00:03 GMT) Full text and rfc822 format available.

Acknowledgement sent to Konstantin Kharlamov <hi-angel <at> yandex.ru>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Tue, 11 Jun 2019 12:00:03 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: bug-gnu-emacs <at> gnu.org
Subject: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]
Date: Tue, 11 Jun 2019 14:59:46 +0300
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.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 12:04:01 GMT) Full text and rfc822 format available.

Message #8 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: 36167 <at> debbugs.gnu.org
Subject: Acknowledgement ([PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]])
Date: Tue, 11 Jun 2019 15:03:39 +0300
Eh, sorry, git send-email is broken, complains on something about perl 
SSL. This may take some time.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 12:30:02 GMT) Full text and rfc822 format available.

Message #11 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <Hi-Angel <at> yandex.ru>
To: 36167 <at> debbugs.gnu.org
Subject: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Tue, 11 Jun 2019 15:29:25 +0300
* 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





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 13:04:02 GMT) Full text and rfc822 format available.

Message #14 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Robert Pluim <rpluim <at> gmail.com>
To: Konstantin Kharlamov <Hi-Angel <at> yandex.ru>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Tue, 11 Jun 2019 15:03:04 +0200
>>>>> On Tue, 11 Jun 2019 15:29:25 +0300, Konstantin Kharlamov <Hi-Angel <at> yandex.ru> 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




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 13:18:02 GMT) Full text and rfc822 format available.

Message #17 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: Robert Pluim <rpluim <at> gmail.com>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Tue, 11 Jun 2019 16:17:10 +0300

On Вт, июн 11, 2019 at 15:03, Robert Pluim <rpluim <at> gmail.com> 
wrote:
>>>>>>  On Tue, 11 Jun 2019 15:29:25 +0300, Konstantin Kharlamov 
>>>>>> <Hi-Angel <at> yandex.ru> 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






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 13:32:02 GMT) Full text and rfc822 format available.

Message #20 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Robert Pluim <rpluim <at> gmail.com>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Tue, 11 Jun 2019 15:30:48 +0200
>>>>> On Tue, 11 Jun 2019 16:17:10 +0300, Konstantin Kharlamov <hi-angel <at> yandex.ru> 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




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 13:33:02 GMT) Full text and rfc822 format available.

Message #23 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: npostavs <at> gmail.com
To: Konstantin Kharlamov <Hi-Angel <at> yandex.ru>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Tue, 11 Jun 2019 09:32:23 -0400
Robert Pluim <rpluim <at> gmail.com> 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.)




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 14:27:01 GMT) Full text and rfc822 format available.

Message #26 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: Mattias Engdegård <mattiase <at> acm.org>,
 36167 <at> debbugs.gnu.org
Subject: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]
Date: Tue, 11 Jun 2019 07:26:00 -0700
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





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 14:38:02 GMT) Full text and rfc822 format available.

Message #29 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: npostavs <at> gmail.com
Cc: 36167 <at> debbugs.gnu.org, Hi-Angel <at> yandex.ru
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Tue, 11 Jun 2019 17:36:46 +0300
> From: npostavs <at> gmail.com
> Date: Tue, 11 Jun 2019 09:32:23 -0400
> Cc: 36167 <at> debbugs.gnu.org
> 
> Robert Pluim <rpluim <at> gmail.com> 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.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 14:39:01 GMT) Full text and rfc822 format available.

Message #32 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: Mattias Engdegård <mattiase <at> acm.org>,
 36167 <at> debbugs.gnu.org
Subject: Re: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]
Date: Tue, 11 Jun 2019 17:37:54 +0300

On Вт, июн 11, 2019 at 07:26, Paul Eggert <eggert <at> cs.ucla.edu> 
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.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 15:38:01 GMT) Full text and rfc822 format available.

Message #35 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: Mattias Engdegård <mattiase <at> acm.org>,
 36167 <at> debbugs.gnu.org
Subject: Re: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]
Date: Tue, 11 Jun 2019 08:37:42 -0700
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.





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 16:32:01 GMT) Full text and rfc822 format available.

Message #38 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Mattias Engdegård <mattiase <at> acm.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 36167 <at> debbugs.gnu.org, Konstantin Kharlamov <hi-angel <at> yandex.ru>
Subject: Re: [PATCH] Replace manually crafted hex regexes with [[:xdigit:]]
Date: Tue, 11 Jun 2019 18:31:38 +0200
[Message part 1 (text/plain, inline)]
11 juni 2019 kl. 17.37 skrev Paul Eggert <eggert <at> cs.ucla.edu>:
> 
> 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 (application/octet-stream, attachment)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 16:51:01 GMT) Full text and rfc822 format available.

Message #41 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Drew Adams <drew.adams <at> oracle.com>
To: Mattias Engdegård <mattiase <at> acm.org>, Paul Eggert
 <eggert <at> cs.ucla.edu>
Cc: 36167 <at> debbugs.gnu.org, Konstantin Kharlamov <hi-angel <at> yandex.ru>
Subject: RE: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 09:50:24 -0700 (PDT)
> [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.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 17:06:01 GMT) Full text and rfc822 format available.

Message #44 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Drew Adams <drew.adams <at> oracle.com>
Cc: mattiase <at> acm.org, eggert <at> cs.ucla.edu, 36167 <at> debbugs.gnu.org,
 hi-angel <at> yandex.ru
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 20:04:38 +0300
> Date: Tue, 11 Jun 2019 09:50:24 -0700 (PDT)
> From: Drew Adams <drew.adams <at> oracle.com>
> Cc: 36167 <at> debbugs.gnu.org, Konstantin Kharlamov <hi-angel <at> yandex.ru>
> 
> > [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?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 17:19:02 GMT) Full text and rfc822 format available.

Message #47 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>, Drew Adams <drew.adams <at> oracle.com>
Cc: mattiase <at> acm.org, 36167 <at> debbugs.gnu.org, hi-angel <at> yandex.ru
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
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. 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.





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 17:20:02 GMT) Full text and rfc822 format available.

Message #50 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Drew Adams <drew.adams <at> oracle.com>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: mattiase <at> acm.org, eggert <at> cs.ucla.edu, 36167 <at> debbugs.gnu.org,
 hi-angel <at> yandex.ru
Subject: RE: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 10:19:17 -0700 (PDT)
> > > [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.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 17:34:01 GMT) Full text and rfc822 format available.

Message #53 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: mattiase <at> acm.org, 36167 <at> debbugs.gnu.org, drew.adams <at> oracle.com,
 hi-angel <at> yandex.ru
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 20:32:38 +0300
> Cc: mattiase <at> acm.org, 36167 <at> debbugs.gnu.org, hi-angel <at> yandex.ru
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> 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.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 17:35:02 GMT) Full text and rfc822 format available.

Message #56 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Drew Adams <drew.adams <at> oracle.com>
Cc: mattiase <at> acm.org, eggert <at> cs.ucla.edu, 36167 <at> debbugs.gnu.org,
 hi-angel <at> yandex.ru
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 20:34:44 +0300
> Date: Tue, 11 Jun 2019 10:19:17 -0700 (PDT)
> From: Drew Adams <drew.adams <at> oracle.com>
> Cc: mattiase <at> acm.org, eggert <at> cs.ucla.edu, 36167 <at> debbugs.gnu.org,
>         hi-angel <at> yandex.ru
> 
> > 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’.





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 17:51:01 GMT) Full text and rfc822 format available.

Message #59 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: npostavs <at> gmail.com
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: mattiase <at> acm.org, eggert <at> cs.ucla.edu, 36167 <at> debbugs.gnu.org,
 Drew Adams <drew.adams <at> oracle.com>, hi-angel <at> yandex.ru
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 13:50:49 -0400
Eli Zaretskii <eliz <at> gnu.org> 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.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 17:55:02 GMT) Full text and rfc822 format available.

Message #62 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: npostavs <at> gmail.com
Cc: mattiase <at> acm.org, eggert <at> cs.ucla.edu, 36167 <at> debbugs.gnu.org,
 drew.adams <at> oracle.com, hi-angel <at> yandex.ru
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 20:53:44 +0300
> From: npostavs <at> gmail.com
> Cc: Drew Adams <drew.adams <at> oracle.com>,  mattiase <at> acm.org,  eggert <at> cs.ucla.edu,  36167 <at> debbugs.gnu.org,  hi-angel <at> yandex.ru
> 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.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 18:16:02 GMT) Full text and rfc822 format available.

Message #65 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: npostavs <at> gmail.com, mattiase <at> acm.org, eggert <at> cs.ucla.edu
Cc: 36167 <at> debbugs.gnu.org, hi-angel <at> yandex.ru
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 21:14:49 +0300
> From: Eli Zaretskii <eliz <at> gnu.org>
> Cc: mattiase <at> acm.org, eggert <at> cs.ucla.edu, 36167 <at> debbugs.gnu.org,
>  hi-angel <at> yandex.ru
> 
> I'm not against the replacement, I responded to the request to have a
> clear documentation of these character classes.

Specifically, this:

> > [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.

The last part says "the doc should say" as if the doc doesn't already
say.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 19:03:01 GMT) Full text and rfc822 format available.

Message #68 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Drew Adams <drew.adams <at> oracle.com>
To: Eli Zaretskii <eliz <at> gnu.org>, npostavs <at> gmail.com, mattiase <at> acm.org,
 eggert <at> cs.ucla.edu
Cc: 36167 <at> debbugs.gnu.org, hi-angel <at> yandex.ru
Subject: RE: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 12:01:45 -0700 (PDT)
> > +1.  At least the doc for [:digit:] should say exactly
> > what it matches.  Then it'll be clear for readers and
> > writers.
> 
> The last part says "the doc should say" as if the doc doesn't already
> say.

Yes, my bad. Forgot that it exists, and misread the
proposal as including its creation.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Tue, 11 Jun 2019 19:57:03 GMT) Full text and rfc822 format available.

Message #71 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Andy Moreton <andrewjmoreton <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Tue, 11 Jun 2019 20:56:09 +0100
On Tue 11 Jun 2019, Eli Zaretskii wrote:

>> Date: Tue, 11 Jun 2019 10:19:17 -0700 (PDT)
>> From: Drew Adams <drew.adams <at> oracle.com>
>> Cc: mattiase <at> acm.org, eggert <at> cs.ucla.edu, 36167 <at> debbugs.gnu.org,
>>         hi-angel <at> yandex.ru
>> 
>> > 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’.

The docs for [:digit:] and [:xdigit:] seem clear enough, but there is
one other minor point that could be clarified.

The [:alnum:] and [:alpha:] are based on (unspecified values of) the Unicode
general-category property, but [:digit:] is not. Thus [:alnum:] includes
other numeric characters that are not matched by [:digit:].

    AndyM





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 00:33:02 GMT) Full text and rfc822 format available.

Message #74 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: Robert Pluim <rpluim <at> gmail.com>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 03:29:29 +0300

В Вт, июн 11, 2019 at 15:30, Robert Pluim <rpluim <at> gmail.com> 
написал:
>>>>>>  On Tue, 11 Jun 2019 16:17:10 +0300, Konstantin Kharlamov 
>>>>>> <hi-angel <at> yandex.ru> 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

Okay, so, after I do the first 2 points, I end up in a buffer with the 
following content

> 2019-06-12    <constantine <at> constantine-N61Ja>
>
> 	*  (Stash):

I am not sure what to do next, because I guess this buffer supposed to 
have changed function names? I also tried first marking files in vc-dir 
with "m" key, and then doing the 2nd point, to no avail.

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

Yeah. It would be very useful, because had you not write that this 
could be automated, I'd never guessed. And even now that you wrote 
about it, I still don't understand how to make it work. I guess I'm not 
an unique contributor in such position.

But I think possibility of such change may be better to discuss in a 
separate thread.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 02:31:02 GMT) Full text and rfc822 format available.

Message #77 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Andy Moreton <andrewjmoreton <at> gmail.com>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Wed, 12 Jun 2019 05:30:08 +0300
> From: Andy Moreton <andrewjmoreton <at> gmail.com>
> Date: Tue, 11 Jun 2019 20:56:09 +0100
> 
> The docs for [:digit:] and [:xdigit:] seem clear enough, but there is
> one other minor point that could be clarified.
> 
> The [:alnum:] and [:alpha:] are based on (unspecified values of) the Unicode
> general-category property, but [:digit:] is not. Thus [:alnum:] includes
> other numeric characters that are not matched by [:digit:].

It's true that [:alnum:] includes more numerical characters that
[:digit:], but what exactly needs to be clarified here?  Assuming you
mean clarified in the manual, that is.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 02:43:02 GMT) Full text and rfc822 format available.

Message #80 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 05:42:04 +0300
> Date: Wed, 12 Jun 2019 03:29:29 +0300
> From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
> Cc: 36167 <at> debbugs.gnu.org
> 
> > Unless you meant completely automatically generating the ChangeLog
> > entries, which is a wholly different can of worms.
> 
> Yeah. It would be very useful, because had you not write that this 
> could be automated, I'd never guessed.

It's in CONTRIBUTE, btw.

> And even now that you wrote about it, I still don't understand how
> to make it work. I guess I'm not an unique contributor in such
> position.

If you have never used "C-x 4 a", you should indeed learn how to use
it efficiently.

> But I think possibility of such change may be better to discuss in a 
> separate thread.

I very much doubt that log-message creation could be automated.  For
starters, there's a human decision how to group the entries and what
to write as the description of the changes themselves.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 08:22:02 GMT) Full text and rfc822 format available.

Message #83 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Robert Pluim <rpluim <at> gmail.com>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 10:21:41 +0200
>>>>> On Wed, 12 Jun 2019 03:29:29 +0300, Konstantin Kharlamov <hi-angel <at> yandex.ru> said:
    >> - 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

    Konstantin> Okay, so, after I do the first 2 points, I end up in a buffer with the
    Konstantin> following content

    >> 2019-06-12    <constantine <at> constantine-N61Ja>
    >> 
    >> *  (Stash):

    Konstantin> I am not sure what to do next, because I guess this buffer supposed to
    Konstantin> have changed function names? I also tried first marking files in
    Konstantin> vc-dir with "m" key, and then doing the 2nd point, to no avail.

Sorry, I forgot a step: you have to visit the file you changed, and
make sure point is near where you made changes (C-x v = will show you
a *vc-diff* buffer containing the changes), and then do C-x 4 a
(possibly multiple times if you changed multiple things).

Robert




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 11:20:02 GMT) Full text and rfc822 format available.

Message #86 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: Robert Pluim <rpluim <at> gmail.com>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 14:19:04 +0300

В Ср, июн 12, 2019 at 10:21, Robert Pluim <rpluim <at> gmail.com> 
написал:
>>>>>>  On Wed, 12 Jun 2019 03:29:29 +0300, Konstantin Kharlamov 
>>>>>> <hi-angel <at> yandex.ru> said:
>     >> - 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
> 
>     Konstantin> Okay, so, after I do the first 2 points, I end up in 
> a buffer with the
>     Konstantin> following content
> 
>     >> 2019-06-12    <constantine <at> constantine-N61Ja>
>     >>
>     >> *  (Stash):
> 
>     Konstantin> I am not sure what to do next, because I guess this 
> buffer supposed to
>     Konstantin> have changed function names? I also tried first 
> marking files in
>     Konstantin> vc-dir with "m" key, and then doing the 2nd point, to 
> no avail.
> 
> Sorry, I forgot a step: you have to visit the file you changed, and
> make sure point is near where you made changes (C-x v = will show you
> a *vc-diff* buffer containing the changes), and then do C-x 4 a
> (possibly multiple times if you changed multiple things).

Oh, that doesn't sound automated, it's a lot of work. I had 28 files in 
the outdated patch, and there will be more, as noted Paul. And in the 
other patch, which I did not send as it turned out to be obsolete 
(which was replacing [0-9] with [[:digit:]]) I had around 4xx changed 
files. No way one could manually go through 400 files, stop by each 
change, and press a hotkey.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 11:45:02 GMT) Full text and rfc822 format available.

Message #89 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Andy Moreton <andrewjmoreton <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Wed, 12 Jun 2019 12:44:12 +0100
On Wed 12 Jun 2019, Eli Zaretskii wrote:

>> From: Andy Moreton <andrewjmoreton <at> gmail.com>
>> Date: Tue, 11 Jun 2019 20:56:09 +0100
>> 
>> The docs for [:digit:] and [:xdigit:] seem clear enough, but there is
>> one other minor point that could be clarified.
>> 
>> The [:alnum:] and [:alpha:] are based on (unspecified values of) the Unicode
>> general-category property, but [:digit:] is not. Thus [:alnum:] includes
>> other numeric characters that are not matched by [:digit:].
>
> It's true that [:alnum:] includes more numerical characters that
> [:digit:], but what exactly needs to be clarified here?  Assuming you
> mean clarified in the manual, that is.

As noted by Paul Eggert, the POSIX behaviour is different. It may be
worth a note in the manual to draw attention to this difference.

    AndyM





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 14:56:02 GMT) Full text and rfc822 format available.

Message #92 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 17:55:45 +0300
> Date: Wed, 12 Jun 2019 14:19:04 +0300
> From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
> Cc: 36167 <at> debbugs.gnu.org
> 
> > Sorry, I forgot a step: you have to visit the file you changed, and
> > make sure point is near where you made changes (C-x v = will show you
> > a *vc-diff* buffer containing the changes), and then do C-x 4 a
> > (possibly multiple times if you changed multiple things).
> 
> Oh, that doesn't sound automated, it's a lot of work. I had 28 files in 
> the outdated patch, and there will be more, as noted Paul.

The idea is to type "C-x 4 a" right after making each change, or set
up a keyboard macro that does this for you.

> And in the other patch, which I did not send as it turned out to be
> obsolete (which was replacing [0-9] with [[:digit:]]) I had around
> 4xx changed files. No way one could manually go through 400 files,
> stop by each change, and press a hotkey.

When you change 400 files, no one will expect you to mention each
instance, it's enough to describe the change itself and say "in all
files" or somesuch.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 16:08:02 GMT) Full text and rfc822 format available.

Message #95 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Andy Moreton <andrewjmoreton <at> gmail.com>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Wed, 12 Jun 2019 19:07:29 +0300
> From: Andy Moreton <andrewjmoreton <at> gmail.com>
> Date: Wed, 12 Jun 2019 12:44:12 +0100
> 
> >> The [:alnum:] and [:alpha:] are based on (unspecified values of) the Unicode
> >> general-category property, but [:digit:] is not. Thus [:alnum:] includes
> >> other numeric characters that are not matched by [:digit:].
> >
> > It's true that [:alnum:] includes more numerical characters that
> > [:digit:], but what exactly needs to be clarified here?  Assuming you
> > mean clarified in the manual, that is.
> 
> As noted by Paul Eggert, the POSIX behaviour is different. It may be
> worth a note in the manual to draw attention to this difference.

It's strange to say in the manual what we do NOT do.  The current text
says:

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

I believe you suggest to add to this something like "Note that Posix
interpretation of '[:digit:]' is different"?  Given the crystal
clarity of the current text, wouldn't such addition confuse the
reader?

Btw, where's the reference for a different interpretation by Posix?  I
cannot find anything to that effect; even the Unicode UTS18
(http://www.unicode.org/reports/tr18/) says, while describing the
Posix equivalent of the Unicode regexp notations: "Non-decimal numbers
(like Roman numerals) are normally excluded".  What am I missing?




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 16:46:02 GMT) Full text and rfc822 format available.

Message #98 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 19:39:26 +0300

В Ср, июн 12, 2019 at 17:55, Eli Zaretskii <eliz <at> gnu.org> 
написал:
>>  Date: Wed, 12 Jun 2019 14:19:04 +0300
>>  From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
>>  Cc: 36167 <at> debbugs.gnu.org
>> 
>>  > Sorry, I forgot a step: you have to visit the file you changed, 
>> and
>>  > make sure point is near where you made changes (C-x v = will show 
>> you
>>  > a *vc-diff* buffer containing the changes), and then do C-x 4 a
>>  > (possibly multiple times if you changed multiple things).
>> 
>>  Oh, that doesn't sound automated, it's a lot of work. I had 28 
>> files in
>>  the outdated patch, and there will be more, as noted Paul.
> 
> The idea is to type "C-x 4 a" right after making each change, or set
> up a keyboard macro that does this for you.

This indeed sounds somewhat easier, have I been making each xdigit 
replacement manually.

But I'm a fan of automation, this reduces a "human factor" and is 
faster. So the original xdigit patch was a matter of a single command:

	sp "\[0-9a-fA-F\]" "[[:xdigit:]]"

where "sp" is a "sed" replacement in perl¹. (okay, maybe then also to 
review and "git checkout" irrelevant files, like changelogs)

Having to do all 20 files manually would be a lot of work.

>>  And in the other patch, which I did not send as it turned out to be
>>  obsolete (which was replacing [0-9] with [[:digit:]]) I had around
>>  4xx changed files. No way one could manually go through 400 files,
>>  stop by each change, and press a hotkey.
> 
> When you change 400 files, no one will expect you to mention each
> instance, it's enough to describe the change itself and say "in all
> files" or somesuch.

Can I do that for 20 files?

1: 
https://github.com/Hi-Angel/dotfiles/blob/33eab4cc99ad06dbfa71fa0cf9c2822e5d824f24/.zshrc#L122






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 16:52:02 GMT) Full text and rfc822 format available.

Message #101 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 19:51:29 +0300
> Date: Wed, 12 Jun 2019 19:39:26 +0300
> From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
> Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
> 
> > When you change 400 files, no one will expect you to mention each
> > instance, it's enough to describe the change itself and say "in all
> > files" or somesuch.
> 
> Can I do that for 20 files?

Borderline, IMO.

Can't the command you use output the list of functions or at least
files where it made the changes?  Then you could massage that list
into a log message.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 17:10:02 GMT) Full text and rfc822 format available.

Message #104 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 20:09:09 +0300

В Ср, июн 12, 2019 at 19:51, Eli Zaretskii <eliz <at> gnu.org> 
написал:
>>  Date: Wed, 12 Jun 2019 19:39:26 +0300
>>  From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
>>  Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
>> 
>>  > When you change 400 files, no one will expect you to mention each
>>  > instance, it's enough to describe the change itself and say "in 
>> all
>>  > files" or somesuch.
>> 
>>  Can I do that for 20 files?
> 
> Borderline, IMO.
> 
> Can't the command you use output the list of functions or at least
> files where it made the changes?  Then you could massage that list
> into a log message.

Getting the list of files is trivial, I can just copy them from a `git 
diff --name-only` or some such. Getting the list of modified functions 
in code is harder.

Anyway, I'll try making some function later to apply recursively the 
(add-change-log-entry-other-window), that sounds good to have in 
general.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 21:34:01 GMT) Full text and rfc822 format available.

Message #107 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: Eli Zaretskii <eliz <at> gnu.org>, rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 23:33:16 +0200
Konstantin Kharlamov <hi-angel <at> yandex.ru> writes:

> Anyway, I'll try making some function later to apply recursively the
> (add-change-log-entry-other-window), that sounds good to have in
> general.

If it helps, I've got this that emulates hitting `C-x 4 a' on all
changes in a diff-mode (in probably the least efficient way possible)
which is handy if you're doing a lot of semi-automatic changes to many
functions. 

(defun lars-gather-changelog ()
  (interactive)
  (let* ((buf-file-name (funcall add-log-buffer-file-name-function))
	 (buffer-file (if buf-file-name (expand-file-name buf-file-name)))
	 (change-buffer 
	  (add-log-find-changelog-buffer 
	   (expand-file-name (find-change-log nil buffer-file)))))
    (with-current-buffer change-buffer
      (erase-buffer))
    (save-excursion
      (goto-char (point-min))
      (while (re-search-forward "^[-+] " nil t)
	(save-window-excursion
	  (diff-goto-source)
	  (add-change-log-entry-other-window))))
    (switch-to-buffer-other-window change-buffer)))

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 21:41:01 GMT) Full text and rfc822 format available.

Message #110 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Wed, 12 Jun 2019 23:39:55 +0200
Lars Ingebrigtsen <larsi <at> gnus.org> writes:

>       (while (re-search-forward "^[-+] " nil t)

Should be

      (while (re-search-forward "^[-+][ \t]" nil t)

I think.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 22:18:01 GMT) Full text and rfc822 format available.

Message #113 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Andreas Schwab <schwab <at> linux-m68k.org>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org,
 Konstantin Kharlamov <hi-angel <at> yandex.ru>
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Thu, 13 Jun 2019 00:17:20 +0200
On Jun 12 2019, Lars Ingebrigtsen <larsi <at> gnus.org> wrote:

> Konstantin Kharlamov <hi-angel <at> yandex.ru> writes:
>
>> Anyway, I'll try making some function later to apply recursively the
>> (add-change-log-entry-other-window), that sounds good to have in
>> general.
>
> If it helps, I've got this that emulates hitting `C-x 4 a' on all
> changes in a diff-mode

Isn't that what C-x 4 A (diff-add-change-log-entries-other-window) does?

Andreas.

-- 
Andreas Schwab, schwab <at> linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510  2552 DF73 E780 A9DA AEC1
"And now for something completely different."




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 22:23:02 GMT) Full text and rfc822 format available.

Message #116 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Lars Ingebrigtsen <larsi <at> gnus.org>
To: Andreas Schwab <schwab <at> linux-m68k.org>
Cc: rpluim <at> gmail.com, 36167 <at> debbugs.gnu.org,
 Konstantin Kharlamov <hi-angel <at> yandex.ru>
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Thu, 13 Jun 2019 00:22:23 +0200
Andreas Schwab <schwab <at> linux-m68k.org> writes:

> Isn't that what C-x 4 A (diff-add-change-log-entries-other-window) does?

Indeed it is -- I wasn't aware of that command.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Wed, 12 Jun 2019 22:49:01 GMT) Full text and rfc822 format available.

Message #119 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: Lars Ingebrigtsen <larsi <at> gnus.org>
Cc: rpluim <at> gmail.com, Andreas Schwab <schwab <at> linux-m68k.org>,
 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH] Replace [0-9a-fA-F] with [[:xdigit:]]
Date: Thu, 13 Jun 2019 01:48:45 +0300
This is great, thanks everyone!

В Чт, июн 13, 2019 at 00:22, Lars Ingebrigtsen <larsi <at> gnus.org> 
написал:
> Andreas Schwab <schwab <at> linux-m68k.org> writes:
> 
>>  Isn't that what C-x 4 A (diff-add-change-log-entries-other-window) 
>> does?
> 
> Indeed it is -- I wasn't aware of that command.
> 
> --
> (domestic pets only, the antidote for overdose, milk.)
>    bloggy blog: http://lars.ingebrigtsen.no






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Thu, 13 Jun 2019 00:20:01 GMT) Full text and rfc822 format available.

Message #122 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <Hi-Angel <at> yandex.ru>
To: 36167 <at> debbugs.gnu.org
Subject: [PATCH v2] Replace manually crafted hex regexes wth [[:xdigit:]]
Date: Thu, 13 Jun 2019 03:18:43 +0300
* admin/charsets/mapconv:
* build-aux/gitlog-to-changelog (parse_amend_file) (git_dir_option):
* lisp/progmodes/verilog-mode.el (verilog-delay-re):
    (verilog-type-font-keywords) (verilog-read-always-signals-recurse):
    (verilog-is-number):
* lisp/progmodes/vera-mode.el (vera-font-lock-keywords):
* test/src/emacs-module-tests.el (mod-test-sum-test):
* lisp/xml.el: (xml--entity-replacement-text):
* lisp/version.el (emacs-repository-version-git):
* lisp/textmodes/sgml-mode.el (sgml-quote):
* lisp/textmodes/css-mode.el (css-escapes-re) (css--colors-regexp):
* lisp/progmodes/prolog.el (prolog-syntax-propertize-function):
* lisp/progmodes/hideif.el (hif-token-regexp) (hif-tokenize):
* lisp/progmodes/ebnf-dtd.el: (ebnf-dtd-attlistdecl)
    (ebnf-dtd-entitydecl) (ebnf-dtd-lex)
* lisp/progmodes/ebnf-ebx.el (ebnf-ebx-hex-character):
* lisp/progmodes/ebnf-abn.el (ebnf-abn-character):
* lisp/progmodes/cperl-mode.el (cperl-highlight-charclass) (cperl-find-pods-heres):
* lisp/progmodes/cc-mode.el (c-maybe-quoted-number-head)
    (c-maybe-quoted-number) (c-parse-quotes-before-change)
    (c-parse-quotes-after-change)
    (c-quoted-number-head-before-point) (c-quoted-number-straddling-point)
* lisp/progmodes/ada-mode.el (featurep) (ada-in-numeric-literal-p)
    (ada-font-lock-keywords):
* lisp/org/org-mobile.el (org-mobile-copy-agenda-files)
* lisp/org/org-table.el (org-table-number-regexp):
    (org-mobile-update-checksum-for-capture-file):
* lisp/nxml/xsd-regexp.el (xsdre-gen-categories):
* lisp/nxml/xmltok.el (let*):
* lisp/nxml/rng-xsd.el (rng-xsd-convert-hex-binary) (rng-xsd-convert-any-uri):
* lisp/nxml/rng-uri.el (rng-uri-file-name-1) (rng-uri-unescape-multibyte)
    (rng-uri-unescape-unibyte) (rng-uri-unescape-unibyte-match)
    (rng-uri-unescape-unibyte-replace):
* lisp/nxml/rng-cmpct.el (rng-c-process-escapes):
* lisp/nxml/nxml-maint.el (nxml-insert-target-repertoire-glyph-set):
* lisp/net/shr-color.el (shr-color->hexadecimal):
* lisp/mail/rfc2231.el (rfc2231-decode-encoded-string):
* lisp/international/mule-cmds.el (read-char-by-name):
* lisp/htmlfontify.el (hfy-hex-regex):
* lisp/gnus/nneething.el (nneething-decode-file-name):
* lisp/gnus/mml-sec.el (mml-secure-find-usable-keys):
* lisp/gnus/gnus-art.el (gnus-button-mid-or-mail-heuristic-alist):
* lisp/faces.el (read-color):
* lisp/epg.el (epg--status-ERRSIG) (epg--status-VALIDSIG)
    (epg--status-SIG_CREATED) (epg--decode-percent-escape)
    (epg--decode-hexstring) (epg--decode-quotedstring) (epg-dn-from-string):
* lisp/emulation/cua-rect.el (cua-incr-rectangle):
* lisp/dnd.el (dnd-unescape-uri):
* lisp/cedet/semantic/lex.el (semantic-lex-number-expression):
* lisp/cedet/semantic/java.el (semantic-java-number-regexp):
* lisp/calc/calc-lang.el (pascal):
* lisp/calc/calc-ext.el (math-read-number-fancy):
* lisp/calc/calc-aent.el (math-read-token):
    replace various combinations of [0-9a-fA-F] with [[:xdigit:]] (Bug#36167)
---

v2:
    * add changed function names.
    * more files changed.

I'm changing here 2 non-lisp files:
    1. mapconv — here I change "sed", sed supports xdigit
    2. gitlog-to-changelog: this one is perl. Perl supports xdigit too.

I compared whether I changed all files from Mattias's log, and turned
out I changed even more of them :) A regex I noted that logger didn't catch
was the change in lisp/progmodes/ebnf-abn.el file: the regex was
assigned there through let before being used with (skip-chars-forward)

 admin/charsets/mapconv          |  2 +-
 build-aux/gitlog-to-changelog   |  6 +++---
 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/dnd.el                     |  2 +-
 lisp/emulation/cua-rect.el      |  2 +-
 lisp/epg.el                     | 14 +++++++-------
 lisp/faces.el                   |  2 +-
 lisp/gnus/gnus-art.el           |  8 ++++----
 lisp/gnus/mml-sec.el            |  2 +-
 lisp/gnus/nneething.el          |  2 +-
 lisp/htmlfontify.el             |  2 +-
 lisp/international/mule-cmds.el |  2 +-
 lisp/mail/rfc2231.el            |  2 +-
 lisp/net/shr-color.el           |  2 +-
 lisp/nxml/nxml-maint.el         |  4 ++--
 lisp/nxml/rng-cmpct.el          |  2 +-
 lisp/nxml/rng-uri.el            | 10 +++++-----
 lisp/nxml/rng-xsd.el            |  4 ++--
 lisp/nxml/xmltok.el             |  2 +-
 lisp/nxml/xsd-regexp.el         |  2 +-
 lisp/org/org-mobile.el          |  4 ++--
 lisp/org/org-table.el           |  6 +++---
 lisp/progmodes/ada-mode.el      |  6 +++---
 lisp/progmodes/cc-mode.el       | 22 +++++++++++-----------
 lisp/progmodes/cperl-mode.el    |  8 ++++----
 lisp/progmodes/ebnf-abn.el      |  2 +-
 lisp/progmodes/ebnf-dtd.el      | 16 ++++++++--------
 lisp/progmodes/ebnf-ebx.el      |  2 +-
 lisp/progmodes/hideif.el        |  4 ++--
 lisp/progmodes/prolog.el        |  2 +-
 lisp/progmodes/vera-mode.el     |  2 +-
 lisp/progmodes/verilog-mode.el  |  8 ++++----
 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 +-
 41 files changed, 95 insertions(+), 95 deletions(-)

diff --git a/admin/charsets/mapconv b/admin/charsets/mapconv
index 8e19972f3d..2696b13a52 100755
--- a/admin/charsets/mapconv
+++ b/admin/charsets/mapconv
@@ -118,7 +118,7 @@ AWK=
     # Source format is:
     #   0xXX	0xYYYY
     sed -n -e "${2}p" < $1 \
-	| sed -e 's/\(0x[0-9A-Fa-f]*\)[^0]*\(0x[0-9A-Fa-f]*\).*/\1 \2/' \
+	| sed -e 's/\(0x[[:xdigit:]]*\)[^0]*\(0x[[:xdigit:]]*\).*/\1 \2/' \
 	| sort | ${AWKPROG}
 elif [ "$3" = "UNICODE" ] ; then
     # Source format is:
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
index deddef2446..ebbcb522e8 100755
--- a/build-aux/gitlog-to-changelog
+++ b/build-aux/gitlog-to-changelog
@@ -174,7 +174,7 @@ sub parse_amend_file($)
 
       if (!$in_code)
         {
-          $line =~ /^([0-9a-fA-F]{40})$/
+          $line =~ /^([[:xdigit:]]{40})$/
             or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"),
               $fail = 1, next;
           $sha = lc $1;
@@ -288,7 +288,7 @@ sub git_dir_option($)
       my ($sha, $rest) = split ':', $log, 2;
       defined $sha
         or die "$ME:$.: malformed log entry\n";
-      $sha =~ /^[0-9a-fA-F]{40}$/
+      $sha =~ /^[[:xdigit:]]{40}$/
         or die "$ME:$.: invalid SHA1: $sha\n";
 
       my $skipflag = 0;
@@ -376,7 +376,7 @@ sub git_dir_option($)
                   @skipshas = ();
                   next;
               }
-              if ($found && $_ =~ /^([0-9a-fA-F]{7,}) [^ ]/)
+              if ($found && $_ =~ /^([[:xdigit:]]{7,}) [^ ]/)
               {
                   push ( @skipshas, $1 );
               }
diff --git a/lisp/calc/calc-aent.el b/lisp/calc/calc-aent.el
index f16e665fc3..f1ef5c170b 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 1456fb2857..c7b4c3b091 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 ee107df39c..4a9771d743 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 54cce96545..7f9c93b906 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 2690122f06..f1c6b01418 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/dnd.el b/lisp/dnd.el
index 459a7238dc..973af7e518 100644
--- a/lisp/dnd.el
+++ b/lisp/dnd.el
@@ -138,7 +138,7 @@ dnd-get-local-file-uri
 
 (defsubst dnd-unescape-uri (uri)
   (replace-regexp-in-string
-   "%[A-Fa-f0-9][A-Fa-f0-9]"
+   "%[[:xdigit:]][[:xdigit:]]"
    (lambda (arg)
      (let ((str (make-string 1 0)))
        (aset str 0 (string-to-number (substring arg 1) 16))
diff --git a/lisp/emulation/cua-rect.el b/lisp/emulation/cua-rect.el
index 706634a501..1a19cc2910 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/epg.el b/lisp/epg.el
index 0400716845..1d2f5be818 100644
--- a/lisp/epg.el
+++ b/lisp/epg.el
@@ -950,7 +950,7 @@ 'epg--time-from-seconds
 
 (defun epg--status-ERRSIG (context string)
   (if (string-match "\\`\\([^ ]+\\) \\([0-9]+\\) \\([0-9]+\\) \
-\\([0-9A-Fa-f][0-9A-Fa-f]\\) \\([^ ]+\\) \\([0-9]+\\)"
+\\([[:xdigit:]][[:xdigit:]]\\) \\([^ ]+\\) \\([0-9]+\\)"
 		    string)
       (let ((signature (epg-make-signature 'error)))
 	(epg-context-set-result-for
@@ -974,7 +974,7 @@ epg--status-VALIDSIG
     (when (and signature
 	       (eq (epg-signature-status signature) 'good)
 	       (string-match "\\`\\([^ ]+\\) [^ ]+ \\([^ ]+\\) \\([^ ]+\\) \
-\\([0-9]+\\) [^ ]+ \\([0-9]+\\) \\([0-9]+\\) \\([0-9A-Fa-f][0-9A-Fa-f]\\) \
+\\([0-9]+\\) [^ ]+ \\([0-9]+\\) \\([0-9]+\\) \\([[:xdigit:]][[:xdigit:]]\\) \
 \\(.*\\)"
 			   string))
       (setf (epg-signature-fingerprint signature)
@@ -1144,7 +1144,7 @@ epg--status-DELETE_PROBLEM
 
 (defun epg--status-SIG_CREATED (context string)
   (if (string-match "\\`\\([DCS]\\) \\([0-9]+\\) \\([0-9]+\\) \
-\\([0-9A-Fa-f][0-9A-Fa-f]\\) \\(.*\\) " string)
+\\([[:xdigit:]][[:xdigit:]]\\) \\(.*\\) " string)
       (epg-context-set-result-for
        context 'sign
        (cons (epg-make-new-signature
@@ -2021,7 +2021,7 @@ epg-edit-key
 
 (defun epg--decode-percent-escape (string)
   (let ((index 0))
-    (while (string-match "%\\(\\(%\\)\\|\\([0-9A-Fa-f][0-9A-Fa-f]\\)\\)"
+    (while (string-match "%\\(\\(%\\)\\|\\([[:xdigit:]][[:xdigit:]]\\)\\)"
 			 string index)
       (if (match-beginning 2)
 	  (setq string (replace-match "%" t t string)
@@ -2034,7 +2034,7 @@ epg--decode-percent-escape
 
 (defun epg--decode-hexstring (string)
   (let ((index 0))
-    (while (eq index (string-match "[0-9A-Fa-f][0-9A-Fa-f]" string index))
+    (while (eq index (string-match "[[:xdigit:]][[:xdigit:]]" string index))
       (setq string (replace-match (string (string-to-number
 					   (match-string 0 string) 16))
 				  t t string)
@@ -2044,7 +2044,7 @@ epg--decode-hexstring
 (defun epg--decode-quotedstring (string)
   (let ((index 0))
     (while (string-match "\\\\\\(\\([,=+<>#;\\\"]\\)\\|\
-\\([0-9A-Fa-f][0-9A-Fa-f]\\)\\)"
+\\([[:xdigit:]][[:xdigit:]]\\)\\)"
 			 string index)
       (if (match-beginning 2)
 	  (setq string (replace-match "\\2" t nil string)
@@ -2081,7 +2081,7 @@ epg-dn-from-string
 		     string index))
 	  (setq index (match-end 0)
 		value (epg--decode-quotedstring (match-string 0 string)))
-	(if (eq index (string-match "#\\([0-9A-Fa-f]+\\)" string index))
+	(if (eq index (string-match "#\\([[:xdigit:]]+\\)" string index))
 	    (setq index (match-end 0)
 		  value (epg--decode-hexstring (match-string 1 string)))
 	  (if (eq index (string-match "\"\\([^\\\"]\\|\\\\.\\)*\""
diff --git a/lisp/faces.el b/lisp/faces.el
index 89b598669c..f9e8c6c58b 100644
--- a/lisp/faces.el
+++ b/lisp/faces.el
@@ -1997,7 +1997,7 @@ read-color
       (when (and convert-to-RGB
 		 (not (string-equal color "")))
 	(let ((components (x-color-values color)))
-	  (unless (string-match-p "^#\\(?:[a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]\\)+$" color)
+	  (unless (string-match-p "^#\\(?:[[:xdigit:]][[:xdigit:]][[:xdigit:]]\\)+$" color)
 	    (setq color (format "#%04X%04X%04X"
 				(logand 65535 (nth 0 components))
 				(logand 65535 (nth 1 components))
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index d826faca5b..11782998f5 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:]][^[:xdigit:]]")
+    ;; -5.0 /^[0-9][[:xdigit:]]{3,3}/;
+    (-5.0  . "^[0-9][[:xdigit:]][[:xdigit:]][[:xdigit:]][^[:xdigit:]]")
     ;;
     (-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 db7489fbf1..02a27b367c 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 f64007aaf7..c3d511bc6e 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/htmlfontify.el b/lisp/htmlfontify.el
index f37a76cd7b..0466e7c024 100644
--- a/lisp/htmlfontify.el
+++ b/lisp/htmlfontify.el
@@ -566,7 +566,7 @@ hfy-facemap-assoc
 (defvar hfy-tmpfont-stack nil
   "An alist of derived fonts resulting from overlays.")
 
-(defconst hfy-hex-regex "[0-9A-Fa-f]")
+(defconst hfy-hex-regex "[[:xdigit:]]")
 
 (defconst hfy-triplet-regex
   (concat
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index 47b07479c3..1edf80d14c 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/mail/rfc2231.el b/lisp/mail/rfc2231.el
index 0a0983c25f..6ddb2964e5 100644
--- a/lisp/mail/rfc2231.el
+++ b/lisp/mail/rfc2231.el
@@ -223,7 +223,7 @@ rfc2231-decode-encoded-string
     (mm-with-unibyte-buffer
       (insert value)
       (goto-char (point-min))
-      (while (re-search-forward "%\\([0-9A-Fa-f][0-9A-Fa-f]\\)" nil t)
+      (while (re-search-forward "%\\([[:xdigit:]][[:xdigit:]]\\)" nil t)
 	(insert
 	 (prog1
 	     (string-to-number (match-string 1) 16)
diff --git a/lisp/net/shr-color.el b/lisp/net/shr-color.el
index 2d6cf68d8f..af0b99c76f 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/nxml-maint.el b/lisp/nxml/nxml-maint.el
index 2956efb736..c524567a5b 100644
--- a/lisp/nxml/nxml-maint.el
+++ b/lisp/nxml/nxml-maint.el
@@ -34,10 +34,10 @@ nxml-insert-target-repertoire-glyph-set
   (let (lst head)
     (with-current-buffer (find-file-noselect file)
       (goto-char (point-min))
-      (while (re-search-forward "^ *\\([a-fA-F0-9]\\{2\\}\\)[ \t]+" nil t)
+      (while (re-search-forward "^ *\\([[:xdigit:]]\\{2\\}\\)[ \t]+" nil t)
 	(let ((row (match-string 1))
 	      (eol (line-end-position)))
-	  (while (re-search-forward "\\([a-fA-F0-9]\\{2\\}\\)-\\([a-fA-F0-9]\\{2\\}\\)\\|\\([a-fA-F0-9]\\{2\\}\\)" eol t)
+	  (while (re-search-forward "\\([[:xdigit:]]\\{2\\}\\)-\\([[:xdigit:]]\\{2\\}\\)\\|\\([[:xdigit:]]\\{2\\}\\)" eol t)
 	    (setq lst
 		  (cons (if (match-beginning 3)
 			    (concat "#x" row (match-string 3))
diff --git a/lisp/nxml/rng-cmpct.el b/lisp/nxml/rng-cmpct.el
index d36f9d92f2..60c871990e 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 798475bbc3..5a67cc7f14 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 f308b049f3..582d08e149 100644
--- a/lisp/nxml/rng-xsd.el
+++ b/lisp/nxml/rng-xsd.el
@@ -330,7 +330,7 @@ rng-xsd-convert-token
        (match-string 1 string)))
 
 (defun rng-xsd-convert-hex-binary (string)
-  (and (string-match "\\`[ \r\n\t]*\\(\\(?:[0-9A-Fa-f][0-9A-Fa-f]\\)*\\)[ \r\n\t]*\\'"
+  (and (string-match "\\`[ \r\n\t]*\\(\\(?:[[:xdigit:]][[:xdigit:]]\\)*\\)[ \r\n\t]*\\'"
 		     string)
        (downcase (match-string 1 string))))
 
@@ -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 afa33e064f..3cab5ed9b7 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/nxml/xsd-regexp.el b/lisp/nxml/xsd-regexp.el
index 7ae169c19c..c002e6fd9f 100644
--- a/lisp/nxml/xsd-regexp.el
+++ b/lisp/nxml/xsd-regexp.el
@@ -702,7 +702,7 @@ xsdre-gen-categories
   (with-current-buffer (find-file-noselect file)
     (goto-char (point-min))
     (mapc (lambda (x) (put x 'xsdre-ranges nil)) xsdre-gen-categories)
-    (while (re-search-forward "^\\([0-9A-Fa-f]*\\);[^;]*;\\([A-Z][a-z]\\);"
+    (while (re-search-forward "^\\([[:xdigit:]]*\\);[^;]*;\\([A-Z][a-z]\\);"
 			      nil
 			      t)
       (let* ((sym (intern (match-string-no-properties 2)))
diff --git a/lisp/org/org-mobile.el b/lisp/org/org-mobile.el
index 8b4e895388..a1552606eb 100644
--- a/lisp/org/org-mobile.el
+++ b/lisp/org/org-mobile.el
@@ -472,7 +472,7 @@ org-mobile-copy-agenda-files
 		     (concat (shell-quote-argument org-mobile-checksum-binary)
 			     " "
 			     (shell-quote-argument (expand-file-name file)))))
-	(when (string-match "[a-fA-F0-9]\\{30,40\\}" check)
+	(when (string-match "[[:xdigit:]]\\{30,40\\}" check)
 	  (push (cons link-name (match-string 0 check))
 		org-mobile-checksum-files))))
 
@@ -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/org/org-table.el b/lisp/org/org-table.el
index 147527da1d..513a534d9b 100644
--- a/lisp/org/org-table.el
+++ b/lisp/org/org-table.el
@@ -155,7 +155,7 @@ org-table-default-size
   :type 'string)
 
 (defcustom org-table-number-regexp
-  "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%:]*\\|[<>]?[-+]?0[xX][0-9a-fA-F.]+\\|[<>]?[-+]?[0-9]+#[0-9a-zA-Z.]+\\|nan\\|[-+u]?inf\\)$"
+  "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%:]*\\|[<>]?[-+]?0[xX][[:xdigit:].]+\\|[<>]?[-+]?[0-9]+#[0-9a-zA-Z.]+\\|nan\\|[-+u]?inf\\)$"
   "Regular expression for recognizing numbers in table columns.
 If a table column contains mostly numbers, it will be aligned to the
 right.  If not, it will be aligned to the left.
@@ -180,9 +180,9 @@ org-table-number-regexp
 	  (const :tag "Exponential, Floating point, Integer"
 		 "^[-+]?[0-9.]+\\([eEdD][-+0-9]+\\)?$")
 	  (const :tag "Very General Number-Like, including hex and Calc radix"
-		 "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%]*\\|[<>]?[-+]?0[xX][0-9a-fA-F.]+\\|[<>]?[-+]?[0-9]+#[0-9a-zA-Z.]+\\|nan\\|[-+u]?inf\\)$")
+		 "^\\([<>]?[-+^.0-9]*[0-9][-+^.0-9eEdDx()%]*\\|[<>]?[-+]?0[xX][[:xdigit:].]+\\|[<>]?[-+]?[0-9]+#[0-9a-zA-Z.]+\\|nan\\|[-+u]?inf\\)$")
 	  (const :tag "Very General Number-Like, including hex and Calc radix, allows comma as decimal mark"
-		 "^\\([<>]?[-+^.,0-9]*[0-9][-+^.0-9eEdDx()%]*\\|[<>]?[-+]?0[xX][0-9a-fA-F.]+\\|[<>]?[-+]?[0-9]+#[0-9a-zA-Z.]+\\|nan\\|[-+u]?inf\\)$")
+		 "^\\([<>]?[-+^.,0-9]*[0-9][-+^.0-9eEdDx()%]*\\|[<>]?[-+]?0[xX][[:xdigit:].]+\\|[<>]?[-+]?[0-9]+#[0-9a-zA-Z.]+\\|nan\\|[-+u]?inf\\)$")
 	  (string :tag "Regexp:")))
 
 (defcustom org-table-number-fraction 0.5
diff --git a/lisp/progmodes/ada-mode.el b/lisp/progmodes/ada-mode.el
index 77c1e5e2d8..404e704373 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))
@@ -1013,7 +1013,7 @@ ada-in-string-or-comment-p
 
 (defsubst ada-in-numeric-literal-p ()
   "Return t if point is after a prefix of a numeric literal."
-  (looking-back "\\([0-9]+#[0-9a-fA-F_]+\\)" (line-beginning-position)))
+  (looking-back "\\([0-9]+#[[:xdigit:]_]+\\)" (line-beginning-position)))
 
 ;;------------------------------------------------------------------
 ;; Contextual menus
@@ -5213,7 +5213,7 @@ ada-font-lock-keywords
      '("<<\\(\\sw+\\)>>" 1 font-lock-constant-face)
 
      ;; Highlight based-numbers (R. Reagan <robin-reply <at> reagans.org>)
-     (list "\\([0-9]+#[0-9a-fA-F_]+#\\)" '(1 font-lock-constant-face t))
+     (list "\\([0-9]+#[[:xdigit:]_]+#\\)" '(1 font-lock-constant-face t))
 
      ;; Ada unnamed numerical constants
      (list "\\W\\([-+]?[0-9._]+\\)\\>" '(1 font-lock-constant-face))
diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 6afcb08a7c..6370c9c3a4 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]\\)*'?\\)?\\)"
        "\\|"
@@ -1435,7 +1435,7 @@ c-quoted-number-head-before-point
     (save-excursion
       (let ((here (point))
 	    found)
-	(skip-chars-backward "0-9a-fA-F'")
+	(skip-chars-backward "[:xdigit:]'")
 	(if (and (memq (char-before) '(?x ?X))
 		 (eq (char-before (1- (point))) ?0))
 	    (backward-char 2))
@@ -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]\\)*\\)"
        "\\|"
@@ -1487,9 +1487,9 @@ c-quoted-number-straddling-point
   (when c-has-quoted-numbers
     (save-excursion
       (let ((here (point))
-	    (bound (progn (skip-chars-forward "0-9a-fA-F'") (point))))
+	    (bound (progn (skip-chars-forward "[:xdigit:]'") (point))))
 	(goto-char here)
-	(when (< (skip-chars-backward "0-9a-fA-F'") 0)
+	(when (< (skip-chars-backward "[:xdigit:]'") 0)
 	  (if (and (memq (char-before) '(?x ?X))
 		   (eq (char-before (1- (point))) ?0))
 	      (backward-char 2))
@@ -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 ba007d67c0..c58acf0c2f 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-abn.el b/lisp/progmodes/ebnf-abn.el
index 53d37b689f..b00308591f 100644
--- a/lisp/progmodes/ebnf-abn.el
+++ b/lisp/progmodes/ebnf-abn.el
@@ -640,7 +640,7 @@ ebnf-abn-character
      (let* ((char  (following-char))
 	    (chars (cond ((or (= char ?B) (= char ?b)) "01")
 			 ((or (= char ?D) (= char ?d)) "0-9")
-			 ((or (= char ?X) (= char ?x)) "0-9A-Fa-f")
+			 ((or (= char ?X) (= char ?x)) "[:xdigit:]")
 			 (t (error "Invalid terminal value")))))
        (forward-char)
        (or (> (skip-chars-forward chars ebnf-limit) 0)
diff --git a/lisp/progmodes/ebnf-dtd.el b/lisp/progmodes/ebnf-dtd.el
index 94d9643261..74ff1f47d1 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"))
@@ -1242,7 +1242,7 @@ ebnf-dtd-lex
 	  (setq ebnf-dtd-lex (if (/= (following-char) ?x)
 				 (ebnf-dtd-char-ref "&#" "0-9")
 			       (forward-char)
-			       (ebnf-dtd-char-ref "&#x" "0-9a-fA-F")))
+			       (ebnf-dtd-char-ref "&#x" "[:xdigit:]")))
 	  'char-ref))
        ;; miscellaneous: (, ), [, ], =, |, *, +, >, `,'
        (t
diff --git a/lisp/progmodes/ebnf-ebx.el b/lisp/progmodes/ebnf-ebx.el
index 25500f1618..dc1a60f374 100644
--- a/lisp/progmodes/ebnf-ebx.el
+++ b/lisp/progmodes/ebnf-ebx.el
@@ -658,7 +658,7 @@ ebnf-ebx-hex-character
       (or no-error
 	  (error "Invalid hexadecimal character"))
     (forward-char)
-    (or (> (skip-chars-forward "0-9A-Fa-f" ebnf-limit) 0)
+    (or (> (skip-chars-forward "[:xdigit:]" ebnf-limit) 0)
 	(error "Invalid hexadecimal character"))))
 
 
diff --git a/lisp/progmodes/hideif.el b/lisp/progmodes/hideif.el
index 32b0b7551f..1b06077005 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 296a7ac3c9..780eff2d8a 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/progmodes/vera-mode.el b/lisp/progmodes/vera-mode.el
index f34b21e4cf..21d3db91ad 100644
--- a/lisp/progmodes/vera-mode.el
+++ b/lisp/progmodes/vera-mode.el
@@ -635,7 +635,7 @@ vera-font-lock-keywords
    (list (concat "^\\s-*" vera-rvm-types-regexp "\\s-*\\(\\[[^]]+\\]\\s-+\\)?")
 	 '(vera-font-lock-match-item nil nil (1 font-lock-variable-name-face)))
    ;; highlight numbers
-   '("\\([0-9]*'[bdoh][0-9a-fA-FxXzZ_]+\\)" 1 vera-font-lock-number)
+   '("\\([0-9]*'[bdoh][[:xdigit:]xXzZ_]+\\)" 1 vera-font-lock-number)
    ;; highlight filenames in #include directives
    '("^#\\s-*include\\s-*\\(<[^>\"\n]*>?\\)"
      1 font-lock-string-face)
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index eeed4c0d7c..12b7257ac2 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -2757,7 +2757,7 @@ verilog-optional-signed-range-re
    "\\s-*\\(\\<\\(reg\\|wire\\)\\>\\s-*\\)?\\(\\<\\(un\\)?signed\\>\\s-*\\)?\\(" verilog-range-re "\\)?"))
 (defconst verilog-macroexp-re "`\\sw+")
 
-(defconst verilog-delay-re "#\\s-*\\(\\([0-9_]+\\('s?[hdxbo][0-9a-fA-F_xz]+\\)?\\)\\|\\(([^()]*)\\)\\|\\(\\sw+\\)\\)")
+(defconst verilog-delay-re "#\\s-*\\(\\([0-9_]+\\('s?[hdxbo][[:xdigit:]_xz]+\\)?\\)\\|\\(([^()]*)\\)\\|\\(\\sw+\\)\\)")
 (defconst verilog-declaration-re-2-no-macro
   (concat "\\s-*" verilog-declaration-re
           "\\s-*\\(\\(" verilog-optional-signed-range-re "\\)\\|\\(" verilog-delay-re "\\)"
@@ -3287,7 +3287,7 @@ verilog-font-lock-grouping-keywords-face
                                                       'font-lock-preprocessor-face
                                                     'font-lock-type-face))
 		 ;; Fontify delays/numbers
-		 '("\\(@\\)\\|\\([ \t\n\f\r]#\\s-*\\(\\([0-9_.]+\\('s?[hdxbo][0-9a-fA-F_xz]*\\)?\\)\\|\\(([^()]+)\\|\\sw+\\)\\)\\)"
+		 '("\\(@\\)\\|\\([ \t\n\f\r]#\\s-*\\(\\([0-9_.]+\\('s?[hdxbo][[:xdigit:]_xz]*\\)?\\)\\|\\(([^()]+)\\|\\sw+\\)\\)\\)"
 		   0 font-lock-type-face append)
      ;; Fontify property/sequence cycle delays - these start with '##'
      '("\\(##\\(\\sw+\\|\\[[^]]+\\]\\)\\)"
@@ -9177,7 +9177,7 @@ verilog-read-always-signals-recurse
 	      (setq end-else-check t))
 	    (forward-char 1))
 	   ((equal keywd "'")
-	    (cond ((looking-at "'[sS]?[hdxboHDXBO]?[ \t]*[0-9a-fA-F_xzXZ?]+")
+	    (cond ((looking-at "'[sS]?[hdxboHDXBO]?[ \t]*[[:xdigit:]_xzXZ?]+")
                    (goto-char (match-end 0)))
                   ((looking-at "'{")
                    (forward-char 2)
@@ -9867,7 +9867,7 @@ verilog-is-number
   "Return true if SYMBOL is number-like."
   (or (string-match "^[0-9 \t:]+$" symbol)
       (string-match "^[---]*[0-9]+$" symbol)
-      (string-match "^[0-9 \t]+'s?[hdxbo][0-9a-fA-F_xz? \t]*$" symbol)))
+      (string-match "^[0-9 \t]+'s?[hdxbo][[:xdigit:]_xz? \t]*$" symbol)))
 
 (defun verilog-symbol-detick (symbol wing-it)
   "Return an expanded SYMBOL name without any defines.
diff --git a/lisp/textmodes/css-mode.el b/lisp/textmodes/css-mode.el
index 5d5d787945..b0653bce81 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 0c5d5e56a6..602effe9af 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 d13d8c31e8..b9e2e50d1f 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 09ec72f792..833eb8aced 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 5349de055e..96a604f982 100644
--- a/test/src/emacs-module-tests.el
+++ b/test/src/emacs-module-tests.el
@@ -60,7 +60,7 @@ mod-test-emacs
     (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.21.0





Reply sent to Eli Zaretskii <eliz <at> gnu.org>:
You have taken responsibility. (Sat, 06 Jul 2019 08:05:02 GMT) Full text and rfc822 format available.

Notification sent to Konstantin Kharlamov <hi-angel <at> yandex.ru>:
bug acknowledged by developer. (Sat, 06 Jul 2019 08:05:02 GMT) Full text and rfc822 format available.

Message #127 received at 36167-done <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Konstantin Kharlamov <Hi-Angel <at> yandex.ru>
Cc: 36167-done <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH v2] Replace manually crafted hex regexes wth
 [[:xdigit:]]
Date: Sat, 06 Jul 2019 11:04:28 +0300
> From: Konstantin Kharlamov <Hi-Angel <at> yandex.ru>
> Date: Thu, 13 Jun 2019 03:18:43 +0300
> 
> * admin/charsets/mapconv:
> * build-aux/gitlog-to-changelog (parse_amend_file) (git_dir_option):
> * lisp/progmodes/verilog-mode.el (verilog-delay-re):
>     (verilog-type-font-keywords) (verilog-read-always-signals-recurse):
>     (verilog-is-number):

Thanks, I pushed this.

The log message was mis-formatted, which required me to tediously fix
it by hand.  Please in the future format the entries using "C-x 4 a"
or similar commands, to avoid that, okay?  In particular, lines longer
than 78 characters abort "git am", so please verify this doesn't
happen in the patches you submit.  "C-x 4 a" and friends format the
entries with leading TABs which you can later remove with "C-x TAB",
and that produces the optimal results, including when the log messages
are later used to generate ChangeLog files in the release tarballs.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Mon, 08 Jul 2019 09:35:02 GMT) Full text and rfc822 format available.

Message #130 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
To: 36167 <at> debbugs.gnu.org
Cc: Eli Zaretskii <eliz <at> gnu.org>
Subject: Re: bug#36167: [PATCH v2] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Mon, 08 Jul 2019 12:34:32 +0300
> Thanks, I pushed this.
> 
> The log message was mis-formatted, which required me to tediously fix
> it by hand. Please in the future format the entries using "C-x 4 a"
> or similar commands, to avoid that, okay? In particular, lines longer
> than 78 characters abort "git am", so please verify this doesn't
> happen in the patches you submit. "C-x 4 a" and friends format the
> entries with leading TABs which you can later remove with "C-x TAB",
> and that produces the optimal results, including when the log messages
> are later used to generate ChangeLog files in the release tarballs.

Thank you! And sorry about that. I wanted to take a look this weekend 
for problems you mentioned, but haven't got time. Anyway, IIRC I have 
used "C-x 4 a" to create the commit message, but then I re-formatted it 
to look more similar to other commits I've seen. Probably I shouldn't 
have touched it…

About git-am: this is unfortunate, I think I haven't seen this problem 
because apparently "git" refuses to execute local hooks if one have set 
global hooks with "hooksPath" variable (which since recently I use to 
pre-format commit message based on modified paths, etc). I'll see what 
can be done with it.

P.S.: I replied on top level since for some reason my email client 
(Geary) refused to reply the last message directly.






Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#36167; Package emacs. (Mon, 08 Jul 2019 12:13:01 GMT) Full text and rfc822 format available.

Message #133 received at 36167 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Konstantin Kharlamov <hi-angel <at> yandex.ru>
Cc: 36167 <at> debbugs.gnu.org
Subject: Re: bug#36167: [PATCH v2] Replace manually crafted hex regexes with
 [[:xdigit:]]
Date: Mon, 08 Jul 2019 15:11:54 +0300
> Date: Mon, 08 Jul 2019 12:34:32 +0300
> From: Konstantin Kharlamov <hi-angel <at> yandex.ru>
> Cc: Eli Zaretskii <eliz <at> gnu.org>
> 
> > The log message was mis-formatted, which required me to tediously fix
> > it by hand. Please in the future format the entries using "C-x 4 a"
> > or similar commands, to avoid that, okay? In particular, lines longer
> > than 78 characters abort "git am", so please verify this doesn't
> > happen in the patches you submit. "C-x 4 a" and friends format the
> > entries with leading TABs which you can later remove with "C-x TAB",
> > and that produces the optimal results, including when the log messages
> > are later used to generate ChangeLog files in the release tarballs.
> 
> Thank you! And sorry about that.

No sweat, mistakes do happen.

> Anyway, IIRC I have used "C-x 4 a" to create the commit message, but
> then I re-formatted it to look more similar to other commits I've
> seen. Probably I shouldn't have touched it…

Yes, my recommendation is to do only "C-u -8 C-x TAB" and nothing else
to reformat the entries into commit log messages.  This just removes
the leading whitespace.  Also, I recommend to have auto-fill-mode
enabled in the buffer where you edit the log messages.

> About git-am: this is unfortunate

It isn't git-am per se, it's our hooks.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Tue, 06 Aug 2019 11:24:06 GMT) Full text and rfc822 format available.

This bug report was last modified 5 years and 145 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.