LOGICAL FUNCTION INTEXT(LL, L1, L2, BR) C C LL POINTS TO DSA ENTRY OF FCN NAME C L1 POINTS INTO STACK TO BEGINNING OF ARGS C L2 POINTS INTO STACK TO LAST ARG ENTRY C BR .TRUE. MEANS LOOK FOR BOTH EXTERNALS ND INTRINS C BR FALSE MEANS JUST LOOK FOR EXTERNALS C ROUTINE CHECKS FOR REFERENCES TO INTRINSIC OR BASIC EXTERNAL C FCNS; RETURNS TRUE IF FINDS INTRINSIC FCN. CHECKS INTRINSICS C ARGS FOR USAGE, TYPE AND NUMBER. MARKS POSSIBLE BASIC EXTDRNAL C FCNS SENT DOWN TO IT C INTEGER STACK, BL, PDSA, DSA, FCN(6), Z LOGICAL BR COMMON /CEXPRS/ LSTACK, STACK(620) COMMON /CTABL/ LDSA, PDSA, DSA(5000) COMMON /INTS/ Z(346) COMMON /FACTS/ NAME, NOST, ITYP, IASF DATA BL /1H / INTEXT = .FALSE. CALL S5UNPK(DSA(LL+4), FCN(1), 6) K = 1 DO 40 I=1,55 K1 = K + 1 K2 = K1 + Z(K) - 1 L = 0 DO 10 J=K1,K2 L = L + 1 IF (FCN(L).NE.Z(J)) GO TO 30 10 CONTINUE IF (L.EQ.6) GO TO 60 L = L + 1 DO 20 J=L,6 IF (FCN(J).NE.BL) GO TO 30 20 CONTINUE GO TO 60 30 K = K2 + 2 40 CONTINUE 50 RETURN C C DIFFERENTIATES BETWEEN A POSSIBLE BASIC EXTERNAL AND POSSIBLE C INTRINSIC FCN C 60 L = MOD(Z(K2+1),1024)/512 C C IF POSSIBLE BASIC EXTERNAL CHECK TYPE AND SET IT IF NOT ALREADY C EXPLICITLY SET C IF (L.NE.1) GO TO 70 L = IGATT1(LL,1) IF (L/8.GE.1) GO TO 190 L = MOD(Z(K2+1),8) IF (BR) L = L + 8 CALL SATT1(LL, 1, L) C C MARK AS USED IN PASS 1 C GO TO 190 C C CHEKC IF IN EXTERNAL STMT IF SO NOT AN INTRINSIC C 70 IF (.NOT.BR) GO TO 50 L = IGATT1(LL,8) IF (L.EQ.13) GO TO 50 C C CHECK IF EXPLICITLY TYPES DIFFERENTLY THAN EXPECTED C L = IGATT1(LL,1) J = MOD(Z(K2+1),8) IF (L.GE.8) GO TO 80 CALL SATT1(LL, 1, J+8) GO TO 90 80 IF (J.NE.MOD(L,8)) GO TO 50 C C K POINTS TO THE FUNCTION ENTRY IN Z C K1 POINTS TO FIRST LETTER IN FCN-NAME; K2 TO LAST LETTER C FIELDS IN ATTRIBUTE WORD ARE AS FOLLOWS: C BITS 0-2 TYPE FCN C BITS 3-5 TYPE ARGS C BIT 6 IF 1, FIXED NO ARGS; IF 0 VARIABLE NO OF ARGS C BITS 7-8 MINIMUM NUMBER OF ARGS C BITS 9 IF 0, INTRINSIC; IF 1 BASIC EXTERNAL C BITS 10 IF 1 USED IN PASS 1; ELSE NOT REFERENCED C C FCN IS INTRINSIC C CHECK NUMBER OF ARGS C 90 I = MOD(Z(K2+1),128)/64 J = MOD(Z(K2+1),512)/128 IF (I) 100, 100, 120 C C VARIABLE NUMBER OF ARGS ALLOWED C MUST BE AT LEAST J C 100 IF ((L2-L1+1)/2.GE.J) GO TO 130 110 CALL ERROR2(29H INCORRECT NUMBER OF ARGS IN , 29, DSA(LL+4), * 1, 1, 1) GO TO 180 C C FIXED NUMBER OF ARGS C 120 IF ((L2-L1+1)/2.NE.J) GO TO 110 C C CHECK THRU ARG LIST OR PROPER TYPE ID AS AN ARG; C CHECK TYPE AND THAT ARGS ARE SCALARS C 130 L = MOD(Z(K2+1),64)/8 DO 170 N=L1,L2,2 C C CHECK FOR EXPRESSION AS ARG C IF (STACK(N).EQ.0) GO TO 160 C C CHECK USAGE C I = IGATT1(STACK(N),8) IF (I.EQ.10 .OR. ((I.EQ.2 .OR. I.EQ.5 .OR. I.EQ.14) .AND. * STACK(N+1).NE.6)) GO TO 160 IF (I.NE.0) GO TO 140 CALL SATT1(STACK(N), 8, 10) GO TO 160 140 IF (I.EQ.1 .AND. ITYP.NE.31) GO TO 150 I = STACK(N) IF (DSA(I+2).EQ.IASF) GO TO 160 150 CALL ERROR2(40H ILLEGAL ARGUMENT IN INTRINSIC REFERENCE, 40, * DSA(LL+4), 1, 1, 1) GO TO 170 C C CHECK STRUCTURE C 160 IF (STACK(N+1)/8.EQ.1) CALL ERROR2( * 48H ILLEGAL STRUCTURE OF ARG IN INTRINSIC REFERENCE, 48, * DSA(LL+4), 1, 1, 1) C C CHECK TYPE C IF (MOD(STACK(N+1),8).NE.L) CALL ERROR2( * 43H ILLEGAL TYPE OF ARG IN INTRINSIC REFERENCE, 43, * DSA(LL+4), 1, 1, 1) 170 CONTINUE 180 INTEXT = .TRUE. I = IGATT1(LL,8) IF (I.NE.0) GO TO 190 CALL SATT1(LL, 8, 14) C C MARK FCN AS USED C 190 K = Z(K2+1)/1024 IF (K.EQ.0) Z(K2+1) = Z(K2+1) + 1024 GO TO 50 END