62 lines
2.2 KiB
Plaintext
62 lines
2.2 KiB
Plaintext
#!/usr/local/bin/spar
|
|
pragma annotate( summary, "caesar" )
|
|
@( description, "Implement a Caesar cipher, both encoding and ")
|
|
@( description, "decoding. The key is an integer from 1 to " )
|
|
@( description, "25. This cipher rotates (either towards left ")
|
|
@( description, "or right) the letters of the alphabet (A to " )
|
|
@( description, "Z). " )
|
|
@( see_also, "http://rosettacode.org/wiki/Caesar_cipher" )
|
|
@( author, "Ken O. Burtch" );
|
|
pragma license( unrestricted );
|
|
|
|
pragma restriction( no_external_commands );
|
|
|
|
procedure caesar is
|
|
|
|
type cipher_value is new natural;
|
|
|
|
function to_cipher_value(c: character; offset: character) return cipher_value is
|
|
cv : integer;
|
|
begin
|
|
cv := ( numerics.pos(c)-numerics.pos(offset) ) mod 26;
|
|
return cipher_value(cv);
|
|
end to_cipher_value;
|
|
|
|
function to_character(cv: cipher_value; offset: character) return character is
|
|
begin
|
|
return strings.val( integer(cv) + numerics.pos(offset) );
|
|
end to_character;
|
|
|
|
function encrypt( plain: string; key: cipher_value) return string is
|
|
cv : cipher_value;
|
|
cipher_char : character;
|
|
cipher_text : string;
|
|
plain_char : character;
|
|
begin
|
|
for i in 1..strings.length( plain ) loop
|
|
plain_char := strings.element( plain, i);
|
|
if plain_char >= 'A' and plain_char <= 'Z' then
|
|
cv := ( to_cipher_value( plain_char, 'A')+key ) mod 26;
|
|
cipher_char := to_character( cv, 'A' );
|
|
elsif plain_char >= 'a' and plain_char <= 'z' then
|
|
cv := ( to_cipher_value( plain_char, 'a')+key ) mod 26;
|
|
cipher_char := to_character( cv, 'a' );
|
|
else
|
|
cipher_char := plain_char;
|
|
end if;
|
|
cipher_text := strings.overwrite( @, i, string( cipher_char ) );
|
|
end loop;
|
|
return cipher_text;
|
|
end encrypt;
|
|
|
|
text: string := get_line;
|
|
key: constant cipher_value := 3; -- Default key from "Commentarii de Bello Gallico"
|
|
|
|
begin
|
|
put_line("Plaintext ------------>" & text);
|
|
text := encrypt(text, key);
|
|
put_line("Ciphertext ----------->" & text);
|
|
text := encrypt(text, -key);
|
|
put_line("Decrypted Ciphertext ->" & text);
|
|
end caesar;
|