Skip to content

Commit

Permalink
whitespace, indenting & ; vs. ;; fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
danlarkin committed Nov 1, 2009
1 parent 19761e9 commit 5253caf
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 48 deletions.
6 changes: 3 additions & 3 deletions src/org/danlarkin/json.clj
Expand Up @@ -78,9 +78,9 @@
"Takes a java.io.Reader pointing to JSON-encoded data and
returns a clojure datastructure."
[reader]
; Unless we're already dealing with a BufferedReader, wrap the supplied reader in one
; (this ensures we have a consistent interface supporting mark/reset regardless which
; subclass of Reader we were passed). For now, we'll use the default buffer length.
;; Unless we're already dealing with a BufferedReader, wrap the supplied reader in one
;; (this ensures we have a consistent interface supporting mark/reset regardless which
;; subclass of Reader we were passed). For now, we'll use the default buffer length.
(if (isa? reader BufferedReader)
(decoder/decode-from-buffered-reader reader)
(decoder/decode-from-buffered-reader (BufferedReader. reader))))
Expand Down
62 changes: 31 additions & 31 deletions src/org/danlarkin/json/decoder.clj
Expand Up @@ -65,7 +65,7 @@
[#^BufferedReader b-reader match-fn]
(loop [s ""]
(let [_ (.mark b-reader 1)
codepoint (.read b-reader)]
codepoint (.read b-reader)]
(cond
(= codepoint -1) s
(match-fn codepoint) (recur (str s (char codepoint)))
Expand All @@ -82,39 +82,39 @@
[#^BufferedReader b-reader]
(loop [object {}]
(let [_ (.mark b-reader 1)
codepoint (.read b-reader)]
codepoint (.read b-reader)]
(cond
(= codepoint 0x7D) object ; }
(= codepoint 0x2C) (recur object)
(json-ws? codepoint) (let [_ (eat-whitespace b-reader)] (recur object))
:else (let [_ (.reset b-reader)
_ (eat-whitespace b-reader)
key (decode-value b-reader)
_ (eat-whitespace b-reader)
name-sep (.read b-reader) ; should be : (0x3A)
_ (eat-whitespace b-reader)
value (decode-value b-reader)
_ (eat-whitespace b-reader)]
(when-not (= name-sep 0x3A)
(throw (Exception. "Error parsing object: colon not where expected.")))
(recur (assoc object (keyword key) value)))))))
_ (eat-whitespace b-reader)
key (decode-value b-reader)
_ (eat-whitespace b-reader)
name-sep (.read b-reader) ; should be : (0x3A)
_ (eat-whitespace b-reader)
value (decode-value b-reader)
_ (eat-whitespace b-reader)]
(when-not (= name-sep 0x3A)
(throw (Exception. "Error parsing object: colon not where expected.")))
(recur (assoc object (keyword key) value)))))))

(defn- decode-array
"Decodes a JSON array and returns a vector."
[#^BufferedReader b-reader]
(loop [array []]
(let [_ (.mark b-reader 1)
codepoint (.read b-reader)]
codepoint (.read b-reader)]
(cond
(= codepoint 0x5D) array
(= codepoint 0x2C) (recur array)
; next case handles empty array with whitespace between [ and ]
;; next case handles empty array with whitespace between [ and ]
(json-ws? codepoint) (let [_ (eat-whitespace b-reader)] (recur array))
:else (let [_ (.reset b-reader)
_ (eat-whitespace b-reader)
value (decode-value b-reader)
_ (eat-whitespace b-reader)]
(recur (conj array value)))))))
_ (eat-whitespace b-reader)
value (decode-value b-reader)
_ (eat-whitespace b-reader)]
(recur (conj array value)))))))

(def unescape-map
#^{:private true}
Expand All @@ -132,15 +132,15 @@
it."
[#^BufferedReader b-reader]
(let [codepoint (.read b-reader)
map-value (unescape-map codepoint)]
map-value (unescape-map codepoint)]
(cond
map-value map-value
(= codepoint 0x75)
(read-string (str
"\\u"
(apply str (take 4 (map
#(char (.read #^BufferedReader %))
(repeat b-reader)))))))))
"\\u"
(apply str (take 4 (map
#(char (.read #^BufferedReader %))
(repeat b-reader)))))))))

(defn- decode-string
"Decodes a JSON string and returns it. NOTE: strings are terminated by a double-quote
Expand All @@ -159,22 +159,22 @@
match the expectation. Otherwise, the supplied constant value is returned."
[#^BufferedReader b-reader #^String expected value]
(let [exp-len (count expected)
got (loop [s "" br b-reader len exp-len]
(if (> len 0)
(recur (str s (char (.read br))) br (dec len))
s))]
got (loop [s "" br b-reader len exp-len]
(if (> len 0)
(recur (str s (char (.read br))) br (dec len))
s))]
(if (= got expected)
value
(throw (Exception. (str
"Unexpected constant remainder: " got
" expected: " expected))))))
"Unexpected constant remainder: " got
" expected: " expected))))))

