Mercurial > repos > tabletprog
annotate modules/json.tp @ 186:35d2cc193d99
Add string conversion inside array join so callers don't need to worry about doing string conversions themselves
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 26 Aug 2013 17:27:17 -0700 |
parents | 9d8ae39e8e67 |
children | bb4723fec05e |
rev | line source |
---|---|
154 | 1 { |
2 startArr <- "[" byte: 0 | |
3 endArr <- "]" byte: 0 | |
4 startObj <- "{" byte: 0 | |
5 endObj <- "}" byte: 0 | |
6 quote <- "\"" byte: 0 | |
7 esc <- "\\" byte: 0 | |
8 zero <- "0" byte: 0 | |
9 nine <- "9" byte: 0 | |
10 neg <- "-" byte: 0 | |
11 space <- " " byte: 0 | |
12 comma <- "," byte: 0 | |
169
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
13 period <- "." byte: 0 |
167
5a6a55592c45
Fix some JSON parser bugs
Mike Pavone <pavone@retrodev.com>
parents:
166
diff
changeset
|
14 tab <- " " byte: 0 |
166
e7642715d575
Handle newlines and carriage returns in JSON decoder
Mike Pavone <pavone@retrodev.com>
parents:
165
diff
changeset
|
15 nl <- "\n" byte: 0 |
e7642715d575
Handle newlines and carriage returns in JSON decoder
Mike Pavone <pavone@retrodev.com>
parents:
165
diff
changeset
|
16 cr <- "\r" byte: 0 |
154 | 17 colon <- ":" byte: 0 |
165
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
18 t <- "t" byte: 0 |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
19 f <- "f" byte: 0 |
154 | 20 |
21 parseNumAt <- :str :at :recvResult { | |
22 num <- 0 | |
23 l <- str length | |
24 minus <- false | |
25 aft <- -1 | |
169
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
26 ignore <- false |
154 | 27 while: { at < l } do: { |
28 b <- str byte: at | |
29 if: b = neg { | |
30 minus <- true | |
31 } else: { | |
169
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
32 if: b = period { |
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
33 ignore <- true |
154 | 34 } else: { |
169
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
35 if: b >= zero && b <= nine { |
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
36 if: (not: ignore) { |
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
37 num <- num * 10 + (str byte: at) - zero |
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
38 } |
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
39 } else: { |
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
40 aft <- at |
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
41 at <- l |
9d8ae39e8e67
Handle floating point numbers in JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
167
diff
changeset
|
42 } |
154 | 43 } |
44 } | |
45 at <- at + 1 | |
46 } | |
47 if: aft < 0 { | |
48 aft <- at | |
49 } | |
50 if: minus { | |
51 num <- 0 - num | |
52 } | |
53 #{ | |
54 value <- num | |
55 after <- aft | |
56 } | |
57 } | |
58 | |
59 parseStrAt <- :src :at :recvResult { | |
60 //TODO: Deal with escaped characters | |
61 end <- src find: "\"" startingAt: at + 1 else: { src length } | |
62 #{ | |
63 value <- src from: (at + 1) withLength: (end - at - 1) | |
64 after <- end + 1 | |
65 } | |
66 } | |
67 | |
68 _decode:at <- :text :cur { | |
69 ret <- false | |
70 b <- text byte: cur | |
71 if: b = neg || b >= zero && b <= nine { | |
72 text parseNumAt: cur | |
73 } else: { | |
74 if: b = quote { | |
75 text parseStrAt: cur | |
76 } else: { | |
77 if: b = startArr { | |
78 len <- text length | |
79 val <- #[] | |
80 cur <- cur + 1 | |
81 aft <- -1 | |
82 while: { cur < len } do: { | |
83 b <- text byte: cur | |
84 if: b = endArr { | |
85 aft <- cur + 1 | |
86 cur <- len | |
87 } else: { | |
166
e7642715d575
Handle newlines and carriage returns in JSON decoder
Mike Pavone <pavone@retrodev.com>
parents:
165
diff
changeset
|
88 if: b = comma || b = space || b = tab || b = nl || b = cr { |
154 | 89 cur <- cur + 1 |
90 } else: { | |
91 el <- _decode: text at: cur | |
92 cur <- el after | |
93 val append: (el value) | |
94 } | |
95 } | |
96 } | |
97 #{ | |
98 value <- val | |
99 after <- aft | |
100 } | |
101 } else: { | |
102 if: b = startObj { | |
103 len <- text length | |
104 val <- dict linear | |
105 cur <- cur + 1 | |
106 aft <- -1 | |
107 expectKey <- true | |
108 key <- "" | |
109 while: { cur < len } do: { | |
110 b <- text byte: cur | |
166
e7642715d575
Handle newlines and carriage returns in JSON decoder
Mike Pavone <pavone@retrodev.com>
parents:
165
diff
changeset
|
111 if: b = comma || b = space || b = tab || b = colon || b = nl || b = cr { |
154 | 112 cur <- cur + 1 |
113 } else: { | |
114 if: expectKey { | |
115 if: b = endObj { | |
116 aft <- cur + 1 | |
117 cur <- len | |
118 } else: { | |
119 kd <- _decode: text at: cur | |
120 key <- kd value | |
121 cur <- kd after | |
167
5a6a55592c45
Fix some JSON parser bugs
Mike Pavone <pavone@retrodev.com>
parents:
166
diff
changeset
|
122 |
154 | 123 expectKey <- false |
124 } | |
125 } else: { | |
126 el <- _decode: text at: cur | |
127 val set: key (el value) | |
128 cur <- el after | |
129 expectKey <- true | |
130 } | |
131 } | |
132 } | |
133 #{ | |
134 after <- aft | |
135 value <- val | |
136 } | |
137 } else: { | |
165
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
138 if: b = t && (text from: cur withLength: 4) = "true" { |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
139 #{ |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
140 value <- true |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
141 after <- cur + 4 |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
142 } |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
143 } else: { |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
144 if: b = f && (text from: cur withLength: 5) = "false" { |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
145 #{ |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
146 value <- false |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
147 after <- cur + 5 |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
148 } |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
149 } else: { |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
150 #{ |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
151 value <- "foobar" |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
152 after <- (text length) |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
153 } |
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
154 } |
154 | 155 } |
165
fe816637fcc4
Add support for parsing true and false to JSON parser
Mike Pavone <pavone@retrodev.com>
parents:
154
diff
changeset
|
156 |
154 | 157 } |
158 } | |
159 } | |
160 } | |
161 } | |
162 #{ | |
163 decode <- :text { | |
164 (_decode: text at: 0) value | |
165 } | |
166 } | |
167 } |