|
|
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: 11730 (0x2dd2)
Types: TextFile
Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11
└─⟦129cab021⟧ »DATA«
└─⟦bb25a46d4⟧
└─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16
└─⟦6f12a12be⟧ »DATA«
└─⟦bb25a46d4⟧
└─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04
└─⟦d65440be7⟧ »DATA«
└─⟦bb25a46d4⟧
└─⟦this⟧
with ASA_DEFINITIONS;
with ASAOPEN;
with JOB_SEGMENT;
with LOGGER;
with REMOTE_OPERATIONS;
with SIMPLE_STATUS;
with TIME_UTILITIES;
with UNIX_DEFINITIONS;
package body HIERARCHY is
package RO renames REMOTE_OPERATIONS;
package SS renames SIMPLE_STATUS;
-- ----------
-- ( ) Naming
-- ----------
HIERARCHY : constant STRING :=
ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".HIERARCHY";
function ADA_NAME (S : in STRING) return STRING is
OFFSET : constant := CHARACTER'POS ('A') - CHARACTER'POS ('a');
RESULT : STRING (S'RANGE);
NEXT : NATURAL := S'FIRST;
begin
for I in S'RANGE loop
case S (I) is
when 'A' .. 'Z' =>
RESULT (NEXT) := S (I);
NEXT := NEXT + 1;
when 'a' .. 'z' =>
RESULT (NEXT) := CHARACTER'VAL (CHARACTER'POS (S (I)) + OFFSET);
NEXT := NEXT + 1;
when '0' .. '9' =>
if NEXT = S'FIRST then
-- An Ada name cannot start with a digit.
null;
else
RESULT (NEXT) := S (I);
NEXT := NEXT + 1;
end if;
when others =>
if NEXT = S'FIRST then
-- An Ada name cannot start with an underscore.
null;
elsif RESULT (NEXT - 1) = '_' then
-- An Ada name cannot have two consecutive
-- underscores.
null;
else
RESULT (NEXT) := '_';
NEXT := NEXT + 1;
end if;
end case;
end loop;
if NEXT > S'FIRST and then RESULT (NEXT - 1) = '_' then
-- An Ada name cannot end with an underscore.
return RESULT (S'FIRST .. NEXT - 2);
else
return RESULT (S'FIRST .. NEXT - 1);
end if;
end ADA_NAME;
--[bug]
-- Due to a bug in asaopen, the requirements arrive here with
-- underscores instead of blanks. They must be converted back.
--
function UNDERLINES_TO_SPACES (S : in STRING) return STRING is
RESULT : STRING (S'RANGE);
begin
for I in S'RANGE loop
if S (I) = '_' then
RESULT (I) := ' ';
else
RESULT (I) := S (I);
end if;
end loop;
return RESULT;
end UNDERLINES_TO_SPACES;
-- ----------------------------------
-- ( ) Bodies of external subprograms
-- ----------------------------------
procedure BUILD (MODEL : in STRING;
HOST : in STRING;
ROOT : out MODULE;
BUILD_TIME : out CALENDAR.TIME) is
C : RO.CONTEXT;
S : SIMPLE_STATUS.CONDITION;
begin
--
-- Acquire a connection.
--
RO.ACQUIRE (A_CONTEXT => C,
STATUS => S,
MACHINE => HOST,
INSTANCE => ASA_DEFINITIONS.ASA);
LOGGER.STATUS (S);
--
-- Do the actual build.
--
BUILD (MODEL => MODEL,
IN_CONTEXT => C,
ROOT => ROOT,
BUILD_TIME => BUILD_TIME);
--
-- Release the connection.
--
RO.RELEASE (A_CONTEXT => C, STATUS => S);
LOGGER.STATUS (S);
end BUILD;
procedure BUILD (MODEL : in STRING;
IN_CONTEXT : in REMOTE_OPERATIONS.CONTEXT;
ROOT : out MODULE;
BUILD_TIME : out CALENDAR.TIME) is
S : SS.CONDITION;
type LINE_KIND is (IDENTIFIER,
NODE,
COMMENT,
REQUIREMENT_1,
REQUIREMENT_2,
REQUIREMENT_3,
REQUIREMENT_4,
REQUIREMENT_5,
REQUIREMENT_6,
REQUIREMENT_7,
REQUIREMENT_8,
REQUIREMENT_9,
CHILDREN);
type STATE_RECORD is
record
CURRENT : MODULE;
EXPECTED : LINE_KIND;
end record;
MY_STATE : STATE_RECORD := (CURRENT => null,
EXPECTED => IDENTIFIER);
procedure PROCESS (STATE : in out STATE_RECORD; LINE : in STRING) is
NEW_MODULE : MODULE;
NB_OF_CHILDREN : NATURAL;
begin
case STATE.EXPECTED is
when IDENTIFIER =>
if STATE.CURRENT /= null then
NEW_MODULE := new MODULE_RECORD'(IDENTIFIER =>
new STRING'(LINE),
NODE_NUMBER => null,
COMMENT => null,
REQUIREMENTS =>
(others => null),
PARENT => STATE.CURRENT,
FIRST_CHILD => null,
NEXT_SIBLING =>
STATE.CURRENT.FIRST_CHILD,
REMAINING_CHILDREN => 0);
pragma HEAP (JOB_SEGMENT.GET);
STATE.CURRENT.REMAINING_CHILDREN :=
STATE.CURRENT.REMAINING_CHILDREN - 1;
STATE.CURRENT.FIRST_CHILD := NEW_MODULE;
STATE.CURRENT := NEW_MODULE;
else
STATE.CURRENT :=
new MODULE_RECORD'(IDENTIFIER => new STRING'(LINE),
NODE_NUMBER => null,
COMMENT => null,
REQUIREMENTS => (others => null),
PARENT => null,
FIRST_CHILD => null,
NEXT_SIBLING => null,
REMAINING_CHILDREN => 0);
pragma HEAP (JOB_SEGMENT.GET);
end if;
when NODE =>
STATE.CURRENT.NODE_NUMBER := new STRING'(LINE);
pragma HEAP (JOB_SEGMENT.GET);
when COMMENT =>
--
-- Asaopen says "(null)" if there is no comment.
--
if LINE = "(null)" then
STATE.CURRENT.COMMENT := new STRING'("");
pragma HEAP (JOB_SEGMENT.GET);
else
STATE.CURRENT.COMMENT := new STRING'(LINE);
pragma HEAP (JOB_SEGMENT.GET);
end if;
when REQUIREMENT_1 .. REQUIREMENT_9 =>
if LINE /= "" then
STATE.CURRENT.REQUIREMENTS
(REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER
(LINE_KIND'POS (STATE.EXPECTED) -
LINE_KIND'POS (LINE_KIND'PRED (REQUIREMENT_1)))) :=
new STRING'(UNDERLINES_TO_SPACES (LINE));
pragma HEAP (JOB_SEGMENT.GET);
end if;
when CHILDREN =>
NB_OF_CHILDREN := NATURAL'VALUE (LINE);
case NB_OF_CHILDREN is
when 0 =>
while STATE.CURRENT.REMAINING_CHILDREN = 0 and then
STATE.CURRENT.PARENT /= null loop
STATE.CURRENT := STATE.CURRENT.PARENT;
end loop;
when POSITIVE =>
STATE.CURRENT.REMAINING_CHILDREN := NB_OF_CHILDREN;
end case;
end case;
if STATE.EXPECTED = LINE_KIND'LAST then
STATE.EXPECTED := LINE_KIND'FIRST;
else
STATE.EXPECTED := LINE_KIND'SUCC (STATE.EXPECTED);
end if;
end PROCESS;
procedure EXECUTE_SCRIPT is
new ASAOPEN.EXECUTE (STATE_RECORD => STATE_RECORD, PROCESS => PROCESS);
begin
--
-- Get the remote model's update time.
--
RO.UPDATE_TIME (OF_FILE => MODEL,
IN_CONTEXT => IN_CONTEXT,
RESULT => BUILD_TIME,
STATUS => S);
if SS.ERROR (S) then
LOGGER.ERROR ("Unable to open remote model " & MODEL,
RAISE_ERROR => FALSE);
LOGGER.STATUS (S);
end if;
--
-- Execute the script to extract the hierarchy information.
--
EXECUTE_SCRIPT (IN_CONTEXT => IN_CONTEXT,
MODEL => MODEL,
TEMPLATE_NAME => HIERARCHY,
STATE => MY_STATE,
STATUS => S);
LOGGER.STATUS (S);
ROOT := MY_STATE.CURRENT;
end BUILD;
function MAKE (IDENTIFIER : in STRING) return MODULE is
begin
return new MODULE_RECORD'(IDENTIFIER => new STRING'(IDENTIFIER),
NODE_NUMBER => new STRING'("M"),
COMMENT => new STRING'(""),
REQUIREMENTS => (others => null),
PARENT => null,
FIRST_CHILD => null,
NEXT_SIBLING => null,
REMAINING_CHILDREN => 0);
pragma HEAP (JOB_SEGMENT.GET);
end MAKE;
function CHILDREN_OF (M : in MODULE) return MODULE_ITERATOR is
begin
return MODULE_ITERATOR (M.FIRST_CHILD);
end CHILDREN_OF;
function PARENT_OF (M : in MODULE) return MODULE is
begin
return M.PARENT;
end PARENT_OF;
function IDENTIFIER (M : in MODULE) return STRING is
begin
return M.IDENTIFIER.all;
end IDENTIFIER;
function SIMPLE_NAME (M : in MODULE) return STRING is
begin
return ADA_NAME (M.IDENTIFIER.all);
end SIMPLE_NAME;
function FULL_NAME (M : in MODULE) return STRING is
begin
if M.PARENT = null then
return ADA_NAME (M.IDENTIFIER.all);
else
return FULL_NAME (M.PARENT) & '.' & ADA_NAME (M.IDENTIFIER.all);
end if;
end FULL_NAME;
function NODE_NUMBER (M : in MODULE) return STRING is
begin
return M.NODE_NUMBER.all;
end NODE_NUMBER;
function COMMENT (M : in MODULE) return STRING is
begin
return M.COMMENT.all;
end COMMENT;
function REQUIREMENT (M : in MODULE;
NUMBER : in REQUIREMENTS.FUNCTIONAL_REQUIREMENT_NUMBER)
return STRING is
begin
if M.REQUIREMENTS (NUMBER) = null then
return "";
else
return M.REQUIREMENTS (NUMBER).all;
end if;
end REQUIREMENT;
function DONE (M : in MODULE_ITERATOR) return BOOLEAN is
begin
return M = null;
end DONE;
function VALUE (M : in MODULE_ITERATOR) return MODULE is
begin
return MODULE (M);
end VALUE;
procedure NEXT (M : in out MODULE_ITERATOR) is
begin
M := MODULE_ITERATOR (M.NEXT_SIBLING);
end NEXT;
function SIZE (M : in MODULE_ITERATOR) return NATURAL is
ITER : MODULE_ITERATOR := M;
RESULT : NATURAL := 0;
begin
while ITER /= null loop
RESULT := RESULT + 1;
ITER := MODULE_ITERATOR (ITER.NEXT_SIBLING);
end loop;
return RESULT;
end SIZE;
function MAKE (M : in MODULE) return MODULE_ITERATOR is
begin
return MODULE_ITERATOR (M);
end MAKE;
end HIERARCHY;