[comp.sys.apollo] Cleanup Handler

hanyak@garnet.bucknell.EDU ("M.E. Hanyak") (12/30/88)

   Can anyone assist me on the use of PFM_$CLEANUP?

I'm using it in a menu-driven program to trap either
runtime errors or <CTRL/Q>.  My intent is to allow the
user to use <CTRL/Q> to get from anywhere in the menu
tree back to the top-level menu.

However, I am running into the following problem.
Whenever the user types <CTRL/Q> in respond to a menu
prompt, an interrupt occurs in the middle of a FORTRAN
READ and the cleanup handler functions properly, but
when the next READ is down the following error occurs:

      ?(ftnlib) Using Unit 5 connected to input pad
      for formatted sequential access - recursive use
      of FORTRAN IO (library/IO)

How do I prevent this error from being issued?

A synopsis of my cleanup handler code is given below:

      PROGRAM  MAIN
C
      INTEGER*4  HANDLR(2)
      INTEGER*4  STATUS
      CHARACTER  REPLY*80
C
C:               HANDLR - unique identifier for the cleanup handler.
C:               STATUS - status code returned by cleanup handler.
C:               REPLY  - the reply line supplied by the user.
C
C
C:               Mark the next statement to which control passes
C:               when either the <CTRL/Q> sequence is hit or a
C:               runtime error happens.
C:
      STATUS = PFM_$CLEANUP (HANDLR)
C
C:               Start the BUTS program.  This is the normal startup.
C
      IF     (STATUS .EQ. PFM_$CLEANUP_SET)   THEN
         CALL   BUTS
C
C:               Execute cleanup by closing the following files
C:               before proceeding with the BUTS menu prompt:
C:
C:                    Unit  1  -  a BUTS user library file.
C:                    Unit  2  -  a BUTS public library file.
C:                    Unit 29  -  a TAKE file of input responses.
C:                    Unit 98  -  a read/write temporary file.
C:                    Unit 99  -  a read/write temporary file.
C:
C:               This step only occurs when either <CTRL/Q> is hit
C:               or a runtime error happens.
C
      ELSE
         CLOSE  ( UNIT =  1 )
         CLOSE  ( UNIT =  2 )
         CLOSE  ( UNIT = 29 )
         CLOSE  ( UNIT = 98 )
         CLOSE  ( UNIT = 99 )
C
         CALL   PFM_$RESET_CLEANUP (HANDLR,   STATUS)
C
C
C:                      Ask user if he or she wishes to continue.
C
         PRINT*
         CALL   AREPLY (1, 'Continue menu prompts (y/n)...? ',  REPLY)
C
         IF     (REPLY(1:1) .EQ. 'Y')     CALL   DRIVER
      ENDIF
C
      END


Thanks in Advanced,

      Mike  Hanyak
      Chem. Eng. Dept.
      Bucknell University
      Lewisburg, PA