?? NEWTITLE := 'NOS/VE : Basic Access Methods : AMP$FILE' ??
MODULE bam$store_art_table_pointer;
?? RIGHT := 110 ??

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc oss$task_private
*copyc fme$file_management_errors
*copyc amt$local_file_name
*copyc bat$auxilliary_request_table
*copyc bat$task_file_table
*copyc ost$name
?? POP ??
*copyc osp$set_status_abnormal
*copyc bav$auxilliary_request_table
*copyc osv$task_private_heap
?? OLDTITLE ??
?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??

  VAR
    bav$last_art_entry: [XDCL, #GATE, oss$task_private] bat$last_art_entry := 0;

?? OLDTITLE ??
?? NEWTITLE := '[xdcl, #gate] BAP$DELETE_ART_ENTRY', EJECT ??

  PROCEDURE [XDCL, #GATE] bap$delete_art_entry
    (    local_file_name: amt$local_file_name;
     VAR status: ost$status);

    VAR
      art_index: bat$art_limit,
      found: boolean;

    status.normal := TRUE;
    fetch_art_index (local_file_name, art_index, found);

    IF found THEN
      IF bav$auxilliary_request_table^ [art_index].file_attributes <> NIL THEN
        FREE bav$auxilliary_request_table^ [art_index].file_attributes IN osv$task_private_heap^;
      IFEND;
      bav$auxilliary_request_table^ [art_index].local_file_name := osc$null_name;
    IFEND;

  PROCEND bap$delete_art_entry;
?? OLDTITLE ??
?? NEWTITLE := '    [XDCL, #GATE] bap$fetch_art_table_pointer', EJECT ??

  PROCEDURE [XDCL, #GATE] bap$fetch_art_table_pointer
    (    local_file_name: amt$local_file_name;
     VAR file_attributes: ^amt$file_attributes);

    VAR
      art_index: bat$art_limit,
      found: boolean;

    fetch_art_index (local_file_name, art_index, found);
    IF found THEN
      file_attributes := bav$auxilliary_request_table^ [art_index].file_attributes;
    ELSE
      file_attributes := NIL;
    IFEND;

  PROCEND bap$fetch_art_table_pointer;
?? OLDTITLE ??
?? NEWTITLE := ' PROCEDURE [XDCL, #GATE] bap$store_art_table_pointer', EJECT ??

  PROCEDURE [XDCL, #GATE] bap$store_art_table_pointer
    (    local_file_name: amt$local_file_name;
     VAR file_attributes: ^amt$file_attributes;
     VAR status: ost$status);

    VAR
      art_index: bat$art_limit;

    find_art_entry (local_file_name, art_index, status);
    IF NOT status.normal THEN
      RETURN; {----->
    IFEND;

    IF bav$auxilliary_request_table^ [art_index].file_attributes <> NIL THEN
      FREE bav$auxilliary_request_table^ [art_index].file_attributes IN osv$task_private_heap^;
      bav$auxilliary_request_table^ [art_index].file_attributes := NIL;
    IFEND;
    IF file_attributes <> NIL THEN
      ALLOCATE bav$auxilliary_request_table^ [art_index].file_attributes:
            [LOWERBOUND (file_attributes^) .. UPPERBOUND (file_attributes^)] IN osv$task_private_heap^;
      bav$auxilliary_request_table^ [art_index].file_attributes^ := file_attributes^;
    IFEND;

  PROCEND bap$store_art_table_pointer;
?? OLDTITLE ??
?? NEWTITLE := '[inline] FETCH_ART_INDEX', EJECT ??

  PROCEDURE [INLINE] fetch_art_index
    (    lfn: amt$local_file_name;
     VAR art_index: bat$art_limit;
     VAR found: boolean);

    found := FALSE;
    IF bav$auxilliary_request_table <> NIL THEN

    /search_for_entry/
      FOR art_index := 1 TO bav$last_art_entry DO
        IF bav$auxilliary_request_table^ [art_index].local_file_name = lfn THEN
          found := TRUE;
          EXIT /search_for_entry/; {----->
        IFEND;
      FOREND /search_for_entry/;
    IFEND;

  PROCEND fetch_art_index;
?? OLDTITLE ??
?? NEWTITLE := '[inline] FIND_ART_ENTRY', EJECT ??

  PROCEDURE [inline] find_art_entry
    (    lfn: amt$local_file_name;
     VAR art_index: bat$art_limit;
     VAR status: ost$status);

    VAR
      entry_found: boolean;

    status.normal := TRUE;
    IF bav$auxilliary_request_table = NIL THEN
      ALLOCATE bav$auxilliary_request_table IN osv$task_private_heap^;
    IFEND;

    fetch_art_index (lfn, art_index, entry_found);
    IF NOT entry_found THEN

    /art_null_search/
      BEGIN
        FOR art_index := 1 TO bav$last_art_entry DO
          IF bav$auxilliary_request_table^ [art_index].local_file_name = osc$null_name THEN
            entry_found := TRUE;
            EXIT /art_null_search/; {----->
          IFEND;
        FOREND;
        IF (bav$last_art_entry < bac$art_size) THEN
          bav$last_art_entry := bav$last_art_entry + 1;
          art_index := bav$last_art_entry;
          entry_found := TRUE;
        IFEND;
      END /art_null_search/;

      IF entry_found THEN
        bav$auxilliary_request_table^ [art_index].local_file_name := lfn;
        bav$auxilliary_request_table^ [art_index].file_attributes := NIL;
      ELSE
        osp$set_status_abnormal (amc$access_method_id, fme$system_error, 'amp$file table overflow', status);
      IFEND;
    IFEND;

  PROCEND find_art_entry;
?? OLDTITLE ??
MODEND bam$store_art_table_pointer;
