FTN4
      LOGICAL FUNCTION TSWR(MEDIA,INDIC,ISTAT,KBIN,KSCE,IBUF,IHD), 92903
     C-16313 REV.1913  790112 1715
C 
C     SOURCE 92903-18313
C 
C 
C 
C     **************************************************************
C     * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  ALL RIGHTS    *
C     * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- *
C     * PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH-  *
C     * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.  *
C     **************************************************************
C 
C 
C 
C     PROGRAMMER *JCM* HPG
C*********************************************************************
C*                                                                   *
C*             THIS LOGICAL FUNCTION WRITES A TRANSACTION SPECIFICA- *
C*   TION ON A GIVEN MEDIA SPECIFIED BY THE USER .                   *
C*                                                                   *
C*           A TRUE VALUE IS RETURNED IF THE WRITE OPERATION FAILS   *
C*           A FALSE VALUE IS RETURNED IF THE WRITE SUCCEEDS         *
C*                                                                   *
C*         DEFINITION OF PARAMETERS :                                *
C*                                                                   *
C*    MEDIA(4) : IS A 4 WORDS LONG BUFFER DEFINES THE MEDIA WHERE    *
C*               THE TRANS. SPECS. MUST BE STORED :                  *
C*                   -IF A DISC FILE THE FIRST 3 WORDS ARE FILE NAME *
C*                    AND THE FOURTH CR# (0 IF NOT GIVEN)            *
C*               IF MEDIA(1) IS   > 0    AN OPEN/REWIND OF THE MEDIA *
C*               IS PERFORMED                                        *
C*               IF MEDIA(1) IS   < 0    NO OPEN/NO REWIND           *
C*                                                                   *
C*    INDIC    : IS A 1 WORD LONG VARIABLE TO SPECIFY WHAT OPERATION *
C*               IS TO BE PERFORMED :                                *
C*                 INDIC=0  : A NEW MEDIA IS USED (IF DISC FILE      *
C*                            CREATE FILE)                           *
C*                      =1  : OLD MEDIA * WRITE THE SPECS AT CURRENT *
C*                            POSITION IN FILE                       *
C*                      =2  : OLD MEDIA * PERFORM A BACKSPACE BEFORE *
C*                            WRITING THE SPECS                      *
C*                      =3  : CLOSE MEDIA * WRITE EOF                *
C*                      =4  : CREATE NEW MEDIA ,WRITE HEADER         *
C*                                                                   *
C*   ISTAT     : IS A 1 WORD LONG VARIABLE TO RETURN THE STATUS OF   *
C*               THE PERFORMED OPERATION  :                          *
C*                 ISTAT=0   : NO ERROR                              *
C*                      =1   : FILE TYPE IS NOT GOOD                 *
C*                      =2   : EOF FOUND                             *
C*                      =4   : ILLEGAL PARAMETER                     *
C*                      =5   : ERROR IN   LOCKING TYPE 0 LU          *
C*                      =6   : ERROR IN UNLOCKING TYPE 0 LU          *
C*                      <0   : FMGR ERROR                            *
C*                                                                   *
C*                                                                   *
C*   KBIN      : ADDRESS OF STORAGE BUFFER FOR BINARY SPECS          *
C*                                                                   *
C*   KSCE      : ADDRESS OF STORAGE BUFFER FOR SOURCE SPECS          *
C*                                                                   *
C*   IBUF      : 144 WORDS LONG BUFFER (IDCB BUFFER)                 *
C*                                                                   *
C*   IHD       : 15 WORDS LONG BUFFER CONTAINING THE LIBRARY HEADER  *
C*               WRITTEN ON THE MEDIA ONLY IF INDIC=0                *
C*                                                                   *
C*********************************************************************
C*
C*
C*
      INTEGER CREATE,OPEN 
      LOGICAL IRW,WRITF,POSNT,RWNDF,POST
      DIMENSION MEDIA(1),KBIN(1),KSCE(1),IBUF(1),ISIZE(2),IHD(1)
C-----"INREC1" IS THE LENGTH OF THE 1ST RECORD. AS A NEW VERSION OF TGP 
C     IS RELEASED, THE VALUE OF "INREC1" SHOULD BE INCREMENTED BY 1 SO
C     THAT OLDER TRANSACTIONS CAN NO LONGER BE READ BY THE NEW VERSION
C     & NO MIX-UP CAN OCCUR. THE SAME VARIABLE (INREC1) SHOULD BE 
C     SIMILARLY CHANGED IN "TSWR".
      DATA INREC1/11/ 
C 
C 
C INITIALISE LOGICAL FLAGS
C 
C  IRW : IF TRUE MUST REWIND
C 
      TSWR=.FALSE.
      IRW=.FALSE. 
      K=(KBIN-INREC1)/127 
      IR=(KBIN-INREC1)-127*K
