X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/398d17dabad996914c58309f9e008f8141539189..b336bfcdf39f1e4d35bff4a7bd01d3b4bca8f516:/lisp/json.el diff --git a/lisp/json.el b/lisp/json.el index 3d4c02c588..6228b99f3e 100644 --- a/lisp/json.el +++ b/lisp/json.el @@ -1,6 +1,6 @@ ;;; json.el --- JavaScript Object Notation parser / generator -;; Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; Author: Edward O'Connor ;; Version: 1.2 @@ -62,12 +62,12 @@ (defvar json-object-type 'alist "Type to convert JSON objects to. -Must be one of `alist', `plist', or `hash-table'. Consider let-binding +Must be one of `alist', `plist', or `hash-table'. Consider let-binding this around your call to `json-read' instead of `setq'ing it.") (defvar json-array-type 'vector "Type to convert JSON arrays to. -Must be one of `vector' or `list'. Consider let-binding this around +Must be one of `vector' or `list'. Consider let-binding this around your call to `json-read' instead of `setq'ing it.") (defvar json-key-type nil @@ -83,19 +83,19 @@ If nil, `json-read' will guess the type based on the value of `plist' `keyword' Note that values other than `string' might behave strangely for -Sufficiently Weird keys. Consider let-binding this around your call to +Sufficiently Weird keys. Consider let-binding this around your call to `json-read' instead of `setq'ing it.") (defvar json-false :json-false "Value to use when reading JSON `false'. If this has the same value as `json-null', you might not be able to tell -the difference between `false' and `null'. Consider let-binding this +the difference between `false' and `null'. Consider let-binding this around your call to `json-read' instead of `setq'ing it.") (defvar json-null nil "Value to use when reading JSON `null'. If this has the same value as `json-false', you might not be able to -tell the difference between `false' and `null'. Consider let-binding +tell the difference between `false' and `null'. Consider let-binding this around your call to `json-read' instead of `setq'ing it.") @@ -123,11 +123,7 @@ this around your call to `json-read' instead of `setq'ing it.") (defsubst json-advance (&optional n) "Skip past the following N characters." - (unless n (setq n 1)) - (let ((goal (+ (point) n))) - (goto-char goal) - (when (< (point) goal) - (signal 'end-of-file nil)))) + (forward-char n)) (defsubst json-peek () "Return the character at point." @@ -144,8 +140,7 @@ this around your call to `json-read' instead of `setq'ing it.") (defun json-skip-whitespace () "Skip past the whitespace at point." - (while (looking-at "[\t\r\n\f\b ]") - (goto-char (match-end 0)))) + (skip-chars-forward "\t\r\n\f\b ")) @@ -221,19 +216,27 @@ KEYWORD is the keyword expected." ;; 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 +473,7 @@ become JSON objects." (?\" 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.")