dependabot-hex 0.94.1 → 0.94.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- metadata +4 -19
- data/helpers/deps/jason/.fetch +0 -0
- data/helpers/deps/jason/.hex +0 -2
- data/helpers/deps/jason/CHANGELOG.md +0 -60
- data/helpers/deps/jason/LICENSE +0 -13
- data/helpers/deps/jason/README.md +0 -179
- data/helpers/deps/jason/hex_metadata.config +0 -20
- data/helpers/deps/jason/lib/codegen.ex +0 -158
- data/helpers/deps/jason/lib/decoder.ex +0 -657
- data/helpers/deps/jason/lib/encode.ex +0 -630
- data/helpers/deps/jason/lib/encoder.ex +0 -216
- data/helpers/deps/jason/lib/formatter.ex +0 -253
- data/helpers/deps/jason/lib/fragment.ex +0 -11
- data/helpers/deps/jason/lib/helpers.ex +0 -90
- data/helpers/deps/jason/lib/jason.ex +0 -228
- data/helpers/deps/jason/mix.exs +0 -92
@@ -1,657 +0,0 @@
|
|
1
|
-
defmodule Jason.DecodeError do
|
2
|
-
@type t :: %__MODULE__{position: integer, data: String.t}
|
3
|
-
|
4
|
-
defexception [:position, :token, :data]
|
5
|
-
|
6
|
-
def message(%{position: position, token: token}) when is_binary(token) do
|
7
|
-
"unexpected sequence at position #{position}: #{inspect token}"
|
8
|
-
end
|
9
|
-
def message(%{position: position, data: data}) when position == byte_size(data) do
|
10
|
-
"unexpected end of input at position #{position}"
|
11
|
-
end
|
12
|
-
def message(%{position: position, data: data}) do
|
13
|
-
byte = :binary.at(data, position)
|
14
|
-
str = <<byte>>
|
15
|
-
if String.printable?(str) do
|
16
|
-
"unexpected byte at position #{position}: " <>
|
17
|
-
"#{inspect byte, base: :hex} ('#{str}')"
|
18
|
-
else
|
19
|
-
"unexpected byte at position #{position}: " <>
|
20
|
-
"#{inspect byte, base: :hex}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
defmodule Jason.Decoder do
|
26
|
-
@moduledoc false
|
27
|
-
|
28
|
-
import Bitwise
|
29
|
-
|
30
|
-
alias Jason.{DecodeError, Codegen}
|
31
|
-
|
32
|
-
import Codegen, only: [bytecase: 2, bytecase: 3]
|
33
|
-
|
34
|
-
# @compile :native
|
35
|
-
|
36
|
-
# We use integers instead of atoms to take advantage of the jump table
|
37
|
-
# optimization
|
38
|
-
@terminate 0
|
39
|
-
@array 1
|
40
|
-
@key 2
|
41
|
-
@object 3
|
42
|
-
|
43
|
-
def parse(data, opts) when is_binary(data) do
|
44
|
-
key_decode = key_decode_function(opts)
|
45
|
-
string_decode = string_decode_function(opts)
|
46
|
-
try do
|
47
|
-
value(data, data, 0, [@terminate], key_decode, string_decode)
|
48
|
-
catch
|
49
|
-
{:position, position} ->
|
50
|
-
{:error, %DecodeError{position: position, data: data}}
|
51
|
-
{:token, token, position} ->
|
52
|
-
{:error, %DecodeError{token: token, position: position, data: data}}
|
53
|
-
else
|
54
|
-
value ->
|
55
|
-
{:ok, value}
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
defp key_decode_function(%{keys: :atoms}), do: &String.to_atom/1
|
60
|
-
defp key_decode_function(%{keys: :atoms!}), do: &String.to_existing_atom/1
|
61
|
-
defp key_decode_function(%{keys: :strings}), do: &(&1)
|
62
|
-
defp key_decode_function(%{keys: fun}) when is_function(fun, 1), do: fun
|
63
|
-
|
64
|
-
defp string_decode_function(%{strings: :copy}), do: &:binary.copy/1
|
65
|
-
defp string_decode_function(%{strings: :reference}), do: &(&1)
|
66
|
-
|
67
|
-
defp value(data, original, skip, stack, key_decode, string_decode) do
|
68
|
-
bytecase data do
|
69
|
-
_ in '\s\n\t\r', rest ->
|
70
|
-
value(rest, original, skip + 1, stack, key_decode, string_decode)
|
71
|
-
_ in '0', rest ->
|
72
|
-
number_zero(rest, original, skip, stack, key_decode, string_decode, 1)
|
73
|
-
_ in '123456789', rest ->
|
74
|
-
number(rest, original, skip, stack, key_decode, string_decode, 1)
|
75
|
-
_ in '-', rest ->
|
76
|
-
number_minus(rest, original, skip, stack, key_decode, string_decode)
|
77
|
-
_ in '"', rest ->
|
78
|
-
string(rest, original, skip + 1, stack, key_decode, string_decode, 0)
|
79
|
-
_ in '[', rest ->
|
80
|
-
array(rest, original, skip + 1, stack, key_decode, string_decode)
|
81
|
-
_ in '{', rest ->
|
82
|
-
object(rest, original, skip + 1, stack, key_decode, string_decode)
|
83
|
-
_ in ']', rest ->
|
84
|
-
empty_array(rest, original, skip + 1, stack, key_decode, string_decode)
|
85
|
-
_ in 't', rest ->
|
86
|
-
case rest do
|
87
|
-
<<"rue", rest::bits>> ->
|
88
|
-
continue(rest, original, skip + 4, stack, key_decode, string_decode, true)
|
89
|
-
<<_::bits>> ->
|
90
|
-
error(original, skip)
|
91
|
-
end
|
92
|
-
_ in 'f', rest ->
|
93
|
-
case rest do
|
94
|
-
<<"alse", rest::bits>> ->
|
95
|
-
continue(rest, original, skip + 5, stack, key_decode, string_decode, false)
|
96
|
-
<<_::bits>> ->
|
97
|
-
error(original, skip)
|
98
|
-
end
|
99
|
-
_ in 'n', rest ->
|
100
|
-
case rest do
|
101
|
-
<<"ull", rest::bits>> ->
|
102
|
-
continue(rest, original, skip + 4, stack, key_decode, string_decode, nil)
|
103
|
-
<<_::bits>> ->
|
104
|
-
error(original, skip)
|
105
|
-
end
|
106
|
-
_, rest ->
|
107
|
-
error(rest, original, skip + 1, stack, key_decode, string_decode)
|
108
|
-
<<_::bits>> ->
|
109
|
-
error(original, skip)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
defp number_minus(<<?0, rest::bits>>, original, skip, stack, key_decode, string_decode) do
|
114
|
-
number_zero(rest, original, skip, stack, key_decode, string_decode, 2)
|
115
|
-
end
|
116
|
-
defp number_minus(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode)
|
117
|
-
when byte in '123456789' do
|
118
|
-
number(rest, original, skip, stack, key_decode, string_decode, 2)
|
119
|
-
end
|
120
|
-
defp number_minus(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode) do
|
121
|
-
error(original, skip + 1)
|
122
|
-
end
|
123
|
-
|
124
|
-
defp number(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, len)
|
125
|
-
when byte in '0123456789' do
|
126
|
-
number(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
127
|
-
end
|
128
|
-
defp number(<<?., rest::bits>>, original, skip, stack, key_decode, string_decode, len) do
|
129
|
-
number_frac(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
130
|
-
end
|
131
|
-
defp number(<<e, rest::bits>>, original, skip, stack, key_decode, string_decode, len) when e in 'eE' do
|
132
|
-
prefix = binary_part(original, skip, len)
|
133
|
-
number_exp_copy(rest, original, skip + len + 1, stack, key_decode, string_decode, prefix)
|
134
|
-
end
|
135
|
-
defp number(<<rest::bits>>, original, skip, stack, key_decode, string_decode, len) do
|
136
|
-
int = String.to_integer(binary_part(original, skip, len))
|
137
|
-
continue(rest, original, skip + len, stack, key_decode, string_decode, int)
|
138
|
-
end
|
139
|
-
|
140
|
-
defp number_frac(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, len)
|
141
|
-
when byte in '0123456789' do
|
142
|
-
number_frac_cont(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
143
|
-
end
|
144
|
-
defp number_frac(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode, len) do
|
145
|
-
error(original, skip + len)
|
146
|
-
end
|
147
|
-
|
148
|
-
defp number_frac_cont(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, len)
|
149
|
-
when byte in '0123456789' do
|
150
|
-
number_frac_cont(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
151
|
-
end
|
152
|
-
defp number_frac_cont(<<e, rest::bits>>, original, skip, stack, key_decode, string_decode, len)
|
153
|
-
when e in 'eE' do
|
154
|
-
number_exp(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
155
|
-
end
|
156
|
-
defp number_frac_cont(<<rest::bits>>, original, skip, stack, key_decode, string_decode, len) do
|
157
|
-
token = binary_part(original, skip, len)
|
158
|
-
float = try_parse_float(token, token, skip)
|
159
|
-
continue(rest, original, skip + len, stack, key_decode, string_decode, float)
|
160
|
-
end
|
161
|
-
|
162
|
-
defp number_exp(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, len)
|
163
|
-
when byte in '0123456789' do
|
164
|
-
number_exp_cont(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
165
|
-
end
|
166
|
-
defp number_exp(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, len)
|
167
|
-
when byte in '+-' do
|
168
|
-
number_exp_sign(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
169
|
-
end
|
170
|
-
defp number_exp(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode, len) do
|
171
|
-
error(original, skip + len)
|
172
|
-
end
|
173
|
-
|
174
|
-
defp number_exp_sign(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, len)
|
175
|
-
when byte in '0123456789' do
|
176
|
-
number_exp_cont(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
177
|
-
end
|
178
|
-
defp number_exp_sign(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode, len) do
|
179
|
-
error(original, skip + len)
|
180
|
-
end
|
181
|
-
|
182
|
-
defp number_exp_cont(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, len)
|
183
|
-
when byte in '0123456789' do
|
184
|
-
number_exp_cont(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
185
|
-
end
|
186
|
-
defp number_exp_cont(<<rest::bits>>, original, skip, stack, key_decode, string_decode, len) do
|
187
|
-
token = binary_part(original, skip, len)
|
188
|
-
float = try_parse_float(token, token, skip)
|
189
|
-
continue(rest, original, skip + len, stack, key_decode, string_decode, float)
|
190
|
-
end
|
191
|
-
|
192
|
-
defp number_exp_copy(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, prefix)
|
193
|
-
when byte in '0123456789' do
|
194
|
-
number_exp_cont(rest, original, skip, stack, key_decode, string_decode, prefix, 1)
|
195
|
-
end
|
196
|
-
defp number_exp_copy(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, prefix)
|
197
|
-
when byte in '+-' do
|
198
|
-
number_exp_sign(rest, original, skip, stack, key_decode, string_decode, prefix, 1)
|
199
|
-
end
|
200
|
-
defp number_exp_copy(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode, _prefix) do
|
201
|
-
error(original, skip)
|
202
|
-
end
|
203
|
-
|
204
|
-
defp number_exp_sign(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, prefix, len)
|
205
|
-
when byte in '0123456789' do
|
206
|
-
number_exp_cont(rest, original, skip, stack, key_decode, string_decode, prefix, len + 1)
|
207
|
-
end
|
208
|
-
defp number_exp_sign(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode, _prefix, len) do
|
209
|
-
error(original, skip + len)
|
210
|
-
end
|
211
|
-
|
212
|
-
defp number_exp_cont(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, prefix, len)
|
213
|
-
when byte in '0123456789' do
|
214
|
-
number_exp_cont(rest, original, skip, stack, key_decode, string_decode, prefix, len + 1)
|
215
|
-
end
|
216
|
-
defp number_exp_cont(<<rest::bits>>, original, skip, stack, key_decode, string_decode, prefix, len) do
|
217
|
-
suffix = binary_part(original, skip, len)
|
218
|
-
string = prefix <> ".0e" <> suffix
|
219
|
-
prefix_size = byte_size(prefix)
|
220
|
-
initial_skip = skip - prefix_size - 1
|
221
|
-
final_skip = skip + len
|
222
|
-
token = binary_part(original, initial_skip, prefix_size + len + 1)
|
223
|
-
float = try_parse_float(string, token, initial_skip)
|
224
|
-
continue(rest, original, final_skip, stack, key_decode, string_decode, float)
|
225
|
-
end
|
226
|
-
|
227
|
-
defp number_zero(<<?., rest::bits>>, original, skip, stack, key_decode, string_decode, len) do
|
228
|
-
number_frac(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
229
|
-
end
|
230
|
-
defp number_zero(<<e, rest::bits>>, original, skip, stack, key_decode, string_decode, len) when e in 'eE' do
|
231
|
-
number_exp_copy(rest, original, skip + len + 1, stack, key_decode, string_decode, "0")
|
232
|
-
end
|
233
|
-
defp number_zero(<<rest::bits>>, original, skip, stack, key_decode, string_decode, len) do
|
234
|
-
continue(rest, original, skip + len, stack, key_decode, string_decode, 0)
|
235
|
-
end
|
236
|
-
|
237
|
-
@compile {:inline, array: 6}
|
238
|
-
|
239
|
-
defp array(rest, original, skip, stack, key_decode, string_decode) do
|
240
|
-
value(rest, original, skip, [@array, [] | stack], key_decode, string_decode)
|
241
|
-
end
|
242
|
-
|
243
|
-
defp empty_array(<<rest::bits>>, original, skip, stack, key_decode, string_decode) do
|
244
|
-
case stack do
|
245
|
-
[@array, [] | stack] ->
|
246
|
-
continue(rest, original, skip, stack, key_decode, string_decode, [])
|
247
|
-
_ ->
|
248
|
-
error(original, skip - 1)
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
defp array(data, original, skip, stack, key_decode, string_decode, value) do
|
253
|
-
bytecase data do
|
254
|
-
_ in '\s\n\t\r', rest ->
|
255
|
-
array(rest, original, skip + 1, stack, key_decode, string_decode, value)
|
256
|
-
_ in ']', rest ->
|
257
|
-
[acc | stack] = stack
|
258
|
-
value = :lists.reverse(acc, [value])
|
259
|
-
continue(rest, original, skip + 1, stack, key_decode, string_decode, value)
|
260
|
-
_ in ',', rest ->
|
261
|
-
[acc | stack] = stack
|
262
|
-
value(rest, original, skip + 1, [@array, [value | acc] | stack], key_decode, string_decode)
|
263
|
-
_, _rest ->
|
264
|
-
error(original, skip)
|
265
|
-
<<_::bits>> ->
|
266
|
-
empty_error(original, skip)
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
@compile {:inline, object: 6}
|
271
|
-
|
272
|
-
defp object(rest, original, skip, stack, key_decode, string_decode) do
|
273
|
-
key(rest, original, skip, [[] | stack], key_decode, string_decode)
|
274
|
-
end
|
275
|
-
|
276
|
-
defp object(data, original, skip, stack, key_decode, string_decode, value) do
|
277
|
-
bytecase data do
|
278
|
-
_ in '\s\n\t\r', rest ->
|
279
|
-
object(rest, original, skip + 1, stack, key_decode, string_decode, value)
|
280
|
-
_ in '}', rest ->
|
281
|
-
skip = skip + 1
|
282
|
-
[key, acc | stack] = stack
|
283
|
-
final = [{key_decode.(key), value} | acc]
|
284
|
-
continue(rest, original, skip, stack, key_decode, string_decode, :maps.from_list(final))
|
285
|
-
_ in ',', rest ->
|
286
|
-
skip = skip + 1
|
287
|
-
[key, acc | stack] = stack
|
288
|
-
acc = [{key_decode.(key), value} | acc]
|
289
|
-
key(rest, original, skip, [acc | stack], key_decode, string_decode)
|
290
|
-
_, _rest ->
|
291
|
-
error(original, skip)
|
292
|
-
<<_::bits>> ->
|
293
|
-
empty_error(original, skip)
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
defp key(data, original, skip, stack, key_decode, string_decode) do
|
298
|
-
bytecase data do
|
299
|
-
_ in '\s\n\t\r', rest ->
|
300
|
-
key(rest, original, skip + 1, stack, key_decode, string_decode)
|
301
|
-
_ in '}', rest ->
|
302
|
-
case stack do
|
303
|
-
[[] | stack] ->
|
304
|
-
continue(rest, original, skip + 1, stack, key_decode, string_decode, %{})
|
305
|
-
_ ->
|
306
|
-
error(original, skip)
|
307
|
-
end
|
308
|
-
_ in '"', rest ->
|
309
|
-
string(rest, original, skip + 1, [@key | stack], key_decode, string_decode, 0)
|
310
|
-
_, _rest ->
|
311
|
-
error(original, skip)
|
312
|
-
<<_::bits>> ->
|
313
|
-
empty_error(original, skip)
|
314
|
-
end
|
315
|
-
end
|
316
|
-
|
317
|
-
defp key(data, original, skip, stack, key_decode, string_decode, value) do
|
318
|
-
bytecase data do
|
319
|
-
_ in '\s\n\t\r', rest ->
|
320
|
-
key(rest, original, skip + 1, stack, key_decode, string_decode, value)
|
321
|
-
_ in ':', rest ->
|
322
|
-
value(rest, original, skip + 1, [@object, value | stack], key_decode, string_decode)
|
323
|
-
_, _rest ->
|
324
|
-
error(original, skip)
|
325
|
-
<<_::bits>> ->
|
326
|
-
empty_error(original, skip)
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
# TODO: check if this approach would be faster:
|
331
|
-
# https://git.ninenines.eu/cowlib.git/tree/src/cow_ws.erl#n469
|
332
|
-
# http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
|
333
|
-
defp string(data, original, skip, stack, key_decode, string_decode, len) do
|
334
|
-
bytecase data, 128 do
|
335
|
-
_ in '"', rest ->
|
336
|
-
string = string_decode.(binary_part(original, skip, len))
|
337
|
-
continue(rest, original, skip + len + 1, stack, key_decode, string_decode, string)
|
338
|
-
_ in '\\', rest ->
|
339
|
-
part = binary_part(original, skip, len)
|
340
|
-
escape(rest, original, skip + len, stack, key_decode, string_decode, part)
|
341
|
-
_ in unquote(0x00..0x1F), _rest ->
|
342
|
-
error(original, skip)
|
343
|
-
_, rest ->
|
344
|
-
string(rest, original, skip, stack, key_decode, string_decode, len + 1)
|
345
|
-
<<char::utf8, rest::bits>> when char <= 0x7FF ->
|
346
|
-
string(rest, original, skip, stack, key_decode, string_decode, len + 2)
|
347
|
-
<<char::utf8, rest::bits>> when char <= 0xFFFF ->
|
348
|
-
string(rest, original, skip, stack, key_decode, string_decode, len + 3)
|
349
|
-
<<_char::utf8, rest::bits>> ->
|
350
|
-
string(rest, original, skip, stack, key_decode, string_decode, len + 4)
|
351
|
-
<<_::bits>> ->
|
352
|
-
empty_error(original, skip + len)
|
353
|
-
end
|
354
|
-
end
|
355
|
-
|
356
|
-
defp string(data, original, skip, stack, key_decode, string_decode, acc, len) do
|
357
|
-
bytecase data, 128 do
|
358
|
-
_ in '"', rest ->
|
359
|
-
last = binary_part(original, skip, len)
|
360
|
-
string = IO.iodata_to_binary([acc | last])
|
361
|
-
continue(rest, original, skip + len + 1, stack, key_decode, string_decode, string)
|
362
|
-
_ in '\\', rest ->
|
363
|
-
part = binary_part(original, skip, len)
|
364
|
-
escape(rest, original, skip + len, stack, key_decode, string_decode, [acc | part])
|
365
|
-
_ in unquote(0x00..0x1F), _rest ->
|
366
|
-
error(original, skip)
|
367
|
-
_, rest ->
|
368
|
-
string(rest, original, skip, stack, key_decode, string_decode, acc, len + 1)
|
369
|
-
<<char::utf8, rest::bits>> when char <= 0x7FF ->
|
370
|
-
string(rest, original, skip, stack, key_decode, string_decode, acc, len + 2)
|
371
|
-
<<char::utf8, rest::bits>> when char <= 0xFFFF ->
|
372
|
-
string(rest, original, skip, stack, key_decode, string_decode, acc, len + 3)
|
373
|
-
<<_char::utf8, rest::bits>> ->
|
374
|
-
string(rest, original, skip, stack, key_decode, string_decode, acc, len + 4)
|
375
|
-
<<_::bits>> ->
|
376
|
-
empty_error(original, skip + len)
|
377
|
-
end
|
378
|
-
end
|
379
|
-
|
380
|
-
defp escape(data, original, skip, stack, key_decode, string_decode, acc) do
|
381
|
-
bytecase data do
|
382
|
-
_ in 'b', rest ->
|
383
|
-
string(rest, original, skip + 2, stack, key_decode, string_decode, [acc | '\b'], 0)
|
384
|
-
_ in 't', rest ->
|
385
|
-
string(rest, original, skip + 2, stack, key_decode, string_decode, [acc | '\t'], 0)
|
386
|
-
_ in 'n', rest ->
|
387
|
-
string(rest, original, skip + 2, stack, key_decode, string_decode, [acc | '\n'], 0)
|
388
|
-
_ in 'f', rest ->
|
389
|
-
string(rest, original, skip + 2, stack, key_decode, string_decode, [acc | '\f'], 0)
|
390
|
-
_ in 'r', rest ->
|
391
|
-
string(rest, original, skip + 2, stack, key_decode, string_decode, [acc | '\r'], 0)
|
392
|
-
_ in '"', rest ->
|
393
|
-
string(rest, original, skip + 2, stack, key_decode, string_decode, [acc | '\"'], 0)
|
394
|
-
_ in '/', rest ->
|
395
|
-
string(rest, original, skip + 2, stack, key_decode, string_decode, [acc | '/'], 0)
|
396
|
-
_ in '\\', rest ->
|
397
|
-
string(rest, original, skip + 2, stack, key_decode, string_decode, [acc | '\\'], 0)
|
398
|
-
_ in 'u', rest ->
|
399
|
-
escapeu(rest, original, skip, stack, key_decode, string_decode, acc)
|
400
|
-
_, _rest ->
|
401
|
-
error(original, skip + 1)
|
402
|
-
<<_::bits>> ->
|
403
|
-
empty_error(original, skip)
|
404
|
-
end
|
405
|
-
end
|
406
|
-
|
407
|
-
defmodule Unescape do
|
408
|
-
@moduledoc false
|
409
|
-
|
410
|
-
import Bitwise
|
411
|
-
|
412
|
-
@digits Enum.concat([?0..?9, ?A..?F, ?a..?f])
|
413
|
-
|
414
|
-
def unicode_escapes(chars1 \\ @digits, chars2 \\ @digits) do
|
415
|
-
for char1 <- chars1, char2 <- chars2 do
|
416
|
-
{(char1 <<< 8) + char2, integer8(char1, char2)}
|
417
|
-
end
|
418
|
-
end
|
419
|
-
|
420
|
-
defp integer8(char1, char2) do
|
421
|
-
(integer4(char1) <<< 4) + integer4(char2)
|
422
|
-
end
|
423
|
-
|
424
|
-
defp integer4(char) when char in ?0..?9, do: char - ?0
|
425
|
-
defp integer4(char) when char in ?A..?F, do: char - ?A + 10
|
426
|
-
defp integer4(char) when char in ?a..?f, do: char - ?a + 10
|
427
|
-
|
428
|
-
defp token_error_clause(original, skip, len) do
|
429
|
-
quote do
|
430
|
-
_ ->
|
431
|
-
token_error(unquote_splicing([original, skip, len]))
|
432
|
-
end
|
433
|
-
end
|
434
|
-
|
435
|
-
defmacro escapeu_first(int, last, rest, original, skip, stack, key_decode, string_decode, acc) do
|
436
|
-
clauses = escapeu_first_clauses(last, rest, original, skip, stack, key_decode, string_decode, acc)
|
437
|
-
quote location: :keep do
|
438
|
-
case unquote(int) do
|
439
|
-
unquote(clauses ++ token_error_clause(original, skip, 6))
|
440
|
-
end
|
441
|
-
end
|
442
|
-
end
|
443
|
-
|
444
|
-
defp escapeu_first_clauses(last, rest, original, skip, stack, key_decode, string_decode, acc) do
|
445
|
-
for {int, first} <- unicode_escapes(),
|
446
|
-
not (first in 0xDC..0xDF) do
|
447
|
-
escapeu_first_clause(int, first, last, rest, original, skip, stack, key_decode, string_decode, acc)
|
448
|
-
end
|
449
|
-
end
|
450
|
-
|
451
|
-
defp escapeu_first_clause(int, first, last, rest, original, skip, stack, key_decode, string_decode, acc)
|
452
|
-
when first in 0xD8..0xDB do
|
453
|
-
hi =
|
454
|
-
quote bind_quoted: [first: first, last: last] do
|
455
|
-
0x10000 + ((((first &&& 0x03) <<< 8) + last) <<< 10)
|
456
|
-
end
|
457
|
-
args = [rest, original, skip, stack, key_decode, string_decode, acc, hi]
|
458
|
-
[clause] =
|
459
|
-
quote location: :keep do
|
460
|
-
unquote(int) -> escape_surrogate(unquote_splicing(args))
|
461
|
-
end
|
462
|
-
clause
|
463
|
-
end
|
464
|
-
|
465
|
-
defp escapeu_first_clause(int, first, last, rest, original, skip, stack, key_decode, string_decode, acc)
|
466
|
-
when first <= 0x00 do
|
467
|
-
skip = quote do: (unquote(skip) + 6)
|
468
|
-
acc =
|
469
|
-
quote bind_quoted: [acc: acc, first: first, last: last] do
|
470
|
-
if last <= 0x7F do
|
471
|
-
# 0?????
|
472
|
-
[acc, last]
|
473
|
-
else
|
474
|
-
# 110xxxx?? 10?????
|
475
|
-
byte1 = ((0b110 <<< 5) + (first <<< 2)) + (last >>> 6)
|
476
|
-
byte2 = (0b10 <<< 6) + (last &&& 0b111111)
|
477
|
-
[acc, byte1, byte2]
|
478
|
-
end
|
479
|
-
end
|
480
|
-
args = [rest, original, skip, stack, key_decode, string_decode, acc, 0]
|
481
|
-
[clause] =
|
482
|
-
quote location: :keep do
|
483
|
-
unquote(int) -> string(unquote_splicing(args))
|
484
|
-
end
|
485
|
-
clause
|
486
|
-
end
|
487
|
-
|
488
|
-
defp escapeu_first_clause(int, first, last, rest, original, skip, stack, key_decode, string_decode, acc)
|
489
|
-
when first <= 0x07 do
|
490
|
-
skip = quote do: (unquote(skip) + 6)
|
491
|
-
acc =
|
492
|
-
quote bind_quoted: [acc: acc, first: first, last: last] do
|
493
|
-
# 110xxx?? 10??????
|
494
|
-
byte1 = ((0b110 <<< 5) + (first <<< 2)) + (last >>> 6)
|
495
|
-
byte2 = (0b10 <<< 6) + (last &&& 0b111111)
|
496
|
-
[acc, byte1, byte2]
|
497
|
-
end
|
498
|
-
args = [rest, original, skip, stack, key_decode, string_decode, acc, 0]
|
499
|
-
[clause] =
|
500
|
-
quote location: :keep do
|
501
|
-
unquote(int) -> string(unquote_splicing(args))
|
502
|
-
end
|
503
|
-
clause
|
504
|
-
end
|
505
|
-
|
506
|
-
defp escapeu_first_clause(int, first, last, rest, original, skip, stack, key_decode, string_decode, acc)
|
507
|
-
when first <= 0xFF do
|
508
|
-
skip = quote do: (unquote(skip) + 6)
|
509
|
-
acc =
|
510
|
-
quote bind_quoted: [acc: acc, first: first, last: last] do
|
511
|
-
# 1110xxxx 10xxxx?? 10??????
|
512
|
-
byte1 = (0b1110 <<< 4) + (first >>> 4)
|
513
|
-
byte2 = ((0b10 <<< 6) + ((first &&& 0b1111) <<< 2)) + (last >>> 6)
|
514
|
-
byte3 = (0b10 <<< 6) + (last &&& 0b111111)
|
515
|
-
[acc, byte1, byte2, byte3]
|
516
|
-
end
|
517
|
-
args = [rest, original, skip, stack, key_decode, string_decode, acc, 0]
|
518
|
-
[clause] =
|
519
|
-
quote location: :keep do
|
520
|
-
unquote(int) -> string(unquote_splicing(args))
|
521
|
-
end
|
522
|
-
clause
|
523
|
-
end
|
524
|
-
|
525
|
-
defmacro escapeu_last(int, original, skip) do
|
526
|
-
clauses = escapeu_last_clauses()
|
527
|
-
quote location: :keep do
|
528
|
-
case unquote(int) do
|
529
|
-
unquote(clauses ++ token_error_clause(original, skip, 6))
|
530
|
-
end
|
531
|
-
end
|
532
|
-
end
|
533
|
-
|
534
|
-
defp escapeu_last_clauses() do
|
535
|
-
for {int, last} <- unicode_escapes() do
|
536
|
-
[clause] =
|
537
|
-
quote do
|
538
|
-
unquote(int) -> unquote(last)
|
539
|
-
end
|
540
|
-
clause
|
541
|
-
end
|
542
|
-
end
|
543
|
-
|
544
|
-
defmacro escapeu_surrogate(int, last, rest, original, skip, stack, key_decode, string_decode, acc,
|
545
|
-
hi) do
|
546
|
-
clauses = escapeu_surrogate_clauses(last, rest, original, skip, stack, key_decode, string_decode, acc, hi)
|
547
|
-
quote location: :keep do
|
548
|
-
case unquote(int) do
|
549
|
-
unquote(clauses ++ token_error_clause(original, skip, 12))
|
550
|
-
end
|
551
|
-
end
|
552
|
-
end
|
553
|
-
|
554
|
-
defp escapeu_surrogate_clauses(last, rest, original, skip, stack, key_decode, string_decode, acc, hi) do
|
555
|
-
digits1 = 'Dd'
|
556
|
-
digits2 = Stream.concat([?C..?F, ?c..?f])
|
557
|
-
for {int, first} <- unicode_escapes(digits1, digits2) do
|
558
|
-
escapeu_surrogate_clause(int, first, last, rest, original, skip, stack, key_decode, string_decode, acc, hi)
|
559
|
-
end
|
560
|
-
end
|
561
|
-
|
562
|
-
defp escapeu_surrogate_clause(int, first, last, rest, original, skip, stack, key_decode, string_decode, acc, hi) do
|
563
|
-
skip = quote do: unquote(skip) + 12
|
564
|
-
acc =
|
565
|
-
quote bind_quoted: [acc: acc, first: first, last: last, hi: hi] do
|
566
|
-
lo = ((first &&& 0x03) <<< 8) + last
|
567
|
-
[acc | <<(hi + lo)::utf8>>]
|
568
|
-
end
|
569
|
-
args = [rest, original, skip, stack, key_decode, string_decode, acc, 0]
|
570
|
-
[clause] =
|
571
|
-
quote do
|
572
|
-
unquote(int) ->
|
573
|
-
string(unquote_splicing(args))
|
574
|
-
end
|
575
|
-
clause
|
576
|
-
end
|
577
|
-
end
|
578
|
-
|
579
|
-
defp escapeu(<<int1::16, int2::16, rest::bits>>, original, skip, stack, key_decode, string_decode, acc) do
|
580
|
-
require Unescape
|
581
|
-
last = escapeu_last(int2, original, skip)
|
582
|
-
Unescape.escapeu_first(int1, last, rest, original, skip, stack, key_decode, string_decode, acc)
|
583
|
-
end
|
584
|
-
defp escapeu(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode, _acc) do
|
585
|
-
empty_error(original, skip)
|
586
|
-
end
|
587
|
-
|
588
|
-
# @compile {:inline, escapeu_last: 3}
|
589
|
-
|
590
|
-
defp escapeu_last(int, original, skip) do
|
591
|
-
require Unescape
|
592
|
-
Unescape.escapeu_last(int, original, skip)
|
593
|
-
end
|
594
|
-
|
595
|
-
defp escape_surrogate(<<?\\, ?u, int1::16, int2::16, rest::bits>>, original,
|
596
|
-
skip, stack, key_decode, string_decode, acc, hi) do
|
597
|
-
require Unescape
|
598
|
-
last = escapeu_last(int2, original, skip + 6)
|
599
|
-
Unescape.escapeu_surrogate(int1, last, rest, original, skip, stack, key_decode, string_decode, acc, hi)
|
600
|
-
end
|
601
|
-
defp escape_surrogate(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode, _acc, _hi) do
|
602
|
-
error(original, skip + 6)
|
603
|
-
end
|
604
|
-
|
605
|
-
defp try_parse_float(string, token, skip) do
|
606
|
-
:erlang.binary_to_float(string)
|
607
|
-
catch
|
608
|
-
:error, :badarg ->
|
609
|
-
token_error(token, skip)
|
610
|
-
end
|
611
|
-
|
612
|
-
defp error(<<_rest::bits>>, _original, skip, _stack, _key_decode, _string_decode) do
|
613
|
-
throw {:position, skip - 1}
|
614
|
-
end
|
615
|
-
|
616
|
-
defp empty_error(_original, skip) do
|
617
|
-
throw {:position, skip}
|
618
|
-
end
|
619
|
-
|
620
|
-
@compile {:inline, error: 2, token_error: 2, token_error: 3}
|
621
|
-
defp error(_original, skip) do
|
622
|
-
throw {:position, skip}
|
623
|
-
end
|
624
|
-
|
625
|
-
defp token_error(token, position) do
|
626
|
-
throw {:token, token, position}
|
627
|
-
end
|
628
|
-
|
629
|
-
defp token_error(token, position, len) do
|
630
|
-
throw {:token, binary_part(token, position, len), position}
|
631
|
-
end
|
632
|
-
|
633
|
-
@compile {:inline, continue: 7}
|
634
|
-
defp continue(rest, original, skip, stack, key_decode, string_decode, value) do
|
635
|
-
case stack do
|
636
|
-
[@terminate | stack] ->
|
637
|
-
terminate(rest, original, skip, stack, key_decode, string_decode, value)
|
638
|
-
[@array | stack] ->
|
639
|
-
array(rest, original, skip, stack, key_decode, string_decode, value)
|
640
|
-
[@key | stack] ->
|
641
|
-
key(rest, original, skip, stack, key_decode, string_decode, value)
|
642
|
-
[@object | stack] ->
|
643
|
-
object(rest, original, skip, stack, key_decode, string_decode, value)
|
644
|
-
end
|
645
|
-
end
|
646
|
-
|
647
|
-
defp terminate(<<byte, rest::bits>>, original, skip, stack, key_decode, string_decode, value)
|
648
|
-
when byte in '\s\n\r\t' do
|
649
|
-
terminate(rest, original, skip + 1, stack, key_decode, string_decode, value)
|
650
|
-
end
|
651
|
-
defp terminate(<<>>, _original, _skip, _stack, _key_decode, _string_decode, value) do
|
652
|
-
value
|
653
|
-
end
|
654
|
-
defp terminate(<<_rest::bits>>, original, skip, _stack, _key_decode, _string_decode, _value) do
|
655
|
-
error(original, skip)
|
656
|
-
end
|
657
|
-
end
|