*copyc OSD$DEFAULT_PRAGMATS
MODULE iim$close;
?? TITLE := 'MODULE iim$close' ??

?? PUSH (LISTEXT := ON) ??
*copyc AMT$FILE_IDENTIFIER
*copyc AMP$CLOSE
*copyc IIT$CONNECTION_DESCRIPTION
*copyc IIP$CLEAR_LOCK
*copyc IIP$FREE_QUEUE_ENTRY
*copyc IIV$INTERACTIVE_TERMINATED
*copyc IIP$PUT
*copyc IIP$REPORT_STATUS_ERROR
*copyc IIP$SIGN_OFF
*copyc IIP$SKIP_TO_EOR
*copyc iip$flush
*copyc IIP$SET_LOCK
*copyc IIV$INT_TASK_OPEN_FILE_COUNT
*copyc OST$STATUS
?? POP ??

?? NEWTITLE := 'PROCEDURE iip$close', EJECT ??

  PROCEDURE [XDCL, #GATE] iip$close (file_id: amt$file_identifier;
    VAR open_file_desc_pointer: ^iit$open_file_description;
    VAR status: ost$status);

    VAR
      open_file_entry_descriptor: iit$queue_entry_descriptor,
      local_status: ost$status;

{ Return with normal status if the file is not open because BAM must close file.

      status.normal := TRUE;

      IF open_file_desc_pointer = NIL THEN
        RETURN;
      IFEND;

{ Close the prompt file if the system has opened it.

    IF ((open_file_desc_pointer^.attributes.prompt_file_identifier.value.ordinal <> 0) AND
          (open_file_desc_pointer^.attributes.prompt_file_identifier.
          source = ifc$os_default)) THEN
      amp$close (open_file_desc_pointer^.attributes.prompt_file_identifier.value, local_status);
    IFEND;

{ Decrement task open file count.

    IF iiv$int_task_open_file_count > 0 THEN
    iiv$int_task_open_file_count := iiv$int_task_open_file_count - 1;
    IFEND;

{ Terminate the previous record if at mid_record.

    IF iiv$put_info.last_term_option <> amc$terminate THEN
      iip$put (file_id, open_file_desc_pointer, amc$put_partial_req, NIL, 0,
        NIL, amc$terminate, local_status);
    IFEND;
    iip$flush (file_id, open_file_desc_pointer, local_status);

    IF (iiv$int_task_open_file_count = 0) THEN

{ Decrement interactive task count.

      iip$set_lock (iiv$interactive_task_count_lock, osc$wait, local_status);
      iiv$interactive_task_count := iiv$interactive_task_count - 1;
      iip$clear_lock (iiv$interactive_task_count_lock, local_status);

      iip$sign_off (iiv$int_application_name, local_status);

    IFEND;

    open_file_entry_descriptor.open_file_description_ptr :=
      open_file_desc_pointer;
    iip$free_queue_entry (iic$open_file_description,
      open_file_entry_descriptor, local_status);

  PROCEND iip$close;

MODEND iim$close;
