19 lines
755 B
Zig
19 lines
755 B
Zig
/// Caller owns the returned slice memory.
|
|
fn vigenere(allocator: Allocator, text: []const u8, key: []const u8, mode: Vigenere) Allocator.Error![]u8 {
|
|
var dynamic_string = std.ArrayList(u8).init(allocator);
|
|
var key_index: usize = 0;
|
|
for (text) |letter| {
|
|
const c = if (std.ascii.isLower(letter)) std.ascii.toUpper(letter) else letter;
|
|
if (std.ascii.isUpper(c)) {
|
|
const k = key[key_index];
|
|
const n = switch (mode) {
|
|
.encode => ((c - 'A') + (k - 'A')),
|
|
.decode => 26 + c - k,
|
|
};
|
|
try dynamic_string.append(n % 26 + 'A'); // A-Z
|
|
key_index += 1;
|
|
key_index %= key.len;
|
|
}
|
|
}
|
|
return dynamic_string.toOwnedSlice();
|
|
}
|