# HG changeset patch # User Chong Yidong # Date 1219954757 0 # Node ID 5d474cdb19f8a6b45175e09e870865e7dcb61c6d # Parent dda5f1fcccc90b581a329e31ecdd050afd2cf22e (json-read-number): New arg. Handle explicitly signed numbers. (json-readtable): Add `+' and `.'. diff -r dda5f1fcccc9 -r 5d474cdb19f8 lisp/json.el --- a/lisp/json.el Thu Aug 28 20:18:56 2008 +0000 +++ b/lisp/json.el Thu Aug 28 20:19:17 2008 +0000 @@ -221,19 +221,27 @@ ;; Number parsing -(defun json-read-number () - "Read the JSON number following point. +(defun json-read-number (&optional sign) + "Read the JSON number following point. +The optional SIGN argument is for internal use. + N.B.: Only numbers which can fit in Emacs Lisp's native number representation will be parsed correctly." - (if (char-equal (json-peek) ?-) - (progn - (json-advance) - (- 0 (json-read-number))) - (if (looking-at "[0-9]+\\([.][0-9]+\\)?\\([eE][+-]?[0-9]+\\)?") - (progn + ;; If SIGN is non-nil, the number is explicitly signed. + (let ((number-regexp + "\\([0-9]+\\)?\\(\\.[0-9]+\\)?\\([Ee][+-]?[0-9]+\\)?")) + (cond ((and (null sign) (char-equal (json-peek) ?-)) + (json-advance) + (- (json-read-number t))) + ((and (null sign) (char-equal (json-peek) ?+)) + (json-advance) + (json-read-number t)) + ((and (looking-at number-regexp) + (or (match-beginning 1) + (match-beginning 2))) (goto-char (match-end 0)) (string-to-number (match-string 0))) - (signal 'json-number-format (list (point)))))) + (t (signal 'json-number-format (list (point))))))) ;; Number encoding @@ -470,7 +478,7 @@ (?\" json-read-string)))) (mapc (lambda (char) (push (list char 'json-read-number) table)) - '(?- ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9)) + '(?- ?+ ?. ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9)) table) "Readtable for JSON reader.")