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