|
|
1.1 ! root 1: SUBROUTINE EQUIV ! 2: INTEGER STMT, PSTMT, PDSA, DSA, TYPE, STACK, BNEXT, SYMHD ! 3: LOGICAL ARDECL, CORNR, SAME, ERR, SYSERR, ABORT ! 4: COMMON /DETECT/ ERR, SYSERR, ABORT ! 5: COMMON /INPUT/ NSTMT, PSTMT, STMT(1327) ! 6: COMMON /TABL/ NEXT, LABHD, SYMHD, BNEXT ! 7: COMMON /CTABL/ LDSA, PDSA, DSA(5000) ! 8: COMMON /CEXPRS/ LSTACK, STACK(620) ! 9: C ! 10: C PROCESSES AN EQUIVALENCE STMT-FINDS DECLARATORS SEPARATED BY , ! 11: C IF DIFFERENT TYPE VARIABLES INVOLVED, CHECKS FOR USE OF CORNER ! 12: C ELEMENTS; ARDECL CALLED TO PROCESS DECLARATORS ! 13: C SAME IS .TRUE. IF ALL ITEMS EQUIVALENCED IN ONE (--) ARE SAME TYPE ! 14: C CORNR IS .TRUE. IF ALL ITEMS EQUIV. IN ONE (--) ARE CORNER ELES. ! 15: C E.G. A(1,1,1) ! 16: C ! 17: 10 IF (STMT(PSTMT).EQ.65) GO TO 30 ! 18: 20 CALL ERROR1(20H ILLEGAL PUNCTUATION, 20) ! 19: GO TO 150 ! 20: 30 TYPE = -1 ! 21: IPT = 1 ! 22: CORNR = .TRUE. ! 23: SAME = .TRUE. ! 24: 40 PSTMT = PSTMT + 1 ! 25: IF (PSTMT.GE.NSTMT) GO TO 20 ! 26: IF (.NOT.ARDECL(K2,KK)) GO TO 150 ! 27: IF (SYSERR .OR. ERR) GO TO 150 ! 28: C ! 29: C KK>= 0 FOR AN ARRAY ELEMENT MEANS IT WASN'T A CORNER ELEMENT ! 30: C ! 31: L = IGATT1(IABS(KK),7) ! 32: IF (KK.GT.0 .AND. L.GT.0) CORNR = .FALSE. ! 33: KK = IABS(KK) ! 34: C ! 35: C SET USAGE, IF UNSET ! 36: C ! 37: L = IGATT1(KK,8) ! 38: IF (L.EQ.0) CALL SATT1(KK, 8, 10) ! 39: C ! 40: C STORE VARIABLE IN STACK, CHECK VARIABLE TYPE ! 41: C ! 42: STACK(IPT) = KK ! 43: IPT = IPT + 1 ! 44: CALL SATT1(KK, 3, 1) ! 45: I = IGATT1(KK,1) ! 46: I = MOD(I,8) ! 47: IF (-1.EQ.TYPE) TYPE = I ! 48: IF (TYPE.EQ.I) GO TO 50 ! 49: SAME = .FALSE. ! 50: C ! 51: C END OF DELARATOR CHECKS; NEED , OR ) ! 52: C ! 53: 50 IF (STMT(K2).NE.68) GO TO 60 ! 54: PSTMT = K2 ! 55: GO TO 40 ! 56: 60 IF (STMT(K2).NE.62) GO TO 20 ! 57: C ! 58: C CHECK FOR CORNER ELEMENTS IF ARRAY ELEMENTS WERE USED ! 59: C ! 60: IF (.NOT.SAME .AND. .NOT.CORNR) CALL ERROR1( ! 61: * 53H WARNING - USE CORNER ELEMENTS WHEN MIXING DATA TYPES, 53) ! 62: C ! 63: C CHECK FOR ELEMENTS IN COMMON; MAKE SURE ONLY ONE COMMON ! 64: C REGION APPEARS ! 65: C ! 66: KK = IPT - 1 ! 67: C ! 68: C PUT COMMON REGIONS OF EACH DECLARATOR (IF ANY) ON STACK ! 69: C ! 70: DO 80 I=1,KK ! 71: L = IGATT1(STACK(I),2) ! 72: IF (L) 80, 80, 70 ! 73: 70 IF(IPT+1.GT.LSTACK) GOTO 160 ! 74: L = STACK(I) ! 75: L = DSA(L+2) ! 76: STACK(IPT) = DSA(L+1) ! 77: IPT = IPT + 1 ! 78: 80 CONTINUE ! 79: IF (KK+2.GE.IPT) GO TO 90 ! 80: CALL ERROR1(40H EQUIVALENCE CONFLICTS WITH COMMON DEFNS, 40) ! 81: GO TO 130 ! 82: 90 IF (KK+1.EQ.IPT) GO TO 130 ! 83: C ! 84: C MARK ALL DECLARATORS IN EQUIV (--) AS IF IN COMMON BLOCK ! 85: C THAT ANY ONE OF THEM IS ACTUALLY IN ! 86: C ! 87: DO 120 I=1,KK ! 88: L = IGATT1(STACK(I),2) ! 89: IF (L.EQ.1) GO TO 120 ! 90: CALL SATT1(STACK(I), 2, 1) ! 91: L = STACK(I) ! 92: IF (DSA(L+2)) 100, 100, 110 ! 93: 100 IF(NEXT+2.GE.BNEXT) GOTO 170 ! 94: DSA(L+2) = NEXT ! 95: DSA(NEXT) = 0 ! 96: DSA(NEXT+1) = STACK(IPT-1) ! 97: NEXT = NEXT + 2 ! 98: GO TO 120 ! 99: 110 L = DSA(L+2) ! 100: DSA(L+1) = STACK(IPT-1) ! 101: 120 CONTINUE ! 102: 130 IF (K2+1.EQ.NSTMT) GO TO 150 ! 103: IF (STMT(K2+1).NE.68) GO TO 20 ! 104: PSTMT = K2 + 2 ! 105: GO TO 10 ! 106: 150 RETURN ! 107: 160 CALL ERROR1(34H IN EQUIV, TABLE OVERFLOW OF STACK,34) ! 108: 180 SYSERR = .TRUE. ! 109: GOTO 150 ! 110: 170 CALL ERROR1(32H IN EQUIV, TABLE OVERFLOW OF DSA, 32) ! 111: GOTO 180 ! 112: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.