]> git.eshelyaron.com Git - emacs.git/commitdiff
lisp/progmodes/hideif.el (hif-tokenize): Understand non-decimal floats.
authorJuanma Barranquero <lekktu@gmail.com>
Thu, 20 Mar 2014 18:22:17 +0000 (19:22 +0100)
committerJuanma Barranquero <lekktu@gmail.com>
Thu, 20 Mar 2014 18:22:17 +0000 (19:22 +0100)
lisp/ChangeLog
lisp/progmodes/hideif.el

index 51d5de2f3be6692adce792c059fb43ca076abb2f..30e76c013b7d4b2e22183d36c57d0daaf2a9661d 100644 (file)
@@ -1,5 +1,8 @@
 2014-03-20  Juanma Barranquero  <lekktu@gmail.com>
 
+       * 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.
index 39ad676f5932f94f60d9578c811cf9997043326f..bcb465924656450800f55b770091cfae1c16001e 100644 (file)
@@ -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