comparison modules/json.tp @ 377:93c28eee141e default tip

Merge
author Michael Pavone <pavone@retrodev.com>
date Sat, 15 Aug 2015 22:45:33 -0700
parents e2c1309ab750
children
comparison
equal deleted inserted replaced
376:d61b1f0e1936 377:93c28eee141e
16 cr <- "\r" byte: 0 16 cr <- "\r" byte: 0
17 colon <- ":" byte: 0 17 colon <- ":" byte: 0
18 t <- "t" byte: 0 18 t <- "t" byte: 0
19 f <- "f" byte: 0 19 f <- "f" byte: 0
20 20
21 parseNumAt <- :str :at :recvResult { 21 parseNumAt <- :str at {
22 num <- 0 22 num <- 0
23 l <- str length 23 l <- str length
24 minus <- false 24 minus <- false
25 aft <- -1 25 aft <- -1
26 ignore <- false 26 ignore <- false
54 value <- num 54 value <- num
55 after <- aft 55 after <- aft
56 } 56 }
57 } 57 }
58 58
59 parseStrAt <- :src :at :recvResult { 59 parseStrAt <- :src at {
60 //TODO: Deal with escaped characters 60 //TODO: Deal with unicode escapes
61 end <- src find: "\"" startingAt: at + 1 else: { src length } 61 bslash <- "\\" byte: 0
62 quote <- "\"" byte: 0
63 escapes <- dict hash
64 escapes set: bslash "\\"
65 escapes set: quote "\""
66 escapes set: ("n" byte: 0) "\n"
67 escapes set: ("t" byte: 0) "\t"
68 escapes set: ("r" byte: 0) "\r"
69 i <- at + 1
70 chunks <- #[]
71 start <- i
72 continue <- true
73 while: { continue && i < (src byte_length) } do: {
74 b <- src byte: i
75 if: b = bslash {
76 if: i > start {
77 chunks append: (src from: start withLength: i-start)
78 }
79 if: i + 1 < (src byte_length) {
80 i <- i + 1
81 b <- src byte: i
82 start <- i + 1
83 escapes ifget: b :v {
84 chunks append: v
85 } else: {
86 //not a recognized escape, just copy it raw
87 chunks append: (src from: i-1 withLength: 2)
88 }
89 }
90 } else: {
91 if: b = quote {
92 if: i > start {
93 chunks append: (src from: start withLength: i-start)
94 }
95 continue <- false
96 }
97 }
98 i <- i + 1
99 }
62 #{ 100 #{
63 value <- src from: (at + 1) withLength: (end - at - 1) 101 value <- chunks join: ""
64 after <- end + 1 102 after <- i
65 } 103 }
66 } 104 }
67 105
68 _decode:at <- :text :cur { 106 _decode:at <- :text :cur {
69 ret <- false 107 ret <- false
70 b <- text byte: cur 108 b <- text byte: cur
71 if: b = neg || b >= zero && b <= nine { 109 if: b = neg || b >= zero && b <= nine {
72 text parseNumAt: cur 110 parseNumAt: text cur
73 } else: { 111 } else: {
74 if: b = quote { 112 if: b = quote {
75 text parseStrAt: cur 113 parseStrAt: text cur
76 } else: { 114 } else: {
77 if: b = startArr { 115 if: b = startArr {
78 len <- text length 116 len <- text length
79 val <- #[] 117 val <- #[]
80 cur <- cur + 1 118 cur <- cur + 1
99 after <- aft 137 after <- aft
100 } 138 }
101 } else: { 139 } else: {
102 if: b = startObj { 140 if: b = startObj {
103 len <- text length 141 len <- text length
104 val <- dict linear 142 val <- dict hash
105 cur <- cur + 1 143 cur <- cur + 1
106 aft <- -1 144 aft <- -1
107 expectKey <- true 145 expectKey <- true
108 key <- "" 146 key <- ""
109 while: { cur < len } do: { 147 while: { cur < len } do: {