|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 4661 (0x1235)
Types: TextFile
Names: »B«
└─⟦149519bd4⟧ Bits:30000546 8mm tape, Rational 1000, !projects 93-07-13
└─⟦124ff5788⟧ »DATA«
└─⟦this⟧
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦this⟧
└─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16
└─⟦6f12a12be⟧ »DATA«
└─⟦this⟧
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04
└─⟦d65440be7⟧ »DATA«
└─⟦this⟧
-------------------------------------------------------------------------------
with String_Run;
package body Wild_String is
---------------------------------------------------------------------------
function Is_With_Wildcards (Word : String) return Boolean is
begin
for I in Word'Range loop
case (Word (I)) is
when Wildcard.Pound_Sign =>
return True;
when Wildcard.At_Sign =>
return True;
when Wildcard.Question_Mark =>
return True;
when others =>
null;
end case;
end loop;
return False;
end Is_With_Wildcards;
---------------------------------------------------------------------------
function At_Sign_At_End (Iter : String_Run.Iterator) return Boolean is
begin
if (String_Run.Value (Iter) = Wildcard.At_Sign) then
return String_Run.Next_Done (Iter);
else
return False;
end if;
end At_Sign_At_End;
---------------------------------------------------------------------------
function Is_Wild_Equal (Left, Right : String) return Boolean is
Iter_Left : String_Run.Iterator;
Iter_Right : String_Run.Iterator;
Find : Boolean;
begin
String_Run.Init (Iter_Left, Left);
String_Run.Init (Iter_Right, Right);
loop
if (String_Run.Done (Iter_Left) and
String_Run.Done (Iter_Right)) then
return True;
end if;
if (String_Run.Done (Iter_Left)) then
return At_Sign_At_End (Iter_Right);
end if;
if (String_Run.Done (Iter_Right)) then
return At_Sign_At_End (Iter_Left);
end if;
case (String_Run.Value (Iter_Left)) is
when Wildcard.Pound_Sign =>
String_Run.Next (Iter_Left);
String_Run.Next (Iter_Right);
when Wildcard.At_Sign =>
if (String_Run.Next_Done (Iter_Left)) then
return True;
else
Find := False;
for I in String_Run.Current_Index (Iter_Right) ..
Right'Length loop
Find := True;
exit when Is_Wild_Equal
(String_Run.Rest (Iter_Left),
String_Run.Cut (Iter_Right, I));
Find := False;
end loop;
return Find;
end if;
when Wildcard.Question_Mark =>
if (String_Run.Next_Done (Iter_Left)) then
return (not String_Run.Done (Iter_Right));
else
Find := False;
for I in String_Run.Current_Index (Iter_Right) + 1 ..
Right'Length loop
Find := True;
exit when Is_Wild_Equal
(String_Run.Rest (Iter_Left),
String_Run.Cut (Iter_Right, I));
Find := False;
end loop;
return Find;
end if;
when others =>
if (String_Run.Value (Iter_Left) /=
String_Run.Value (Iter_Right)) then
return False;
end if;
String_Run.Next (Iter_Left);
String_Run.Next (Iter_Right);
end case;
end loop;
end Is_Wild_Equal;
---------------------------------------------------------------------------
function Is_Equal (Left, Right : String) return Boolean is
Left_Wild : Boolean;
Right_Wild : Boolean;
begin
Left_Wild := Is_With_Wildcards (Left);
Right_Wild := Is_With_Wildcards (Right);
if (Left_Wild and Right_Wild) then
raise Invalid_Argument_Error;
end if;
if (Left_Wild) then
return Is_Wild_Equal (Left, Right);
end if;
if (Right_Wild) then
return Is_Wild_Equal (Right, Left);
end if;
return Left = Right;
end Is_Equal;
end Wild_String;
-------------------------------------------------------------------------------