?? RIGHT := 110 ??
?? NEWTITLE := 'INSTALL_SOFTWARE Utility: RAP$ESTABLISH_DIRECTORY_PTRS Interface.' ??
MODULE ram$establish_directory_ptrs;

{ PURPOSE:
{   This module contains the interface and procedures that establishes
{   the directory pointers within a directory sequence.
{
{ DESIGN:
{   The compiled module resides in RAF$LIBRARY.
{
{ NOTES:
{

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc rae$install_software_cc
*copyc rac$idb_directory_level
*copyc rac$idb_directory_name
*copyc rac$inss_processor_version
*copyc rat$idb_directory_pointers
*copyc rat$installation_control_record
*copyc rat$path
*copyc rat$sequence_descriptor_types
?? POP ??
*copyc osp$append_status_file
*copyc osp$append_status_parameter
*copyc osp$generate_log_message
*copyc osp$set_status_abnormal
*copyc pmp$get_legible_date_time
?? OLDTITLE ??
?? NEWTITLE := '[XDCL] rap$establish_directory_ptrs', EJECT ??

{ PURPOSE:
{   This interface establishes the pointers to the directory
{   components.
{
{ DESIGN:
{
{ NOTES:
{

  PROCEDURE [XDCL] rap$establish_directory_ptrs
    (    installation_database: rat$path;
     VAR directory_pointers {input} : rat$idb_directory_pointers;
     VAR status: ost$status);


    VAR
      ignore_status: ost$status,
      local_status: ost$status;


    status.normal := TRUE;

    RESET directory_pointers.sequence_p;
    NEXT directory_pointers.sequence_descriptor_p IN directory_pointers.sequence_p;
    IF directory_pointers.sequence_descriptor_p = NIL THEN
      osp$set_status_abnormal ('RA', rae$unexpected_eof_directory, rac$idb_directory_name, status);
      osp$append_status_file (osc$status_parameter_delimiter, installation_database.
            path (1, installation_database.size), status);
      RETURN;
    IFEND;

    IF directory_pointers.sequence_descriptor_p^.sequence_type <> rac$idb_directory_sequence THEN
      osp$set_status_abnormal ('RA', rae$invalid_idb_directory, rac$idb_directory_name, status);
      osp$append_status_file (osc$status_parameter_delimiter, installation_database.
            path (1, installation_database.size), status);
      RETURN;
    IFEND;

    IF directory_pointers.sequence_descriptor_p^.sequence_level <> rac$idb_directory_level THEN
      osp$set_status_abnormal ('RA', rae$incompatible_sequence_level, 'IDB directory', status);
      osp$append_status_parameter (osc$status_parameter_delimiter,
            directory_pointers.sequence_descriptor_p^.sequence_level, status);
      RETURN;
    IFEND;

    IF directory_pointers.sequence_descriptor_p^.processor_version <> rac$inss_processor_version THEN
      osp$set_status_abnormal ('RA', rae$different_processor_version, 'IDB directory', local_status);
      osp$generate_log_message ($pmt$ascii_logset [pmc$job_log], local_status, ignore_status);
    IFEND;

    NEXT directory_pointers.header_p IN directory_pointers.sequence_p;
    IF directory_pointers.header_p = NIL THEN
      osp$set_status_abnormal ('RA', rae$unexpected_eof_directory, rac$idb_directory_name, status);
      osp$append_status_file (osc$status_parameter_delimiter, installation_database.
            path (1, installation_database.size), status);
      RETURN;
    IFEND;


    IF directory_pointers.header_p^.directory_size = 0 THEN
      { This is required to establish the directory records pointer.
      directory_pointers.directory_p := #PTR (directory_pointers.header_p^.directory_rel_p,
            directory_pointers.sequence_p^);
    ELSE
      { This is required to move the current sequence position to directory EOI.}
      NEXT directory_pointers.directory_p: [1..directory_pointers.header_p^.directory_size] IN
            directory_pointers.sequence_p;
      IF directory_pointers.header_p = NIL THEN
        osp$set_status_abnormal ('RA', rae$unexpected_eof_directory, rac$idb_directory_name, status);
        osp$append_status_file (osc$status_parameter_delimiter, installation_database.
              path (1, installation_database.size), status);
        RETURN;
      IFEND;
    IFEND;

  PROCEND rap$establish_directory_ptrs;

MODEND ram$establish_directory_ptrs;
