-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.zig
74 lines (59 loc) · 2 KB
/
main.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
const std = @import("std");
const Allocator = std.mem.Allocator;
const Encoder = @import("encode.zig");
const Decoder = @import("decode.zig");
const HuffmanError = error{InvalidArgs} || Decoder.DecodeError;
pub fn main() !void {
const start = std.time.milliTimestamp();
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena.deinit();
const allocator = arena.allocator();
const args = try std.process.argsAlloc(allocator);
defer std.process.argsFree(allocator, args);
if (args.len < 2) {
return HuffmanError.InvalidArgs;
}
const Op = enum { encode, decode };
const op: Op = std.meta.stringToEnum(Op, args[1]) orelse {
return HuffmanError.InvalidArgs;
};
const input_path: ?[]u8 = if (args.len > 2) args[2] else null;
const file = if (input_path == null or std.mem.eql(u8, input_path.?, "-"))
std.io.getStdIn()
else
try std.fs.cwd().openFile(input_path.?, .{});
defer file.close();
const stdout = std.io.getStdOut();
defer stdout.close();
switch (op) {
.encode => try encode(allocator, file, stdout),
.decode => try decode(allocator, file, stdout),
}
const end = std.time.milliTimestamp();
const duration = end - start;
std.debug.print("Execution time: {} ms\n", .{duration});
}
fn encode(
allocator: Allocator,
file: std.fs.File,
stdout: std.fs.File,
) !void {
const input = try file.readToEndAlloc(allocator, 1e9);
defer allocator.free(input);
var encoder = Encoder.init(allocator, input);
var encoded = try encoder.encode();
defer encoded.deinit();
try stdout.writeAll(encoded.bytes.items);
}
fn decode(
allocator: Allocator,
file: std.fs.File,
stdout: std.fs.File,
) !void {
const input = try file.readToEndAlloc(allocator, 1e9);
defer allocator.free(input);
var decoder = Decoder.init(allocator, input);
var bytes = try decoder.decode();
defer bytes.deinit();
try stdout.writeAll(bytes.items);
}