FTN4
      PROGRAM RECOV(4,99),92069-16134 REV.2013 791214 
C 
C 
C****************************************************************** 
C (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS RESERVED 
C NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, REPRODUCED, OR
C TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT THE PRIOR WRITTEN
C CONSENT OF HEWLETT-PACKARD COMPANY. 
C****************************************************************** 
C 
C 
C     SOURCE:    92069-18134
C     RELOC:     92069-16134
C 
C     PRGMR:     JC,CEJ,CSN 
C 
C 
C****************************************************************** 
C 
C 
C 
C ********************************************************************
C                          *** COMMON *** 
C 
      COMMON COTBL(540),COSIZ,ENTSZ,LINE(40),DNODE,RMOTE,DBCOP(3) 
      COMMON LUIN,LIST,LULOG,RDTBL(160),BPSIZ,BPNAM,BPNOD 
C 
C ********************************************************************
C                         DECLARATIONS
C 
      INTEGER       LUIN,LIST,LULOG 
      INTEGER       INBUF(561),NMBUF(10),LINE,PBUF(5) 
      INTEGER       DBCOP,COTBL,COSIZ,ENTSZ 
      INTEGER       DNODE,RDTBL,BPSIZ,BPNAM,BPNOD 
      INTEGER       ILENG,ISTRC,FCODE,ERROR,QWAIT,GET 
      INTEGER       NULL,DASH,BLANK,STAR,SHFT8
      INTEGER       MNAME(3),MNODE
C 
      LOGICAL       QUIT,YES,IFTTY,RMOTE
C 
      INTEGER       MSG1(27),MSG2(7),MSG5(13),MSG9(5),MSG10(10) 
      COMPLEX       MSG3(2),MSG4,MSG6(3),MSG7(6),MSG8(3)
      COMPLEX       IMHDR(3)
C 
C 
      DATA          QWAIT/23/,GET/21/,NULL/-1/,SHFT8/256/ 
      DATA          DASH/2H--/,BLANK/2H  /,STAR/2H**/ 
C 
      DATA  IMHDR /8HIMAGE/10,8H00 RECOV,8H UTILITY/
      DATA  MSG1  /2HWO,2HUL,2HD ,2HYO,2HU ,2HLI,2HKE,2H T,2HO ,
     &             2HCL,2HEA,2HN ,2HUP,2H A,2HFT,2HER,2H A,2H P,
     &             2HRO,2HGR,2HAM,2H (,2HYE,2HS/,2HNO,2H) ,2H _/
      DATA  MSG2  /2HPR,2HOG,2HRA,2HM ,2HNA,2HME,2H _/
      DATA  MSG3  /8HBAD PROG,8HRAM NAME/ 
      DATA  MSG4  /8HDONE.   /
      DATA  MSG5  /2HDA,2HTA,2H B,2HAS,2HE ,2H  ,2H  ,2H  ,2H R,
     &             2HEL,2HEA,2HSE,2HD./ 
      DATA  MSG6  /8HCLEAN UP,8H UNSUCCE,8HSSFUL.  /
      DATA  MSG7  /8HUNABLE T,8HO OBTAIN,8H CURRENT,8H DATA BA, 
     &             8HSE INFOR,8HMATION. / 
      DATA  MSG8  /8HUNABLE T,8HO LOCK L,8HIST LU. /
      DATA  MSG9  /2HEN,2HD ,2HRE,2HCO,2HV./
      DATA  MSG10 /2H/R,2HEC,2HOV,2H -,2H I,2HLL,2HEG,2HAL,2H L,2HU./ 
C 
C ********************************************************************
C                          SUBROUTINES
C 
C   DSPLA -DISPLAYS THE CURRENT DATA BASE ENTRIES IN DBCOP'S
C          COORDINATING TABLE AND, IF AVAILABLE, THE REMOTE MASTERS 
C          ASSOCIATED WITH RDBAP COPIES FROM RDBAM'S TABLE. 
C 
C   FINDB -FINDS AND RETURNS ALL THE DATA BASE NAMES AND CRNS ASSOCIATED
C          WITH THE PROGRAM WHOSE NAME IS ENTERED BY THE USER IN RE-
C          SPONSE TO THE QUERY: PROGRAM NAME? 
C 
C   SERCH -FINDS AND RETURNS THE NAME AND NODE NUMBER OF THE MASTER 
C          PROGRAM ASSOCIATED WITH AN REBAP COPY. 
C 
C   ANSWR -INPUTS A USER'S (YES/NO) RESPONSE AND RETURNS LOGICAL T/F. 
C 
C   PUT   -PERFORMS AN EXEC CALL FOR OUTPUT TO A DEVICE.
C 
C   INPUT -PERFORMS AN EXEC CALL FOR INPUT FROM A DEVICE. 
C 
C   RMNF  -GETS A COPY OF THE RDBAP SCHEDULING TABLE IF AVAILABLE 
C          AND RETURNS THE VALUE TRUE, ELSE RETURNS THE VALUE FALSE 
C 
C   RMCLN -SENDS A CLEAN-UP MESSAGE TO RDBAM FOR A SPECIFIC MASTER
C          PROGRAM. 
C 
C ********************************************************************
C                       *** SAMPLE OUTPUT *** 
C 
C  ***
C   NO REMOTE DATA BASE ACCESS
C  ***
C 
C   IMAGE/1000 RECOV UTILITY
C 
C   *********************************************** 
C      DB NAME      CART #      MODE      OPEN TO 
C   ----------------------------------------------- 
C 
C         DB1           12         3        PROG1 
C 
C         DB2           49         1        PROG2 
C                                           PROG3 
C                                           PROG4 
C 
C         DB3         1003         8        DBSPA 
C 
C   *********************************************** 
C 
C   END RECOV 
C 
C *** 
C  WITH REMOTE DATA BASE ACCESS 
C *** 
C   IMAGE 1000 RECOV UTILITY
C 
C   ********************************************************************
C      DB NAME      CART #      MODE      OPEN TO      MASTER      NODE 
C   --------------------------------------------------------------------
C 
C         DB1          12         3        PROG1
C 
C         RB4           4         1        RDB02        PROG8        8
C                                          PROG2
C 
C         RB9           9         8        RDB03        PROG2        2
C                                          DBSPA
C 
C   ********************************************************************
C 
C   END RECOV 
C 
C ********************************************************************
C                       *** INITIALIZATION ***
      COSIZ = 20
      ENTSZ = 27
      DBCOP(1) = 2HDB 
      DBCOP(2) = 2HCO 
      DBCOP(3) = 2HP
      BPSIZ = 8 
      BPNAM = 4 
      BPNOD = 3 
C ********************************************************************
C                          *** MAIN *** 
C     RETRIEVE INVOKING PARAMETERS FROM COMMAND STRING
C 
      CALL GETST(INBUF,-80,ILENG) 
      ISTRC = 1 
C 
C     GET INPUT DEVICE
C 
      IF (NAMR(NMBUF,INBUF,ILENG,ISTRC)) 4,3
C 
C     SKIP TO 5 IF NAMR(COMMAND STRING) YIELDED NON-NULL LEGAL LUIN DEVICE
C 
3     IF ((IAND(NMBUF(4),003B).EQ.1).AND.(NMBUF(1).GE.0)
     &     .AND.(NMBUF(1).LE.255B)) GO TO 5 
        NMBUF(1) = -2 
        IF (NMBUF(4).NE.0) GO TO 5
C 
C       SET THE INPUT DEVICE TO -1 FOR EASY DEFAULT LATER.
C 
4       NMBUF(1) = -1 
5     LUIN = NMBUF(1) 
C 
C     GET LIST DEVICE 
C 
      IF (NAMR(NMBUF,INBUF,ILENG,ISTRC)) 9,8
C 
C     SKIP TO 10 IF LIST NON-NULL AND LEGAL 
C 
8     IF ((IAND(NMBUF(4),003B).EQ.1).AND.(NMBUF(1).GE.0)
     &     .AND.(NMBUF(1).LE.255B)) GO TO 10
        NMBUF(1) = -2 
        IF (NMBUF(4).NE.0) GO TO 10 
C 
C     FOR DEFAULT OF LIST DEVICE BELOW, SET LIST DEVICE TO -1 NOW.
C 
9       NMBUF = -1
C 
10    LIST = NMBUF(1) 
C     GET SCHEDULER'S NODE NUMBER.  IF DEFAULTED OR EQUAL TO THE LOCAL
C       NODE, SET IT TO -1. 
C 
      CALL NAMR(NMBUF,INBUF,ILENG,ISTRC)
        IF (IAND(NMBUF(4),003B).NE.1) NMBUF(1) = -1 
        IF (NMBUF(1).EQ.NODE(IDUM)) NMBUF(1) = -1 
15    DNODE = NMBUF(1)
C 
C     SET ERROR LOGGING LU TO 1 FOR NOW.
C 
      LULOG = 1 
C 
C     NOW SET THE DEFAULT INPUT DEVICE.  IF LUIN IS -1, THEN IF REMOTE
C       SCHEDULE, DEFAULT IT TO 1, ELSE CALL LOGLU.  IF LUIN IS -2, 
C       BRANCH TO PRINT ERROR MESSAGE.
C 
      IF (LUIN.GE.0) GO TO 16 
      IF (LUIN.EQ.-2) GO TO 300 
      LUIN = 1
      IF (DNODE.NE.-1) GO TO 16 
      LUIN = LOGLU(IDUM)
C 
C     NOW SET THE DEFAULT LIST DEVICE.  IF LIST IS -1, THEN IF LUIN IS
C       INTERACTIVE OR REMOTE, SET LIST TO IT, ELSE SET LIST TO 6.
C       IF LIST IS -2, BRANCH TO PRINT ERROR MESSAGE. 
C 
16    IF (LIST.GE.0) GO TO 18 
      IF (LIST.EQ.-2) GO TO 300 
      LIST = 6
      IF (DNODE.NE.-1) GO TO 17 
        IF (.NOT.IFTTY(LUIN)) GO TO 18
17    LIST = LUIN 
C 
C     DETERMINE THE LU OF THE DEVICE TO WHICH ANY ERRORS ARE LOGGED.
C       THIS IS LUIN, IF INTERACTIVE OR REMOTE, ELSE IT REMAINS LU 1. 
C 
18    IF (DNODE.NE.-1) GO TO 19 
        IF (.NOT.IFTTY(LUIN)) GO TO 20
19    LULOG = LUIN
C 
C     IF THE INPUT DEVICE IS NOT INTERACTIVE AND NOT REMOTE, JUST PRINT 
C       OUT THE TABLE AND TERMINATE.
C 
20    IF (DNODE.NE.-1) GO TO 25 
      IF (IFTTY(LUIN))  GO TO 25
        CALL DSPLA(ERROR) 
        GO TO 100 
25    CONTINUE
C 
C     INPUT DEVICE IS INTERACTIVE.  PUT OUT RECOV HEADER. 
C 
      CALL PUT(BLANK,LUIN,1,ERROR)
        IF (ERROR.NE.0) GO TO 130 
      CALL PUT(IMHDR,LUIN,12,ERROR) 
        IF (ERROR.NE.0) GO TO 130 
      QUIT = .FALSE.
C 
C     DO WHILE(QUITFLAG=FALSE)
C 
30    IF (QUIT)  GO TO 120
C 
C       DISPLAY THE CURRENT COORDINATING TABLE- EXIT WHILE ON ERROR 
C 
        CALL DSPLA(ERROR) 
        IF (ERROR.NE.0) GO TO 100 
C 
C       ASK IF USER WANTS TO CLEAN UP AFTER A PROGRAM.
C 
        CALL PUT(MSG1,LUIN,27,ERROR)
        IF (ERROR.NE.0) GO TO 130 
        CALL ANSWR(YES,ERROR) 
        IF (ERROR.NE.0) GO TO 130 
        IF (.NOT.YES) GO TO 80
C 
C         ASK FOR PROGRAM NAME. 
C 
          DO 35 I=1,3 
            NMBUF(I) = 2H 
35        CONTINUE
          CALL PUT(MSG2,LUIN,7,ERROR) 
          IF (ERROR.NE.0) GO TO 130 
          ILENG = 3 
          CALL INPUT(NMBUF,ILENG,ERROR) 
          IF (ERROR.NE.0) GO TO 130 
C 
C       MAKE SURE PROGRAM IS IN OUR LIST AND GET ITS ASSOCIATED DATA BASE 
C         NAMES AND CRNS. 
C 
      CALL FINDB(NMBUF,INBUF,ERROR) 
        IF (ERROR.NE.0) GO TO 78
C 
C       SEE IF PROGRAM TO CLEAN-UP AFTER IS AN RDBAP COPY.  THE FIRST 
C         THREE CHARACTERS OF THE NAME ARE 'RDB' IN THIS CASE.
C 
      IF (.NOT.RMOTE) GO TO 50
        IF (NMBUF(1).NE.2HRD)  GO TO 50 
        IF (IOR(IAND(NMBUF(2),177400B),40B).NE.2HB )  GO TO 50
C 
C       AN RDBAP COPY, GET ITS MASTER'S NAME AND NODE NUMBER THEN SEND A
C       MESSAGE TO RDBAM TO REMOVE IT.
C 
          CALL SERCH(NMBUF,MNAME,MNODE,ERROR) 
            IF (ERROR.NE.0) GO TO 50
          CALL RMCLN(MNAME,MNODE,ERROR) 
            IF (ERROR.NE.0) GO TO 70
C 
C    FOR EACH DATA BASE NAME IN INBUF:
C 
C           SCHEDULE DBCOP(NO ABORT) TO DELETE COORD TABLE ENTRY
C 
50    CONTINUE
      DO 67 K=1,561,4 
        IF (INBUF(K).EQ.NULL) GO TO 68
            FCODE = 3 * SHFT8 
            CALL EXEC(QWAIT+100000B,DBCOP,FCODE,INBUF(K),INBUF(K+1),
     &               INBUF(K+2),INBUF(K+3),NMBUF,3) 
               GO TO 70 
60          ERROR = 0 
            CALL RMPAR(PBUF)
C 
C           CHECK PBUF(1) ERROR FLAG
C 
          IF (PBUF(1).EQ.0) GO TO 65
          IF (PBUF(1).NE.103)  GO TO 70 
            GO TO 67
C 
C             PRINT DB RELEASED IF #USERS=0 
C 
65            IF (PBUF(2).GT.0) GO TO 67
                CALL SMOVE(INBUF(K),1,6,MSG5,11)
                CALL PUT(MSG5,LUIN,13,ERROR)
                  IF (ERROR.NE.0) GO TO 130 
67            CONTINUE
C 
C    PRINT CLEAN-UP DONE MESSAGE. 
C 
68        CONTINUE
          CALL PUT(MSG4,LUIN,4,ERROR) 
            IF (ERROR.NE.0) GO TO 130 
          GO TO 90
C 
C             PRINT CLOSURE UNSUCCESSFUL MESSAGE. 
C 
70            CALL PUT(MSG6,LUIN,12,ERROR)
                IF (ERROR.NE.0) GO TO 130 
              GO TO 90
75          CONTINUE
          CONTINUE
C 
C         PRINT BAD PROGRAM NAME MESSAGE. 
C 
78          CALL PUT(MSG3,LUIN,8,ERROR) 
              IF (ERROR.NE.0) GO TO 130 
            GO TO 90
C 
C         ELSE (IF DON'T WANT TO CLEAN UP AFTER A PROGRAM)
C 
80        QUIT = .TRUE. 
        CONTINUE
90    CONTINUE
      GO TO 30
C 
C     END WHILE 
C 
100   CONTINUE
      IF (ERROR.EQ.0) GO TO 120 
C 
C     INCASE(ERROR) 
C 
        IF (ERROR.NE.1) GO TO 110 
          CALL PUT(MSG7,LULOG,24,ERROR) 
          GO TO 120 
C 
110     IF (ERROR.NE.2) GO TO 130 
          CALL PUT(MSG8,LULOG,12,ERROR) 
120   CONTINUE
C 
C     END INCASE
C 
C     PRINT END MESSAGE IF LUIN IS REMOTE AND/OR INTERACTIVE. 
C 
      IF (RMOTE) GO TO 125
      IF (.NOT.IFTTY(LUIN)) GO TO 130 
125   CALL PUT(MSG9,LUIN,5,ERROR) 
130   CONTINUE
      STOP
C 
C     HERE ON AN ILLEGAL LU NUMBER IN RUN STRING.  PRINT ERROR MESSAGE: 
C 
C     /RECOV - ILLEGAL LU.
C 
C     AND STOP. 
C 
300   CALL PUT(MSG10,LULOG,10,ERROR)
      GO TO 130 
      END 
C 
C 
C 
C 
      SUBROUTINE DSPLA(ERR) 
C 
C ********************************************************************
C                           *** COMMON ***
C 
      COMMON COTBL(540),COSIZ,ENTSZ,LINE(40),DNODE,RMOTE,DBCOP(3) 
      COMMON LUIN,LIST,LULOG,RDTBL(160),BPSIZ,BPNAM,BPNOD 
C 
C ********************************************************************
C 
      INTEGER       COTBL,COSIZ,ENTSZ,LINE,PBUF(5),DBCOP
      INTEGER       DNODE,RDTBL,BPSIZ,BPNAM,BPNOD 
      INTEGER       ASCII(3),FCODE,QWAIT,GET,CLASS,EBASE,NULL,ERR,LIST
      INTEGER       TBLEN,SHFT8 
      INTEGER       ENAME,UNLCK 
      LOGICAL       RMNF,RMOTE,IFTTY
      COMPLEX       TBHDR(6)
C 
      DIMENSION     MNAME(3)
C 
C ********************************************************************
C 
      DATA           LOCK/040001B/,UNLCK/140000B/ 
        DATA        QWAIT/23/,GET/21/,DASH/2H--/,BLANK/2H  /,STAR/2H**/ 
        DATA        NULL/-1/,SHFT8/256/ 
        DATA  TBHDR/8HDB NAME ,8H CART # ,8H   MODE ,8H OPEN TO,
     &               8H  MASTER,8H   NODE / 
C ********************************************************************
C 
C 
C     SCHEDULE DBCOP TO ACCESS COORDINATING TABLE.
C 
      FCODE = -1
      CALL EXEC(QWAIT+100000B,DBCOP,FCODE)
          GO TO 50
10    CALL RMPAR(PBUF)
C 
C     TEST FOR DBCOP ERROR
C 
      IF (PBUF(1).NE.0) GO TO 50
      CLASS = IAND(PBUF(2),017777B) 
C 
C     GET COPY OF COORD TABLE FROM SAM. 
C 
      CALL EXEC(GET+100000B,CLASS,COTBL,COSIZ*ENTSZ)
          GO TO 50
C 
C     IF OUTPUT DEVICE NON-INTERACTIVE, LOCK IT.
C 
20    IF (IFTTY(LIST))  GO TO 21
        IF (DNODE.NE.-1)  GO TO 21
          CALL LURQ(LOCK,LIST,1)
            GO TO 55
C 
C     DETERMINE IF WE CAN PRINT REMOTE DATA BASE ACCESS INFORMATION.
C       IF SO, MAKE A COPY OF THE RDBAP COPY TABLE AND SET OUR FLAGS, 
C       AND OUTPUT LENGTH.
C 
21    RMOTE = RMNF(RDTBL) 
      LINLN = 16
      IF (RMOTE) LINLN = 24 
C 
C     PRINT HEADER: 
C 
C  ***********************************************[*******************] 
C     DB NAME      CART #      MODE      OPEN TO  [   MASTER     NODE ] 
C  -----------------------------------------------[-------------------] 
C 
C     WHERE THE CHARACTERS IN BRACKETS ([]) ARE PRINTED ONLY IF WE CAN
C     REPORT ON REMOTE ACCESS.
C 
      CALL PUT(BLANK,LIST,1,ERR)
        IF (ERR.NE.0) GO TO 60
      CALL SFILL(LINE,1,LINLN*2,STAR) 
      CALL PUT(LINE,LIST,LINLN,ERR) 
        IF (ERR.NE.0) GO TO 60
      CALL PUT(TBHDR,LIST,LINLN,ERR)
        IF (ERR.NE.0) GO TO 60
      CALL SFILL(LINE,1,LINLN*2,DASH) 
      CALL PUT(LINE,LIST,LINLN,ERR) 
        IF (ERR.NE.0) GO TO 60
      CALL PUT(BLANK,LIST,1,ERR)
        IF (ERR.NE.0) GO TO 60
C 
      CALL SFILL(LINE,1,LINLN*2,BLANK)
C 
C     PRINT COORDINATING TABLE
C 
C     PRINT EVERY NON-NULL ENTRY OF THE COORD TABLE 
C 
      TBLEN = COSIZ*ENTSZ 
      DO 40 EBASE=1,TBLEN,ENTSZ 
        IF (COTBL(EBASE).EQ.NULL) GO TO 40
C         BUFF UP DBNAME
          CALL SMOVE(COTBL(EBASE),1,6,LINE,2) 
C         BUF UP CARTRIDGE #
          CALL CNUMD(COTBL(EBASE+3),ASCII)
          CALL SMOVE(ASCII,1,6,LINE,10) 
C         BUFF UP OPEN MODE (IN LEFT BYTE)
          CALL CNUMD(COTBL(EBASE+4)/SHFT8,ASCII)
          CALL SMOVE(ASCII,1,6,LINE,17) 
C         BUFF UP FIRST USER PROGRAM NAME IN THIS LINE
          DO 30 ENAME=EBASE+6,EBASE+ENTSZ-3,3 
            IF (COTBL(ENAME).EQ.NULL) GO TO 30
              CALL SMOVE(COTBL(ENAME),1,6,LINE,27)
C             IF WE ARE PRINTING REMOTE MONITOR PROGRAMS, SEE IF A MASTER 
C               FOR THIS PROGRAM EXISTS.
              IF (.NOT.RMOTE) GO TO 25
                CALL SERCH(COTBL(ENAME),MNAME,MNODE,ERR)
                IF (ERR.NE.0) GO TO 25
C               A MASTER PROGRAM, BUFF UP ITS NAME
                CALL SMOVE(MNAME,1,6,LINE,35) 
C               BUFF UP MASTER'S NODE NUMBER
                CALL CNUMD(MNODE,ASCII) 
                CALL SMOVE(ASCII,1,6,LINE,42) 
C           PRINT OUT LINE OF INFORMATION 
25          CONTINUE
            CALL PUT(LINE,LIST,LINLN,ERR) 
              IF (ERR.NE.0) GO TO 60
C           FILL LINE WITH BLANKS 
            CALL SFILL(LINE,1,LINLN*2,BLANK)
C         CONTINUE FOR ALL NAMES IN THIS ENTRY
30        CONTINUE
C       PRINT ONE BLANK LINE AFTER EACH DATA BASE 
        CALL PUT(BLANK,LIST,1,ERR)
          IF (ERR.NE.0) GO TO 60
40    CONTINUE
C 
C     END DO
C 
      CALL SFILL(LINE,1,LINLN*2,STAR) 
      CALL PUT(LINE,LIST,LINLN,ERR) 
        IF (ERR.NE.0) GO TO 60
      CALL PUT(BLANK,LIST,1,ERR)
        IF (ERR.NE.0) GO TO 60
      ERR = 0 
C 
C     UNLOCK LIST DEVICE
C 
      CALL LURQ(UNLCK,LIST,1) 
        GO TO 60
48    GO TO 60
C 
C     BRANCH HERE FOR DSPLA ERROR CASE: ERR = 1 
C 
50    ERR = 1 
      GO TO 60
C 
C     BRANCH HERE FOR LU LOCK ERROR CASE: ERR = 2 
C 
55    ERR = 2 
60    CONTINUE
      RETURN
      END 
C 
C 
C 
C 
      SUBROUTINE FINDB(NMBUF,INBUF,ERROR) 
C 
C ********************************************************************
C                           *** COMMON ***
C 
      COMMON COTBL(540),COSIZ,ENTSZ,LINE(40),DNODE,RMOTE,DBCOP(3) 
      COMMON LUIN,LIST,LULOG,RDTBL(160),BPSIZ,BPNAM,BPNOD 
C 
C ********************************************************************
C 
C 
      INTEGER ERROR,EBASE,ENTSZ,COSIZ,INBUF 
      INTEGER DNODE,DBCOP,RDTBL,BPSIZ,BPNAM,BPNOD 
      INTEGER NMBUF,ENAME,COTBL 
C 
      LOGICAL RMOTE 
C 
      DIMENSION NMBUF(3),INBUF(80)
C 
      DATA NULL/-1/ 
C 
      ERROR = -1
      J = 1 
      DO 50 EBASE=1,ENTSZ*COSIZ,ENTSZ 
        IF (COTBL(EBASE).EQ.NULL)  GO TO 50 
          DO 40 ENAME=EBASE+6,EBASE+ENTSZ-3,3 
            IF (COTBL(ENAME).EQ.NULL) GO TO 40
            IF (JSCOM(COTBL(ENAME),1,6,NMBUF,1,ERROR).NE.0) GO TO 40
              CALL SMOVE(COTBL(EBASE),1,8,INBUF,J)
              ERROR = 0 
              J = J + 8 
40        CONTINUE
50    CONTINUE
      INBUF((J+1)/2) = -1 
      RETURN
      END 
C 
C 
C 
C 
      SUBROUTINE SERCH(PNAME,MNAME,MNODE,ERROR) 
C 
C ********************************************************************
C                             *** COMMON ***
C 
      COMMON COTBL(540),COSIZ,ENTSZ,LINE(40),DNODE,RMOTE,DBCOP(3) 
      COMMON LUIN,LIST,LULOG,RDTBL(160),BPSIZ,BPNAM,BPNOD 
C 
C ********************************************************************
C 
      INTEGER PNAME,ERROR,ENTRY 
      INTEGER COTBL,COSIZ,ENTSZ,DNODE,DBCOP 
      INTEGER RDTBL,BPSIZ,BPNAM,BPNOD 
C 
      LOGICAL RMOTE 
C 
      DIMENSION PNAME(3),MNAME(3) 
C 
      DO 50 ENTRY=1,BPSIZ*COSIZ,BPSIZ 
        IF (RDTBL(ENTRY).EQ.0)  GO TO 50
          IF (JSCOM(RDTBL(ENTRY+BPNAM),1,6,PNAME,1,ERROR).NE.0) GO TO 50
            CALL SMOVE(RDTBL(ENTRY),1,6,MNAME,1)
            MNODE = RDTBL(ENTRY+BPNOD)
            ERROR = 0 
            GO TO 100 
50    CONTINUE
      ERROR = -1
100   RETURN
      END 
C 
C 
C 
C 
      SUBROUTINE PUT(BUF,DEST,LEN,ERROR)
C 
C ********************************************************************
C                           *** COMMON ***
C 
      COMMON COTBL(540),COSIZ,ENTSZ,LINE(40),DNODE,RMOTE,DBCOP(3) 
      COMMON LUIN,LIST,LULOG,RDTBL(160),BPSIZ,BPNAM,BPNOD 
C 
C ********************************************************************
C 
      INTEGER       BUF(40),DEST,LEN,FCODE,ERROR
      INTEGER       COTBL,COSIZ,ENTSZ,DNODE,DBCOP 
      INTEGER       RDTBL,BPSIZ,BPNAM,BPNOD 
C 
      LOGICAL       RMOTE 
      COMPLEX       ERMSG(2)
      DATA          ERMSG /8HRECOV OU,8HTPUT ERR/ 
  
      FCODE = 2 
      IF (DNODE.NE.-1)  GO TO 7 
      CALL EXEC(FCODE+100000B,DEST+200B,BUF,LEN)
        GO TO 10
5     ERROR = 0 
      RETURN
C 
7     CONTINUE
      CALL DEXEC(DNODE,FCODE+100000B,DEST+200B,BUF,LEN) 
        GO TO 10
8     ERROR = 0 
      RETURN
C 
10    ERROR = -1
      IF (DNODE.EQ.-1) GO TO 15 
        CALL DEXEC(DNODE,FCODE+100000B,201B,ERMSG,8)
          GO TO 15
13      GO TO 20
15    CALL EXEC(FCODE,201B,ERMSG,8) 
20    RETURN
      END 
C 
C 
C 
      SUBROUTINE INPUT(BUF,LEN,ERROR) 
C 
C ********************************************************************
C                            *** COMMON *** 
C 
      COMMON COTBL(540),COSIZ,ENTSZ,LINE(40),DNODE,RMOTE,DBCOP(3) 
      COMMON LUIN,LIST,LULOG,RDTBL(160),BPSIZ,BPNAM,BPNOD 
C 
C ********************************************************************
C       INPUTS A MAXIMUM OF (+LEN) WORDS OR (-LEN) CHARACTERS 
        INTEGER     BUF(40),ERROR,LEN,AREG,BREG,QMARK 
        INTEGER     COTBL,COSIZ,ENTSZ,DNODE,DBCOP 
        INTEGER     RDTBL,BPSIZ,BPNAM,BPNOD 
C 
        LOGICAL     RMOTE 
C 
        COMPLEX     ERMSG(2)
        DATA        ERMSG /8HRECOV IN,8HPUT ERR / 
        DATA        QMARK/2H?_/ 
C 
C       TRUNCATE INPUT REQUEST IF LARGER THAN BUFFER
C 
        IF (LEN.GT.40)  LEN = 40
        IF (LEN.LT.-80) LEN = -80 
C 
      IF (DNODE.NE.-1) GO TO 3
        CALL EXEC(100002B,LUIN,QMARK,1) 
          GO TO 10
1       CALL EXEC(100001B,LUIN+400B,BUF,LEN)
          GO TO 10
2       GO TO 5 
C 
3     CALL DEXEC(DNODE,100001B,LUIN+4400B,BUF,LEN,QMARK,1)
        GO TO 10
5       CALL ABREG(AREG,BREG) 
        LEN = BREG
        ERROR = 0 
        RETURN
C 
10      ERROR = -1
        CALL EXEC(2,201B,ERMSG,8) 
        RETURN
      END 
C 
C 
C 
      SUBROUTINE ANSWR(REPLY,ERROR) 
C 
C ********************************************************************
C                           *** COMMON ***
C 
      COMMON COTBL(540),COSIZ,ENTSZ,LINE(40),DNODE,RMOTE,DBCOP(3) 
      COMMON LUIN,LIST,LULOG,RDTBL(160),BPSIZ,BPNAM,BPNOD 
C 
C ********************************************************************
C 
        INTEGER     YES,NO,RESP(2),ERROR      
        INTEGER     COTBL,COSIZ,ENTSZ,DNODE,DBCOP 
        INTEGER     RDTBL,BPSIZ,BPNAM,BPNOD 
C 
        LOGICAL     REPLY,RMOTE 
C 
        DATA        YES/2HYE/ 
        DATA        NO /2HNO/ 
C 
        REPLY = .FALSE. 
10      LEN=2 
        CALL INPUT(RESP,LEN,ERROR)
          IF (ERROR.NE.0) RETURN
        IF ((RESP.EQ.YES).OR.(RESP.EQ.NO)) GO TO 20 
        GO TO 10
20      CONTINUE
        IF (RESP.EQ.YES) REPLY= .TRUE.
        RETURN
      END 
      END$
                                                                                                                                              