C 
C 
C  CHECK CALLING PARAMETERS 
C 
      IF((MEDIA.NE.0).AND.(INDIC.GE.0)) GO TO 100 
      ISTAT=4 
      GO TO 900 
C 
C  REWIND AND OPEN ?
C 
100   IF(MEDIA.GT.0) IRW=.TRUE. 
      ISAV=MEDIA
      IF(MEDIA.LT.0) MEDIA=-MEDIA 
C 
      GO TO 500 
C 
C  NORMAL RETURN
C 
270   ISTAT=0 
      MEDIA=ISAV
      RETURN
C 
C 
C  ERROR RETURN 
C 
900   TSWR=.TRUE. 
      MEDIA=ISAV
      RETURN
C 
C 
C  IF INDIC=3 CLOSE FILE
C 
500   IF(INDIC.NE.3) GO TO 505
      IF(WRITF(IBUF,ISTAT,IHD,-1)) GO TO 900
      JLU=0 
C-----TYPE 0 FILE?
      IF(IBUF(3).EQ.0) JLU=IAND(77B,IBUF(4))
      CALL CLOSE(IBUF)
      IF(JLU.EQ.0) GO TO 270
C-----TYPE 0 FILE 
C-----REWIND, STANDBY 
      CALL EXEC(3,500B+JLU) 
C-----UNLOCK IT BEFORE EXITING
      IF(LURQ(100000B,JLU,1).EQ.0) GO TO 270
C-----ERROR, UNABLE TO UNLOCK IT. 
      ISTAT=6 
      GO TO 900 
C 
C  IF INDIC=0 CREATE DISC FILE
C 
505   IF((INDIC.NE.0).AND.(INDIC.NE.4)) GO TO 510 
      IF(OPEN(IBUF,ISTAT,MEDIA,0,0,MEDIA(4)).LT.0) GO TO 508
      IF(ISTAT.NE.0) GO TO 506
C-----TYPE 0 FILE?
      IF(IBUF(3).EQ.0) GO TO 517
506   ISTAT=-2
      GO TO 900 
508   IF(ISTAT.NE.-6) GO TO 506 
      ISIZE=128 
      IF(CREAT(IBUF,ISTAT,MEDIA,ISIZE,35,0,MEDIA(4)).LT.0) GO TO 900
C 
C  OPEN/REWIND ?
C 
510   IF(.NOT.(IRW)) GO TO 520
      IF(OPEN(IBUF,ISTAT,MEDIA,0,0,MEDIA(4)).LT.0) GO TO 900
C-----TYPE 0 FILE?
      IF(ISTAT.EQ.35) GO TO 519 
      IF(ISTAT.EQ.0)  GO TO 517 
      ISTAT=1 
      GO TO 900 
C 
C-----TYPE 0 FILE, GET LU NO. 
C 
517   JLU=IAND(377B,IBUF(4))
C-----LOCK IT W/O WAIT. 
      IF(LURQ(100001B,JLU,1).EQ.0) GO TO 519
C-----ERROR, UNABLE TO LOCK IT. 
C-----CLOSE IT BEFORE EXITING 
      CALL CLOSE(IBUF)
      ISTAT=5 
      GO TO 900 
C 
519   IF(RWNDF(IBUF,ISTAT)) GO TO 900 
C 
C  BACKSPACE ?
C 
520   IF((INDIC.NE.0).AND.(INDIC.NE.4)) GO TO 525 
      IF(WRITF(IBUF,ISTAT,IHD,15)) GO TO 900
      IF(INDIC.EQ.4) GO TO 270
525   IF(INDIC.NE.2) GO TO 530
      IF(POSNT(IBUF,ISTAT,-1)) GO TO 900
C 
C   WRITE FIRST RECORD
C 
530   IF(WRITF(IBUF,ISTAT,KBIN,INREC1)) GO TO 900 
C 
C  WRITE BINARY SPECS 
C 
540   L=127 
      DO 560 I=1,K+1
      IF((I.EQ.K+1).AND.(IR.EQ.0)) GO TO 570
      IF(I.EQ.K+1) L=IR 
      IF(WRITF(IBUF,ISTAT,KBIN(INREC1+1+(I-1)*127),L)) GO TO 900
560   CONTINUE
C 
C  WRITE SOURCE SPECS 
C 
570   L=127 
      DO 600 I=1,21 
      IF(I.EQ.21) L=7 
      IF(WRITF(IBUF,ISTAT,KSCE(1+(I-1)*127),L)) GO TO 900 
600   CONTINUE
C 
      GO TO 270 
C 
      END 
      END$
                                                                                                                                                                                                        