?? RIGHT := 110 ??
MODULE ram$get_elements_by_class;
*copyc osd$default_pragmats
?? PUSH (LISTEXT := ON) ??
*copyc rat$table_version
*copyc rat$header_record
*copyc rat$installation_table
*copyc rat$correction_package
*copyc rav$installation_table
*copyc amp$open
*copyc amp$get_segment_pointer
*copyc amp$close
?? POP ??

*copyc rah$get_elements_by_class

  PROCEDURE [XDCL] rap$get_elements_by_class (class: rat$file_class;
    VAR element_list: ^array [1 .. * ] OF ost$name;
    VAR status: ost$status);

    VAR
      access_sel: amt$file_access_selections,
      i: rat$element_index,
      install_header: ^rat$header_record,
      install_table: amt$segment_pointer,
      it_fid: amt$file_identifier,
      j: rat$element_index,
      table: ^rat$installation_table,
      temp_elements: ^array [1 .. * ] of ost$name,
      version: ^rat$table_version;

    status.normal := TRUE;

    PUSH access_sel: [1 .. 1];
    access_sel^ [1].key := amc$access_mode;
    access_sel^ [1].access_mode := $pft$usage_selections [pfc$read];
    amp$open (rav$installation_table, amc$segment, access_sel, it_fid, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    amp$get_segment_pointer (it_fid, amc$sequence_pointer, install_table, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    RESET install_table.sequence_pointer;
    NEXT version IN install_table.sequence_pointer;
    NEXT install_header IN install_table.sequence_pointer;
    NEXT table: [1 .. install_header^.number_of_files] IN install_table.sequence_pointer;
    j := 1;
    ALLOCATE temp_elements: [1 .. install_header^.number_of_files];
    FOR i := 1 TO install_header^.number_of_files DO
      IF table^ [i].class = class THEN
        temp_elements^ [j] := table^ [i].mnemonic_name;
        j := j + 1;
      IFEND;
    FOREND;

    IF (j - 1) <> 0 THEN
      ALLOCATE element_list: [1 .. j - 1];
      FOR i := 1 TO j - 1 DO
        element_list^ [i] := temp_elements^ [i];
      FOREND;
    ELSE
      element_list := NIL;
    IFEND;
    FREE temp_elements;
    amp$close (it_fid, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;
  PROCEND rap$get_elements_by_class;
MODEND ram$get_elements_by_class;
