home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume12 / ffccc / part07 < prev    next >
Encoding:
Text File  |  1990-05-14  |  47.3 KB  |  1,489 lines

  1. Newsgroups: comp.sources.misc
  2. organization: CERN, Geneva, Switzerland
  3. keywords: fortran
  4. subject: v12i093: Floppy - Fortran Coding Convention Checker Part 07/11
  5. from: julian@cernvax.cern.ch (julian bunn)
  6. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  7.  
  8. Posting-number: Volume 12, Issue 93
  9. Submitted-by: julian@cernvax.cern.ch (julian bunn)
  10. Archive-name: ffccc/part07
  11.  
  12. #!/bin/sh
  13. echo 'Start of Floppy, part 07 of 11:'
  14. echo 'x - CCLASS.h'
  15. sed 's/^X//' > CCLASS.h << '/'
  16. X*IF DEF,NEVER   
  17. X*-----------------------------------------------------------------------
  18. X*--- contains statement classification information  
  19. X*       NCLASS      no. of (internal) classes   
  20. X*       NPRIOR      no. of priority statements  
  21. X*       NHEADR      no. of header statements
  22. X*       IIF         internal number of the logical IF   
  23. X*       IEND        internal number of END statement
  24. X*       IFORMT      internal number of the FORMAT statement 
  25. X*       ILL            -       -      -     illegal     -   
  26. X*      ISTMDS(MCLASS,MXSTAT)  control words being   
  27. X*                    1 = first ch. in SNAM  
  28. X*                    2 = last  ch. in SNAM  
  29. X*                    3 = first ch. in SSTM  
  30. X*                    4 = last ch. in SSTM   
  31. X*                    5 = last significant ch. in SSTM   
  32. X*                    6 = external reference number ( class )
  33. X*                    7 = priority ( if 0, any order)
  34. X*                    8 = char. in descr. after which to start name  
  35. X*                        scan.  if 99, start after match string.
  36. X*                    9 = stop name scan at stmt. end
  37. X*                   10 = statement number classifier, being 
  38. X*                        0 if statement cannot contain stmt. numbers
  39. X*                        1 if (one) stmt. number must follow key immed. 
  40. X*                        2 if all stmt. no.s are inside first bracket   
  41. X*                        3 if all stmt. no.s follow immed. first bracket
  42. X*                        4 if (one) after FMT=, or second in first br.  
  43. X*                   11 = exec flag ( 0 = non-executable)
  44. X*                   12 = names flag ( 0 = no names, 1 = one, 2 = any)   
  45. X*                   13 = special treatement flag ( if 1) +2 * smflag
  46. X*                       where smflag = 1 allows for simple keyword match
  47. X*                   14 = routine header flag (0 no, 1 yes)  
  48. X*                   15 = type flag: 
  49. X*                        0 if types valid for all names 
  50. X*                        1 if separate types for first name + rest  
  51. X*                        2 if special treatment (IMPLICIT)  
  52. X*                        to this, 10 is added if only names outside 
  53. X*                        brackets to be taken, +10 for COMMON   
  54. X*                   16 = n1 = no. of types for first or all 
  55. X*                   17 to 16 + n1 = types   
  56. X*                   17 + n1  = n2   
  57. X*                   18 + n1 to 21 = types for rest (0 filled)   
  58. X*       IALPHA(2,27)   for letters 1 to 26 (A to Z),
  59. X*                   first and last class under that letter. 
  60. X*                   ( keys are in alphabetic order) 
  61. X*                   27 for those not starting with any key. 
  62. X*                   if not specified otherwise, those will be   
  63. X*                   processed last  
  64. X*       IPRIOR(MXSTAT)       refs of priority statements
  65. X*       IHEADR(MXSTAT)       refs of header statements  
  66. X*-----------------------------------------------------------------------
  67. X*EI 
  68. /
  69. echo 'x - INUSER.f'
  70. sed 's/^X//' > INUSER.f << '/'
  71. X      SUBROUTINE INUSER 
  72. X*-----------------------------------------------------------------------
  73. X* reads command lines, compacts them (blanks outside strings suppressed)
  74. X* finds no. of OR-sets, marks strings with '{}' 
  75. X*   
  76. X*  Output : common blocks (mis-)used for input decoding only
  77. X*  NLINES = total number of lines read  
  78. X*  NSTAMM = total number of commands
  79. X*  NFLINE(I) = first line of command I  
  80. X*  NLLINE(I) = last   -         -   
  81. X*  NLTYPE(J) = pos. of last character, or of ';' in command line J  
  82. X*  NSSTRT(I) = first command of OR-set number I 
  83. X*  NSEND(I)  = last    -         -  
  84. X*   
  85. X*  Output correctly stored for later use:   
  86. X*  NORSET    = number of OR-sets
  87. X*-----------------------------------------------------------------------
  88. X      include 'PARAM.h' 
  89. X      include 'ALCAZA.h' 
  90. X      include 'STATE.h' 
  91. X      include 'KEYCOM.h' 
  92. X      CHARACTER*1 STEMP,SQUOTE  
  93. X      include 'CONVEX.h' 
  94. X*   
  95. X      N=0   
  96. X      WRITE (MPUNIT,10020)  
  97. X   10 CONTINUE  
  98. X      READ (MCUNIT,'(A)',END=20) SIMA(N+1)  
  99. X      N=N+1 
  100. X      WRITE(MPUNIT,'(1X,A)') SIMA(N)
  101. X      IF (SIMA(N)(1:3).EQ.'END') GOTO 20
  102. X      IF(N.EQ.MXSIMA)  THEN 
  103. X         WRITE (MPUNIT,10030) N 
  104. X      ELSE  
  105. X         GOTO 10
  106. X      ENDIF 
  107. X   20 CONTINUE  
  108. X      WRITE (MPUNIT,10040)  
  109. X      NLINES=N  
  110. X*--- suppress blanks outside strings, and in strings to be replaced 
  111. X*    find end of each line  
  112. X      N=0   
  113. X      NFLINE(1)=1   
  114. X      IN=0  
  115. X      IR=0  
  116. X      IS=0  
  117. X      DO 50 I=1,NLINES  
  118. X         NPOS=0 
  119. X         DO 30 J=1,MXLINE   
  120. X            STEMP=SIMA(I)(J:J)  
  121. X            IF (INDEX(SPILL,STEMP).NE.0)  THEN  
  122. X*--- illegal character encountered - replace by '/' 
  123. X               WRITE (MPUNIT,10010) STEMP   
  124. X               STEMP='/'
  125. X            ENDIF   
  126. X            IF (IN.EQ.1)  THEN  
  127. X*--- inside quote string
  128. X               IF (STEMP.EQ.SQUOTE) THEN
  129. X                  IN=0  
  130. X                  STEMP='}' 
  131. X                  IR=0  
  132. X               ELSEIF (STEMP.EQ.'''')  THEN 
  133. X                  IS=1-IS   
  134. X               ENDIF
  135. X               IF(STEMP.NE.' '.OR.IR+IS.GT.0)  THEN 
  136. X                  NPOS=NPOS+1   
  137. X                  SIMA(I)(NPOS:NPOS)=STEMP  
  138. X               ENDIF
  139. X            ELSE
  140. X*--- outside quote string   
  141. X               IF (STEMP.NE.' ')  THEN  
  142. X                  IF (STEMP.EQ.''''.OR.STEMP.EQ.'"')  THEN  
  143. X                     IN=1   
  144. X                     SQUOTE=STEMP   
  145. X                     STEMP='{'  
  146. X                  ELSEIF(STEMP.EQ.'=')  THEN
  147. X                     IR=1   
  148. X                  ENDIF 
  149. X                  NPOS=NPOS+1   
  150. X                  SIMA(I)(NPOS:NPOS)=STEMP  
  151. X                  IF (STEMP.EQ.';')  THEN   
  152. X                     N=N+1  
  153. X                     NLLINE(N)=I
  154. X                     NFLINE(N+1)=I+1
  155. X                     GOTO 40
  156. X                  ENDIF 
  157. X               ENDIF
  158. X            ENDIF   
  159. X   30    CONTINUE   
  160. X   40    CONTINUE   
  161. X         NLTYPE(I)=NPOS 
  162. X   50 CONTINUE  
  163. X      IF(NLINES.GT.0)  THEN 
  164. X         IF (IN.NE.0)  THEN 
  165. X            WRITE (MPUNIT,10050)
  166. X            K=MIN(NLTYPE(NLINES)+1,MXLINE)  
  167. X            SIMA(NLINES)(K:K)='}'   
  168. X            NLTYPE(NLINES)=K
  169. X         ENDIF  
  170. X         K=NLTYPE(NLINES)   
  171. X         STEMP=SIMA(NLINES)(K:K)
  172. X         IF(STEMP.NE.';')  THEN 
  173. X            WRITE (MPUNIT,10000)
  174. X            IF (K.EQ.MXLINE.AND.STEMP.EQ.'}') SIMA(NLINES)(K-1:K-1)=
  175. X     +      STEMP   
  176. X            K=MIN(K+1,MXLINE)   
  177. X            SIMA(NLINES)(K:K)=';'   
  178. X            NLTYPE(NLINES)=K
  179. X         ENDIF  
  180. X      ENDIF 
  181. X      NSTAMM=N  
  182. X*--- now find number of OR-sets 
  183. X      NORSET=1  
  184. X      NSSTRT(1)=1   
  185. X      DO 60 I=1,NSTAMM  
  186. X         IF (SIMA(NFLINE(I))(1:3).EQ.'OR;')  THEN   
  187. X            NSEND(NORSET)=I-1   
  188. X            IF (NORSET.EQ.MXORST)  THEN 
  189. X               WRITE (MPUNIT,10060) NORSET  
  190. X               GOTO 999 
  191. X            ENDIF   
  192. X            NORSET=NORSET+1 
  193. X            NSSTRT(NORSET)=I
  194. X         ENDIF  
  195. X   60 CONTINUE  
  196. X      NSEND(NORSET)=NSTAMM  
  197. X10000 FORMAT(/1X,8('*-*-'),' WARNING - missing ";" added at end',/) 
  198. X10010 FORMAT(/1X,8('*-*-'),' WARNING - illegal character ',A,   
  199. X     +' replaced by "/"')   
  200. X10020 FORMAT(///1X,8('++++'),' Input Commands  ',8('++++'),//)  
  201. X10030 FORMAT(//1X,8('*-*-'),' WARNING - max. buffer size for input',
  202. X     +' = ',I5,' lines reached, rest ignored',/)
  203. X10040 FORMAT(//1X,8('++++'),' End of Commands ',8('++++'),//)   
  204. X10050 FORMAT(//1X,8('*-*-'),' WARNING - unclosed string in commands',   
  205. X     +' closed at the very end',/)  
  206. X10060 FORMAT(//1X,8('*-*-'),' WARNING - max. number of OR-sets =', I5,  
  207. X     +' reached, remainder ignored',/)  
  208. X  999 END   
  209. /
  210. echo 'x - MARKST.f'
  211. sed 's/^X//' > MARKST.f << '/'
  212. X      SUBROUTINE MARKST(OPTION,IERR)
  213. X*-----------------------------------------------------------------------
  214. X*   
  215. X* in SSTA, suppresses multiple blanks outside strings, puts strings 
  216. X* in special characters,
  217. X* '{' and '}'. strings may be either ...H, or be
  218. X* included in single or double quotes.  
  219. X*   
  220. X*--- input  
  221. X*    OPTION          (character) 'FULL' or 'PART' to extract
  222. X*                    all, or just start (up to first bracket)   
  223. X*    NCHST           number of ch. in SSTA  
  224. X*   
  225. X*--- output 
  226. X*    IERR          = 0 if everything OK, =1 if illegal characters found,
  227. X*                  or unclosed string.  
  228. X*    SSTA            COMMON/ALCAZA/  FORTRAN fields 7-72 of SIMA
  229. X*    NCHST           COMMON/STATE/  last non-blank in SSTA  
  230. X*   
  231. X*   
  232. X*-----------------------------------------------------------------------
  233. X      include 'PARAM.h' 
  234. X      include 'ALCAZA.h' 
  235. X      include 'CURSTA.h' 
  236. X      CHARACTER STEMP*1,SKEEP*1,SDUM*100,OPTION*4   
  237. X      LOGICAL POSS,SPOSS,PARTFL,LASTBL  
  238. X      include 'CONVEX.h' 
  239. X      PARTFL=OPTION.EQ.'PART'   
  240. X      NCH=0 
  241. X      NDUM=0
  242. X      ISKIP=0   
  243. X*--- ISKIP = 0      outside string  
  244. X*          = -1     inside hollerith string (nH...) 
  245. X*          = +1     inside character string (' or ")
  246. X      NHOLL=0   
  247. X      IERR=0
  248. X      POSS=.FALSE.  
  249. X      SPOSS=.FALSE. 
  250. X      STEMP=' ' 
  251. X      J=0   
  252. X   10 CONTINUE  
  253. X      J=J+1 
  254. X      IF (J.GT.NCHST) GOTO 20   
  255. X      LASTBL=STEMP.NE.' '   
  256. X      STEMP=SSTA(J:J)   
  257. X      IF (PARTFL)  THEN 
  258. X         IF (STEMP.EQ.'(')GOTO 30   
  259. X      ENDIF 
  260. X      IF (INDEX(SPILL,STEMP).NE.0)  THEN
  261. X*--- illegal character  
  262. X         GOTO 40
  263. X      ENDIF 
  264. X      IF (ISKIP.EQ.0)  THEN 
  265. X*--- not in string  
  266. X         IF (STEMP.EQ.' ')  THEN
  267. X            IF (LASTBL)  THEN   
  268. X               NCH=NCH+1
  269. X               SSTR(NCH:NCH)=' '
  270. X            ENDIF   
  271. X         ELSEIF (NUMCH(STEMP))  THEN
  272. X            IF (POSS)  THEN 
  273. X*--- count for ..H may start or continue
  274. X               IF (NHOLL.LT.10000) NHOLL=10*NHOLL+ICVAL(STEMP)-ICVAL('0'
  275. X     +         )
  276. X               NDUM=NDUM+1  
  277. X*--- buffer digits  
  278. X               SDUM(NDUM:NDUM)=STEMP
  279. X            ELSE
  280. X               NCH=NCH+1
  281. X               SSTR(NCH:NCH)=STEMP  
  282. X            ENDIF   
  283. X         ELSEIF (ALPHCH(STEMP))  THEN   
  284. X            IF (NDUM.EQ.0)  THEN
  285. X*--- no digits (= holl. count ) buffered
  286. X               POSS=.FALSE. 
  287. X               NCH=NCH+1
  288. X               SSTR(NCH:NCH)=STEMP  
  289. X            ELSE
  290. X               IF (STEMP.EQ.'H')  THEN  
  291. X                  NCH=NCH+1 
  292. X                  SSTR(NCH:NCH)='{' 
  293. X                  ISKIP=-1  
  294. X                  SSTR(NCH+1:NCH+NDUM)=SDUM(:NDUM)  
  295. X                  NCH=NCH+NDUM+1
  296. X                  SSTR(NCH:NCH)=STEMP   
  297. X               ELSE 
  298. X*--- other alphabetic ch. than H
  299. X                  POSS=.FALSE.  
  300. X                  NHOLL=0   
  301. X                  SSTR(NCH+1:NCH+NDUM)=SDUM(:NDUM)  
  302. X                  NCH=NCH+NDUM+1
  303. X                  SSTR(NCH:NCH)=STEMP   
  304. X               ENDIF
  305. X               NDUM=0   
  306. X            ENDIF   
  307. X         ELSE   
  308. X*--- special character  
  309. X            SPOSS=SPOSS.OR.STEMP.NE.'*' 
  310. X*--- holl. count cannot start after '*' 
  311. X            POSS=SPOSS  
  312. X            IF (NDUM.NE.0)  THEN
  313. X               SSTR(NCH+1:NCH+NDUM)=SDUM(:NDUM) 
  314. X               NCH=NCH+NDUM 
  315. X               NDUM=0   
  316. X            ENDIF   
  317. X            NHOLL=0 
  318. X            IF (STEMP.EQ.''''.OR.STEMP.EQ.'"')  THEN
  319. X               ISKIP=1  
  320. X               SKEEP=STEMP  
  321. X               NCH=NCH+1
  322. X               SSTR(NCH:NCH)='{'
  323. X            ENDIF   
  324. X            NCH=NCH+1   
  325. X            SSTR(NCH:NCH)=STEMP 
  326. X*--- following ENDIF for IF(STEMP.EQ.' ')  THEN  etc.   
  327. X         ENDIF  
  328. X      ELSEIF (ISKIP.LT.0)  THEN 
  329. X*--- inside a holl. string  
  330. X         NHOLL=NHOLL-1  
  331. X         NCH=NCH+1  
  332. X         SSTR(NCH:NCH)=STEMP
  333. X         IF (NHOLL.EQ.0)  THEN  
  334. X*--- end of holl. string reached
  335. X            ISKIP=0 
  336. X            NCH=NCH+1   
  337. X            SSTR(NCH:NCH)='}'   
  338. X         ENDIF  
  339. X      ELSE  
  340. X*--- ISKIP GT 0 
  341. X         IF (STEMP.EQ.''''.AND.SSTA(J+1:J+1).EQ.''''.AND.J.LT.NCHST)
  342. X     +   THEN   
  343. X            SSTR(NCH+1:NCH+2)=SSTA(J:J+1)   
  344. X            J=J+1   
  345. X            NCH=NCH+2   
  346. X         ELSEIF (SKEEP.EQ.STEMP)  THEN  
  347. X*--- end of string  
  348. X            ISKIP=0 
  349. X            NCH=NCH+1   
  350. X            SSTR(NCH:NCH)=STEMP 
  351. X            NCH=NCH+1   
  352. X            SSTR(NCH:NCH)='}'   
  353. X         ELSE   
  354. X            NCH=NCH+1   
  355. X            SSTR(NCH:NCH)=STEMP 
  356. X         ENDIF  
  357. X      ENDIF 
  358. X      GOTO 10   
  359. X   20 CONTINUE  
  360. X      IF(NDUM.GT.0)  THEN   
  361. X*--- still some lonely digits hanging around
  362. X         SSTR(NCH+1:NCH+NDUM)=SDUM(:NDUM)   
  363. X         NCH=NCH+NDUM   
  364. X      ENDIF 
  365. X      IF (ISKIP.NE.0) GOTO 40   
  366. X   30 NCHST=NCH 
  367. X      SSTA(:NCH)=SSTR(:NCH) 
  368. X      GOTO 999  
  369. X   40 CONTINUE  
  370. X*--- illegal - either unclosed string, or illegal character 
  371. X      IERR=1
  372. X  999 END   
  373. /
  374. echo 'x - MIXMOD.f'
  375. sed 's/^X//' > MIXMOD.f << '/'
  376. X      SUBROUTINE MIXMOD(NGLOBF) 
  377. XC! Checks for Mixed Mode expressions
  378. X      include 'PARAM.h' 
  379. X      include 'ALCAZA.h' 
  380. X      include 'CLASS.h' 
  381. X      include 'CURSTA.h' 
  382. X      include 'FLWORK.h' 
  383. X      include 'KEYCOM.h' 
  384. X      include 'TYPDEF.h' 
  385. X      include 'JOBSUM.h' 
  386. X      include 'STATE.h' 
  387. X      include 'FLAGS.h' 
  388. X      include 'USIGNO.h' 
  389. X      include 'USLIST.h' 
  390. X      include 'USGCOM.h' 
  391. X      include 'USSTMT.h' 
  392. X      include 'USUNIT.h' 
  393. X      include 'USARGS.h' 
  394. X      include 'USLTYD.h' 
  395. X      include 'STACK.h' 
  396. X      CHARACTER*1 STYP  
  397. X      CHARACTER*(LOPER) SOPT
  398. X      INTEGER ISTART(2),IFINIS(2)   
  399. X      CHARACTER*6 CREL(11)  
  400. X      CHARACTER*256 STEMP   
  401. X      INTEGER LPS(256)  
  402. X      INTEGER LREL(11)  
  403. X      DATA CREL /'.EQV. ','.NEQV.','.OR.  ','.AND. ','.NOT. ',  
  404. X     &           '.GT.  ','.GE.  ','.LT.  ','.LE.  ','.EQ.  ',  
  405. X     &           '.NE.  '/  
  406. X      DATA LREL /5,6,4,5,5,4,4,4,4,4,4/ 
  407. XC   
  408. XC CALLED FROM URTERM FOR EACH STATEMENT IN THE MODULE   
  409. XC   
  410. X      ICL1 = ICURCL(1)  
  411. X      ICL2 = ICURCL(2)  
  412. XC   
  413. XC RETURN UNLESS AN ASSIGNMENT STATEMENT 
  414. XC   
  415. X      IF(LIFF(ICL1)) THEN   
  416. X        IF(.NOT.LASIGN(ICL2)) RETURN
  417. X        IUP = 2 
  418. XC find end of IF
  419. X        JPT = INDEX(SSTA(:NCHST),'(')   
  420. X        CALL SKIPLV(SSTA,JPT+1,NCHST,.FALSE.,KND,ILEV)  
  421. X        ISTART(1) = JPT+1   
  422. X        ISTART(2) = KND+1   
  423. X        IFINIS(1) = KND-1   
  424. X        IFINIS(2) = NCHST   
  425. X      ELSE IF(LASIGN(ICL1)) THEN
  426. X        IUP = 1 
  427. X        KND = NCHST 
  428. X        ISTART(1) = 1   
  429. X        IFINIS(1) = NCHST   
  430. X      ELSE  
  431. X        RETURN  
  432. X      ENDIF 
  433. XC loop over parts of the statement  
  434. X      DO 20 IPART=1,IUP 
  435. XC zero stack address
  436. X        NLEVL = 0   
  437. X        IF(IPART.EQ.1) THEN 
  438. X          ICL=ICL1  
  439. X        ELSE
  440. X          ICL=ICL2  
  441. X          IF(.NOT.LASIGN(ICL))                                   GOTO 20
  442. X        ENDIF   
  443. XC KST and KND mark the start and end of the assignment part of the statement
  444. X        KST = ISTART(IPART) 
  445. X        KND = IFINIS(IPART) 
  446. XC       WRITE(6,'(A,A)') ' Statement : ',SSTA(KST:KND)  
  447. XC this part of statement is an assignment or is inside IF clause
  448. XC move from left to right, character by character   
  449. X        NLO1 = 1
  450. X        ICHR = KST  
  451. X    5   CONTINUE
  452. X        IF(ICHR.EQ.KND+1) THEN  
  453. XC put end of expression operator
  454. X          CALL PUTOPT('END',3,ICHR,IERR)
  455. X          IF(IERR.GT.0)                                          GOTO 25
  456. X          IF(IERR.LT.0) THEN
  457. X            NGLOBF = NGLOBF + 1 
  458. X                                                                 GOTO 40
  459. X          ENDIF 
  460. X                                                                 GOTO 20
  461. X        ENDIF   
  462. X        IF(SSTA(ICHR:ICHR).EQ.' ') THEN 
  463. XC ignore blanks 
  464. X          ICHR = ICHR + 1   
  465. X                                                                  GOTO 5
  466. X        ENDIF   
  467. XC NLO is the index to the statement name last found 
  468. X        NLO = NLO1  
  469. X        ICHRE = 0   
  470. XC find if this character is start of a name 
  471. X        DO 10 ISN=NLO,NSNAME
  472. X          IF(NSSTRT(ISN).NE.ICHR)                                GOTO 10
  473. X          NLO1 = ISN + 1
  474. X          ICHRE = NSEND(ISN)
  475. XC convert the name type to the smaller subset   
  476. X          CALL TY2TYP(ISN,STYP) 
  477. XC add this operand to the stack 
  478. X          CALL PUTOPA(SNAMES(ISN+ISNAME),STYP,ICHR,ICHRE,IERR)  
  479. X          IF(IERR.NE.0)                                          GOTO 30
  480. X          ICHR = ICHRE + 1  
  481. XC go for the next character after this name 
  482. X                                                                  GOTO 5
  483. X   10   CONTINUE
  484. XC next name is at NLO1  
  485. X        IF(NLO1.GT.NSNAME) THEN 
  486. X          IFIN = KND
  487. X        ELSE
  488. X          IFIN = NSSTRT(NLO1)-1 
  489. X        ENDIF   
  490. X        ISTA = ICHR 
  491. XC analyse this part of statement (ISTA:IFIN) since it is
  492. XC not a name, may be an operator
  493. X        ILEN = IFIN-ISTA+1  
  494. X        CALL GETOPT(SSTA(ISTA:IFIN),ILEN,SOPT,LOPT,IERR)
  495. X        IF(IERR.NE.0)                                            GOTO 15
  496. XC found an operator of length LOPT, called SOPT 
  497. XC put the operator on the stack 
  498. X        CALL PUTOPT(SOPT,LOPT,ICHR,IERR)
  499. X        IF(IERR.GT.0)                                            GOTO 15
  500. X        IF(IERR.LT.0) THEN  
  501. X          NGLOBF = NGLOBF + 1   
  502. X        ENDIF   
  503. X        ICHR = ICHR + LOPT  
  504. X                                                                  GOTO 5
  505. X   15   CONTINUE
  506. XC not a name, not an operator, so   
  507. XC check if start of a constant. Remove blanks first 
  508. X   98   NC=0
  509. X        DO 97 IC=ISTA,IFIN  
  510. X          IF(SSTA(IC:IC).EQ.' ') GOTO 97
  511. X          NC=NC+1   
  512. X          LPS(NC)=IC-ISTA   
  513. X          STEMP(NC:NC) = SSTA(IC:IC)
  514. X   97   CONTINUE
  515. XC remove .EQ. etc which confuse GETCON  
  516. X        DO 95 IREL=1,11 
  517. X          LP=INDEX(STEMP(:NC),CREL(IREL)(:LREL(IREL)))  
  518. X          IF(LP.EQ.0) GOTO 95   
  519. X          IFIN = ISTA + LPS(LP) - 1 
  520. X          GOTO 98   
  521. X   95   CONTINUE
  522. X        CALL GETCON(SSTA,ISTA,IFIN,KLCH,STYP)   
  523. X        IF(KLCH.NE.0) THEN  
  524. XC found a constant. place on the stack  
  525. X          CALL PUTOPA(SSTA(ISTA:KLCH),STYP,ICHR,KLCH,IERR)  
  526. X          IF(IERR.NE.0)                                          GOTO 35
  527. X          ICHR = KLCH + 1   
  528. X                                                                  GOTO 5
  529. X        ENDIF   
  530. XC not a name,operand or constant. this is an error. type the offender   
  531. X        LCST = MIN(70,NCHST)
  532. X        WRITE(MZUNIT,500) SSTA(1:LCST)  
  533. X   20 CONTINUE  
  534. X                                                                 GOTO 40
  535. X   25 CONTINUE  
  536. X   30 CONTINUE  
  537. X   35 CONTINUE  
  538. X   40 CONTINUE  
  539. X      RETURN
  540. X  500 FORMAT(1X,'!!! NON-FATAL ERROR IN MIXMOD ...',
  541. X     +' UNABLE TO PARSE: ',A)   
  542. X      END   
  543. /
  544. echo 'x - PRENUM.f'
  545. sed 's/^X//' > PRENUM.f << '/'
  546. X      SUBROUTINE PRENUM 
  547. X*-----------------------------------------------------------------------
  548. X*   
  549. X*  Makes a list of statement numbers, replaces old by new in label field
  550. X*   
  551. X*-----------------------------------------------------------------------
  552. X      include 'PARAM.h' 
  553. X      include 'ALCAZA.h' 
  554. X      include 'FLAGS.h' 
  555. X      include 'CLASS.h' 
  556. X      include 'STATE.h' 
  557. X      include 'KEYCOM.h' 
  558. X      include 'FLWORK.h' 
  559. X      LOGICAL FORMFL,RETFL,ENDFL
  560. X      NSTANU=0  
  561. X      N=0   
  562. X      DO 10 I=1,NSTAMM  
  563. X         IF (ICLASS(I,1).NE.0)  THEN
  564. X            NN=NEXTIN(SIMA(NFLINE(I)),1,5)  
  565. X            IF (NN.NE.0)  THEN  
  566. X               N=N+1
  567. X               IWS(N)=NN
  568. X            ENDIF   
  569. X         ENDIF  
  570. X   10 CONTINUE  
  571. X      IF (N.EQ.0) GOTO 999  
  572. X      CALL SORTSP(N,IWS,NSTANU) 
  573. X      IF(NSTANU.GT.MAXNUM)  THEN
  574. X         WRITE (MPUNIT,10000) MAXNUM,SCROUT 
  575. X         NSTANU=0   
  576. X         GOTO 999   
  577. X      ENDIF 
  578. X*--- get values for starts, steps etc.  
  579. X      DO 20 IKY=1,NGLSET
  580. X         IF (KEYREF(IKY,1).EQ.7) GOTO 30
  581. X   20 CONTINUE  
  582. X      GOTO 120  
  583. X   30 CONTINUE  
  584. X      KKS=KEYREF(IKY,3) 
  585. X*--- start and step for normal statements   
  586. X      KST=KEYINT(KKS+1) 
  587. X      NST=KEYINT(KKS+2) 
  588. X*--- FORMAT statements  
  589. X      KFOR=KEYINT(KKS+3)
  590. X      NFOR=KEYINT(KKS+4)
  591. X*--- RETURN 
  592. X      KRET=KEYINT(KKS+5)
  593. X      NRET=KEYINT(KKS+6)
  594. X*--- END
  595. X      NEND=KEYINT(KKS+7)
  596. X      FORMFL=KFOR.GT.0  
  597. X      RETFL=KRET.GT.0   
  598. X      ENDFL=NEND.GT.0   
  599. X      KST=KST-NST   
  600. X      KFOR=KFOR-NFOR
  601. X      KRET=KRET-NRET
  602. X      DO 40 I=1,NSTANU  
  603. X         KSTANU(I)=IWS(I)   
  604. X         KSTARE(I)=0
  605. X   40 CONTINUE  
  606. X*--- count FORMAT statements which have to be displaced 
  607. X      NF=0  
  608. X      DO 70 I=1,NSTAMM  
  609. X         ICL=ICLASS(I,1)
  610. X         IF (ICL.NE.0)  THEN
  611. X            IF(ICL.EQ.IIF)  ICL=ICLASS(I,2) 
  612. X            NN=NEXTIN(SIMA(NFLINE(I)),1,5)  
  613. X            IF (NN.NE.0)  THEN  
  614. X*--- find statement number in sorted table. 
  615. X*    The value of 40 for switching from direct to binary search is  
  616. X*    valid for VAX/780, but probably reasonable elsewhere as well.  
  617. X               IF (NSTANU.LE.40)  THEN  
  618. X                  DO 50 J=1,NSTANU  
  619. X                     IF (KSTANU(J).EQ.NN) GOTO 60   
  620. X   50             CONTINUE  
  621. X                  GOTO 120  
  622. X   60             CONTINUE  
  623. X                  IPOS=J
  624. X               ELSE 
  625. X                  CALL BINSRC(NN,KSTANU,NSTANU,IPOS,LAST)   
  626. X                  IF (IPOS.EQ.0) GOTO 120   
  627. X               ENDIF
  628. X               IF(KSTARE(IPOS).EQ.0)  THEN  
  629. X                  IF (FORMFL.AND.ICL.EQ.IFORMT)  THEN   
  630. X                     KFOR=KFOR+NFOR 
  631. X                     NEW=KFOR   
  632. X                  ELSEIF (RETFL.AND.ICL.EQ.IRETUR)  THEN
  633. X                     KRET=KRET+NRET 
  634. X                     NEW=KRET   
  635. X                  ELSEIF (ENDFL.AND.ICL.EQ.IEND)  THEN  
  636. X                     NEW=NEND   
  637. X                  ELSE  
  638. X                     KST=KST+NST
  639. X                     NEW=KST
  640. X                  ENDIF 
  641. X                  KSTARE(IPOS)=NEW  
  642. X               ENDIF
  643. X               IF (ACTION(14).AND.ICL.EQ.IFORMT.AND.NF.LT.1000)  THEN   
  644. X*--- remember FORMAT statements to be put at end
  645. X                  NF=NF+1   
  646. X                  IWS(NF)=I 
  647. X                  IWS(1000+NF)=NFLINE(I)
  648. X                  IWS(2000+NF)=NLLINE(I)
  649. X                  IWS(3000+NF)=ICLASS(I,1)  
  650. X                  IWS(4000+NF)=ICLASS(I,2)  
  651. X                  IWS(5000+NF)=IMODIF(I)
  652. X               ENDIF
  653. X            ENDIF   
  654. X         ENDIF  
  655. X   70 CONTINUE  
  656. X      IF(NF.GT.0)  THEN 
  657. X*--- put FORMAT statements in front of last statement   
  658. X         DO 80 ILAST=NSTAMM,1,-1
  659. X            IF(ICLASS(ILAST,1).NE.0) GOTO 90
  660. X   80    CONTINUE   
  661. X   90    CONTINUE   
  662. X*--- ILAST is last FORTRAN statement
  663. X         IS=IWS(1)  
  664. X         K=IS-1 
  665. X         N=1
  666. X         DO 100 I=IS,ILAST-1
  667. X            IF (I.EQ.IWS(N).AND.N.LE.NF)  THEN  
  668. X               N=N+1
  669. X            ELSE
  670. X               K=K+1
  671. X               NFLINE(K)=NFLINE(I)  
  672. X               NLLINE(K)=NLLINE(I)  
  673. X               ICLASS(K,1)=ICLASS(I,1)  
  674. X               ICLASS(K,2)=ICLASS(I,2)  
  675. X               IMODIF(K)=IMODIF(I)  
  676. X            ENDIF   
  677. X  100    CONTINUE   
  678. X         K=ILAST-NF-1   
  679. X         DO 110 I=1,NF  
  680. X            NFLINE(K+I)=IWS(1000+I) 
  681. X            NLLINE(K+I)=IWS(2000+I) 
  682. X            ICLASS(K+I,1)=IWS(3000+I)   
  683. X            ICLASS(K+I,2)=IWS(4000+I)   
  684. X            IMODIF(K+I)=IWS(5000+I) 
  685. X  110    CONTINUE   
  686. X      ENDIF 
  687. X      GOTO 999  
  688. X  120 CONTINUE  
  689. X      WRITE (MPUNIT,10010) SCROUT   
  690. X      NSTANU=0  
  691. X10000 FORMAT(/' ++++++ Warning - more than',I5,' statement numbers',
  692. X     +'in routine ',A,' , not renumbered')  
  693. X10010 FORMAT(/' ++++++ Warning - serious error in routine PRENUM ', 
  694. X     +'when processing routine ',A,' , not renumbered') 
  695. X  999 END   
  696. /
  697. echo 'x - REFORM.f'
  698. sed 's/^X//' > REFORM.f << '/'
  699. X      SUBROUTINE REFORM 
  700. X*-----------------------------------------------------------------------
  701. X*   
  702. X*   Re-formats the statement after a change.
  703. X*   
  704. X*---Input   
  705. X*     SSTA, NCHST   
  706. X*--- Output 
  707. X*     SIMA, and NFLINE, NLLINE, NLINES possibly updated.
  708. X*   
  709. X*-----------------------------------------------------------------------
  710. X      include 'PARAM.h' 
  711. X      include 'ALCAZA.h' 
  712. X      include 'FLAGS.h' 
  713. X      include 'CURSTA.h' 
  714. X      include 'STATE.h' 
  715. X      include 'JOBSUM.h' 
  716. X      include 'FLWORK.h' 
  717. X      include 'CLASS.h' 
  718. X*--- RETRY flag for second attempt without indentation if overflow  
  719. X      LOGICAL RETRY 
  720. X*--- IUPPER = line fill of SIMA, max. indented statement starts in  
  721. X*    IMAX+7 
  722. X      DATA IUPPER/72/, IMAX/30/ 
  723. X      RETRY=.TRUE.  
  724. X      NMOD=IMODIF(NSTREF)   
  725. X      I1=NFLINE(NSTREF) 
  726. X   10 CONTINUE  
  727. X*--- start of complete statement reformatting   
  728. X      IF(RETRY)  THEN   
  729. X*--- get user indentation   
  730. X         INU=NLBLPS(SIMA(I1),7,IMAX+6)  
  731. X         IF(ACTION(21))  THEN   
  732. X*--- indent corresponding to level (from PROIND)
  733. X            INB=6+MIN(IMAX,INDFAC*INDCNT)   
  734. X*--- return if not modified and indentation correct 
  735. X            IF (IMODIF(NSTREF).LT.10.AND.INU.EQ.INB) THEN   
  736. X               DO 20 I=I1+1,NLLINE(NSTREF)  
  737. X                  IF(NLTYPE(I).EQ.2)  THEN  
  738. X                     IF(NLBLPS(SIMA(I),7,IMAX+6).NE.INU) GOTO 30
  739. X                  ENDIF 
  740. X   20          CONTINUE 
  741. X               GOTO 999 
  742. X            ENDIF   
  743. X   30       CONTINUE
  744. X            IF(NMOD.LT.10)  NMOD=NMOD+10
  745. X         ELSE   
  746. X            INB=INU 
  747. X         ENDIF  
  748. X      ELSE  
  749. X*--- second pass - try without indentation  
  750. X         INB=6  
  751. X      ENDIF 
  752. X      NEWOUT=0  
  753. X      INSTR=0   
  754. X      INTRA=0   
  755. X      IPTRA=0   
  756. X      LTRA=0
  757. X      LAST=0
  758. X   40 CONTINUE  
  759. X      NEWOUT=NEWOUT+1   
  760. X*--- start of a new line  (statement number pre-set in PROCES or RENUMB)
  761. X      IF(NEWOUT.EQ.20)  THEN
  762. X         IF (RETRY)  THEN   
  763. X            RETRY=.FALSE.   
  764. X            GOTO 10 
  765. X         ELSE   
  766. X            WRITE (MPUNIT,10000)
  767. X            CALL FLPRNT(1,'OVERFLOW',NLLINE(NSTREF)-NFLINE(NSTREF)+1,   
  768. X     +      SIMA(NFLINE(NSTREF)),NDUMMY)
  769. X            NSTATC(6)=NSTATC(6)+1   
  770. X            STATUS(11)=.TRUE.   
  771. X            GOTO 999
  772. X         ENDIF  
  773. X      ELSEIF(NEWOUT.GT.1)  THEN 
  774. X         IF(INSTR.GE.0)  THEN   
  775. X            SNEWST(NEWOUT)(1:6)='     +'
  776. X         ELSE   
  777. X*--- split statement into several at '<'
  778. X            SNEWST(NEWOUT)(1:6)='      '
  779. X            INSTR=0 
  780. X         ENDIF  
  781. X      ENDIF 
  782. X*--- clear rest of statement
  783. X      SNEWST(NEWOUT)(7:MXLINE)=' '  
  784. X      IF(INSTR.EQ.0)  THEN  
  785. X*--- outside string 
  786. X         IPS=INB
  787. X      ELSE  
  788. X         IPS=6  
  789. X      ENDIF 
  790. X      IF(IPTRA.LT.LTRA)  THEN   
  791. X*--- add those items already prepared by call to NXITEM 
  792. X         L=MIN(IUPPER-IPS,LTRA-IPTRA)   
  793. X         SNEWST(NEWOUT)(IPS+1:IPS+L)=SSTA(IPTRA+1:IPTRA+L)  
  794. X         IPTRA=IPTRA+L  
  795. X         IPS=IPS+L  
  796. X         IF (IPTRA.LT.LTRA) GOTO 40 
  797. X      ENDIF 
  798. X      INSTR=0   
  799. X      IPT=LAST  
  800. X   50 CONTINUE  
  801. X      IF (IPT.EQ.NCHST) GOTO 60 
  802. X*--- chop into nice little pieces   
  803. X      CALL NXITEM(SSTA,IPT+1,NCHST,LAST)
  804. X      IF(SSTA(IPT+1:IPT+1).EQ.' ')  THEN
  805. X         IF (IPS.LT.IUPPER) IPS=IPS+1   
  806. X         IPT=IPT+1  
  807. X         IF (IPT.EQ.NCHST) GOTO 60  
  808. X      ENDIF 
  809. X      IF(SSTA(IPT+1:IPT+1).EQ.'{')  THEN
  810. X         IPTRA=IPT+1
  811. X      ELSEIF(SSTA(IPT+1:IPT+1).EQ.'<')  THEN
  812. X*--- split statement into several   
  813. X         IPTRA=LTRA 
  814. X         INSTR=-1   
  815. X         GOTO 40
  816. X      ELSE  
  817. X         IPTRA=IPT  
  818. X      ENDIF 
  819. X      IF(SSTA(LAST:LAST).EQ.'}')  THEN  
  820. X         LTRA=LAST-1
  821. X      ELSE  
  822. X         LTRA=LAST  
  823. X      ENDIF 
  824. X      L=LTRA-IPTRA  
  825. X      IF(L.LE.0)  THEN  
  826. X         IPT=LAST   
  827. X         GOTO 50
  828. X      ENDIF 
  829. X      IF(L.LE.IUPPER-IPS)  THEN 
  830. X         SNEWST(NEWOUT)(IPS+1:IPS+L)=SSTA(IPTRA+1:LTRA) 
  831. X         IPS=IPS+L  
  832. X         IPT=LAST   
  833. X         GOTO 50
  834. X      ELSE  
  835. X         IF (L.GT.IUPPER-INB)  THEN 
  836. X*--- split  
  837. X            SNEWST(NEWOUT)(IPS+1:IUPPER)=SSTA(IPTRA+1:) 
  838. X            INSTR=1 
  839. X            IPTRA=IPTRA+IUPPER-IPS  
  840. X         ELSE   
  841. X            INSTR=0 
  842. X         ENDIF  
  843. X*--- start a new line   
  844. X         GOTO 40
  845. X      ENDIF 
  846. X   60 CONTINUE  
  847. X      IF(ACTION(28))  THEN  
  848. X*--- right-adjust GOTO statements   
  849. X         IF(ICURCL(1).EQ.IIF) THEN  
  850. X            ICLE=ISTMDS(6,ICURCL(2))
  851. X         ELSE   
  852. X            ICLE=ISTMDS(6,ICURCL(1))
  853. X         ENDIF  
  854. X         IF(ICLE.EQ.37) THEN
  855. X            CALL MATCH('#GOTO@;',1,7,SNEWST(NEWOUT),7,  
  856. X     +      LASTNB(SNEWST(NEWOUT),7,72), .FALSE.,KPOS,ILEV,NSPEC,   
  857. X     +      IWS,IWS(1001))  
  858. X            IF(KPOS.GT.0.AND.KPOS.LT.72) THEN   
  859. X               DO 70 I=72,7,-1  
  860. X                  SNEWST(NEWOUT)(I:I)=SNEWST(NEWOUT)(KPOS:KPOS) 
  861. X                  IF(SNEWST(NEWOUT)(I:I).EQ.'G') GOTO 80
  862. X                  KPOS=KPOS-1   
  863. X   70          CONTINUE 
  864. X   80          CONTINUE 
  865. X               SNEWST(NEWOUT)(KPOS:I-1)=' ' 
  866. X            ENDIF   
  867. X         ENDIF  
  868. X      ENDIF 
  869. X      IMODIF(NSTREF)=NMOD   
  870. X*--- re-formatted statement now in SNEWST   
  871. X10000 FORMAT(/' +++++++++ WARNING - re-formatting leads to overflow,
  872. X     + statement not changed:') 
  873. X  999 END   
  874. /
  875. echo 'x - RENUMB.f'
  876. sed 's/^X//' > RENUMB.f << '/'
  877. X      SUBROUTINE RENUMB 
  878. X*-----------------------------------------------------------------------
  879. X*   
  880. X*   Processes one routine statement by statement:   
  881. X*   filtering, replacements 
  882. X*   
  883. X*-----------------------------------------------------------------------
  884. X      include 'PARAM.h' 
  885. X      include 'ALCAZA.h' 
  886. X      include 'CLASS.h' 
  887. X      include 'FLAGS.h' 
  888. X      include 'CURSTA.h' 
  889. X      include 'STATE.h' 
  890. X      include 'JOBSUM.h' 
  891. X      include 'FLWORK.h' 
  892. X      include 'CONDEC.h' 
  893. X      DIMENSION IKL(3)  
  894. X*   IKL(1) = last ch. of 'FMT=' or 0
  895. X*   IKL(2) =             'ERR=' 
  896. X*   IKL(3) =             'END=' 
  897. X      LOGICAL FMTFL 
  898. X*--- FMTFL true when 'FMT=' found   
  899. X      CHARACTER SKL(3)*5,STEMP*1,STEMP3*3, SBUFF*5  
  900. X    
  901. X      DATA SKL/'#FMT=','#ERR=','#END='/ 
  902. X      include 'CONDAT.h' 
  903. X*--- if no statement numbers, return
  904. X      IF (NSTANU.EQ.0) GOTO 999 
  905. X*--- replace statement number if any
  906. X      NN=NEXTIN(SIMA(NFLINE(NSTREF)),1,5)   
  907. X      IF (NN.NE.0)  THEN
  908. X*--- get number from table  
  909. X         IF (NSTANU.LE.40)  THEN
  910. X            DO 10 J=1,NSTANU
  911. X               IF (NN.EQ.KSTANU(J)) GOTO 20 
  912. X   10       CONTINUE
  913. X            J=0 
  914. X   20       CONTINUE
  915. X         ELSE   
  916. X            CALL BINSRC(NN,KSTANU,NSTANU,J,L)   
  917. X         ENDIF  
  918. X         IF (J.GT.0)  THEN  
  919. X            NN=KSTARE(J)
  920. X         ELSE   
  921. X            NN=0
  922. X         ENDIF  
  923. X         IF(NN.GT.0)  THEN  
  924. X            IF (IMODIF(NSTREF).LT.10) IMODIF(NSTREF)=IMODIF(NSTREF)+10  
  925. X            WRITE (SNEWST(1),'(I5)') NN 
  926. X         ENDIF  
  927. X      ENDIF 
  928. X      NMOD=IMODIF(NSTREF)   
  929. X      ICL=ICURCL(1) 
  930. X      IF(ICL.EQ.IIF)  THEN  
  931. X*--- get class of second part   
  932. X         ICL=ICURCL(2)  
  933. X*--- ISTIND specifies tpyes 
  934. X         ISTIND=ISTMDS(10,ICL)  
  935. X         IF (ISTIND.EQ.0) GOTO 999  
  936. X*--- set pointer after first bracket
  937. X         IPT=INDEX(SSTA(:NCHST),'(')
  938. X         IF (IPT.EQ.0) GOTO 999 
  939. X         CALL SKIPLV(SSTA,IPT+1,NCHST,.FALSE.,IPT,ILEV) 
  940. X         IF (IPT.EQ.0) GOTO 999 
  941. X         SSTR(:IPT)=SSTA(:IPT)  
  942. X         IPS=IPT
  943. X      ELSE  
  944. X         ISTIND=ISTMDS(10,ICL)  
  945. X         IF (ISTIND.EQ.0) GOTO 999  
  946. X         IPT=0  
  947. X         IPS=0  
  948. X*--- IPS = pointer in new string SSTR, IPT in old SSTA  
  949. X      ENDIF 
  950. X*--- now IPT in front of statement  
  951. X*   
  952. X*--- treat the five different cases 
  953. X      IF(ISTIND.EQ.1)  THEN 
  954. X*--- one number, directly behind key
  955. X         KFCH=0 
  956. X         CALL SKIPTP(2,SSTA,IPT+1,NCHST,.FALSE.,IPTT,ILEV)  
  957. X         IF(IPTT.EQ.0.OR.IPTT.EQ.NCHST) GOTO 60 
  958. X         STEMP=SSTA(IPTT+1:IPTT+1)  
  959. X         IF(STEMP.EQ.' '.AND.IPTT+2.LE.NCHST)  STEMP=SSTA(IPTT+2:IPTT+2)
  960. X         IF(NUMCH(STEMP))  THEN 
  961. X            CALL GETINT(SSTA,IPT+1,NCHST,KFCH,KLCH,NN)  
  962. X         ENDIF  
  963. X         GOTO 60
  964. X      ENDIF 
  965. X*--- for all other cases, find bracket  
  966. X      LL=INDEX(SSTA(IPT+1:NCHST),'(')+IPT   
  967. X      IF (LL.EQ.IPT) GOTO 999   
  968. X      CALL SKIPLV(SSTA,LL+1,NCHST,.FALSE.,LR,ILEV)  
  969. X      IF (LR.EQ.0) GOTO 999 
  970. X*--- first bracket between LL and LR
  971. X*--- look for 'FMT=' etc.   
  972. X      DO 30 I=1,3   
  973. X         CALL MATCH(SKL(I),1,5,SSTA,LL,LR,.FALSE.,IKL(I),ILEV,NSPEC,IWS,
  974. X     +   IWS)   
  975. X         IF (I.EQ.1) FMTFL=IKL(1).GT.0  
  976. X   30 CONTINUE  
  977. X      N=0   
  978. X*--- count and order
  979. X      DO 40 I=1,3   
  980. X         IF (IKL(I).GT.0)  THEN 
  981. X            N=N+1   
  982. X            IKL(N)=IKL(I)   
  983. X         ENDIF  
  984. X   40 CONTINUE  
  985. X      IF (N.GT.1)  THEN 
  986. X         CALL SORTSP(N,IKL,NSPEC)   
  987. X      ELSE  
  988. X         NSPEC=N
  989. X      ENDIF 
  990. X*--- NFL is a flag for different passes 
  991. X      NFL=0 
  992. X   50 CONTINUE  
  993. X      KFCH=0
  994. X      IF (ISTIND.EQ.2)  THEN
  995. X*--- all numbers inside first bracket   
  996. X         CALL GETINT(SSTA,LL+1,LR,KFCH,KLCH,NN) 
  997. X         LL=KLCH
  998. X      ELSEIF (ISTIND.EQ.3)  THEN
  999. X*--- all numbers follow first bracket   
  1000. X         CALL GETINT(SSTA,LR+1,NCHST,KFCH,KLCH,NN)  
  1001. X         LR=KLCH
  1002. X      ELSEIF (ISTIND.EQ.4)  THEN
  1003. X*--- inside first bracket 'FMT=' etc.,  
  1004. X*   or if no 'FMT=', second item
  1005. X         IF (.NOT.FMTFL)  THEN  
  1006. X            CALL POSCH(',',SSTA,LL+1,LR-1,.FALSE.,0,IPOS,ILEV)  
  1007. X            IF(IPOS.EQ.0) GOTO 999  
  1008. X            CALL GETNBL(SSTA(IPOS+1:LR),STEMP,N)
  1009. X            IF(N.GT.0.AND.NUMCH(STEMP))  THEN   
  1010. X               CALL GETINT(SSTA,IPOS+1,LR,KFCH,KLCH,NN) 
  1011. X               LL=KLCH  
  1012. X            ENDIF   
  1013. X         ELSE   
  1014. X            NFL=NFL+1   
  1015. X            IF (NFL.LE.NSPEC)  THEN 
  1016. X               CALL GETNBL(SSTA(IKL(NFL)+1:LR),STEMP,N) 
  1017. X               IF(N.GT.0.AND.NUMCH(STEMP))  THEN
  1018. X                  CALL GETINT(SSTA,IKL(NFL)+1,LR,KFCH,KLCH,NN)  
  1019. X                  LL=KLCH   
  1020. X               ENDIF
  1021. X            ENDIF   
  1022. X         ENDIF  
  1023. X      ELSEIF (ISTIND.EQ.5)  THEN
  1024. X*--- alternate returns, '(*' or ',*'
  1025. X         IF (NFL.EQ.0)  THEN
  1026. X            STEMP3='#(*'
  1027. X         ELSE   
  1028. X            STEMP3='#,*'
  1029. X         ENDIF  
  1030. X         NFL=NFL+1  
  1031. X         CALL MATCH(STEMP3,1,3,SSTA,LL,LR,.FALSE.,KPOS,ILEV,NSPEC,IWS,  
  1032. X     +   IWS)   
  1033. X         IF (KPOS.GT.0)  THEN   
  1034. X            LL=KPOS 
  1035. X            CALL GETINT(SSTA,LL+1,LR,KFCH,KLCH,NN)  
  1036. X            LL=KLCH 
  1037. X         ENDIF  
  1038. X      ENDIF 
  1039. X   60 CONTINUE  
  1040. X*--- if KFCH > 0, number found  
  1041. X      IF (KFCH.GT.0)  THEN  
  1042. X         IF (NMOD.LT.10) NMOD=NMOD+10   
  1043. X*--- transmit part up to pointer
  1044. X         N=KFCH-IPT-1   
  1045. X         IF (N.GT.0)  THEN  
  1046. X            SSTR(IPS+1:IPS+N)=SSTA(IPT+1:IPT+N) 
  1047. X            IPS=IPS+N   
  1048. X            IPT=KLCH
  1049. X         ENDIF  
  1050. X*--- get number from table  
  1051. X         IF (NSTANU.LE.40)  THEN
  1052. X            DO 70 J=1,NSTANU
  1053. X               IF (NN.EQ.KSTANU(J)) GOTO 80 
  1054. X   70       CONTINUE
  1055. X            J=0 
  1056. X   80       CONTINUE
  1057. X         ELSE   
  1058. X            CALL BINSRC(NN,KSTANU,NSTANU,J,L)   
  1059. X         ENDIF  
  1060. X         IF (J.GT.0)  THEN  
  1061. X            NN=KSTARE(J)
  1062. X         ELSE   
  1063. X            NN=0
  1064. X         ENDIF  
  1065. X*--- add to SSTR
  1066. X         WRITE (SBUFF,'(I5)') NN
  1067. X         DO 90 J=1,5
  1068. X            STEMP=SBUFF(J:J)
  1069. X            IF (STEMP.NE.' ')  THEN 
  1070. X               IPS=IPS+1
  1071. X               SSTR(IPS:IPS)=STEMP  
  1072. X            ENDIF   
  1073. X   90    CONTINUE   
  1074. X         FMTFL=.TRUE.   
  1075. X         IF (ISTIND.GT.1) GOTO 50   
  1076. X      ENDIF 
  1077. X      IF (NFL.EQ.1.AND.ISTIND.EQ.5) GOTO 50 
  1078. X      IF (.NOT.FMTFL.AND.ISTIND.EQ.4)  THEN 
  1079. X         FMTFL=.TRUE.   
  1080. X         GOTO 50
  1081. X      ENDIF 
  1082. X*--- transfer rest  
  1083. X      N=NCHST-IPT   
  1084. X      IF (N.GT.0)  THEN 
  1085. X         SSTR(IPS+1:IPS+N)=SSTA(IPT+1:NCHST)
  1086. X         IPS=IPS+N  
  1087. X      ENDIF 
  1088. X      IF (NMOD.GT.10)  THEN 
  1089. X         IF (IPS.LE.MXLENG)  THEN   
  1090. X            IMODIF(NSTREF)=NMOD 
  1091. X            NCHST=IPS   
  1092. X            SSTA(:IPS)=SSTR(:IPS)   
  1093. X         ELSE   
  1094. X            WRITE (MPUNIT,10000)
  1095. X            CALL FLPRNT(1,'OVERFLOW',NLLINE(NSTREF)-NFLINE(NSTREF)+1,   
  1096. X     +      SIMA(NFLINE(NSTREF)),NDUMMY)
  1097. X            NSTATC(6)=NSTATC(6)+1   
  1098. X            STATUS(11)=.TRUE.   
  1099. X         ENDIF  
  1100. X      ENDIF 
  1101. X10000 FORMAT(/' ++++++ Warning - renumbering would lead to overflow',   
  1102. X     +' in following statement, not done')  
  1103. X  999 END   
  1104. /
  1105. echo 'x - TREEST.f'
  1106. sed 's/^X//' > TREEST.f << '/'
  1107. X      SUBROUTINE TREEST(MODE)   
  1108. X*-----------------------------------------------------------------------
  1109. X*   
  1110. X*--- Prepares TREE file output (called for each statement)  
  1111. X*   
  1112. X*---Input   
  1113. X*   MODE        =0 : headerless routine start   
  1114. X*               >0 : normal routine start, or statement 
  1115. X*-----------------------------------------------------------------------
  1116. X      include 'PARAM.h' 
  1117. X      include 'ALCAZA.h' 
  1118. X      include 'TREECOM.h' 
  1119. X      include 'STATE.h' 
  1120. X      include 'FLAGS.h' 
  1121. X      include 'CLASS.h' 
  1122. X      include 'CURSTA.h' 
  1123. X      CHARACTER SNAME*(MXNMCH),STEMP*1  
  1124. X      LOGICAL LEXARS
  1125. X      NCALLP=NCALLD 
  1126. X      IF(MODE.EQ.0)  THEN   
  1127. X*--- headerless routine start   
  1128. X         NCALLR=NCALLR+1
  1129. X         ICALLR(NCALLR)=0   
  1130. X         CALLER(NCALLR)=SCROUT  
  1131. X      ELSE  
  1132. X*--- external class number  
  1133. X         ICLE=ISTMDS(6,ICURCL(1))   
  1134. X*--- routine header or entry
  1135. X         IF(ISTMDS(14,ICURCL(1)).NE. 0.OR.ICLE.EQ.29) THEN  
  1136. X            IF(ICLE.EQ.29) THEN 
  1137. X               SNAME=SNAMES(ISNAME+1)   
  1138. X            ELSE
  1139. X               SNAME=SCROUT 
  1140. X            ENDIF   
  1141. X*--- keep argument name list
  1142. X            NARGEL=MAX(0,MIN(NSNAME-1,NOARG))   
  1143. X            DO 10 I=1,NARGEL
  1144. X               SARGEL(I)=SNAMES(ISNAME+I+1) 
  1145. X   10       CONTINUE
  1146. X*--- add routine name to list   
  1147. X            IF(NCALLR.LT.KENT) THEN 
  1148. X*--- keep statement ref. for callers
  1149. X               ICALLR(NCALLR+1)=NSTREF  
  1150. X               CALLER(NCALLR+1)=SNAME   
  1151. X               NCALLR=NCALLR+1  
  1152. X            ENDIF   
  1153. X         ELSEIF(ICLE.EQ.31) THEN
  1154. X*--- EXTERNAL statement - keep names
  1155. X            DO 20 I=1,NSNAME
  1156. X               IF(NEXEL.LT.KALL) THEN   
  1157. X                  NEXEL=NEXEL+1 
  1158. X                  SEXEL(NEXEL)=SNAMES(ISNAME+I) 
  1159. X               ENDIF
  1160. X   20       CONTINUE
  1161. X         ELSEIF(ISTMDS(11,ICURCL(1)).NE.0) THEN 
  1162. X*--- executable - scan all names
  1163. X            IF(ICURCL(1).EQ.IIF) THEN   
  1164. X               ICLE=ISTMDS(6,ICURCL(2)) 
  1165. X               IND=INDEX(SSTA,'(')  
  1166. X               CALL SKIPLV(SSTA,IND+1,NCHST,.FALSE., IPT,ILEV)  
  1167. X            ELSE
  1168. X               ICLE=ISTMDS(6,ICURCL(1)) 
  1169. X               IPT=0
  1170. X            ENDIF   
  1171. X            IF(ICLE.EQ.7) THEN  
  1172. X*--- subroutine call
  1173. X               DO 30 I=1,NSNAME 
  1174. X                  IF(NSSTRT(I).GT.IPT) GOTO 40  
  1175. X   30          CONTINUE 
  1176. X               GOTO 999 
  1177. X   40          CONTINUE 
  1178. X*--- keep name ref. of call 
  1179. X               ISTC=I   
  1180. X*--- check against argument list, drop if argument  
  1181. X               DO 50 J=1,NARGEL 
  1182. X                  IF(SNAMES(ISNAME+I).EQ.SARGEL(J)) GOTO 55 
  1183. X   50          CONTINUE 
  1184. X               IF(NCALLD.LT.KALL) THEN  
  1185. X                  NCALLD=NCALLD+1   
  1186. X                  CALLED(NCALLD)=SNAMES(ISNAME+I)   
  1187. X                  CEDARG(NCALLD)=' '
  1188. X                  IND=INDEX(SSTA(IPT+1:NCHST),'(')  
  1189. X                  IF(IND.GT.0) THEN 
  1190. X                     CALL ARGTYP(SSTA,.FALSE.,IPT+IND,NCHST,
  1191. X     +               CEDARG(NCALLD))
  1192. X                  ENDIF 
  1193. X               ENDIF
  1194. X            ELSE
  1195. X               ISTC=0   
  1196. X            ENDIF   
  1197. X   55       CONTINUE
  1198. X            DO 70 I=1,NSNAME
  1199. X               IF(I.EQ.ISTC) GOTO 70
  1200. X               IF((ITBIT(NAMTYP(ISNAME+I),17).NE.0  
  1201. X     +         .AND.SNAMES(ISNAME+I).NE.SCROUT) 
  1202. X     +         .OR.ITBIT(NAMTYP(ISNAME+I),12).NE.0) THEN
  1203. X*--- name is a function, or EXTERNAL
  1204. X*--- check against argument list, drop if argument  
  1205. X                  DO 60 J=1,NARGEL  
  1206. X                     IF(SNAMES(ISNAME+I).EQ.SARGEL(J)) GOTO 70  
  1207. X   60             CONTINUE  
  1208. X                  IF(NCALLD.LT.KALL) THEN   
  1209. X                     IPT=NSEND(I)+1 
  1210. X                     IF(LEXARS(I))  THEN
  1211. X*--- name appears as argument to another routine
  1212. X                        NCALLD=NCALLD+1 
  1213. X                        CALLED(NCALLD)=SNAMES(ISNAME+I) 
  1214. X                        CEDARG(NCALLD)='$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  1215. X     +$$$$$$$$$$$$$$$$$$'   
  1216. X                     ELSE   
  1217. X                        STEMP=SSTA(IPT:IPT) 
  1218. X                        IF(STEMP.EQ.' ') THEN   
  1219. X                           IPT=IPT+1
  1220. X                           STEMP=SSTA(IPT:IPT)  
  1221. X                        ENDIF   
  1222. X                        IF(STEMP.EQ.'(') THEN   
  1223. X                           CALL SKIPLV(SSTA,IPT+1,NCHST,.FALSE., IPOS,  
  1224. X     +                     ILEV)
  1225. X                           IF(IPOS.GT.0) THEN   
  1226. X                              NCALLD=NCALLD+1   
  1227. X                              CALLED(NCALLD)=SNAMES(ISNAME+I)   
  1228. X                              CEDARG(NCALLD)=' '
  1229. X                              CALL ARGTYP(SSTA,.FALSE.,IPT,IPOS,
  1230. X     +                        CEDARG(NCALLD))   
  1231. X                           ENDIF
  1232. X                        ENDIF   
  1233. X                     ENDIF  
  1234. X                  ENDIF 
  1235. X               ENDIF
  1236. X   70       CONTINUE
  1237. X         ENDIF  
  1238. X      ENDIF 
  1239. X*--- suppress multiple subsequent called routines with identical
  1240. X*    argument type lists
  1241. X      IF(NCALLP.GT.0.AND.NCALLD.GT.NCALLP)  THEN
  1242. X         IF(CALLED(NCALLD).EQ.CALLED(NCALLD-1)  
  1243. X     +   .AND.CEDARG(NCALLD).EQ.CEDARG(NCALLD-1))  NCALLD=NCALLD-1  
  1244. X      ENDIF 
  1245. X  999 END   
  1246. /
  1247. echo 'x - floppy.l'
  1248. sed 's/^X//' > floppy.l << '/'
  1249. X.TH floppy 1 "3rd May 1990"  "CERN"
  1250. X.SH NAME
  1251. Xfloppy \- Fortran coding convention checker and code tidier
  1252. X.SH SYNOPSIS
  1253. X.B floppy 
  1254. X[
  1255. X.B \-l
  1256. X] [
  1257. X.B \-c rules
  1258. X] [
  1259. X.B \-f
  1260. X] [
  1261. X.B \-o old file
  1262. X] [
  1263. X.B \-i names
  1264. X] [
  1265. X.B \-j number
  1266. X] [
  1267. X.B \-F
  1268. X] [
  1269. X.B \-G
  1270. X] [
  1271. X.B \-r start[,step]
  1272. X] [
  1273. X.B \-s start[,step]
  1274. X] [
  1275. X.B \-n new fortran
  1276. X] [ file ]
  1277. X.SH DESCRIPTION
  1278. X.I Floppy
  1279. Xis a tool which allows a file of Fortran 77 code to be checked against
  1280. Xa set of common coding conventions. Floppy also allows the source Fortran
  1281. Xto be reformatted and tidied in various ways.
  1282. X.PP
  1283. XNote that, before passing code through Floppy, it should have
  1284. Xbeen compiled, preferably with the ANSI compiler flag, to check
  1285. Xfor errors. Otherwise, the results from using Floppy are
  1286. Xunpredictable. Note also that non-standard Fortran statements
  1287. X(such as "include" directives or lower-case) are treated as
  1288. X.B comments
  1289. Xby Floppy, and thus ignored.
  1290. X
  1291. X.SH OPTIONS
  1292. X.IP \fB\-l\fR 12
  1293. XThe
  1294. X.I logging
  1295. Xoption causes Floppy to produce a verbose description of the selected options.
  1296. X.IP \fB\-c\ rules \fR 12
  1297. XThe 
  1298. X.I checks
  1299. Xoption indicates which rules Floppy should check. The checks may be specified as
  1300. Xa series of comma-separated numbers (see below), or as one of the following:
  1301. X.RS 12
  1302. X.IP standard 12
  1303. XThe standard set of rules will be checked (those marked * in the list below).
  1304. X.IP a 12
  1305. XALL rules in the available list will be checked.
  1306. X.IP n 12
  1307. XNO rules will be checked. (Useful when just tidying code.)
  1308. X.PP
  1309. XNote that, if selecting individual rule numbers, 99 is taken to mean ALL
  1310. Xrules, and -99 to mean NO rules. Specifying a negative rule number excludes
  1311. Xthat rule. So to check all rules except 1,5,7 and 31, you can use
  1312. X.br
  1313. X.RS 12
  1314. X.I -c99,-1,-5,-7,-31
  1315. X.RE 12
  1316. X
  1317. X.RE
  1318. X.IP \fB\-f\fR 12
  1319. XThe
  1320. X.I full
  1321. Xqualifier specifies
  1322. Xthat all source code lines should be listed, rather than
  1323. Xjust those in breach of any specified rules.
  1324. X
  1325. X.IP \fB\-o\ old file\fR 12
  1326. XUse a previously-generated file of rule numbers, ignore names etc.
  1327. XThe
  1328. X.I old
  1329. Xtag should be set to the file name, which is generated by 
  1330. Xappending .old to the previous source Fortran file name.
  1331. X
  1332. X.IP \fB\-i\ names\fR 12
  1333. XSpecify a list of Fortran module and variable names to be ignored
  1334. Xwhen the rules are checked. Specify module names by prepending the
  1335. Xname with a # sign. The list of names should be separated by commas.
  1336. XNote also that the names should be uppercase, to conform with the
  1337. XF77 standard. For example,
  1338. X.br
  1339. X.I -i#GOOBAR,FOOBAR
  1340. Xwill cause subroutine GOOBAR to be ignored, and any references to the
  1341. Xvariable FOOBAR.
  1342. X
  1343. X.PP
  1344. X
  1345. XThe following options apply to code tidying:
  1346. X
  1347. X.IP \fB\-j\ [number]\fR 12
  1348. XThe
  1349. X.I indent
  1350. Xoption causes all DO loops and IF...THEN...ENDIF clauses to be
  1351. Xindented by the specified number of spaces to the right. The default
  1352. Xvalue is 3 spaces, the maximum allowed is 5.
  1353. X
  1354. X.IP \fB\-F\fR 12
  1355. XSpecifies that all FORMAT statements be grouped together at the end
  1356. Xof each module.
  1357. X
  1358. X.IP \fB\-G\fR 12
  1359. XSpecifies that all GOTO n clauses are right adjusted to column 72.
  1360. X
  1361. X.IP \fB\-s\ start,[step]\fR 12
  1362. XSpecify that all labelled statements be re-numbered, starting at
  1363. X.I start
  1364. Xand stepping by
  1365. X.I step.
  1366. XThe default value for
  1367. X.I step
  1368. Xis 10.
  1369. X
  1370. X.IP \fB\-r\ start,[step]\fR 12
  1371. XSpecify that all FORMAT statements be re-numbered, starting at
  1372. X.I start
  1373. Xand stepping by
  1374. X.I step.
  1375. XThe default value for
  1376. X.I step
  1377. Xis 10.
  1378. X
  1379. X.IP \fB\-n\ new fortran\fR 12
  1380. XCauses the new Fortran file to be called
  1381. X.I new fortran.
  1382. XIf this option is not given, then the new Fortran file
  1383. Xwill have the name of the source Fortran, appended by
  1384. X.I .out
  1385. X
  1386. X.SH CODING CONVENTION LIST
  1387. X
  1388. XThe full list of rules is as follows:
  1389. X.br
  1390. X.(l
  1391. X*  1   Avoid comment lines after end of module
  1392. X.br
  1393. X*  2   End all program modules with the END statement
  1394. X.br
  1395. X*  3   Declared COMMON blocks must be used in the module
  1396. X.br
  1397. X*  4   COMPLEX and DOUBLEPRECISION vars at end of COMMON
  1398. X.br
  1399. X*  5   COMMON block definitions should not change
  1400. X.br
  1401. X*  6   Variable names should be 6 or fewer characters long
  1402. X.br
  1403. X   7   Variables in COMMON should be 6 characters long
  1404. X.br
  1405. X   8   Variables not in COMMON should be <6 characters
  1406. X.br
  1407. X*  9   Integer variables should begin with I to N
  1408. X.br
  1409. X*  10  Variable names should not equal FORTRAN keywords
  1410. X.br
  1411. X*  11  Avoid comment lines before module declaration
  1412. X.br
  1413. X*  12  Module names should not equal intrinsic functions
  1414. X.br
  1415. X*  13  First statement in a module should be declaration
  1416. X.br
  1417. X*  14  Module should begin with at least 3 comment lines
  1418. X.br
  1419. X   15  Comment lines should begin with a C
  1420. X.br
  1421. X*  16  No comment lines between continuations
  1422. X.br
  1423. X*  17  Avoid non-standard variable types eg INTEGER*2
  1424. X.br
  1425. X*  18  Avoid multiple COMMON definitions per line
  1426. X.br
  1427. X*  19  Do not dimension COMMON variables outside COMMON
  1428. X.br
  1429. X*  20  Avoid embedded blanks in variable names
  1430. X.br
  1431. X*  21  Avoid embedded blanks in syntactic entities
  1432. X.br
  1433. X*  22  Avoid the use of PRINT statements (use WRITE)
  1434. X.br
  1435. X   23  Do not give the END statement a label
  1436. X.br
  1437. X*  24  Avoid WRITE(* construction
  1438. X.br
  1439. X   25  Avoid WRITE statement in a FUNCTION
  1440. X.br
  1441. X*  26  Avoid the use of PAUSE statements
  1442. X.br
  1443. X*  27  Statement labels should not begin in column 1
  1444. X.br
  1445. X*  28  Always preceede STOP by a descriptive WRITE
  1446. X.br
  1447. X*  29  Avoid the use of ENTRY in FUNCTIONS
  1448. X.br
  1449. X*  30  Avoid using I/O in FUNCTIONs
  1450. X.br
  1451. X   31  Avoid the use of the alternate RETURN statement
  1452. X.br
  1453. X*  32  COMMON block names should not equal variable names
  1454. X.br
  1455. X*  33  Avoid use of obsolete CERN library routines
  1456. X.br
  1457. X   34  Avoid FUNCTION names the same as intrinsics
  1458. X.br
  1459. X*  35  Local functions should be declared EXTERNAL
  1460. X.br
  1461. X*  36  Module names should all be different
  1462. X.br
  1463. X*  37  Avoid expressions of mixed mode eg A=B/I
  1464. X.br
  1465. X*  38  Length of passed CHARACTER variables should be *
  1466. X.br
  1467. X*  39  Order of statements should conform !
  1468. X.br
  1469. X*  40  Separate Statement Functions by comment lines
  1470. X.br
  1471. X*  41  No names in Statement Function definitions elsewhere
  1472. X.br
  1473. X   42  Use LLT,LGT etc to compare CHARACTER vars. in IFs
  1474. X.br
  1475. X   43  Variables (not COMMON, not PARAMs) <6 characters
  1476. X.br
  1477. X*  44  Passed arguments should be dimensioned * in module
  1478. X.br
  1479. X.)l
  1480. X
  1481. X.SH SEE ALSO
  1482. X.PP
  1483. Xf77(1)
  1484. /
  1485. echo 'Part 07 of Floppy complete.'
  1486. exit
  1487.  
  1488.  
  1489.