Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 9 additions & 14 deletions src/json.zig
Original file line number Diff line number Diff line change
Expand Up @@ -179,22 +179,17 @@ pub fn loadJsonArray(
max_rows: ?usize,
stderr_writer: *std.Io.Writer,
) usize {
// Read all input into a buffer
var buf: std.ArrayList(u8) = .empty;
defer buf.deinit(allocator);
// Loop invariant I: buf contains all bytes read from reader so far
// Bounding function: bytes remaining in reader (finite input)
while (true) {
const byte = reader.takeByte() catch |err| switch (err) {
error.EndOfStream => break,
error.ReadFailed => fatal("failed to read JSON input", stderr_writer, .csv_error, .{}),
};
buf.append(allocator, byte) catch fatal("out of memory reading JSON input", stderr_writer, .csv_error, .{});
}
// Read all input into a buffer using block reads instead of byte-by-byte takeByte()
const buf = reader.allocRemaining(allocator, .unlimited) catch |err| switch (err) {
error.OutOfMemory => fatal("out of memory reading JSON input", stderr_writer, .csv_error, .{}),
error.ReadFailed => fatal("failed to read JSON input", stderr_writer, .csv_error, .{}),
error.StreamTooLong => unreachable, // .unlimited never triggers this
};
defer allocator.free(buf);

if (buf.items.len == 0) fatal("empty input", stderr_writer, .csv_error, .{});
if (buf.len == 0) fatal("empty input", stderr_writer, .csv_error, .{});

var parsed = std.json.parseFromSlice(std.json.Value, allocator, buf.items, .{}) catch
var parsed = std.json.parseFromSlice(std.json.Value, allocator, buf, .{}) catch
fatal("failed to parse JSON input", stderr_writer, .csv_error, .{});
defer parsed.deinit();

Expand Down
57 changes: 24 additions & 33 deletions src/xml.zig
Original file line number Diff line number Diff line change
Expand Up @@ -694,18 +694,15 @@ pub fn getXmlColumnNames(
xml_row: ?[]const u8,
stderr_writer: *std.Io.Writer,
) [][]const u8 {
var buf: std.ArrayList(u8) = .empty;
defer buf.deinit(allocator);
while (true) {
const byte = reader.takeByte() catch |err| switch (err) {
error.EndOfStream => break,
error.ReadFailed => fatal("failed to read XML input", stderr_writer, .csv_error, .{}),
};
buf.append(allocator, byte) catch fatal("out of memory reading XML", stderr_writer, .csv_error, .{});
}
if (buf.items.len == 0) fatal("empty input", stderr_writer, .csv_error, .{});
const buf = reader.allocRemaining(allocator, .unlimited) catch |err| switch (err) {
error.OutOfMemory => fatal("out of memory reading XML", stderr_writer, .csv_error, .{}),
error.ReadFailed => fatal("failed to read XML input", stderr_writer, .csv_error, .{}),
error.StreamTooLong => unreachable, // .unlimited never triggers this
};
defer allocator.free(buf);
if (buf.len == 0) fatal("empty input", stderr_writer, .csv_error, .{});

var p = XmlParser.init(buf.items);
var p = XmlParser.init(buf);
p.skipPrologue(stderr_writer);
const root_name: []const u8 = if (xml_root) |r| blk: {
p.navigateToRoot(r, stderr_writer);
Expand Down Expand Up @@ -758,18 +755,15 @@ pub fn summarizeXml(
xml_row: ?[]const u8,
stderr_writer: *std.Io.Writer,
) XmlSummary {
var buf: std.ArrayList(u8) = .empty;
defer buf.deinit(allocator);
while (true) {
const byte = reader.takeByte() catch |err| switch (err) {
error.EndOfStream => break,
error.ReadFailed => fatal("failed to read XML input", stderr_writer, .csv_error, .{}),
};
buf.append(allocator, byte) catch fatal("out of memory reading XML", stderr_writer, .csv_error, .{});
}
if (buf.items.len == 0) fatal("empty input", stderr_writer, .csv_error, .{});
const buf = reader.allocRemaining(allocator, .unlimited) catch |err| switch (err) {
error.OutOfMemory => fatal("out of memory reading XML", stderr_writer, .csv_error, .{}),
error.ReadFailed => fatal("failed to read XML input", stderr_writer, .csv_error, .{}),
error.StreamTooLong => unreachable, // .unlimited never triggers this
};
defer allocator.free(buf);
if (buf.len == 0) fatal("empty input", stderr_writer, .csv_error, .{});

var p = XmlParser.init(buf.items);
var p = XmlParser.init(buf);
p.skipPrologue(stderr_writer);
const root_name: []const u8 = if (xml_root) |r| blk: {
p.navigateToRoot(r, stderr_writer);
Expand Down Expand Up @@ -831,18 +825,15 @@ pub fn loadXmlInput(
max_rows: ?usize,
stderr_writer: *std.Io.Writer,
) usize {
var buf: std.ArrayList(u8) = .empty;
defer buf.deinit(allocator);
while (true) {
const byte = reader.takeByte() catch |err| switch (err) {
error.EndOfStream => break,
error.ReadFailed => fatal("failed to read XML input", stderr_writer, .csv_error, .{}),
};
buf.append(allocator, byte) catch fatal("out of memory reading XML input", stderr_writer, .csv_error, .{});
}
if (buf.items.len == 0) fatal("empty input", stderr_writer, .csv_error, .{});
const buf = reader.allocRemaining(allocator, .unlimited) catch |err| switch (err) {
error.OutOfMemory => fatal("out of memory reading XML input", stderr_writer, .csv_error, .{}),
error.ReadFailed => fatal("failed to read XML input", stderr_writer, .csv_error, .{}),
error.StreamTooLong => unreachable, // .unlimited never triggers this
};
defer allocator.free(buf);
if (buf.len == 0) fatal("empty input", stderr_writer, .csv_error, .{});

var p = XmlParser.init(buf.items);
var p = XmlParser.init(buf);
p.skipPrologue(stderr_writer);
const root_name: []const u8 = if (xml_root) |r| blk: {
p.navigateToRoot(r, stderr_writer);
Expand Down
Loading