From decwrl!wyse!mips!apple!bridge2!jarthur!uunet!allbery Wed May 16 10:15:15 PDT 1990 Article 1573 of comp.sources.misc: Path: decwrl!wyse!mips!apple!bridge2!jarthur!uunet!allbery From: julian@cernvax.cern.ch (julian bunn) Newsgroups: comp.sources.misc Subject: v12i095: Floppy - Fortran Coding Convention Checker Part 09/11 Keywords: fortran Message-ID: <88888@uunet.UU.NET> Date: 14 May 90 23:17:22 GMT Sender: allbery@uunet.UU.NET Organization: CERN, Geneva, Switzerland Lines: 1338 Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) Posting-number: Volume 12, Issue 95 Submitted-by: julian@cernvax.cern.ch (julian bunn) Archive-name: ffccc/part09 #!/bin/sh echo 'Start of Floppy, part 09 of 11:' echo 'x - CHKCHR.f' sed 's/^X//' > CHKCHR.f << '/' X SUBROUTINE CHKCHR XC Checks that incorrect relational operators XC are not used to compare XC character strings in IF clauses. XC INPUT ; current statement description XC OUTPUT ; NFAULT XC X include 'PARAM.h' X include 'ALCAZA.h' X include 'CLASS.h' X include 'FLAGS.h' X include 'CURSTA.h' X include 'STATE.h' X include 'USSTMT.h' X include 'USUNIT.h' X include 'USLTYD.h' X include 'USIGNO.h' X include 'CHECKS.h' X LOGICAL BTEST X IF(UNFLP) RETURN X IF(.NOT.LCHECK(42)) RETURN X ICL1 = ICURCL(1) X IF(.NOT.LIFF(ICL1)) RETURN XC Find end of IF X ILOC = INDEX(SSTA(:NCHST),'(') X IF(ILOC.EQ.0) RETURN X CALL SKIPLV(SSTA,ILOC+1,NCHST,.FALSE.,ILOCE,ILEV) X IF(ILOCE.EQ.0) RETURN X DO 40 I=1,NSNAME XC Looping over variable names in the statement X IF(NSSTRT(I).GT.ILOCE) RETURN XC Variable is inside IF clause X IF(.NOT.BTEST(NAMTYP(ISNAME+I),5)) GOTO 40 XC Character variable X DO 10 IPOS=NSSTRT(I)-1,ILOC+1,-1 X IF(SSTA(IPOS:IPOS).EQ.' ') GOTO 10 X IF(SSTA(IPOS:IPOS).EQ.'(') GOTO 20 X IF(SSTA(IPOS:IPOS).NE.'.') GOTO 20 XC Check for incorrect relational operators X IF(SSTA(IPOS-3:IPOS).EQ.'.OR.') GOTO 20 X IF(SSTA(IPOS-3:IPOS).EQ.'.EQ.') GOTO 20 X IF(SSTA(IPOS-3:IPOS).EQ.'.NE.') GOTO 20 X IF(SSTA(IPOS-4:IPOS).EQ.'.AND.') GOTO 20 X IF(ILOCE-ILOC.GT.20) ILOCE=ILOC+20 X WRITE(MZUNIT,500) SSTA(ILOC:ILOCE) X NFAULT = NFAULT + 1 X RETURN X 10 CONTINUE X 20 ILEV = 0 X DO 30 IPOS=NSEND(I)+1,ILOCE-1 X IF(SSTA(IPOS:IPOS).EQ.' ') GOTO 30 X IF(SSTA(IPOS:IPOS).EQ.'(') ILEV=ILEV+1 X IF(SSTA(IPOS:IPOS).EQ.')') ILEV=ILEV-1 X IF(SSTA(IPOS:IPOS).EQ.')') GOTO 30 X IF(ILEV.NE.0) GOTO 30 X IF(SSTA(IPOS:IPOS).NE.'.') GOTO 40 X IF(SSTA(IPOS:IPOS+3).EQ.'.OR.') GOTO 40 X IF(SSTA(IPOS:IPOS+3).EQ.'.EQ.') GOTO 40 X IF(SSTA(IPOS:IPOS+3).EQ.'.NE.') GOTO 40 X IF(SSTA(IPOS:IPOS+4).EQ.'.AND.') GOTO 40 X IF(ILOCE-ILOC.GT.20) ILOCE=ILOC+20 X WRITE(MZUNIT,500) SSTA(ILOC:ILOCE) X NFAULT = NFAULT + 1 X RETURN X 30 CONTINUE X 40 CONTINUE X RETURN X 500 FORMAT(1X,'!!! WARNING ... IF CLAUSE ',A,' USES', X +' INCORRECT RELATIONAL OPERATORS FOR CHARACTER TYPE') X END / echo 'x - CSTATE.h' sed 's/^X//' > CSTATE.h << '/' X*IF DEF,NEVER X*----------------------------------------------------------------------- X* /STATE/ contains the information concerning the actual X* status of the program X* NLINES no. of lines in line image buffer SIMA X* NKEEPL buffered line number in READEC, or 0 X* NSTAMM total no. of statements in current routine X* NFSTAT no. of FORTRAN statements in current routine X* ISNAME pointer to start-1 of stmt. names in SNAMES X* NSNAME no. of names found in statement X* IRNAME pointer to start-1 of names/routine in SNAMES X* NRNAME no. of names/routine X* IGNAME pointer to start-1 of global names in SNAMES X* NGNAME no. of global names X* INDCNT current indentation level (reset at routine start) X* INDFAC no. of ch./level to indent X* KNTDO current DO loop level (for indentation) X* KNTIF current IF...THEN level (for indentation) X* IBLPAD in QUOTES option, string blank-padded to multiples X* of IBLPAD (default = 1) X* NRORST no. of currently selected OR-sets in LRORST X* NSTANU no. of statement numbers in KSTANU, KSTARE X* ICBPRT no. of c.b. variables printed at ACTION(24) X* NCBNAM no. of c.b. names in NCBGRP, KCBGRP, SCBNAM X* NEQNAM no. of equiv. groups in NEQGRP, KEQGRP X* NCBVAR no. of names in SEQNAM X* NCBGRP no. of common block variables per c.b. X* KCBGRP pos.-1 of start of c.b. name list in SCBNAM X* LCBNAM # of c.b. variables used in current routine X* LCBVAR counts number of times a variable is referenced X* NEQGRP no. of names in equiv. group X* KEQGRP pos.-1 of start of equiv. group in SCBNAM X* LRORST list of OR-sets valid for current routine X* NAMTYP variable type, parallel to SNAMES X* NSSTRT start of name I in SSTA X* NSEND end of name I in SSTA X* KSTANU statement numbers in routine (sorted) X* KSTARE new statement numbers, corresponding to KSTANU X* NLTYPE type of line I (0 comment, 1 start, 2 cont. of stmt. ) X* ICLASS(I,1) type of statement I X* 0 = comment X* 999 = no comment, not classified X* class = ICURCL(1), common /CURSTA/ X* ICLASS(I,2) type of second part of statement I if logical IF X* IMODIF 10*n2 + n1 X* n1 = 1 : statement has been filtered X* n2 = 1 : statement has been modified X* NFLINE start of statement I in SIMA X* NLLINE end of statement I in SIMA X*----------------------------------------------------------------------- X*EI / echo 'x - FLAGS.h' sed 's/^X//' > FLAGS.h << '/' X COMMON/FLAGS/ACTION(MXFLAG),STATUS(MXFLAG) X LOGICAL ACTION,STATUS X*IF DEF,NEVER X*----------------------------------------------------------------------- X* +++++++++++++++++++++++++ action flags - as listed X* 1 make namelist/routine X* 2 make global namelist X* 3 print illegal statements X* 4 print changed statements X* 5 print filtered statements X* 6 print all statements X* 7 write changed statements only on output file X* 8 write filtered on output file X* 9 write all on output file X* 10 take first name only in statement X* 11 convert hollerith to quotes X* 12 string replacement requested X* 13 resequence statement numbers X* 14 FORMAT to end of routine X* 15 name replacements requested X* 16 routine filters given X* 17 class filters given X* 18 name filters given X* 19 string filters given X* 20 type variables X* 21 indent X* 22 USER command given X* 23 compressed output file requested X* 24 COMMON block option (signal unused and used C.B.) X* 25 print namelist / routine X* 26 print global namelist X* 27 print COMMON block and variable usage X* 28 adjust GOTO to the right X* 29 write tree output file on unit 13 X* +++++++++++++++++++++++++ status flags - as listed X* 1 no more lines on input X* 2 no more lines to process X* 3 illegal stmnt. detected in EXTRAC (unclosed string, or X* illegal character '{', '}' ). X* 4 end of program due to time limit X* 5 currently buffered routine without end (split) X* 6 currently buffered routine continuation (split) X* 7 current routine filtered X* 8 last filter passed X* 9 routine header still to be printed X* 10 statement still to be printed X* 11 statement cannot be changed (length overflow,or illegal repl.) X* 12 c.b. name list overflow in PROCOM, discard current routine X* 13 true when equiv. groups and commons have been merged (PROCOM) X* 14 true when current routine is a SUBROUTINE X*----------------------------------------------------------------------- X*EI / echo 'x - GETCON.f' sed 's/^X//' > GETCON.f << '/' X SUBROUTINE GETCON(STRING,I1,I2,KLCH,STYP) X*----------------------------------------------------------------------- X* X*--- returns a numeric constant, and its type. Constant must start on I1 X*--- input X* STRING(I1:I2) string X*--- output X* KLCH last pos. of const., or 0 if none X* STYP type of constant: X* 'I' = integer X* 'R' = real X* 'D' = double prec. X* 'K' = complex X* '$' = not specified X* X*----------------------------------------------------------------------- X CHARACTER *(*) STRING X CHARACTER*1 STYP,STEMP,SLAST,SLOG*7 X include 'CONVEX.h' X STYP='$' X KLCH=0 X STEMP=STRING(I1:I1) X IF(STEMP.EQ.'{') THEN X*--- string, hollerith, etc., all treated as CHARACTER X KPOS=INDEX(STRING(I1:I2),'}') X IF(KPOS.NE.0) THEN X KLCH=I1+KPOS-1 X STYP='C' X ENDIF X ELSEIF(STEMP.EQ.'.') THEN X*--- logical constant ? X CALL GETNBL(STRING(I1:I2),SLOG,NN) X IF(NN.GE.5) THEN X IF(SLOG(:5).EQ.'.NOT.'.OR.SLOG(:6).EQ.'.TRUE.' X + .OR.SLOG.EQ.'.FALSE.') THEN X CALL POSCH('.',STRING,I1+1,I2,.FALSE.,0,KLCH,ILEV) X IF(KLCH.NE.0) THEN X STYP='L' X GOTO 999 X ENDIF X ENDIF X ENDIF X ENDIF X IF(NUMCH(STEMP).OR.STEMP.EQ.'.') THEN X*--- integer, real, or double precision X KLCH=I1 X IF(STEMP.EQ.'.') THEN X STYP='R' X ELSE X STYP='I' X ENDIF X SLAST=STEMP X DO 10 I=I1+1,I2 X STEMP=STRING(I:I) X IF(STEMP.EQ.' ') GOTO 10 X IF(.NOT.NUMCH(STEMP)) THEN X IF(STEMP.EQ.'.'.OR.STEMP.EQ.'E') THEN X STYP='R' X ELSEIF(STEMP.EQ.'D') THEN X STYP='D' X ELSEIF((STEMP.EQ.'+'.OR.STEMP.EQ.'-').AND. (SLAST.EQ.'E' X + .OR.SLAST.EQ.'D')) THEN X CONTINUE X ELSE X GOTO 20 X ENDIF X ENDIF X KLCH=I X SLAST=STEMP X 10 CONTINUE X 20 CONTINUE X ELSEIF(STEMP.EQ.'(') THEN X*--- complex X CALL SKIPLV(STRING,I1+1,I2,.FALSE.,KLCH,ILEV) X IF(KLCH.GT.0) THEN X CALL POSCH(',',STRING,I1+1,KLCH-1,.FALSE.,0,KPOS,ILEV) X IF(KPOS.NE.0) STYP='K' X ENDIF X ENDIF X 999 END / echo 'x - INDECZ.f' sed 's/^X//' > INDECZ.f << '/' X SUBROUTINE INDECZ(ISTR1,ISTR2) X*----------------------------------------------------------------------- X* X* Checks consistency between replacement strings, kills illegal ones X* X*--- Input X* ISTR1 ref. to string to be replaced (rel. to KKYSTA, KKYEND) X* ISTR2 ref. to replacing string X*----------------------------------------------------------------------- X include 'PARAM.h' X include 'ALCAZA.h' X include 'KEYCOM.h' X include 'FLWORK.h' X include 'CONDEC.h' X DIMENSION ICT1(10),ICT2(10),IREF1(MXNAME/20,10), IREF2(MXNAME/20, X +10) X EQUIVALENCE (IREF1(1,1),IWS(1)),(IREF2(1,1),IWS(MXNAME/2+1)) X CHARACTER *40 STEXT(4) X DATA STEXT/'too many special symbols', 'unclosed [...] in string', X +'replacement count [n] too high', X +'unclosed quote string inside string'/ X X include 'CONDAT.h' X IF(ISTR1.GT.0.AND.ISTR2.GT.0) THEN X*--- extract special symbols from first string X CALL SPECCT(1,ISTR1,NTOT1,ICT1,IREF1,IERR) X IF (IERR.NE.0) GOTO 30 X*--- second string X CALL SPECCT(2,ISTR2,NTOT2,ICT2,IREF2,IERR) X IF (IERR.NE.0) GOTO 30 X IF (NTOT2.GT.0) THEN X*--- there are special symbols in the replacement string - X* check that no count in [...] higher than actually present X DO 20 I=1,LEN(SPCHAR) X DO 10 J=1,ICT2(I) X IF (ICT1(I).LT.IREF2(J,I)) THEN X IERR=3 X GOTO 30 X ENDIF X 10 CONTINUE X 20 CONTINUE X ENDIF X ENDIF X GOTO 999 X 30 CONTINUE X*--- error condition - suppress string (or name+string) replacement X WRITE (MPUNIT,10000) STEXT(IERR) X I1=KKYSTA(ISTR1)-1 X I2=KKYEND(ISTR1) X L=(I2-I1-1)/MXLINE+1 X DO 40 I=1,L X SIMA(I)=SKYSTR(I1+1:MIN(I2,I1+MXLINE)) X I1=I1+MXLINE X 40 CONTINUE X CALL FLPRNT(0,'replace',L,SIMA,I1) X I1=KKYSTA(ISTR2)-1 X I2=KKYEND(ISTR2) X L=(I2-I1-1)/MXLINE+1 X DO 50 I=1,L X SIMA(I)=SKYSTR(I1+1:MIN(I2,I1+MXLINE)) X I1=I1+MXLINE X 50 CONTINUE X CALL FLPRNT(0,'by string',L,SIMA,I1) X ISTR1=-IERR X10000 FORMAT(/' +++++++ WARNING - ',A,' in following replacement ', X +'request, request ignored') X 999 END / echo 'x - PARAM.h' sed 's/^X//' > PARAM.h << '/' X PARAMETER(MXNAME=20000,MXSSTM=600,MXSTAT=71,MCLASS=22,MXLENG=1320, X 1 MXLINE=80,MXSIMA=2000,MXSIMD=MXSIMA+500,MCUNIT=7,MPUNIT=6, X 2 MIUNIT=11,MTUNIT=13,MOUNIT=14,MXFLAG=30,MXNMCH=8,MXORST=20, X 3 MDIMST=2000,MGLOKY=9,MLOCKY=4,MSUBKY=24,MTOTKY=MGLOKY+MLOCKY, X 4 MXKEYS=MGLOKY+MXORST*MLOCKY,MXKINT=100,MXKNAM=500,MXTYPE=20, X 5 MAXNUM=1000,MAXGRP=100,TIMLIM=1., X + VERSIO=6.00, X 6 KALL=100,KENT=20,NOARG=50) X*IF DEF,NEVER X*----------------------------------------------------------------------- X*--- MXNAME = dimension of IWS, COMMON/FLWORK/, and of SNAMES /ALCAZA/ X* MXSSTM = length of string SSTM, COMMON/ALCAZA/ X* MXSTAT = max. no. of statement definitions X* MCLASS = first dim. of ISTMDS( , ) = no. of control words/statement X* MXLENG = max. length of statement field (20*66) X* MXLINE = line length of input image X* MXSIMA = max. no. of lines in input image (one routine) X* MXSIMD = dim. of SIMA (excess for replacement overflows) X* MCUNIT = file for command input (data cards) X* MPUNIT = file for printed output X* MIUNIT = FORTRAN code input unit X* MTUNIT = TREE output unit X* MOUNIT = FORTRAN code output unit X* MXFLAG = no. of status and action flags X* MXNMCH = max. no. of characters per name X* MXORST = max. no. of OR-sets in control commands X* MDIMST = dimension of SSTA, SSTR, SKYSTR X* MGLOKY = no. of global command keys X* MLOCKY = no. of local (in each OR-set) command keys X* MSUBKY = no. of command sub-keys X* MXKINT = dim. of KEYINT /KEYINP/ X* MXKNAM = max. no. of names or strings on input commands (total) X* MXTYPE = max. no. of variable types X* MAXNUM = max. no. of statement numbers per routine X* MAXGRP = max. no. of c.b. names or equiv. groups (for ACTION(24)) X* TIMLIM = if less time left, refrain from reading next routine X* VERSIO = program version X* KALL = max. no. of different externals / routine (TREE) X* KENT = max. no. of ENTRY statements / routine (TREE) X* NOARG = max. no. of arguments / call (TREE) X*----------------------------------------------------------------------- X*EI / echo 'x - PRNAMF.f' sed 's/^X//' > PRNAMF.f << '/' X SUBROUTINE PRNAMF(ICC1,ICC2) X*----------------------------------------------------------------------- X* X* Prints name table with all attributes (types) X* X* Input X* ICC1 first name is SNAMES to be printed X* ICC2 last - - X* X* NAMTYP , common /STATE/ X* X* Each type corresponds to a bit position (for testing use ITBIT). X* X* Types are: X* X* Bit meaning X* X* 1 INTEGER X* 2 REAL X* 3 LOGICAL X* 4 COMPLEX X* 5 DOUBLE PRECISION X* 6 CHARACTER X* 7 PARAMETER X* 8 COMMON block name X* 9 NAMELIST name X* 10 statement function X* 11 INTRINSIC X* 12 EXTERNAL X* 13 PROGRAM name X* 14 BLOCK DATA name X* 15 SUBROUTINE X* 16 ENTRY X* 17 FUNCTION (intrinsic or external) X* 18 dimensioned X* 19 (routine or function) argument X* 20 in a COMMON block X* 21 strongly typed function (internal usage) X* X*----------------------------------------------------------------------- X include 'PARAM.h' X include 'ALCAZA.h' X include 'STATE.h' X CHARACTER SLINE*120, STYP(MXTYPE)*18 X DIMENSION LTYP(MXTYPE) X DATA STYP/'INTEGER','REAL','LOGICAL','COMPLEX','DOUBLE PRECISION', X +'CHARACTER','PARAMETER','COMMON block','NAMELIST', X +'statement function','INTRINSIC','EXTERNAL','PROGRAM', X +'BLOCK DATA','SUBROUTINE','ENTRY','FUNCTION', 'array','argument', X +'in COMMON'/ X DATA LTYP/7,4,7,7,16,9,9,12,8,18,9,8,7,10,10,5,8,5,8,9/ X IP=0 X SLINE=' ' X DO 20 I=ICC1,ICC2 X SLINE(IP+1:IP+MXNMCH)=SNAMES(I) X IPT=IP+MXNMCH+3 X NT=NAMTYP(I) X DO 10 J=1,MXTYPE X IF (MOD(NT,2).NE.0) THEN X L=LTYP(J) X IF (IPT+L.LE.IP+60) THEN X SLINE(IPT+1:IPT+L)=STYP(J)(:L) X IPT=IPT+L+2 X ENDIF X ENDIF X NT=NT/2 X 10 CONTINUE X IF (IP.EQ.0) THEN X IP=60 X ELSE X IP=0 X WRITE (MPUNIT,'(1X,A120)') SLINE X SLINE=' ' X ENDIF X 20 CONTINUE X IF(IP.NE.0) THEN X WRITE (MPUNIT,'(1X,A120)') SLINE X ENDIF X END / echo 'x - PRTCOM.f' sed 's/^X//' > PRTCOM.f << '/' X SUBROUTINE PRTCOM X*----------------------------------------------------------------------- X* X* Prints common block usage and variables referenced X* as prepared by routine PROCOM (option COMMON). X* X*----------------------------------------------------------------------- X include 'PARAM.h' X include 'ALCAZA.h' X include 'STATE.h' X CHARACTER*(MXNMCH) SLOC(5) X DIMENSION ILOC(5) X IF(NCBNAM.GT.0) THEN X NUSE=0 X DO 10 I=1,NCBNAM X IF(LCBNAM(I).GT.0) NUSE=NUSE+1 X 10 CONTINUE X WRITE(MPUNIT,10000) SCROUT,NCBNAM,NUSE X WRITE(MPUNIT,10010) (SCBNAM(I),LCBNAM(I),I=1,NCBNAM) X IF(ICBPRT.GT.0) THEN X WRITE(MPUNIT,10020) ICBPRT X DO 40 I=1,NCBNAM X N=0 X NT=0 X K=KCBGRP(I) X DO 20 J=1,NCBGRP(I) X IF(LCBVAR(K+J).NE.0) THEN X N=N+1 X NT=NT+1 X SLOC(N)=SCBVAR(K+J) X ILOC(N)=LCBVAR(K+J) X IF(NT.EQ.ICBPRT) GOTO 30 X IF(N.EQ.5) THEN X IF(NT.LE.5) THEN X WRITE(MPUNIT,10030) SCBNAM(I),(SLOC(M),ILOC X + (M),M=1,N) X ELSE X WRITE(MPUNIT,10040) (SLOC(M),ILOC(M),M=1,N) X ENDIF X N=0 X ENDIF X ENDIF X 20 CONTINUE X 30 CONTINUE X IF(N.GT.0) THEN X IF(NT.LE.5) THEN X WRITE(MPUNIT,10030) SCBNAM(I),(SLOC(M),ILOC(M),M=1, X + N) X ELSE X WRITE(MPUNIT,10040) (SLOC(M),ILOC(M),M=1,N) X ENDIF X ENDIF X 40 CONTINUE X ENDIF X ENDIF X10000 FORMAT(/' +++ routine ',A8,' has ',I5,' common blocks ', X +'of which ',I5,' are used') X10010 FORMAT(' c.b. name + no. of var. used ',T45, A8,I4,3X,A8,I4, 3 X +X,A8,I4,3X,A8,I4,3X,A8,I4/ (T45,A8,I4,3X,A8,I4,3X,A8,I4,3X,A8,I4,3 X +X,A8,I4)) X10020 FORMAT(/' list of first ',I5,' common variables in each ', X +'block + number of references'/) X10030 FORMAT(' /',A8,'/',T20,5(A8,I4,3X)) X10040 FORMAT(T20,5(A8,I4,3X)) X END / echo 'x - PUTOPT.f' sed 's/^X//' > PUTOPT.f << '/' X SUBROUTINE PUTOPT(SOPT,LOPT,ICHR,IERR) XC! Put an operator on the stack X include 'STACK.h' X CHARACTER*(*) SOPT X include 'OPPREC.h' XC XC Here we use the operator precedence for Fortran to determine XC whether the addition of this operator will cause the stack XC to be reduced. Note both right and left precedence is needed. XC Thanks to Julian Blake for this info. XC X IERR = 0 X DO 10 I=1,LOPS X IF(ILENO(I).NE.LOPT) GOTO 10 X IF(SOPT(:LOPT).EQ.COPER(I)(:LOPT)) GOTO 20 X 10 CONTINUE X IERR = 1 XC not found ... not an operator X GOTO 30 X 20 CONTINUE XC found. Operator number I X IOP = I X IPREC = IRITP(IOP) XC XC WRITE(6,100) NLEVL,(CTYP(I),COPD(I)(:LOPD(I)),COPT(I), XC & IPOP(I),IPOS(I), XC & I=NLEVL,1,-1) XC XC WRITE(6,110) SOPT(:LOPT),IPREC XC XC check if operator already present X IF(COPT(NLEVL)(:1).NE.' ') THEN X NLEVL = NLEVL + 1 X CTYP(NLEVL) = '$' X COPD(NLEVL)(:LCOPD) = ' ' X LOPD(NLEVL) = 0 X COPT(NLEVL)(:LOPER) = ' ' X COPT(NLEVL)(:LOPT) = SOPT(:LOPT) X IPOP(NLEVL) = ILEFP(IOP) X IPOS(NLEVL) = ICHR X IERR = 0 X GOTO 30 X ENDIF XC place operator on stack X COPT(NLEVL)(:LOPER) = ' ' X COPT(NLEVL)(:LOPT) = SOPT(:LOPT) X IPOP(NLEVL) = ILEFP(IOP) X IPOS(NLEVL) = ICHR XC check for reduction of stack X IF(NLEVL.EQ.1) THEN X IERR = 0 X GOTO 30 X ENDIF X IF(IRITP(IOP).GT.IPOP(NLEVL-1)) THEN X IERR = 0 X GOTO 30 X ENDIF XC expression must be reduced X CALL REDEXP(IOP,IERR) X IERR = -IERR X 30 CONTINUE X RETURN X 500 FORMAT(///,1X,'IN PUTOPT ... STACK LEVEL = ',I2, /,1X, X +'TYPE,OPERAND',23X,',OPERATOR,PRECEDENCE,POSITION', /,1X, X +'---- -------',23('-'),' -------- ---------- --------', (/,1X,2X, X +A1,2X,A30,8X,A2,6X,I2,8X,I2)) X 510 FORMAT(1X,'CURRENT OPERATOR -> ',A,' PRECEDENCE = ',I2) X END / echo 'x - QUOSUB.f' sed 's/^X//' > QUOSUB.f << '/' X SUBROUTINE QUOSUB X*----------------------------------------------------------------------- X* X* Removes {} = string indicators, changes " or ...H to ' if ACTION(11) X* X*----------------------------------------------------------------------- X include 'PARAM.h' X include 'ALCAZA.h' X include 'FLAGS.h' X include 'CURSTA.h' X include 'STATE.h' X include 'JOBSUM.h' X CHARACTER *1 STEMP X NMOD=IMODIF(NSTREF) X NCH=0 X IPT=0 X 10 CONTINUE X IF (IPT.EQ.NCHST) GOTO 30 X IN=INDEX(SSTA(IPT+1:NCHST),'{') X IF (IN.EQ.0) GOTO 30 X L=IN-1 X IN=IPT+IN X IF(L.GT.0) THEN X IF (NCH+L.GT.MXLENG) GOTO 40 X SSTR(NCH+1:NCH+L)=SSTA(IPT+1:IPT+L) X NCH=NCH+L X ENDIF X IPT=IN X IN=INDEX(SSTA(IPT+1:NCHST),'}') X L=IN-1 X IN=IPT+IN X STEMP=SSTA(IPT+1:IPT+1) X IF(STEMP.EQ.''''.OR..NOT.ACTION(11)) THEN X IF (NCH+L.GT.MXLENG) GOTO 40 X SSTR(NCH+1:NCH+L)=SSTA(IPT+1:IN-1) X NCH=NCH+L X ELSE X*--- replace " or ...H, double up single quotes X IF (NMOD.LT.10) NMOD=NMOD+10 X IF (STEMP.EQ.'"') THEN X I1=IPT+2 X I2=IN-2 X ELSE X*--- find H X I1=IPT+INDEX(SSTA(IPT+1:NCHST),'H')+1 X I2=IN-1 X ENDIF X NCH=NCH+1 X IF (NCH.GT.MXLENG) GOTO 40 X SSTR(NCH:NCH)='''' X DO 20 I=I1,I2 X NCH=NCH+1 X IF (NCH.GT.MXLENG) GOTO 40 X STEMP=SSTA(I:I) X SSTR(NCH:NCH)=STEMP X IF (STEMP.EQ.'''') THEN X NCH=NCH+1 X IF (NCH.GT.MXLENG) GOTO 40 X SSTR(NCH:NCH)=STEMP X ENDIF X 20 CONTINUE X IF (IBLPAD.GT.1) THEN X*--- blank pad string up to multiple of IBLPAD X KPAD=MOD(I2+1-I1,IBLPAD) X IF (KPAD.GT.0) THEN X I=IBLPAD-KPAD X IF (NCH+I.GT.MXLENG) GOTO 40 X SSTR(NCH+1:NCH+I)=' ' X NCH=NCH+I X ENDIF X ENDIF X NCH=NCH+1 X IF (NCH.GT.MXLENG) GOTO 40 X SSTR(NCH:NCH)='''' X ENDIF X IPT=IN X GOTO 10 X 30 CONTINUE X*--- transfer rest and swap if modified X IF (IPT.EQ.0) GOTO 999 X L=NCHST-IPT+1 X IF(L.GT.0) THEN X IF (NCH+L.GT.MXLENG) GOTO 40 X SSTR(NCH+1:NCH+L)=SSTA(IPT+1:NCHST) X NCH=NCH+L X ENDIF X IMODIF(NSTREF)=NMOD X SSTA(:NCH)=SSTR(:NCH) X NCHST=NCH X GOTO 999 X 40 CONTINUE X*--- error exit - statement too long X WRITE (MPUNIT,10000) X CALL FLPRNT(1,'OVERFLOW',NLLINE(NSTREF)-NFLINE(NSTREF)+1, SIMA X +(NFLINE(NSTREF)),NDUMMY) X NSTATC(6)=NSTATC(6)+1 X STATUS(11)=.TRUE. X10000 FORMAT(/' ++++++ Warning - replacements would lead to overflow', X +' in following statement, not done') X 999 END / echo 'x - REDEXP.f' sed 's/^X//' > REDEXP.f << '/' X SUBROUTINE REDEXP(IOP,IERR) XC! Reduce the expression on the stack X include 'PARAM.h' X include 'CURSTA.h' X include 'STACK.h' X include 'ALCAZA.h' X include 'USUNIT.h' X CHARACTER*(MDIMST) CTEMP X CHARACTER*(LCOPD) SNEW X CHARACTER*1 SNUTY X include 'OPPREC.h' XC XC WRITE(6,100) XC 100 FORMAT(//,1X,'Now reduce the expression on the stack') XC X IERR = 0 X 5 CONTINUE X IF(NLEVL.LE.1) THEN X IERR = 1 X GOTO 900 X ENDIF XC X L1 = MAX(1,LOPD(NLEVL-1)) X L2 = MAX(1,INDEX(COPT(NLEVL-1),' ' )-1) X L3 = MAX(1,LOPD(NLEVL)) X L = L1+L2+L3 XC The exepression to be reduced is SNEW X SNEW(:L)=COPD(NLEVL-1)(:L1)//COPT(NLEVL-1)(:L2)//COPD(NLEVL)(:L3) XC XC check for generic intrinsic function XC if so, then assign the type of the expression in parentheses XC to the function XC X IF(CTYP(NLEVL-1).EQ.'$'.AND.COPT(NLEVL-1)(:1).EQ.'(') THEN X CTYP(NLEVL-1) = CTYP(NLEVL) X ENDIF XC XC check for mixed mode operation XC X CALL OPRSLT(CTYP(NLEVL-1),COPT(NLEVL-1),CTYP(NLEVL), X & IERR,SNUTY) X IF(IERR.EQ.1) THEN X DO 10 ICH=1,NCHST X CTEMP(ICH:ICH) = ' ' X IF(ICH.EQ.IPOS(NLEVL-1)) CTEMP(ICH:ICH) = '^' X 10 CONTINUE XC WRITE(6,110) SSTA(1:NCHST),CTEMP(:NCHST) X IFINT=MIN(NCHST,100) X WRITE(MZUNIT,110) SSTA(1:IFINT),CTEMP(1:IFINT) X 110 FORMAT(1X,'!!! MIXED MODE EXPRESSION (BAD OPERATOR IS MARKED)', X & /,1X,A,/,1X,A) X GOTO 900 X ENDIF XC XC treat matching parantheses specially XC X IF(COPT(NLEVL-1).EQ.'('.AND.COPER(IOP).EQ.')') THEN X IF(L1.EQ.0) THEN X SNUTY = CTYP(NLEVL) X ELSE X SNUTY = CTYP(NLEVL-1) X ENDIF X SNEW(:L+1) = SNEW(:L)//')' X L = L+1 X NLEVL = NLEVL - 1 X CTYP(NLEVL) = SNUTY X COPD(NLEVL) = SNEW X LOPD(NLEVL) = L X COPT(NLEVL) = ' ' X IPOP(NLEVL) = 0 X IPOS(NLEVL) = 0 X GOTO 900 X ENDIF XC X NLEVL = NLEVL-1 X CTYP(NLEVL) = SNUTY X COPD(NLEVL) = SNEW X LOPD(NLEVL) = L X COPT(NLEVL) = COPER(IOP) X IPOP(NLEVL) = ILEFP(IOP) X IPOS(NLEVL) = 0 XC X IF(IRITP(IOP).GT.IPOP(NLEVL-1)) THEN X GOTO 900 X ENDIF XC XC continue reduction XC X GOTO 5 X 900 CONTINUE X RETURN X END / echo 'x - REPSTR.f' sed 's/^X//' > REPSTR.f << '/' X SUBROUTINE REPSTR X*----------------------------------------------------------------------- X* X* Performs string replacements X* X*----------------------------------------------------------------------- X include 'PARAM.h' X include 'ALCAZA.h' X include 'FLAGS.h' X include 'CURSTA.h' X include 'STATE.h' X include 'KEYCOM.h' X include 'JOBSUM.h' X DIMENSION KSP1(100),KSP2(100) X CHARACTER*1 STEMP X NMOD=IMODIF(NSTREF) X*--- check for 'REP' key X DO 10 IK=1,NGLSET X IF (KEYREF(IK,1).EQ.9) GOTO 20 X 10 CONTINUE X GOTO 999 X 20 CONTINUE X*--- check for string replacement X IF (KEYREF(IK,6).EQ.0) GOTO 999 X DO 50 I=KEYREF(IK,7)+1,KEYREF(IK,7)+KEYREF(IK,6) X NCH=0 X IPT=0 X KREF1=KSTREF(I,1) X KREF2=KSTREF(I,2) X*--- check illegal X IF (KREF1.LE.0) GOTO 50 X K1=KKYSTA(KREF1) X K2=KKYEND(KREF1) X IF (SKYSTR(K1:K1).NE.'#') THEN X*--- insert '#' for free match X KST=1 X K1=K1-1 X STEMP=SKYSTR(K1:K1) X SKYSTR(K1:K1)='#' X ELSE X KST=0 X ENDIF X 30 CONTINUE X CALL MATCH(SKYSTR,K1,K2,SSTA,IPT+1,NCHST,.TRUE.,KPOS,ILEV,NSPEC X + ,KSP1,KSP2) X IF (KPOS.EQ.0) GOTO 40 X*--- string does match X*--- set modify flag X IF (NMOD.LT.10) NMOD=NMOD+10 X*--- transfer additional '#' if there X IF (KST.NE.0) THEN X L=KSP2(1)-IPT X IF (L.GT.0) THEN X SSTR(NCH+1:NCH+L)=SSTA(IPT+1:IPT+L) X NCH=NCH+L X ENDIF X ENDIF X IPT=KPOS X IF (KREF2.GT.0) THEN X*--- non-empty replacement string exists X CALL REPSUB(KREF1,KREF2,NSPEC-KST,KSP1(KST+1),KSP2(KST+1), X + NCH) X IF (NCH.GT.MXLENG) GOTO 60 X ENDIF X IF (IPT.LT.NCHST) GOTO 30 X 40 CONTINUE X IF (KST.NE.0) SKYSTR(K1:K1)=STEMP X IF (IPT.NE.0) THEN X*--- copy SSTR to SSTA, NCH to NCHST X L=NCHST-IPT X IF (L.GT.0) THEN X IF (NCH+L.GT.MXLENG) GOTO 60 X SSTR(NCH+1:NCH+L)=SSTA(IPT+1:NCHST) X NCH=NCH+L X ENDIF X NCHST=NCH X SSTA(:NCH)=SSTR(:NCH) X ENDIF X 50 CONTINUE X IMODIF(NSTREF)=NMOD X GOTO 999 X 60 CONTINUE X WRITE (MPUNIT,10000) X CALL FLPRNT(1,'OVERFLOW',NLLINE(NSTREF)-NFLINE(NSTREF)+1, SIMA X +(NFLINE(NSTREF)),NDUMMY) X NSTATC(6)=NSTATC(6)+1 X STATUS(11)=.TRUE. X10000 FORMAT(/' ++++++ Warning - replacements would lead to overflow', X +' in following statement, not done') X 999 END / echo 'x - SETIMP.f' sed 's/^X//' > SETIMP.f << '/' X SUBROUTINE SETIMP X*----------------------------------------------------------------------- X* X* Sets the default type list for an IMPLICIT statement, updates the X* already existing routine names (except for strongly typed). X* X*----------------------------------------------------------------------- X include 'PARAM.h' X include 'ALCAZA.h' X include 'CONDEC.h' X include 'FLWORK.h' X include 'CURSTA.h' X include 'TYPDEF.h' X CHARACTER STYP(6)*16,STEMP*1,SPREV*1,STEMP2*2 X DIMENSION LTYP(6) X DATA STYP/'#INTEGER','#REAL','#LOGICAL','#COMPLEX', X +'#DOUBLEPRECISION','#CHARACTER'/ X DATA LTYP/8,5,8,8,16,10/ X include 'CONDAT.h' X IPT=0 X 10 CONTINUE X IND=NCHST X DO 20 I=1,6 X CALL MATCH(STYP(I),1,LTYP(I),SSTA,IPT+1,NCHST,.FALSE.,IPOS,ILEV X + ,NSPEC,IWS,IWS) X IF (IPOS.GT.0.AND.IPOS.LE.IND) THEN X IND=IPOS X IT=I X ENDIF X 20 CONTINUE X IF (IND+3.GT.NCHST) GOTO 999 X IPT=IND X*--- skip possible '*(...)' following the key X CALL GETNBL(SSTA(IPT+1:NCHST),STEMP2,NN) X IF (NN.LT.2) GOTO 999 X IF(STEMP2.EQ.'*(') THEN X IPT=IPT+INDEX(SSTA(IPT+1:NCHST),'(') X CALL SKIPLV(SSTA,IPT+1,NCHST,.FALSE.,IPOS,ILEV) X IF (IPOS.EQ.0) GOTO 999 X IPT=IPOS X ENDIF X*--- get start and end of bracket following type X IND=INDEX(SSTA(IPT+1:NCHST),'(') X IF (IND.EQ.0) GOTO 999 X IPT=IPT+IND X CALL SKIPLV(SSTA,IPT+1,NCHST,.FALSE.,IPOS,ILEV) X IF (IPOS.EQ.0) GOTO 999 X*--- loop over bracket, set type, reset types routine name table X SPREV=' ' X KP=27 X DO 40 I=IPT+1,IPOS-1 X STEMP=SSTA(I:I) X IF (STEMP.EQ.' ') GOTO 40 X K=ICVAL(STEMP) X IF (K.GT.0.AND.K.LE.26) THEN X IF (SPREV.EQ.'-') THEN X DO 30 J=KP,K X KVTYPE(J)=IT X 30 CONTINUE X ELSE X KVTYPE(K)=IT X ENDIF X KP=K X ENDIF X SPREV=STEMP X 40 CONTINUE X IPT=IPOS X GOTO 10 X 999 END / echo 'x - SKIPTP.f' sed 's/^X//' > SKIPTP.f << '/' X SUBROUTINE SKIPTP(ITYPE,STRING,ICC1,ICC2,HOLFLG,KPOS,ILEV) X*----------------------------------------------------------------------- X* positions on the last character of a string of the requested type X* input X* ITYPE 1 = numeric X* 2 = alpha X* 3 = alpha-numeric X* 4 = special X* 5 = FORTRAN-name X* 6 = expression ( no [,] at level 0 ) X* STRING string X* ICC1 first ch, in string X* ICC2 last - - - X* HOLFLG if TRUE, hollerith included X* output X* KPOS position of last ch. of given type, if ICC1 is of that X* type, otherwise = 0 X* ILEV level (including KPOS) relative to input level 0 X*----------------------------------------------------------------------- X LOGICAL HOLFLG X CHARACTER STRING*(*),STEMP*1 X include 'CONVEX.h' X ILEV=0 X KPOS=0 X NCNT=0 X ISSTR=0 X ILBASE=-1 X JC=ICC1-1 X 10 JC=JC+1 X IF (JC.GT.ICC2) GOTO 999 X STEMP=STRING(JC:JC) X*--- skip blanks outside strings X IF (STEMP.EQ.' '.AND.ISSTR.EQ.0) GOTO 10 X IF(STEMP.EQ.'{') THEN X*--- start of character string X ISSTR=1 X IF (.NOT.HOLFLG) THEN X ISSTR=0 X I=INDEX(STRING(JC:ICC2),'}') X IF (I.EQ.0) GOTO 999 X JC=I+JC-2 X ENDIF X GOTO 10 X ELSEIF(STEMP.EQ.'}') THEN X ISSTR=0 X IF(ITYPE.EQ.6) THEN X KPOS=JC X ELSE X GOTO 10 X ENDIF X ELSEIF(ITYPE.EQ.1) THEN X IF (NUMCH(STEMP)) KPOS=JC X ELSEIF(ITYPE.EQ.2) THEN X IF (ALPHCH(STEMP)) KPOS=JC X ELSEIF(ITYPE.EQ.3) THEN X IF (ANUMCH(STEMP)) KPOS=JC X ELSEIF(ITYPE.EQ.4) THEN X IF (SPECCH(STEMP)) THEN X KPOS=JC X IF (STEMP.EQ.'(') THEN X ILEV=ILEV+1 X ELSEIF (STEMP.EQ.')') THEN X ILEV=ILEV-1 X ENDIF X ENDIF X ELSEIF(ITYPE.EQ.5) THEN X IF (NCNT.EQ.0) THEN X IF (ALPHCH(STEMP)) THEN X KPOS=JC X NCNT=NCNT+1 X ENDIF X ELSEIF (ANUMCH(STEMP)) THEN X KPOS=JC X ENDIF X ELSEIF(ITYPE.EQ.6) THEN X IF (KPOS.EQ.0.AND..NOT.(ANUMCH(STEMP).OR.STEMP.EQ.'('.OR.STEMP. X + EQ.'+'.OR.STEMP.EQ.'-'.OR.STEMP.EQ.''''))GOTO 999 X IF (STEMP.EQ.'(') THEN X ILEV=ILEV+1 X ELSEIF (ILBASE.LT.0) THEN X ILBASE=ILEV X ENDIF X IF (STEMP.EQ.')') ILEV=ILEV-1 X IF ((STEMP.NE.','.OR.ILEV-ILBASE.GT.0).AND.ILEV.GE.0) KPOS=JC X ENDIF X IF (KPOS.EQ.JC) GOTO 10 X 999 END / echo 'x - SPECCT.f' sed 's/^X//' > SPECCT.f << '/' X SUBROUTINE SPECCT(MODE,ISTR,NTOT,ICT,IREF,IERR) X*----------------------------------------------------------------------- X* Extracts information on special characters from strings X* Input X* MODE = 1 : treat a string which is to be replaced X* = 2 : treat a replacement string X* ISTR = string ref. (relative to KKYSTA, KKYEND) X* Output X* NTOT = total no. of special characters X* ICT (I) = count for character I (in SPCHAR) X* IREF(J,I)= if MODE = 1 : X* for the Jth character I, total count X* if MODE = 2 : X* for the Jth character I, count in [...] X* X*--- important: special characters inside '...' not counted ! X* X* IERR = 0 : all OK X* = 1 : buffer overflow X* = 2 : unclosed [...] X* = 3 : number in [...] out of range X* = 4 : unclosed '...' inside string X*----------------------------------------------------------------------- X include 'PARAM.h' X include 'KEYCOM.h' X DIMENSION ICT(*),IREF(MXNAME/20,*) X include 'CONVEX.h' X IERR=0 X NTOT=0 X INSTR=0 X DO 10 I=1,7 X ICT(I)=0 X 10 CONTINUE X J=KKYSTA(ISTR)-1 X KEND=KKYEND(ISTR) X 20 CONTINUE X J=J+1 X IF (J.GT.KEND) GOTO 30 X IF(SKYSTR(J:J).EQ.'''') INSTR=1-INSTR X IF (INSTR.NE.0) GOTO 20 X I=INDEX(SPCHAR,SKYSTR(J:J)) X IF(I.EQ.7) THEN X*--- '>' found, look for ')' to follow X IF (J.EQ.KEND) THEN X I=0 X ELSEIF (SKYSTR(J+1:J+1).EQ.')') THEN X J=J+1 X ELSE X I=0 X ENDIF X ENDIF X IF(I.GT.0) THEN X*--- check buffer size X IF (ICT(I).EQ.MXNAME/2) THEN X IERR=1 X GOTO 999 X ENDIF X NTOT=NTOT+1 X ICT(I)=ICT(I)+1 X IF (MODE.EQ.1) THEN X IREF(ICT(I),I)=NTOT X ELSEIF (J.LT.KEND.AND.SKYSTR(J+1:J+1).EQ.'[') THEN X J=J+1 X IF (J.EQ.KEND) THEN X IERR=2 X GOTO 999 X ELSEIF (SKYSTR(J+1:J+1).EQ.']') THEN X IREF(ICT(I),I)=ICT(I) X ELSE X*--- get integer in [...] X CALL GETINT(SKYSTR,J+1,KEND,KFCH,KLCH,NN) X IF (KFCH.EQ.0.OR.NN.EQ.0) THEN X IERR=3 X GOTO 999 X ELSE X IREF(ICT(I),I)=NN X IF (KLCH.EQ.KEND) THEN X IERR=2 X GOTO 999 X ENDIF X J=KLCH+1 X IF (SKYSTR(J:J).NE.']') THEN X IERR=2 X GOTO 999 X ENDIF X ENDIF X ENDIF X ELSE X IREF(ICT(I),I)=ICT(I) X ENDIF X ENDIF X GOTO 20 X 30 CONTINUE X IF(INSTR.NE.0) IERR=4 X 999 END / echo 'x - STSUMM.f' sed 's/^X//' > STSUMM.f << '/' X SUBROUTINE STSUMM X*----------------------------------------------------------------------- X* X*--- Prints statement count summary X* X*----------------------------------------------------------------------- X include 'PARAM.h' X include 'ALCAZA.h' X include 'FLWORK.h' X include 'JOBSUM.h' X include 'CLASS.h' X DIMENSION IREF(3,MXSTAT),IOUT(4,2) X EQUIVALENCE (IREF(1,1),IWS(1)) X DO 10 I=1,NCLASS X DO 10 J=1,3 X 10 IREF(J,I)=0 X*--- collect references to external classes X DO 20 I=1,NCLASS X K=ISTMDS(6,I) X IREF(1,K)=I X IREF(2,K)=IREF(2,K)+NFDCLS(I,1) X IREF(3,K)=IREF(3,K)+NFDCLS(I,2) X 20 CONTINUE X WRITE (MPUNIT,10000) X N=0 X DO 30 I=1,NCLASS X K=IREF(1,I) X IF (K.NE.0) THEN X N=N+1 X IOUT(1,N)=I X IOUT(2,N)=IREF(2,I) X IOUT(3,N)=IREF(3,I) X IOUT(4,N)=K X IF (N.EQ.2) THEN X N=0 X WRITE (MPUNIT,10010) IOUT(1,1),SNAM(ISTMDS(1,IOUT(4,1)): X + ISTMDS(2,IOUT(4,1))),IOUT(2,1),IOUT(3,1),IOUT(1,2),SNAM( X + ISTMDS(1,IOUT(4,2)):ISTMDS(2,IOUT(4,2))),IOUT(2,2),IOUT X + ( 3,2) X ENDIF X ENDIF X 30 CONTINUE X IF(N.GT.0) THEN X WRITE (MPUNIT,10010) IOUT(1,1),SNAM(ISTMDS(1,IOUT(4,1)):ISTMDS( X + 2,IOUT(4,1))),IOUT(2,1),IOUT(3,1) X ENDIF X10000 FORMAT('1',10('----'),' Summary for filtered statements ', 10( X +'----')// X +' Except for ILLEGAL (all occurrences in filtered routines),', X +' only filtered statements counted.'/ X +' There are two types of counts, 1 = overall occurence, ', X +'2 = behind logical IF'// ' number',15X,'name',T41, X +' count-1 count-2', T61,' number',15X,'name',T101, X +' count-1 count-2'/) X10010 FORMAT(1X,I6,4X,A29,2I8,T61,1X,I6,4X,A29,2I8) X END / echo 'x - USLTYP.f' sed 's/^X//' > USLTYP.f << '/' X LOGICAL FUNCTION LMODUL(I) X LMODUL = I.EQ.3.OR.I.EQ.9.OR.I.EQ.12.OR.I.EQ.21.OR.I.EQ. X & 26.OR.I.EQ.33.OR.I.EQ.41.OR.I.EQ.47.OR.I.EQ. X & 56.OR.I.EQ.60.OR.I.EQ.67 X END X LOGICAL FUNCTION LFUNCT(I) X LFUNCT = I.EQ.9.OR.I.EQ.12.OR.I.EQ.21.OR.I.EQ.33.OR.I.EQ.41. X & OR.I.EQ.47.OR.I.EQ.60 X END X LOGICAL FUNCTION LNSVT(I) X LNSVT = I.EQ.10.OR.I.EQ.42.OR.I.EQ.48.OR.I.EQ.61 X END X LOGICAL FUNCTION LCOMMN(I) X LCOMMN = I.EQ.8 X END X LOGICAL FUNCTION LDIMEN(I) X LDIMEN = I.EQ.10.OR.I.EQ.11.OR.I.EQ.13.OR.I.EQ.14.OR.I.EQ.17. X & OR.I.EQ.42.OR.I.EQ.43.OR.I.EQ.48.OR.I.EQ.49.OR.I.EQ. X & 61.OR.I.EQ.62.OR.I.EQ.22 X END X LOGICAL FUNCTION LELSE(I) X LELSE = I.EQ.30.OR.I.EQ.29 X END X LOGICAL FUNCTION LGOTO(I) X LGOTO = I.GE.34.AND.I.LE.36 X END X LOGICAL FUNCTION LPRINT(I) X LPRINT = I.EQ.53 X END X LOGICAL FUNCTION LIFF(I) X LIFF = I.GE.37.AND.I.LE.39.OR.I.EQ.30 X END X LOGICAL FUNCTION LWRITE(I) X LWRITE = I.EQ.68 X END X LOGICAL FUNCTION LPAUSE(I) X LPAUSE = I.EQ.55 X END X LOGICAL FUNCTION LSAVE(I) X LSAVE = I.EQ.65 X END X LOGICAL FUNCTION LSTOP(I) X LSTOP = I.EQ.66 X END X LOGICAL FUNCTION LENTRY(I) X LENTRY = I.EQ.26 X END X LOGICAL FUNCTION LIO(I) X LIO = I.EQ.4.OR.I.EQ.5.OR.I.EQ.15.OR.I.EQ.25.OR.I.EQ.52. X & OR.I.EQ.53.OR.I.EQ.57.OR.I.EQ.58.OR.I.EQ.59.OR.I. X & EQ.64.OR.I.EQ.68 X END X LOGICAL FUNCTION LRETRN(I) X LRETRN = I.EQ.63 X END X LOGICAL FUNCTION LMODUS(I) X LMODUS = I.EQ.3.OR.I.EQ.9.OR.I.EQ.12.OR.I.EQ.21. X & OR.I.EQ.33.OR.I.EQ.41.OR.I.EQ.47.OR.I.EQ.56.OR. X & I.EQ.60.OR.I.EQ.67 X END X LOGICAL FUNCTION LCHARC(I) X LCHARC = I.EQ.13.OR.I.EQ.14 X END X LOGICAL FUNCTION LDECLR(I) X LOGICAL LDIMEN X LDECLR = LDIMEN(I).OR.I.EQ.8.OR.I.EQ.27.OR.I.EQ.28.OR.I.EQ. X & 44.OR.I.EQ.46.OR.I.EQ.51.OR.I.EQ.54.OR.I.EQ.65 X END X LOGICAL FUNCTION LDATA(I) X LDATA = I.EQ.16 X END X LOGICAL FUNCTION LASIGN(I) X LASIGN = I.GE.69.AND.I.LE.71 X END / echo 'x - copyright' sed 's/^X//' > copyright << '/' X************************************************************************ X* * X* CERN * X* * X* EUROPEAN ORGANIZATION FOR PARTICLE PHYSICS * X* * X* Program name: FLOPPY : Fortran Coding Convention Checker * X* and source tidier * X* * X* Authors : J.J.Bunn and H. Grote * X* CERN * X* CH-1211 GENEVA 23 * X* SWITZERLAND * X* JULIAN at CERNVM.CERN.CH * X* VXCERN::JULIAN (DECNET) node 22.37 * X* * X* Copyright CERN, Geneva 1990 - Copyright and any other * X* appropriate legal protection of this computer program and * X* associated documentation reserved in all countries of the * X* world. * X* * X* CERN undertakes no obligation for the maintenance of this * X* program or package, nor responsibility for its correctness, * X* and accepts no liability whatsoever resulting from the use of * X* it. * X* * X* Programs and documentation are provided solely for the use of * X* the organization to which they are distributed. * X* The program may be obtained from CERN subject to CERN * X* distribution rules. * X* * X* This program may not be copied or otherwise distributed * X* without permission. This message must be retained on this and * X* any other authorized copies. * X* * X* The material cannot be sold. CERN should be given credit in * X* all references. * X* * X************************************************************************ / echo 'Part 09 of Floppy complete.' exit