Skip to content

Commit 15b2cef

Browse files
committed
.
1 parent 281d92f commit 15b2cef

File tree

1 file changed

+51
-7
lines changed

1 file changed

+51
-7
lines changed

src/TextMateSharp/Internal/Parser/Json/JSONPListParser.cs

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using System.Drawing;
23
using System.IO;
4+
using System.Runtime.InteropServices.ComTypes;
35
using System.Text;
46
using System.Text.Json;
57

@@ -9,27 +11,43 @@ public class JSONPListParser<T>
911
{
1012

1113
private bool theme;
14+
private readonly JsonReaderOptions options;
1215

1316
public JSONPListParser(bool theme)
1417
{
1518
this.theme = theme;
19+
20+
this.options = new JsonReaderOptions();
21+
options.CommentHandling = JsonCommentHandling.Skip;
22+
options.AllowTrailingCommas = true;
1623
}
1724

1825
public T Parse(Stream contents)
1926
{
2027
PList<T> pList = new PList<T>(theme);
2128

22-
byte[] hmm = new byte[contents.Length];
23-
contents.Read(hmm, 0, hmm.Length);
29+
var buffer = new byte[1024];
2430

25-
JsonReaderOptions options = new JsonReaderOptions();
26-
options.CommentHandling = JsonCommentHandling.Skip;
27-
options.AllowTrailingCommas = true;
28-
var reader = new Utf8JsonReader(hmm, options);
31+
// Fill the buffer.
32+
// For this snippet, we're assuming the stream is open and has data.
33+
// If it might be closed or empty, check if the return value is 0.
34+
int size = contents.Read(buffer, 0, buffer.Length);
35+
36+
var reader = new Utf8JsonReader(buffer.AsSpan(0, size), isFinalBlock: false, state: new JsonReaderState(options));
2937

3038
while (true)
3139
{
32-
if (!reader.Read())
40+
int bytesRead = -1;
41+
42+
while (!reader.Read())
43+
{
44+
bytesRead = GetMoreBytesFromStream(contents, ref buffer, ref reader);
45+
46+
if (bytesRead == 0)
47+
break;
48+
}
49+
50+
if (bytesRead == 0)
3351
break;
3452

3553
JsonTokenType nextToken = reader.TokenType;
@@ -66,5 +84,31 @@ public T Parse(Stream contents)
6684
}
6785
return pList.GetResult();
6886
}
87+
88+
private static int GetMoreBytesFromStream(Stream stream, ref byte[] buffer, ref Utf8JsonReader reader)
89+
{
90+
int bytesRead;
91+
if (reader.BytesConsumed < buffer.Length)
92+
{
93+
ReadOnlySpan<byte> leftover = buffer.AsSpan((int)reader.BytesConsumed);
94+
95+
if (leftover.Length == buffer.Length)
96+
{
97+
Array.Resize(ref buffer, buffer.Length * 2);
98+
}
99+
100+
leftover.CopyTo(buffer);
101+
bytesRead = stream.Read(buffer, leftover.Length, buffer.Length - leftover.Length);
102+
reader = new Utf8JsonReader(buffer.AsSpan(0, bytesRead + leftover.Length), isFinalBlock: bytesRead == 0, reader.CurrentState);
103+
}
104+
else
105+
{
106+
bytesRead = stream.Read(buffer, 0, buffer.Length);
107+
reader = new Utf8JsonReader(buffer.AsSpan(0, bytesRead), isFinalBlock: bytesRead == 0, reader.CurrentState);
108+
}
109+
110+
//reader = new Utf8JsonReader(buffer, isFinalBlock: bytesRead == 0, reader.CurrentState);
111+
return bytesRead;
112+
}
69113
}
70114
}

0 commit comments

Comments
 (0)