|
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: 13964 (0x368c) 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 DEBUG_TOOLS; with DEVICE_INDEPENDENT_IO; with DIRECTORY_TOOLS; with IO; with LOGGER; with PROFILE; with REMOTE_OPERATIONS; with STRING_UTILITIES; with UNIX_DEFINITIONS; pragma ELABORATE (ASA_DEFINITIONS); package body ASAOPEN is package ASAC renames ASA_DEFINITIONS.COMMANDS; package ASAS renames ASA_DEFINITIONS.SWITCHES; package DIO renames DEVICE_INDEPENDENT_IO; package DNA renames DIRECTORY_TOOLS.NAMING; package RO renames REMOTE_OPERATIONS; package SS renames SIMPLE_STATUS; package SU renames STRING_UTILITIES; package UNIX renames UNIX_DEFINITIONS; LOCAL_ANNOTATIONS : constant STRING := ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".ANNOTATIONS"; LOCAL_ANNOTATION_TYPES : constant STRING := ASA_DEFINITIONS.MAIN_CLASS_DIRECTORY & ".ANNOTATION_TYPES"; TEMPLATE_ERROR : exception; function "-" (S1 : in STRING; S2 : in STRING) return STRING is begin pragma ASSERT (S1'LENGTH >= S2'LENGTH and then S1 (S1'LAST - S2'LENGTH + 1 .. S1'LAST) = S2); return S1 (S1'FIRST .. S1'LAST - S2'LENGTH); end "-"; -- ------------------------------ -- ( ) Body of external procedure -- ------------------------------ procedure EXECUTE (IN_CONTEXT : in REMOTE_OPERATIONS.CONTEXT; MODEL : in STRING; TEMPLATE_NAME : in STRING; STATE : in out STATE_RECORD; STATUS : out SIMPLE_STATUS.CONDITION) is -- ---------------- -- ( . ) Local data -- ---------------- S : SS.CONDITION; ERROR_FILE : IO.FILE_TYPE; -- The remote stderr and stdout. NULL_INPUT_FILE : DIO.FILE_TYPE; OUTPUT_FILE : IO.FILE_TYPE; -- The result of executing the script. SCRIPT_FILE : IO.FILE_TYPE; TEMPLATE_FILE : IO.FILE_TYPE; REMOTE_ANNOTATIONS : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.ANNOTATIONS_EXTENSION); REMOTE_ANNOTATION_TYPES : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.ANNOTATION_TYPES_EXTENSION); REMOTE_OUTPUT : constant STRING := UNIX.TEMPORARY_FILENAME (""); REMOTE_PROCESSED_MODEL : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.MODEL_EXTENSION); REMOTE_SCRIPT : constant STRING := UNIX.TEMPORARY_FILENAME (ASAC.ASAOPEN_EXTENSION); --[bugs] -- Due to a bug in ASA, the .opn extension cannot be included on -- the command line. -- Due to a bug in REMOTE_OPERATIONS.EXECUTE, we put a leading -- space to make sure that the lower bound of the command string -- is 1. -- ASAOPEN_COMMAND : constant STRING := ' ' & ASAS.BIN_DIRECTORY (RO.MACHINE (IN_CONTEXT)) & UNIX.CONTEXT_SEPARATOR & ASAC.ASAOPEN & ' ' & (REMOTE_SCRIPT - ASAC.ASAOPEN_EXTENSION); RM_COMMAND : constant STRING := UNIX.REMOVE & ' ' & REMOTE_ANNOTATIONS & ' ' & REMOTE_ANNOTATION_TYPES & ' ' & REMOTE_OUTPUT & ' ' & REMOTE_SCRIPT & ' ' & REMOTE_PROCESSED_MODEL; SED_COMMAND : constant STRING := UNIX.STREAM_EDITOR & ' ' & UNIX.EDIT & ' ' & "'/&requirement_[1-9] '""'""'.*'""'""'/s/ /_/g'" & ' ' & UNIX.EDIT & ' ' & "'/&requirement_[1-9] '""'""'[^'""'""']*$/,/'""'""';/s/ /_/g'" & ' ' & UNIX.EDIT & ' ' & "'/&requirement_[1-9]/s/_*\(&requirement_[1-9]\)_*'""'""'/ \1 '""'""'/'" & ' ' & UNIX.EDIT & ' ' & """s/_*;/;/""" & ' ' & MODEL & ' ' & UNIX.OUTPUT_REDIRECT & ' ' & REMOTE_PROCESSED_MODEL; -- ------------------------ -- ( . ) Template expansion -- ------------------------ procedure EXPAND (TEMPLATE_FILE : in IO.FILE_TYPE; SCRIPT_FILE : in IO.FILE_TYPE) is use IO; pragma ASSERT (IO.IS_OPEN (TEMPLATE_FILE) and then IO.MODE (TEMPLATE_FILE) = IO.IN_FILE and then IO.IS_OPEN (SCRIPT_FILE) and then IO.MODE (SCRIPT_FILE) = IO.OUT_FILE); -- -- A line is decomposed into symbol fields and constant fields. -- Fields are separated by the separator. The first field of a -- line is always a constant field. BOUNDARY is the first -- character of the current field. -- type FIELD is (CONSTANT_FIELD, SYMBOL_FIELD); CURRENT_FIELD : FIELD; BOUNDARY : NATURAL; THE_SYMBOL : SYMBOL; begin while not IO.END_OF_FILE (TEMPLATE_FILE) loop declare LINE : constant STRING := IO.GET_LINE (TEMPLATE_FILE); begin CURRENT_FIELD := CONSTANT_FIELD; BOUNDARY := LINE'FIRST; for I in LINE'FIRST .. LINE'LAST - SEPARATOR'LENGTH + 1 loop if LINE (I .. I + SEPARATOR'LENGTH - 1) = SEPARATOR then case CURRENT_FIELD is when CONSTANT_FIELD => -- -- Found the initial symbol separator. First write -- the text preceding it. -- IO.PUT (SCRIPT_FILE, LINE (BOUNDARY .. I - 1)); CURRENT_FIELD := SYMBOL_FIELD; BOUNDARY := I + SEPARATOR'LENGTH; when SYMBOL_FIELD => -- -- Found the final symbol separator. Write the -- value of the symbol. -- THE_SYMBOL := SYMBOL'VALUE (LINE (BOUNDARY .. I - 1)); case THE_SYMBOL is when ANNOTATIONS => IO.PUT (SCRIPT_FILE, REMOTE_ANNOTATIONS); when ANNOTATION_TYPES => IO.PUT (SCRIPT_FILE, REMOTE_ANNOTATION_TYPES); when ASAOPEN.MODEL => IO.PUT (SCRIPT_FILE, REMOTE_PROCESSED_MODEL); when OUTPUT => IO.PUT (SCRIPT_FILE, REMOTE_OUTPUT); end case; CURRENT_FIELD := CONSTANT_FIELD; BOUNDARY := I + SEPARATOR'LENGTH; end case; end if; end loop; IO.PUT_LINE (SCRIPT_FILE, LINE (BOUNDARY .. LINE'LAST)); end; end loop; exception when others => raise TEMPLATE_ERROR; end EXPAND; begin -- -- Create a script file to hold the expanded asaopen text. Open -- the template, expand it, close it. Reset the script file to -- read mode. -- IO.CREATE (FILE => SCRIPT_FILE, MODE => IO.OUT_FILE, NAME => ""); IO.OPEN (FILE => TEMPLATE_FILE, MODE => IO.IN_FILE, NAME => TEMPLATE_NAME); LOGGER.NOTE ("Expanding template file " & IO.NAME (TEMPLATE_FILE) & " into " & IO.NAME (SCRIPT_FILE)); EXPAND (TEMPLATE_FILE => TEMPLATE_FILE, SCRIPT_FILE => SCRIPT_FILE); IO.CLOSE (TEMPLATE_FILE); IO.RESET (FILE => SCRIPT_FILE, MODE => IO.IN_FILE); -- -- Download the script file and close it. -- LOGGER.NOTE ("Copying file " & IO.NAME (SCRIPT_FILE) & " to " & REMOTE_SCRIPT); RO.PUT (FROM_FILE => IO.CONVERT (SCRIPT_FILE), TO_FILE => REMOTE_SCRIPT, IN_CONTEXT => IN_CONTEXT, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => FALSE); IO.CLOSE (SCRIPT_FILE); -- -- Download the annotation files. -- LOGGER.NOTE ("Copying file " & LOCAL_ANNOTATIONS & " to " & REMOTE_ANNOTATIONS); RO.PUT (FROM_FILE => LOCAL_ANNOTATIONS, TO_FILE => REMOTE_ANNOTATIONS, IN_CONTEXT => IN_CONTEXT, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => FALSE); LOGGER.NOTE ("Copying file " & LOCAL_ANNOTATION_TYPES & " to " & REMOTE_ANNOTATION_TYPES); RO.PUT (FROM_FILE => LOCAL_ANNOTATION_TYPES, TO_FILE => REMOTE_ANNOTATION_TYPES, IN_CONTEXT => IN_CONTEXT, STATUS => S); LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Create error files. -- IO.CREATE (FILE => ERROR_FILE, MODE => IO.OUT_FILE, NAME => ""); --[bug] -- Due to a bug in asaopen, the blanks are stripped from the -- requirements' text. Before calling asaopen, we run sed on the -- model file to change every space into an underscore. The -- reverse transformation will be made by package HIERARCHY. -- LOGGER.NOTE ("Executing command """ & SED_COMMAND & '"'); RO.EXECUTE (COMMAND => SED_COMMAND, IN_CONTEXT => IN_CONTEXT, INPUT => NULL_INPUT_FILE, OUTPUT => IO.CONVERT (ERROR_FILE), ERROR => IO.CONVERT (ERROR_FILE), STATUS => S, TIMEOUT => RO.WAIT_FOREVER); LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Execute asaopen on the downloaded script file. Do not separate -- output and error flows. -- LOGGER.NOTE ("Executing command """ & ASAOPEN_COMMAND & '"'); RO.EXECUTE (COMMAND => ASAOPEN_COMMAND, IN_CONTEXT => IN_CONTEXT, INPUT => NULL_INPUT_FILE, OUTPUT => IO.CONVERT (ERROR_FILE), ERROR => IO.CONVERT (ERROR_FILE), STATUS => S, TIMEOUT => RO.WAIT_FOREVER); -- -- Process the error file. -- IO.RESET (FILE => ERROR_FILE, MODE => IO.IN_FILE); while not IO.END_OF_FILE (ERROR_FILE) loop LOGGER.DEBUG (IO.GET_LINE (ERROR_FILE)); end loop; LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Upload the result of execution. -- IO.CREATE (FILE => OUTPUT_FILE, MODE => IO.OUT_FILE, NAME => ""); LOGGER.NOTE ("Copying file " & REMOTE_OUTPUT & " to " & IO.NAME (OUTPUT_FILE)); RO.GET (FROM_FILE => REMOTE_OUTPUT, IN_CONTEXT => IN_CONTEXT, TO_FILE => IO.CONVERT (OUTPUT_FILE), STATUS => S); LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Clean up temporary files. -- IO.RESET (FILE => ERROR_FILE, MODE => IO.OUT_FILE); LOGGER.NOTE ("Executing command """ & RM_COMMAND & '"'); RO.EXECUTE (COMMAND => RM_COMMAND, IN_CONTEXT => IN_CONTEXT, INPUT => NULL_INPUT_FILE, OUTPUT => IO.CONVERT (ERROR_FILE), ERROR => IO.CONVERT (ERROR_FILE), STATUS => S, TIMEOUT => RO.WAIT_FOREVER); -- -- Process the error file and close it. -- IO.RESET (FILE => ERROR_FILE, MODE => IO.IN_FILE); while not IO.END_OF_FILE (ERROR_FILE) loop declare THE_LINE : constant STRING := IO.GET_LINE (ERROR_FILE); begin if SU.LOCATE (FRAGMENT => "ERROR", WITHIN => THE_LINE) = 0 then LOGGER.DEBUG (THE_LINE); else LOGGER.ERROR (THE_LINE); end if; end; end loop; IO.CLOSE (ERROR_FILE); LOGGER.STATUS (S, INTERACTIVE => FALSE); -- -- Process the output file and close it. -- IO.RESET (FILE => OUTPUT_FILE, MODE => IO.IN_FILE); while not IO.END_OF_FILE (OUTPUT_FILE) loop PROCESS (STATE => STATE, LINE => IO.GET_LINE (OUTPUT_FILE)); end loop; IO.CLOSE (OUTPUT_FILE); STATUS := S; exception when PROFILE.ERROR => SS.CREATE_CONDITION (STATUS => S, ERROR_TYPE => "", MESSAGE => "asaopen execution is quitting after errors", SEVERITY => SS.PROBLEM); STATUS := S; when TEMPLATE_ERROR => SS.CREATE_CONDITION (STATUS => S, ERROR_TYPE => "Asaopen", MESSAGE => "syntax error in template or template not found", SEVERITY => SS.PROBLEM); STATUS := S; when others => SS.CREATE_CONDITION (STATUS => S, ERROR_TYPE => "Asaopen", MESSAGE => "execution aborted by exception " & DEBUG_TOOLS.GET_EXCEPTION_NAME, SEVERITY => SS.PROBLEM); STATUS := S; end EXECUTE; end ASAOPEN;