Skip to content

Commit 3d201d7

Browse files
authored
Add Base64 Encode Decode in Zig (#4578)
1 parent 95de913 commit 3d201d7

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
const std = @import("std");
2+
const decoder = std.base64.standard.Decoder;
3+
const encoder = std.base64.standard.Encoder;
4+
const process = std.process;
5+
6+
const stdout = std.io.getStdOut().writer();
7+
8+
fn die() !void {
9+
try stdout.writeAll("Usage: please provide a mode and a string to encode/decode\n");
10+
process.exit(1);
11+
}
12+
13+
pub fn main() !void {
14+
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
15+
defer _ = gpa.deinit();
16+
const allocator = gpa.allocator();
17+
18+
var args = process.args();
19+
20+
_ = args.next();
21+
const mode_opt = args.next();
22+
const src_opt = args.next();
23+
24+
if (mode_opt == null or src_opt == null) {
25+
try die();
26+
}
27+
28+
const mode = mode_opt.?;
29+
const src = src_opt.?;
30+
31+
if (src.len == 0) {
32+
try die();
33+
}
34+
35+
if (std.mem.eql(u8, mode, "encode")) {
36+
const buffer = try allocator.alloc(u8, encoder.calcSize(src.len));
37+
defer allocator.free(buffer);
38+
39+
_ = encoder.encode(buffer, src);
40+
try stdout.writeAll(buffer);
41+
_ = try stdout.write("\n");
42+
} else if (std.mem.eql(u8, mode, "decode")) {
43+
errdefer {
44+
die() catch unreachable;
45+
}
46+
const buflen = try decoder.calcSizeForSlice(src);
47+
48+
const buffer = try allocator.alloc(u8, buflen);
49+
defer allocator.free(buffer);
50+
51+
decoder.decode(buffer, src) catch {
52+
try die();
53+
};
54+
55+
try stdout.writeAll(buffer);
56+
_ = try stdout.write("\n");
57+
} else {
58+
try die();
59+
}
60+
}

0 commit comments

Comments
 (0)