From 4539380159e6ed1cd79418bd34e28ebf0485a510 Mon Sep 17 00:00:00 2001 From: Juanma Barranquero Date: Thu, 20 Mar 2014 19:22:17 +0100 Subject: [PATCH] lisp/progmodes/hideif.el (hif-tokenize): Understand non-decimal floats. --- lisp/ChangeLog | 3 +++ lisp/progmodes/hideif.el | 17 +++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 51d5de2f3be..30e76c013b7 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2014-03-20 Juanma Barranquero + * progmodes/hideif.el (hif-string-to-number): New function. + (hif-tokenize): Use it to understand non-decimal floats. + * emacs-lisp/cl-extra.el (cl--map-overlays): Remove obsolete code. * skeleton.el (skeleton-autowrap): Mark as obsolete. Doc fix. diff --git a/lisp/progmodes/hideif.el b/lisp/progmodes/hideif.el index 39ad676f593..bcb46592465 100644 --- a/lisp/progmodes/hideif.el +++ b/lisp/progmodes/hideif.el @@ -407,6 +407,14 @@ that form should be displayed.") (defconst hif-string-literal-regexp "\\(\"\\(?:[^\"\\]\\|\\\\.\\)*\"\\)") +(defun hif-string-to-number (string &optional base) + "Like `string-to-number', but it understands non-decimal floats." + (if (or (not base) (= base 10)) + (string-to-number string base) + (let* ((parts (split-string string "\\." t "[ \t]+")) + (frac (cadr parts)) + (quot (expt (* base 1.0) (length frac)))) + (/ (string-to-number (concat (car parts) frac) base) quot)))) (defun hif-tokenize (start end) "Separate string between START and END into a list of tokens." @@ -433,15 +441,12 @@ that form should be displayed.") ;; TODO: ;; 1. postfix 'l', 'll', 'ul' and 'ull' ;; 2. floating number formats - ;; 3. hexadecimal/octal floats - ;; 4. 098 is interpreted as octal conversion error - ;; FIXME: string-to-number does not convert hex floats + ;; 3. 098 is interpreted as octal conversion error (if (string-match "0x\\([0-9a-fA-F]+\\.?[0-9a-fA-F]*\\)" token) - (string-to-number (match-string 1 token) 16)) ;; hex - ;; FIXME: string-to-number does not convert octal floats + (hif-string-to-number (match-string 1 token) 16)) ;; hex (if (string-match "\\`0[0-9]+\\(\\.[0-9]+\\)?\\'" token) - (string-to-number token 8)) ;; octal + (hif-string-to-number token 8)) ;; octal (if (string-match "\\`[1-9][0-9]*\\(\\.[0-9]+\\)?\\'" token) (string-to-number token)) ;; decimal -- 2.39.5