FTN4 PROGRAM QY07(5,90),92069-16060 REV.2026 800122 C C C C C************************************************************* C (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. 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 SOURCE: 92069-18070 C RELOC: 92069-16060 C C ALTERED: JANUARY 22, 1980 FOR SORTED CHAINS FEATURE - CEJ C C************************************************************ C C C UPDATE SERVICE MODULE (PART I) C HAS BEEN SPLIT INTO TWO (2) MODULES C IN ORDER TO FIT INTO 16K MEMORY C C QS07 CONTAINS THE OPERATOR INTERFACE C QS14 CONTAINS THE REPLACE, ADD, AND DELETE ROUTINES C LOGICAL ISPTH LOGICAL ISSRT LOGICAL MEMBR INTEGER ERR1(7) INTEGER ERR2(14) INTEGER ERR4(15) INTEGER ERR5(12) INTEGER ERR7(14) INTEGER ERR8(13) INTEGER ERR9(14) INTEGER ERR10(14) INTEGER ERR11(16) INTEGER PRMPT(3) INTEGER REPLC(4),ADD(4),DELT(4) INTEGER NAME(2) INTEGER A,R,D INTEGER INFO(13) INTEGER ITEMS(128) INTEGER INBR(128) INTEGER ASK(5) INTEGER DZERO(2) INTEGER P2,ELCNT INTEGER ISTAT(10) INTEGER IMODE(4) INTEGER UPDATE(3) C$$$$$$$$$$$$$$$$$$$ NOVEMBER 3,1978 $$$$$$$$$$$$$$$$$$$$$ INTEGER INLU,ITTY,ILP,IDCB,JDCB,XEQ INTEGER DBNAM,DBLEV,DSNAM,DINAM,SELECT,SNAM INTEGER DSNUM,DINUM,PARM,LPARM,ECHO,QSERR INTEGER IMA,IB,IBSZ,SECNO,IEND,ISCAN LOGICAL BREAK INTEGER IPFLAG,IOFLAG,RMOTE LOGICAL BATCH,XQBCH INTEGER PAGCNT,LNCNT INTEGER PAGLEN,COLLIM REAL RRCNT REAL SELT,RSEC INTEGER IPTR REAL RCOUNT INTEGER S,R3,TRKNM,IDILU INTEGER R6 REAL ATOTAL INTEGER LIST,L,T,U INTEGER LEVSTR,LEVLEN INTEGER IBUFF INTEGER SS(7,100) C COMMON INLU(145),ITTY(145),ILP(145),IDCB(145),JDCB(144),XEQ(145) COMMON DBNAM(10),DBLEV(3),DSNAM(3),DINAM(3),SELECT(6),SNAM(3) COMMON DSNUM,DINUM,PARM(40),LPARM,ECHO,QSERR COMMON IMA(37),IB(896),IBSZ,SECNO,IEND,ISCAN COMMON BREAK COMMON IPFLAG,IOFLAG,RMOTE COMMON BATCH,XQBCH COMMON PAGCNT,LNCNT COMMON PAGLEN,COLLIM COMMON RRCNT COMMON SELT(64),RSEC COMMON IPTR COMMON RCOUNT COMMON S(15,50),R3,TRKNM,IDILU COMMON R6 COMMON ATOTAL(6,5) COMMON LIST(101,6),L(7),T(5),U(7,5) COMMON LEVSTR(66,5),LEVLEN(5) COMMON IBUFF(2048) C EQUIVALENCE (S,SS) C$$$$$$$$$$$$$$$$$$$ NOVEMBER 3,1978 $$$$$$$$$$$$$$$$$$$$$ EQUIVALENCE(S(1,1),ICHAR) EQUIVALENCE(S(3,1),INBR) C C C C C C C C C C C DATA DZERO/0,0/ DATA ASK/2H ,2H ,2H ,2H =,2H _/ DATA NAME/2HNA,2HME/ C SYNTAX ERROR DATA ERR1/2H S,2HYN,2HTA,2HX ,2HER,2HRO,2HR / C ILLEGAL ACCESS TO DATA SET DATA ERR2/2H I,2HLL,2HEG,2HAL, & 2H A,2HCC,2HES,2HS ,2HTO,2H D,2HAT,2HA ,2HSE,2HT / C RECORD NOT YET BEEN FOUND DATA ERR4/2H R,2HEC,2HOR,2HD ,2HNO,2HT , & 2HYE,2HT ,2HBE,2HEN,2H F,2HOU,2HND/ C ILLEGAL DATA ITEM NAME DATA ERR5/2H I,2HLL,2HEG,2HAL,2H D,2HAT,2HA , & 2HIT,2HEM,2H N,2HAM,2HE / C MUST ENTER PATH ITEM VALUE DATA ERR7/2H M,2HUS,2HT ,2HEN,2HTE,2HR , &2HPA,2HTH,2H I,2HTE,2HM ,2HVA,2HLU,2HE / DATA ERR8/2H I,2HLL,2HEG,2HAL,2H P,2HAT,2HH ,2HMO,2HDI,2HFI, &2HCA,2HTI,2HON/ C USER ACCESS NOT HIGH ENOUGH DATA ERR9/2H U,2HSE,2HR ,2HAC,2HCE,2HSS,2H N,2HOT,2H H, & 2HIG,2HH ,2HEN,2HOU,2HGH/ C MUST ENTER SORT ITEM VALUE DATA ERR10/2H M,2HUS,2HT ,2HEN,2HTE,2HR ,2HSO,2HRT, & 2H I,2HTE,2HM ,2HVA,2HLU,2HE / C ILLEGAL SORT ITEM MODIFICATION DATA ERR11/2H I,2HLL,2HEG,2HAL,2H S,2HOR,2HT ,2HVA, & 2HLU,2HE ,2HMO,2HDI,2HFI,2HCA,2HTI,2HON/ DATA PRMPT/2H I,2HTE,2HM_/ DATA A/101B/ DATA D/104B/ DATA R/122B/ DATA INTGR/111B/ DATA REPLC/2HRE,2HPL,2HAC,2HE / DATA ADD/2HAD,2HD ,2H ,2H / DATA DELT/2HDE,2HLE,2HTE,2H / C UPDATE C C DATA UPDATE/2HUP,2HDA,2HTE/ C C C C C C UPDATE NAME = ; C A[DD],; C C QUERY PROMPTS THE USER WITH EACH ITEM NAME TO C WHICH HE HAS ACCESS. THE USER MAY ENTER A VALUE C OR A SEMICOLN. WHEN A SEMICOLN IS ENTER QUERY C PUTS A NULL VALUE IN THE DATA RECORD. QUERY PROHIBITS C NULL VALUES FOR PATH ITEMS. A USER CAN TERMINATE THE C UPDATE WITH THE BR[EAK] COMMAND. C C D[ELETE]; C C R[EPLACE]; C = "" [,"",""] ; C WHERE ARRAY VALUES ARE ENTERED IN AS A LIST OF C VALUES SEPARATED BY COMMAS AND TERMINATED C BY A SEMICOLN. WHEN TWO COMMAS ARE ENTERED C ADJACENT A NULL VALUE IS ENTERED FOR THAT C ELEMENT. C C C C C C BEGIN C C INBR = 0 P2 = 1 C C CHECK FOR PROCEDURE C CALL LSCAN(IB,I,J,K) IF(K .NE. 2) GOTO 50 IF(J-I.NE.3) GOTO 30 IF(JSCOM(NAME,1,4,IB,I,IERR).NE.0) GOTO 30 C SCAN ACROSS = CALL LSCAN(IB,I,J,K) IF(K.NE.6) GOTO 50 C C GET PROCEDURE NAME C CALL GTPRC(UPDATE,6,IERR) IF(IERR .NE. 0) GOTO 70 IOFLAG = 1 C C GET UPDATE TYPE C CALL LSCAN(IB,I,J,K) IF(K .NE. 2) GOTO 50 C C VERIFY THAT THE UPDATE TYPE IS LEGAL C 30 CALL SGET(IB,I,ICHAR) IF(J-I+1 .NE. 1) GOTO 40 C C A = UPDATE ADD C D = UPDATE DELETE C R = UPDATE REPLACE C IF(ICHAR.EQ.A) GOTO 110 IF(ICHAR.EQ.D) GOTO 610 IF(ICHAR.EQ.R) GOTO 500 GOTO 50 C C ADD = UPDATE ADD C DELETE = UPDATE DELETE C REPLACE = UPDATE REPLACE C 40 CONTINUE IF(J-I+1 .GT. 8) GOTO 50 CALL SFILL(IMODE,1,8,40B) CALL SMOVE(IB,I,J,IMODE,1) IF(JSCOM(IMODE,1,8,ADD,1) .EQ. 0) GOTO 110 IF(JSCOM(IMODE,1,8,REPLC,1) .EQ. 0) GOTO 500 IF(JSCOM(IMODE,1,8,DELT,1) .EQ. 0) GOTO 610 C C ERROR - SYNTAX ERROR C 50 CONTINUE IP = 1 54 IF(IEND .LE. 72) GOTO 57 CALL QRIO(2,ITTY,IB(IP),-72) IEND = IEND - 72 IP = IP + 36 GOTO 54 C C WRITE LAST LINE OUT C 57 CALL QRIO(2,ITTY,IB(IP),-IEND) C C CALL SFILL(IMA,1,72,40B) IF(I .GT. 72) I = I-I/72*72 CALL SPUT(IMA,I,136B) CALL QRIO(2,ITTY,IMA,-I) CALL ERIO(2,ITTY,ERR1,7) C C RETURN TO NEXT? C 70 SNAM(2) = 2H GOTO 100 C C ERROR - DBMS C 80 QSERR = ISTAT SNAM(2) = 2H23 GOTO 100 C C LOAD MODULE QS14 FOR REPLACE,ADD, AND DELETE UPDATES C 90 SNAM(2) = 2H14 100 CALL LOAD(SNAM) C C C C C C C C C C ADD STATEMENT C C SCAN ACROSS "," C 110 CONTINUE CALL LSCAN(IB,I,J,K) IF(K.NE.4) GOTO 50 CALL LSCAN(IB,I,J,K) C C GET DATA SET NAME C IF(J-I.GT.5) GOTO 50 CALL SFILL(DSNAM,1,6,40B) CALL SMOVE(IB,I,J,DSNAM,1) C C VERIFY THE SEMICOLN C CALL LSCAN(IB,I,J,K) IF(K .NE. 5) GOTO 50 C C VERIFY DATA SET NAME C CALL DBINF(DBNAM,DSNAM,201,ISTAT,INFO) IF(ISTAT .NE. 0) GOTO 80 IF(INFO .LT. 0) GOTO 130 C C ERROR - ILLEGAL ACCESS TO DATA SET C 120 CONTINUE CALL ERIO(2,ITTY,ERR2,14) GOTO 70 C C GET THE DATA SET NUMBER C 130 DSNUM = -INFO IPFLAG = 0 IOFLAG = 0 C C GET ALL DATA ITEM #S FOR THIS SET C CALL DBINF(DBNAM,DSNUM,104,ISTAT,ITEMS) IF(ISTAT .NE. 0) GOTO 80 IF(ITEMS .EQ. 0) GOTO 120 C C LOOP ON ITEM COUNT AND GET VALUE C 140 CONTINUE DO 320 LOOP=2,ITEMS+1 C C IF NO READ/WRITE ACCESS THEN SKIP ITEM C IF(ITEMS(LOOP) .GE. 0) GOTO 320 DINUM = -ITEMS(LOOP) C C GET ITEM CHARACTERISTICS C CALL DBINF(DBNAM,DINUM,102,ISTAT,INFO) IF(ISTAT .NE. 0) GOTO 80 CALL SGET(INFO,17,ITYPE) LEN = INFO(10) IF(ITYPE .EQ. R .OR. ITYPE .EQ. INTGR) LEN = LEN * 2 ELCNT = INFO(11) C C GET VALUE FROM USER C CALL SMOVE(INFO,1,6,ASK,3) 160 IF(.NOT. BATCH) CALL QRIO(2,INLU,ASK(1),5) C C SEE IF BREAK WAS REQUESTED C CALL INPUT IF (BREAK) GOTO 70 C C C SEE IF ONLY A SEMICOLN WAS ENTERED C NOTE: LSCAN MUST NOT BE USED HERE BECAUSE C GETVL EXPECTS TO TO THE CALL TO LSCAN C DO 165 I = ISCAN,IEND CALL SGET(IB,I,ITERM) IF( ITERM .EQ. 40B) GOTO 165 IF(ITERM .NE. 73B) 180,167 165 CONTINUE C C IF THIS IS A PATH - A VALUE MUST BE ENTERED C 167 CONTINUE IF(.NOT. ISPTH(DBNAM,DSNUM,DINUM,ISTAT) ) GOTO 170 CALL ERIO(2,ITTY,ERR7,14) GOTO 182 C C BE SURE THERE WERE NO DBMS ERRORS C 170 CONTINUE IF(ISTAT) 80,175,80 C C IF THIS IS A SORT ITEM - A VALUE MUST BE INTERED C 175 CONTINUE IF (.NOT. ISSRT(DBNAM,DSNUM,DINUM,ISTAT)) GOTO 178 CALL ERIO(2,ITTY,ERR10,14) GOTO 182 C C BE SURE THERE WERE NO DBMS ERRORS C 178 CONTINUE IF (ISTAT) 80,180,80 C C PUT THE ITEM VALUE INTO THE DATA BUFFER C 180 CONTINUE CALL GETVL(DSNUM,DINUM,ITYPE,LEN,ELCNT,IBUFF,P2,IB,ITTY,IERR) IF(IERR .EQ. 0) GOTO 185 C C IF THIS IS A BATCH FILE TERMINATE ELSE GO ASK AGAIN C 182 CONTINUE IF(BATCH) 70,160 C C PUT ITEM IN PUT LIST C 185 CONTINUE C C LEAVE ENOUGH ROOM FOR ALL THE ELEMENTS C P2 = LEN * ELCNT + P2 INBR = INBR + 1 INBR(INBR+1) = DINUM C C BE SURE THAT AN ITEM IS TO BE ADDED C 320 CONTINUE IF(INBR .EQ. 0) GOTO 120 SNAM(2) = 2H22 GOTO 100 C C C C C C C C C REPLACE STATEMENT C C C C C C VERIFY SEMICOLN C 500 CONTINUE CALL LSCAN(IB,I,J,K) IF(K .NE. 5) GOTO 50 C C VERIFY THAT THE SELECT FILE IS NOT EMPTY C IF(DCO(RRCNT,DZERO) )505,505,510 505 CALL ERIO(2,ITTY,ERR4,13) GOTO 70 C C GET THE INPUT FROM THE USER C IF THIS IS A PROCEDURE FILE GET THE INPUT C FROM THE PROCEDURE. C 510 CONTINUE IF((IPFLAG .EQ. 0).AND.(.NOT. BATCH)) CALL QRIO(2,INLU,PRMPT,3) C C GET THE ITEM NAME C CALL LSCAN(IB,I,J,K) IF(BREAK) GOTO 70 C C A SEMICOLN INSTEAD OF AN ITEM NAME TERMINATES THE INPUT C IF(K .EQ. 5) GOTO 90 C C VERIFY LEGAL NAME C IF(K .NE. 2) GOTO 530 IF(J-I.GT.5) GOTO 530 CALL SFILL(DINAM,1,6,40B) C CALL SMOVE(IB,I,J,DINAM,1) C C GET THE "=" FROM THE INPUT LINE C CALL LSCAN(IB,I,J,K) IF(K .EQ. 6) GOTO 520 C C GET DATA ITEM NUMBER C 520 CONTINUE CALL DBINF(DBNAM,DINAM,101,ISTAT,INFO) IF(ISTAT .EQ. 0) GOTO 540 C C ERROR - ILLEGAL DATA ITEM NAME C 530 CONTINUE CALL ERIO(2,ITTY,ERR5,12) GOTO 590 C C VERIFY THAT A PATH IS NOT BEING CHANGED C 540 CONTINUE IF(INFO .LT. 0) GOTO 541 CALL ERIO(2,ITTY,ERR9,14) GOTO 590 C C C 541 CONTINUE DINUM = -INFO IF( .NOT. ISPTH(DBNAM,DSNUM,DINUM,ISTAT) ) GOTO 542 CALL ERIO(2,ITTY,ERR8,13) GOTO 590 C C VERIFY THAT A SORT VALUE IS NOT BEING CHANGED C 542 CONTINUE IF (ISTAT .NE. 0) GOTO 530 IF (.NOT. ISSRT(DBNAM,DSNUM,DINUM,ISTAT)) GOTO 543 CALL ERIO(2,ITTY,ERR11,16) GOTO 590 C C MAKE SURE NO DBMS ERROR OCCURRED C 543 CONTINUE IF (ISTAT .NE. 0) GOTO 530 C C VERIFY THIS IS A MEMBER OF THE DECLARED DATA SET C 545 CONTINUE IF(MEMBR(DBNAM,DSNUM,DINUM,ISTAT)) GOTO 550 CALL ERIO(2,ITTY,ERR5,12) GOTO 590 C C GET DATA ITEM CHARACTERISTICS C 550 CONTINUE CALL DBINF(DBNAM,DINUM,102,ISTAT,INFO) IF(ISTAT .NE. 0) GOTO 530 C C GET THE ITEM TYPE, LENGTH, AND ELEMENT COUNT C CALL SGET (INFO,17,ITYPE) LEN = INFO(10) IF((ITYPE .EQ. R) .OR. (ITYPE .EQ. INTGR)) LEN = LEN*2 ELCNT = INFO(11) C C GET THE VALUE FROM THE USER C CALL GETVL(DSNUM,DINUM,ITYPE,LEN,ELCNT,IBUFF,P2,IB,ITTY,IERR) IF(IERR .NE. 0) GOTO 590 C C VERIFY INPUT STRING ENDED WITH A SEMICOLN C C C PUT ITEM IN LIST C 560 CONTINUE P2 = P2 + LEN * ELCNT INBR = INBR + 1 INBR(INBR+1) = DINUM 580 CONTINUE GOTO 510 C C C C C C REPLACE ERROR PROCESSOR C 590 CONTINUE IF((BATCH) .OR. (IPFLAG .NE. 0)) GOTO 70 C C SCAN FOR SEMICOLN C 595 CONTINUE CALL LSCAN(IB,I,J,K) IF(K .NE. 5) GOTO 595 GOTO 510 C C C C C C C C DELETE RECORD C C C C C 610 CONTINUE IF(DCO(RRCNT,DZERO) )630,620,630 620 CALL ERIO(2,ITTY,ERR4,13) GOTO 70 C C BE SURE THIS SET HAS DELETE ACCESS C 630 CONTINUE CALL DBINF(DBNAM,DSNUM,201,ISTAT,INFO) IF(ISTAT .NE. 0) GOTO 80 IF( INFO .LT.0) GOTO 90 CALL ERIO(2,ITTY,ERR9,14) GOTO 70 END