55 lines
1.3 KiB
Ada
55 lines
1.3 KiB
Ada
with Ada.Text_IO;
|
|
|
|
procedure Cusip_Test is
|
|
use Ada.Text_IO;
|
|
|
|
subtype Cusip is String (1 .. 9);
|
|
|
|
function Check_Cusip (Code : Cusip) return Boolean is
|
|
Sum : Integer := 0;
|
|
V : Integer;
|
|
|
|
begin
|
|
for I in Code'First .. Code'Last - 1 loop
|
|
case Code (I) is
|
|
when '0' .. '9' =>
|
|
V := Character'Pos (Code (I)) - Character'Pos ('0');
|
|
when 'A' .. 'Z' =>
|
|
V := Character'Pos (Code (I)) - Character'Pos ('A') + 10;
|
|
when '*' => V := 36;
|
|
when '@' => V := 37;
|
|
when '#' => V := 38;
|
|
when others => return False;
|
|
end case;
|
|
|
|
if I mod 2 = 0 then
|
|
V := V * 2;
|
|
end if;
|
|
|
|
Sum := Sum + V / 10 + (V mod 10);
|
|
end loop;
|
|
|
|
return (10 - (Sum mod 10)) mod 10 =
|
|
Character'Pos (Code (Code'Last)) - Character'Pos ('0');
|
|
end Check_Cusip;
|
|
|
|
type Cusip_Array is array (Natural range <>) of Cusip;
|
|
|
|
Test_Array : Cusip_Array :=
|
|
("037833100",
|
|
"17275R102",
|
|
"38259P508",
|
|
"594918104",
|
|
"68389X106",
|
|
"68389X105");
|
|
begin
|
|
for I in Test_Array'Range loop
|
|
Put (Test_Array (I) & ": ");
|
|
if Check_Cusip (Test_Array (I)) then
|
|
Put_Line ("valid");
|
|
else
|
|
Put_Line ("not valid");
|
|
end if;
|
|
end loop;
|
|
end Cusip_Test;
|