*S~ SUBROUTINE ERRORS (ERRCOD, LASTLP) C C ERRORS does all the error printing on the listing file for the C IFTRAN processor. It receives an error code from the calling C routine, and prints an error message accordingly. It also C updates the lines-printed count by calling PAGEBK, and updates C the variable ERRCNT (error count) in IFTCOM common. C character. C Revision History: C 24-APR-81 Rewritten after accidental deletion C 24-APR-81 Support for IFTMAIN stack warnings C 24-APR-81 Support for error-generated STOPs C 27-APR-81 Support for invalid END IMPLICIT INTEGER (A - Z) BYTE CONLBL, LABEL, LHEAD, LIST ; Common string varbs LOGICAL*1 LISTNG, PASCOM ; Listing, pass comments flags COMMON /IFTCOM/ DONE, INFILE, IP, KIND, L, LNUM, LOUT, OUTFIL, + ERRCNT, LISTNG, PASCOM, CONLBL(6), LABEL(66), LHEAD(6), LIST(1320) 899 FORMAT (' *** IFTRAN internal error. Contact implementer. ***') 900 FORMAT (6X, 'STOP '' - IFTRAN error: Line ', I3, '''') C Warning messages 931 FORMAT (' * WARNING * Potential DO stack overflow in IFTRAN.') 933 FORMAT (' * WARNING * Potential IF stack overflow in IFTRAN.') 935 FORMAT (' * WARNING * Potential WHILE stack overflow in IFTRAN.') 937 FORMAT (' * WARNING * Potential FOR stack overflow in IFTRAN.') 939 FORMAT (' * WARNING * Unbalanced parentheses or quotes.') C Error messages 959 FORMAT (' Statement not expected - invalid usage.') 961 FORMAT (' Expected statement was an END IF.') 963 FORMAT (' Expected statement was an UNTIL ().') 965 FORMAT (' Expected statement was an END WHILE.') 969 FORMAT (' Expected statement was an END FOR.') 971 FORMAT (' * ERROR * Invalid END FOR statement.') 973 FORMAT (' * ERROR * Invalid UNTIL () statement.') 975 FORMAT (' * ERROR * Invalid END WHILE statement.') 977 FORMAT (' * ERROR * Invalid END IF statement.') 979 FORMAT (' * ERROR * Statement ends without ().') 981 FORMAT (' * ERROR * EXIT IF without preceding IF.') 983 FORMAT (' * ERROR * EXIT WHILE without preceding WHILE.') 985 FORMAT (' * ERROR * EXIT DO without preceding DO.') 987 FORMAT (' * ERROR * EXIT FOR without preceding FOR.') 989 FORMAT (' * ERROR * Program ends with an unclosed FOR block.') 991 FORMAT (' * ERROR * Program ends with an unclosed WHILE block.') 993 FORMAT (' * ERROR * Program ends with an unclosed DO block.') 995 FORMAT (' * ERROR * Program ends with an unclosed IF block.') 999 FORMAT (' * ERROR * OR IF or ELSE without preceding IF.') CALL PAGEBK (1) ; One more line coming out ERRCNT = ERRCNT + 1 ; One more error detected ENUM = LNUM - 1 IF (ERRCOD .LT. 30) WRITE (OUTFIL, 900) ENUM ; STOP into output file IF (.NOT.(LISTNG)) RETURN ; Now return is OK if listing off C Error codes begin at 1 IF (ERRCOD .EQ. 1) ; Ill-placed OR IF or ELSE WRITE (LOUT, 999) OR IF (ERRCOD .EQ. 3) ; END with unclosed IF block WRITE (LOUT, 995) OR IF (ERRCOD .EQ. 4) ; END with unclosed DO block WRITE (LOUT, 993) OR IF (ERRCOD .EQ. 5) ; END with unclosed WHILE block WRITE (LOUT, 991) OR IF (ERRCOD .EQ. 6) ; END with unclosed FOR block WRITE (LOUT, 989) OR IF (ERRCOD .EQ. 7) ; Error 7 WRITE (LOUT, 987) OR IF (ERRCOD .EQ. 8) ; Error 8 WRITE (LOUT, 985) OR IF (ERRCOD .EQ. 9) ; Error 9 WRITE (LOUT, 983) OR IF (ERRCOD .EQ. 10) ; Error 10 WRITE (LOUT, 981) OR IF (ERRCOD .EQ. 11) ; Error 11 WRITE (LOUT, 979) OR IF (ERRCOD .EQ. 12) ; Invalid END IF WRITE (LOUT, 977) OR IF (ERRCOD .EQ. 13) ; Invalid END WHILE WRITE (LOUT, 975) OR IF (ERRCOD .EQ. 14) ; Invalid UNTIL WRITE (LOUT, 973) OR IF (ERRCOD .EQ. 15) ; Invalid END FOR WRITE (LOUT, 971) C Warning codes begin at 30 OR IF (ERRCOD .EQ. 30) ; Error 30 WRITE (LOUT, 939) OR IF (ERRCOD .EQ. 31) ; Error 31 WRITE (LOUT, 937) OR IF (ERRCOD .EQ. 32) ; Error 32 WRITE (LOUT, 935) OR IF (ERRCOD .EQ. 33) ; Error 33 WRITE (LOUT, 933) OR IF (ERRCOD .EQ. 34) ; Error 34 WRITE (LOUT, 931) C In case of gonzo error ELSE ; This isn't possible, but ... WRITE (LOUT, 899) END IF C In case of invalid END statements, show expected type IF ((ERRCOD .GT. 11) .AND. (ERRCOD .LT. 16)) ; Invalid END CALL PAGEBK (1) ; One more line on listing IF ((LASTLP .GT. 2) .AND. (LASTLP .LT. 6)) ; Last loop IF WRITE (LOUT, 961) ; Expected an END IF OR IF (LASTLP .EQ. 7) ; Last loop WHILE WRITE (LOUT, 965) ; Expected an END WHILE OR IF (LASTLP .EQ. 12) ; Last loop DO - UNTIL WRITE (LOUT, 963) ; Expected an UNTIL () OR IF (LASTLP .EQ. 15) ; Last loop FOR WRITE (LOUT, 969) ; Expected an END FOR ELSE ; Not expecting an END WRITE (LOUT, 959) ; Not expecting anything END IF END IF RETURN END