-- Illustrates a simple data type for Words
-- A Word contains a String of some fixed maximum length
-- and a current length
with Ada.Text_IO; use Ada.Text_IO;
with ada.Strings.Fixed; use ada.Strings.Fixed;
with ada.Strings.Maps; use ada.Strings.Maps;
with ada.Strings; use ada.Strings;
procedure trySimpleWord is
MaxWordLength: Integer := 80;
type Word is record
letters: String(1 .. MaxWordLength);
length: Natural := 0;
end record;
WordTooLong: Exception;
-- Compare two words
function "="(x, y: Word) return Boolean is
begin
return
x.letters(1..x.length)
=
y.letters(1..y.length) ;
end "=";
-- Output a Word
procedure put(w: Word) is
begin
put(w.letters(1 .. w.length));
end put;
procedure put_line(w: Word) is
begin
put(w.letters(1 .. w.length));
new_line;
end put_line;
-- Turn word w into a string
function length(w: Word) return Natural is
begin
return w.length;
end length;
-- Turn word w into a string
function toString(w: Word) return String is
begin
return w.letters(1 .. w.length);
end toString;
-- Turn string s into a word
-- Raises exceptions if s is too long for a word
function newWord(s: String) return Word is
temp: Word;
begin
if s'length > MaxWordLength then
raise WordTooLong;
end if;
temp.letters(1 .. s'length) := s(s'first .. s'last);
temp.length := s'length;
return temp;
end newWord;
w, x: Word;
s: String := "Hi Mom!";
long: String(1 .. 300) := (others => 'x'); -- Long enough for 3 words
begin
w := newWord(s);
x := newWord("Hi");
if w = x then
put("Same");
else
put("Different");
end if;
put_line(w);
put_line(x);
put("Enter a word: ");
get_line(long, len);
w := newWord(long(1 .. len));
put_line(w);
-- w := newWord(long); -- Causes an exception
end trySimpleWord;