(defn- decode-number
"Decodes a number and returns it. NOTE: first character of the number has already
read so the first thing we need to do is reset the BufferedReader."
[#^BufferedReader b-reader]
(let [_ (.reset b-reader)
number-str (read-matching b-reader number-char?)]
number-str (read-matching b-reader number-char?)]
(convert-number (read-string number-str))))

(defn- decode-value
Expand All @@ -183,7 +183,7 @@
[#^BufferedReader b-reader]
(let [_ (.mark b-reader 1)
int-char (.read b-reader)
char (char int-char)]
char (char int-char)]
(cond
(= char \{) (decode-object b-reader)
(= char \[) (decode-array b-reader)
Expand Down
12 changes: 6 additions & 6 deletions src/org/danlarkin/json/encoder.clj
Expand Up @@ -74,8 +74,8 @@
[#^clojure.lang.MapEntry pair #^Writer writer
#^String pad #^String current-indent #^Integer indent-size]
(let [next-indent (get-next-indent current-indent indent-size)
k (key pair)
ke (if (integer? k) (str k) k)]
k (key pair)
ke (if (integer? k) (str k) k)]
(encode-helper ke writer pad current-indent indent-size)
(.append writer ":")
(encode-helper (val pair) writer pad "" indent-size next-indent)))
Expand All @@ -101,7 +101,7 @@
\u000C "\\f"
\u000D "\\r"
\u0022 "\\\""
\u005C "\\\\"
\u005C "\\\\"
})

(defn- escaped-char
Expand All @@ -125,8 +125,8 @@
(apply str (map escaped-char string)))

(defmulti encode-custom
;Multimethod for encoding classes of objects that
;aren't handled by the default encode-helper.
;; Multimethod for encoding classes of objects that
;; aren't handled by the default encode-helper.
(fn [value & _] (type value)))

(defmethod
Expand All @@ -147,7 +147,7 @@
(string? value) (.append writer (str current-indent \" (escaped-str value) \"))
(number? value) (.append writer (str current-indent value))
(keyword? value) (.append writer
(str current-indent \" (escaped-str (subs (str value) 1)) \"))
(str current-indent \" (escaped-str (subs (str value) 1)) \"))
(symbol? value) (encode-symbol value writer pad)
(map-entry? value) (encode-map-entry value writer pad current-indent indent-size)
(coll? value) (encode-coll value writer pad next-indent current-indent indent-size)
Expand Down
16 changes: 8 additions & 8 deletions test/test.clj
Expand Up @@ -2,7 +2,7 @@
(:require (org.danlarkin [json :as json]))
(:use (clojure test)))

;setup JSON encoder-decoder checker test
;; setup JSON encoder-decoder checker test
(defmethod assert-expr :json=
[msg form]
`(let [values# (list ~@(next form))
Expand Down Expand Up @@ -103,19 +103,19 @@
(deftest string-escaping
(is (:json= {:key "\""}))
(is (= (json/encode-to-str "\"") "\"\\\"\"")) ; single double-quote gets escaped
; make sure hash-map keys get string-escaped when encoding:
;; make sure hash-map keys get string-escaped when encoding:
(is (= (json/encode-to-str {(keyword "/\\\"") 42}) "{\"/\\\\\\\"\":42}"))
(is (= (json/encode-to-str "\u009f\u0078\u0004\u003e\u001e\u0080\u0000")
"\"\u009f\u0078\\u0004\u003e\\u001E\u0080\\u0000\""))
"\"\u009f\u0078\\u0004\u003e\\u001E\u0080\\u0000\""))
(let [long-str (str "\u0000\u0007\u0008\u0009\u000A\u000B\u000C\u000D\u000E"
"\u001F\u0020\u0021\u0022\u0023\u005B\u005C\u005D\u2222")
encoded-long-str (str "\"\\u0000\\u0007\\b\\t\\n\\u000B\\f\\r\\u000E\\u001F"
" !\\\"#\u005B\\\\\u005D\u2222\"")]
encoded-long-str (str "\"\\u0000\\u0007\\b\\t\\n\\u000B\\f\\r\\u000E\\u001F"
" !\\\"#\u005B\\\\\u005D\u2222\"")]
(is (= (json/encode-to-str long-str) encoded-long-str))
(is (= (json/decode-from-str encoded-long-str) long-str))
; now run long-str through a round-trip test
;; now run long-str through a round-trip test
(is (:json= long-str))
; don't loop infinitely if input has an unterminated string:
;; don't loop infinitely if input has an unterminated string:
(is (thrown? Exception (json/decode-from-str "\"\\\\\\\"")))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;
Expand All @@ -128,7 +128,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; All-in-one ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;
; from http://www.json.org/JSON_checker/test/pass1.json
;; from http://www.json.org/JSON_checker/test/pass1.json
(deftest pass1
(let [string (slurp "test/pass1.json")
decoded-json (json/decode-from-str string)
Expand Down

0 comments on commit 5253caf

Please sign in to comment.