Subject: bug#16834: 24.3.50; num3-mode detects long hex numbers as decimal

From: Stefan Monnier <[email-masked]>
Date: Fri, 21 Feb 2014 13:05:56 -0500

> When dealing with large hex numbers the default regex of num3-mode can
> detect them as decimals.  For example given:
> V28   : 00000000000000000007fc0000000000 vs 0000000000000000000bfc000000000
> the follow is high-lighted
> V28   : __xxx___xxx___xxx_____x___xxx___ vs _xxx___xxx___xxx_________xxx___
> which is obviously wrong.

I guess we could use the patch below.  Michal, what do you think?

> It wouldn't hurt to have customisable faces as well as the default can
> look quite harsh depending on the theme.

Hmmm... they are, AFAICT (faces num3-face-odd and num3-face-even).

        Stefan

diff --git a/packages/num3-mode/num3-mode.el b/packages/num3-mode/num3-mode.el
index b890c89..ae3289a 100644
--- a/packages/num3-mode/num3-mode.el
+++ b/packages/num3-mode/num3-mode.el
@@ -1,6 +1,6 @@
 ;;; num3-mode.el --- highlight groups of digits in long numbers  -*- lexical-binding: t -*-
 
-;; Copyright (C) 2012 Free Software Foundation, Inc.
+;; Copyright (C) 2012, 2014 Free Software Foundation, Inc.
 
 ;; Author: Felix Lee <[email-masked]>, Michal Nazarewicz <[email-masked]>
 ;; Maintainer: Michal Nazarewicz <[email-masked]>
@@ -98,7 +98,10 @@ where) decimal point (would be) is."
 (define-globalized-minor-mode global-num3-mode num3-mode num3-mode)
 
 (defconst num3--number-re
-  (concat    "\\(?:0[xX]\\|#\\)\\([0-9a-fA-F]+\\)"  ; 1 = hexadecimal
+  ;; Recognize "0x" and "#x" as prefixes announcing hexadecimal (from C and
+  ;; Elisp, respectively).
+  (concat    "[0#][xX]\\([[:xdigit:]]+\\)"  ; 1 = hexadecimal
+          "\\|\\(?1:[[:xdigit:]]*[a-fA-F][[:xdigit:]]*\\)" ; 1 = hexadecimal
           "\\|\\([0-9]+\\)"                         ; 2 = decimal
           "\\|\\.\\([0-9]+\\)"))                    ; 3 = fraction