DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400 Tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400 Tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download
Index: ┃ B T

⟦d58e6e204⟧ TextFile

    Length: 13964 (0x368c)
    Types: TextFile
    Names: »B«

Derivation

└─⟦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⟧ 

TextFile

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;