|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 22528 (0x5800)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Pattern_Match_Regular_Expression, seg_0046a0
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
--
-- (C) Copyright 1986 Grady Booch
-- All Rights Reserved
--
-- Serial Number 0000000
--
package body Pattern_Match_Regular_Expression is
function Location_Of (The_Pattern : in Items; In_The_Items : in Items)
return Index is
type Kind is (Literal, Class, Any, Stop, Unknown);
type Literals is array (Positive range 1 .. The_Pattern'Length) of Item;
type Pattern (The_Kind : Kind := Unknown) is
record
True_Pattern : Boolean := True;
Has_Closure : Boolean := False;
case The_Kind is
when Literal =>
The_Item : Item;
when Class =>
Number_Of_Items : Natural := 0;
The_Items : Literals;
when Any | Stop | Unknown =>
null;
end case;
end record;
type Patterns is array (Positive range <>) of Pattern;
Full_Pattern : Patterns (1 .. The_Pattern'Length + 1);
procedure Preprocess (The_Pattern : in Items;
Full_Pattern : in out Patterns) is
type State is (Building_Pattern, Building_Class,
Building_Escape_Pattern, Building_Escape_Class);
The_State : State := Building_Pattern;
Pattern_Index : Index := The_Pattern'First;
Full_Index : Positive := Full_Pattern'First;
Last_Pattern : Natural := 0;
begin
loop
case The_State is
when Building_Pattern =>
if Is_Equal (The_Pattern (Pattern_Index), Any_Item) then
if Full_Pattern (Full_Index).True_Pattern then
Full_Pattern (Full_Index) :=
(The_Kind => Any,
True_Pattern =>
Full_Pattern (Full_Index).True_Pattern,
Has_Closure => False);
Last_Pattern := Full_Index;
Full_Index := Full_Index + 1;
else
raise Illegal_Pattern;
end if;
elsif Is_Equal (The_Pattern (Pattern_Index),
Escape_Item) then
The_State := Building_Escape_Pattern;
elsif Is_Equal
(The_Pattern (Pattern_Index), Not_Item) then
if Full_Pattern (Full_Index).True_Pattern then
Full_Pattern (Full_Index).True_Pattern := False;
else
raise Illegal_Pattern;
end if;
elsif Is_Equal (The_Pattern (Pattern_Index),
Closure_Item) then
if not Full_Pattern (Last_Pattern).Has_Closure then
Full_Pattern (Last_Pattern).Has_Closure := True;
else
raise Illegal_Pattern;
end if;
elsif Is_Equal (The_Pattern (Pattern_Index),
Start_Class) then
Full_Pattern (Full_Index) :=
(The_Kind => Class,
True_Pattern =>
Full_Pattern (Full_Index).True_Pattern,
Has_Closure => False,
Number_Of_Items => 0,
The_Items => (others => Any_Item));
Last_Pattern := Full_Index;
Full_Index := Full_Index + 1;
The_State := Building_Class;
elsif Is_Equal (The_Pattern (Pattern_Index),
Stop_Class) then
raise Illegal_Pattern;
else
Full_Pattern (Full_Index) :=
(The_Kind => Literal,
True_Pattern =>
Full_Pattern (Full_Index).True_Pattern,
Has_Closure => False,
The_Item => The_Pattern (Pattern_Index));
Last_Pattern := Full_Index;
Full_Index := Full_Index + 1;
end if;
when Building_Class =>
if Is_Equal (The_Pattern (Pattern_Index), Any_Item) then
raise Illegal_Pattern;
elsif Is_Equal (The_Pattern (Pattern_Index),
Escape_Item) then
The_State := Building_Escape_Class;
elsif Is_Equal
(The_Pattern (Pattern_Index), Not_Item) then
raise Illegal_Pattern;
elsif Is_Equal (The_Pattern (Pattern_Index),
Closure_Item) then
raise Illegal_Pattern;
elsif Is_Equal (The_Pattern (Pattern_Index),
Start_Class) then
raise Illegal_Pattern;
elsif Is_Equal (The_Pattern (Pattern_Index),
Stop_Class) then
if Full_Pattern (Last_Pattern).Number_Of_Items >
0 then
The_State := Building_Pattern;
else
raise Illegal_Pattern;
end if;
else
Full_Pattern (Last_Pattern).Number_Of_Items :=
Full_Pattern (Last_Pattern).Number_Of_Items + 1;
Full_Pattern (Last_Pattern).The_Items
(Full_Pattern (Last_Pattern).Number_Of_Items) :=
The_Pattern (Pattern_Index);
end if;
when Building_Escape_Pattern =>
Full_Pattern (Full_Index) :=
(The_Kind => Literal,
True_Pattern =>
Full_Pattern (Full_Index).True_Pattern,
Has_Closure => False,
The_Item => The_Pattern (Pattern_Index));
Last_Pattern := Full_Index;
Full_Index := Full_Index + 1;
The_State := Building_Pattern;
when Building_Escape_Class =>
Full_Pattern (Last_Pattern).Number_Of_Items :=
Full_Pattern (Last_Pattern).Number_Of_Items + 1;
Full_Pattern (Last_Pattern).The_Items
(Full_Pattern (Last_Pattern).Number_Of_Items) :=
The_Pattern (Pattern_Index);
The_State := Building_Class;
end case;
if Pattern_Index = The_Pattern'Last then
if (The_State = Building_Pattern) and
(Full_Pattern (Full_Index).True_Pattern) then
Full_Pattern (Full_Index) :=
(The_Kind => Stop,
True_Pattern =>
Full_Pattern (Full_Index).True_Pattern,
Has_Closure => False);
return;
else
raise Illegal_Pattern;
end if;
else
Pattern_Index := Index'Succ (Pattern_Index);
end if;
end loop;
exception
when Constraint_Error =>
raise Illegal_Pattern;
end Preprocess;
function Is_Match (The_Pattern : in Pattern; The_Item : in Item)
return Boolean is
begin
case The_Pattern.The_Kind is
when Literal =>
if The_Pattern.True_Pattern then
return Is_Equal (The_Pattern.The_Item, The_Item);
else
return not Is_Equal (The_Pattern.The_Item, The_Item);
end if;
when Class =>
if The_Pattern.True_Pattern then
for Index in 1 .. The_Pattern.Number_Of_Items loop
if Is_Equal (The_Pattern.The_Items (Index),
The_Item) then
return True;
end if;
end loop;
return False;
else
for Index in 1 .. The_Pattern.Number_Of_Items loop
if Is_Equal (The_Pattern.The_Items (Index),
The_Item) then
return False;
end if;
end loop;
return True;
end if;
when Any =>
return True;
when others =>
raise Illegal_Pattern;
end case;
end Is_Match;
function Location_Of (Full_Pattern : in Patterns;
In_The_Items : in Items;
The_Start : in Index) return Index is
Items_Index : Index := The_Start;
Total_Closures : Natural := 0;
Temporary_Location : Index;
Temporary_Index : Index;
begin
for Full_Index in Full_Pattern'Range loop
if Full_Pattern (Full_Index).The_Kind = Stop then
return The_Start;
elsif Full_Pattern (Full_Index).Has_Closure then
for Index in Items_Index .. In_The_Items'Last loop
if Is_Match (Full_Pattern (Full_Index),
In_The_Items (Index)) then
Total_Closures := Total_Closures + 1;
else
exit;
end if;
end loop;
while Total_Closures > 0 loop
begin
Temporary_Index :=
Index'Val (Index'Pos (Items_Index) +
Total_Closures);
Temporary_Location :=
Location_Of (Full_Pattern (Full_Index + 1 ..
Full_Pattern'Last),
In_The_Items (Temporary_Index ..
In_The_Items'Last),
Temporary_Index);
Items_Index := Temporary_Index;
exit;
exception
when Pattern_Not_Found =>
Total_Closures := Total_Closures - 1;
end;
end loop;
elsif Is_Match (Full_Pattern (Full_Index),
In_The_Items (Items_Index)) then
Items_Index := Index'Succ (Items_Index);
else
raise Pattern_Not_Found;
end if;
end loop;
exception
when Constraint_Error =>
raise Pattern_Not_Found;
end Location_Of;
begin
Preprocess (The_Pattern, Full_Pattern);
for Start in In_The_Items'Range loop
begin
return Location_Of (Full_Pattern, In_The_Items, Start);
exception
when Pattern_Not_Found =>
null;
end;
end loop;
raise Pattern_Not_Found;
end Location_Of;
end Pattern_Match_Regular_Expression;
nblk1=15
nid=0
hdr6=2a
[0x00] rec0=1d rec1=00 rec2=01 rec3=010
[0x01] rec0=00 rec1=00 rec2=15 rec3=016
[0x02] rec0=14 rec1=00 rec2=02 rec3=006
[0x03] rec0=00 rec1=00 rec2=14 rec3=01e
[0x04] rec0=10 rec1=00 rec2=03 rec3=04e
[0x05] rec0=01 rec1=00 rec2=13 rec3=014
[0x06] rec0=10 rec1=00 rec2=04 rec3=084
[0x07] rec0=12 rec1=00 rec2=05 rec3=012
[0x08] rec0=00 rec1=00 rec2=12 rec3=038
[0x09] rec0=10 rec1=00 rec2=06 rec3=060
[0x0a] rec0=12 rec1=00 rec2=07 rec3=036
[0x0b] rec0=00 rec1=00 rec2=11 rec3=00a
[0x0c] rec0=11 rec1=00 rec2=08 rec3=02c
[0x0d] rec0=19 rec1=00 rec2=09 rec3=042
[0x0e] rec0=15 rec1=00 rec2=0a rec3=034
[0x0f] rec0=15 rec1=00 rec2=0b rec3=05e
[0x10] rec0=00 rec1=00 rec2=10 rec3=020
[0x11] rec0=13 rec1=00 rec2=0c rec3=040
[0x12] rec0=00 rec1=00 rec2=0f rec3=014
[0x13] rec0=1c rec1=00 rec2=0d rec3=03a
[0x14] rec0=01 rec1=00 rec2=0e rec3=000
tail 0x2170029d0815c66ae3c54 0x42a00088462061e03