package body Characters_and_Numbers is
function Convert ( c : character ) return natural is
-- DESCRIPTION :
-- Returns 10 if the character does not represent a number
-- between 0 and 9, otherwise returns the corresponding number.
begin
case c is
when '0' => return 0;
when '1' => return 1;
when '2' => return 2;
when '3' => return 3;
when '4' => return 4;
when '5' => return 5;
when '6' => return 6;
when '7' => return 7;
when '8' => return 8;
when '9' => return 9;
when others => return 10;
end case;
end Convert;
function Convert_Decimal ( n : natural ) return character is
-- DESCRIPTION :
-- For n in 0..9, the corresponding character representation is returned.
begin
case n is
when 0 => return '0';
when 1 => return '1';
when 2 => return '2';
when 3 => return '3';
when 4 => return '4';
when 5 => return '5';
when 6 => return '6';
when 7 => return '7';
when 8 => return '8';
when 9 => return '9';
when others => return '0';
end case;
end Convert_Decimal;
function Convert_Hexadecimal ( c : character ) return natural is
begin
case c is
when '0' => return 0;
when '1' => return 1;
when '2' => return 2;
when '3' => return 3;
when '4' => return 4;
when '5' => return 5;
when '6' => return 6;
when '7' => return 7;
when '8' => return 8;
when '9' => return 9;
when 'A' => return 10;
when 'B' => return 11;
when 'C' => return 12;
when 'D' => return 13;
when 'E' => return 14;
when 'F' => return 15;
when others => return 16;
end case;
end Convert_Hexadecimal;
function Convert_Hexadecimal ( n : natural ) return character is
begin
if n < 10
then return Convert_Decimal(n);
else case n is
when 10 => return 'A';
when 11 => return 'B';
when 12 => return 'C';
when 13 => return 'D';
when 14 => return 'E';
when 15 => return 'F';
when others => return '0';
end case;
end if;
end Convert_Hexadecimal;
function Convert ( s : String ) return natural is
acc : natural := 0;
cvn : natural;
begin
for i in s'range loop
cvn := Convert(s(i));
if cvn < 10
then acc := acc*10 + cvn;
end if;
end loop;
return acc;
end Convert;
function Convert ( n : natural ) return String is
begin
if n < 10
then declare
res : String(1..1);
begin
res(1) := Convert_Decimal(n);
return res;
end;
else declare
rest : natural := n mod 10;
head : natural := n/10;
headstr : constant string := Convert(head);
res : String(1..headstr'last+1);
begin
res(headstr'range) := headstr;
res(res'last) := Convert_Decimal(rest);
return res;
end;
end if;
end Convert;
procedure Skip_Spaces ( file : in file_type; c : in out character ) is
begin
get(file,c);
while c = ' ' and not End_of_Line(file) loop
get(file,c);
end loop;
end Skip_Spaces;
procedure Skip_Underscores ( file : in file_type; c : in out character ) is
begin
get(file,c);
while c = '_' and not End_of_Line(file) loop
get(file,c);
end loop;
end Skip_Underscores;
end Characters_and_Numbers;