|
| 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