home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume12 / ffccc / part08 < prev    next >
Encoding:
Text File  |  1990-05-14  |  47.2 KB  |  1,301 lines

  1. Newsgroups: comp.sources.misc
  2. organization: CERN, Geneva, Switzerland
  3. keywords: fortran
  4. subject: v12i094: Floppy - Fortran Coding Convention Checker Part 08/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 94
  9. Submitted-by: julian@cernvax.cern.ch (julian bunn)
  10. Archive-name: ffccc/part08
  11.  
  12. #!/bin/sh
  13. echo 'Start of Floppy, part 08 of 11:'
  14. echo 'x - ARGTYP.f'
  15. sed 's/^X//' > ARGTYP.f << '/'
  16. X      SUBROUTINE ARGTYP(STRING,CALLFL,I1,I2,ARG)
  17. X*-----------------------------------------------------------------------
  18. X*   
  19. X*--- returns a list of argument types   
  20. X*--- input  
  21. X*    STRING(I1:I2) = '(...)' argument list  
  22. X*    CALLFL        = .TRUE. if argument list of a caller, else .FALSE.  
  23. X*--- output 
  24. X*    ARG           character variable, 1 ch./argument   
  25. X*                  'I' = integer
  26. X*                  'R' = real   
  27. X*                  'D' = double prec.   
  28. X*                  'K' = complex
  29. X*                  'C' = character  
  30. X*                  'L' = logical
  31. X*                  'P' = procedure (subroutine or function passed)  
  32. X*                  '*' = alternate ret. 
  33. X*                  '$' = not determined 
  34. X*   
  35. X*   the rest is blank.  
  36. X*-----------------------------------------------------------------------
  37. X      include 'PARAM.h' 
  38. X      include 'ALCAZA.h' 
  39. X      include 'CONDEC.h' 
  40. X      include 'STATE.h' 
  41. X      CHARACTER STRING*(*),ARG*(*),STYP*1, STEMP*1,SNAME*(MXNMCH),  
  42. X     +ATYP*7
  43. X      LOGICAL BRNONE,CALLFL 
  44. X      DATA ATYP/'IRLKDC$'/  
  45. X      include 'CONDAT.h' 
  46. X      KPOS=I1   
  47. X      N=0   
  48. X   10 CONTINUE  
  49. X      IPT=KPOS  
  50. X*--- find end of each argument  
  51. X      CALL POSCH(',',STRING,IPT+1,I2, .FALSE.,0,KPOS,ILEV)  
  52. X      IF(KPOS.EQ.0)  KPOS=I2
  53. X      N=N+1 
  54. X      STEMP=STRING(IPT+1:IPT+1) 
  55. X      IF(STEMP.EQ.' ')  THEN
  56. X         IPT=IPT+1  
  57. X         STEMP=STRING(IPT+1:IPT+1)  
  58. X      ENDIF 
  59. X      IF(STEMP.EQ.'*')  THEN
  60. X         ARG(N:N)='*'   
  61. X      ELSE  
  62. X         IF(STEMP.EQ.'+'.OR.STEMP.EQ.'-') THEN  
  63. X            IPT=IPT+1   
  64. X            STEMP=STRING(IPT+1:IPT+1)   
  65. X            IF(STEMP.EQ.' ') THEN   
  66. X               IPT=IPT+1
  67. X               STEMP=STRING(IPT+1:IPT+1)
  68. X            ENDIF   
  69. X         ENDIF  
  70. X         IF(INDEX('0123456789(.{',STEMP).NE.0) THEN 
  71. X            CALL GETCON(STRING,IPT+1,KPOS,KLCH,STYP)
  72. X            IF(KLCH.EQ.0) GOTO 60   
  73. X            IF(KLCH+1.EQ.KPOS.OR.(KLCH+2.EQ.KPOS .AND.STRING(KLCH+1:KLCH
  74. X     +      +1).EQ.' ' )) THEN  
  75. X*--- argument is a simple constant  
  76. X               ARG(N:N)=STYP
  77. X            ELSE
  78. X               GOTO 60  
  79. X            ENDIF   
  80. X         ELSEIF(ALPHCH(STEMP)) THEN 
  81. X            CALL GETNAM(STRING,IPT+1,KPOS,KFCH, KNAM)   
  82. X            KLCH=KNAM   
  83. X            STEMP=STRING(KLCH+1:KLCH+1) 
  84. X            IF(STEMP.EQ.' ') THEN   
  85. X               KLCH=KLCH+1  
  86. X               STEMP=STRING(KLCH+1:KLCH+1)  
  87. X            ENDIF   
  88. X            IF(STEMP.EQ.'(') THEN   
  89. X*--- check for dimensioned variable, or function
  90. X               CALL SKIPLV(STRING,KLCH+2,KPOS, .FALSE.,KLCH,ILEV)   
  91. X               STEMP=STRING(KLCH+1:KLCH+1)  
  92. X               IF(STEMP.EQ.' ') THEN
  93. X                  KLCH=KLCH+1   
  94. X                  STEMP=STRING(KLCH+1:KLCH+1)   
  95. X               ENDIF
  96. X               BRNONE=.FALSE.   
  97. X            ELSE
  98. X               BRNONE=.TRUE.
  99. X            ENDIF   
  100. X            IF(KLCH+1.EQ.KPOS) THEN 
  101. X*--- simple argument
  102. X               SNAME=' '
  103. X               CALL GETNBL(STRING(KFCH:KNAM),SNAME, NN) 
  104. X               DO 20 IPOS=1,NSNAME  
  105. X                  IF(SNAME.EQ.SNAMES(ISNAME+IPOS)) GOTO 30  
  106. X   20          CONTINUE 
  107. X               GOTO 60  
  108. X   30          CONTINUE 
  109. X               NT=NAMTYP(ISNAME+IPOS)   
  110. X               IF(BRNONE.AND. (CALLFL.AND.(ITBIT(NT,15).NE.0.OR.ITBIT   
  111. X     +         (NT,17).NE.0) .OR.(.NOT.CALLFL.AND.ITBIT(NT,12).NE.0)))  
  112. X     +         THEN 
  113. X*--- subroutine or function passed as argument  
  114. X                  ARG(N:N)='P'  
  115. X               ELSE 
  116. X                  DO 40 I=1,6   
  117. X                     K=NT/2 
  118. X                     IF(NT-2*K.GT.0) GOTO 50
  119. X                     NT=K   
  120. X   40             CONTINUE  
  121. X   50             CONTINUE  
  122. X                  ARG(N:N)=ATYP(I:I)
  123. X               ENDIF
  124. X            ELSE
  125. X               GOTO 60  
  126. X            ENDIF   
  127. X         ELSE   
  128. X            GOTO 60 
  129. X         ENDIF  
  130. X      ENDIF 
  131. X      GOTO 70   
  132. X   60 CONTINUE  
  133. X      ARG(N:N)=ATYP(7:7)
  134. X   70 CONTINUE  
  135. X      IF(KPOS.LT.I2) GOTO 10
  136. X  999 END   
  137. /
  138. echo 'x - CHKOBS.f'
  139. sed 's/^X//' > CHKOBS.f << '/'
  140. X      SUBROUTINE CHKOBS(CNAME,IWARN)
  141. XC   
  142. XC Check that input CNAME (subroutine or function name) is   
  143. XC not contained in list of obsolete CERN program library
  144. XC routines. If it is, set IWARN > 0, otherwise = 0. 
  145. XC   
  146. XC JJB march 86  
  147. XC   
  148. X      PARAMETER (LOBSO=176,LOBS1=90)
  149. X      CHARACTER*6   COBSOL(LOBSO)   
  150. X      CHARACTER*(*) CNAME   
  151. XC   
  152. XC 'LOBSO' OBSOLETE PROGRAM LIBRARY ROUTINES FOR FLOPPY CHECKS.  
  153. XC FROM CNL-180 AND LIST (B101,D114,F106,G112,G903,Z035,Z041,Z203,   
  154. XC                        C327/330,E402/405) 
  155. XC   
  156. X      DATA (COBSOL(I),I=1,LOBS1) / 'ABEND ','AFROMI','ATG   ','BESIN ', 
  157. X     +'BESJN ', 'BITBYT','CBYT  ','CCMAD ','CCMAD1','CCMAD2', 'CCMAD3', 
  158. X     +'CCMPY ','CCMPY1','CCMPY2','CCMPY3', 'CCMUB ','CCMUB1','CCMUB2',  
  159. X     +'CCMUB3','CHCOF1', 'CHECOF','CHMOVE','CHSUM1','CHSUM2','CMXPAK',  
  160. X     +'CRMAD ','CRMAD1','CRMAD2','CRMAD3','CRMPY ', 'CRMPY1','CRMPY2',  
  161. X     +'CRMPY3','CRMUB ','CRMUB1', 'CRMUB2','CRMUB3','DBESIN','DBESJN',  
  162. X     +'DIGITN', 'DOTI  ','FLOARG','FUNLAN','GENLAN','GETSST', 'HIST  ', 
  163. X     +'IDENZB','IDIGIT','IFROMA','INTARG', 'IOFMAS','IUBACK','IUEND ',  
  164. X     +'IUFORW','IULOOK', 'IUMODE','IUNEXT','JBIT  ','JBYT  ','JBYTET',  
  165. X     +'JRSBYT','LINEQ1','LINEQ2','LOCF  ','LOCHAR', 'MATIN1','MATIN2',  
  166. X     +'MXEQU ','MXEQU1','MXMAD ', 'MXMAD1','MXMAD2','MXMAD3','MXMLRT',  
  167. X     +'MXMLTR', 'MXMPY ','MXMPY1','MXMPY2','MXMPY3','MXMUB ', 'MXMUB1', 
  168. X     +'MXMUB2','MXMUB3','MXTRP ','MXUTY ', 'NOARG ','PKCHAR','QNEXTE',  
  169. X     +'RANNOR','RCMAD '/
  170. X      DATA (COBSOL(I),I=LOBS1+1,LOBSO) / 'RCMAD1','RCMAD2','RCMAD3',
  171. X     +'RCMPY ','RCMPY1', 'RCMPY2','RCMPY3','RCMUB ','RCMUB1','RCMUB2',  
  172. X     +'RCMUB3','RIWIAD','RRMAD ','RRMAD1','RRMAD2', 'RRMAD3','RRMPY ',  
  173. X     +'RRMPY1','RRMPY2','RRMPY2', 'RRMPY3','RRMUB ','RRMUB1','RRMUB2',  
  174. X     +'RRMUB3', 'SBIT  ','SBIT0 ','SBIT1 ','SBYT  ','SBYTOR', 'SETFMT', 
  175. X     +'SMXINV','SORTX ','STAP  ','SYMINV', 'TLERR ','TLRES ','TLS   ',  
  176. X     +'TLSC  ','TRAAT ', 'TRAL  ','TRALT ','TRAS  ','TRASAT','TRATA ',  
  177. X     +'TRATS ','TRATSA','TRCHLU','TRCHUL','TRINV ', 'TRLA  ','TRLTA ',  
  178. X     +'TRPCK ','TRQSQ ','TRSA  ', 'TRSAT ','TRSINV','TRSMLU','TRSMUL',  
  179. X     +'TRUPCK', 'UBITS ','UBLANK','UBLOW ','UBLOW1','UBNCH1', 'UBUNCH', 
  180. X     +'UCOPIV','UCOPY2','UCTOH ','UCTOH1', 'UFILL ','UFLINT','UHOLLR',  
  181. X     +'UHTOC ','UHTOC1', 'ULEFT ','UOPT  ','UPKCH ','URIGHT','USET  ',  
  182. X     +'USWOP ','UTRANS','UZERO ','VBLANK','VOMAS ', 'XINOUT'/   
  183. X      IWARN = 0 
  184. XC-----------------------------------------------------------------------
  185. XC AFTER M.METCALF                                                       NAMSCH16
  186. XC-----------------------------------------------------------------------NAMSCH17
  187. X      IPOS=0                                                            NAMSCH19
  188. X      LAST=0                                                            NAMSCH20
  189. X      N=LOBSO                                                           NAMSCH21
  190. X      IF(N.GT.0)  THEN                                                  NAMSCH22
  191. X        KPOS=0  
  192. X    5   M=(N+1)/2   
  193. X        LAST=KPOS+M 
  194. X        IF (CNAME.LT.COBSOL(LAST)) THEN 
  195. X          N=M   
  196. X          LAST=LAST-1   
  197. X          IF (N.GT.1) GOTO 5
  198. X        ELSEIF (CNAME.GT.COBSOL(LAST)) THEN 
  199. X          KPOS=LAST 
  200. X          N=N-M 
  201. X          IF (N.GT.0) GOTO 5
  202. X        ELSE
  203. X          IWARN=LAST
  204. X        ENDIF   
  205. X      ENDIF                                                             NAMSCH37
  206. X      RETURN
  207. X      END   
  208. /
  209. echo 'x - CLASS.h'
  210. sed 's/^X//' > CLASS.h << '/'
  211. X      COMMON /CLASS/NCLASS,NPRIOR,NHEADR,IIF,IEND,IFORMT,IRETUR,ILL,
  212. X     + ISTMDS(MCLASS,MXSTAT),IALPHA(2,27),IPRIOR(MXSTAT),IHEADR(MXSTAT) 
  213. X*IF DEF,NEVER   
  214. X*-----------------------------------------------------------------------
  215. X*--- contains statement classification information  
  216. X*       NCLASS      no. of (internal) classes   
  217. X*       NPRIOR      no. of priority statements  
  218. X*       NHEADR      no. of header statements
  219. X*       IIF         internal number of the logical IF   
  220. X*       IEND        internal number of END statement
  221. X*       IFORMT      internal number of the FORMAT statement 
  222. X*       ILL            -       -      -     illegal     -   
  223. X*      ISTMDS(MCLASS,MXSTAT)  control words being   
  224. X*                    1 = first ch. in SNAM  
  225. X*                    2 = last  ch. in SNAM  
  226. X*                    3 = first ch. in SSTM  
  227. X*                    4 = last ch. in SSTM   
  228. X*                    5 = last significant ch. in SSTM   
  229. X*                    6 = external reference number ( class )
  230. X*                    7 = priority ( if 0, any order)
  231. X*                    8 = char. in descr. after which to start name  
  232. X*                        scan.  if 99, start after match string.
  233. X*                    9 = stop name scan at stmt. end
  234. X*                   10 = statement number classifier, being 
  235. X*                        0 if statement cannot contain stmt. numbers
  236. X*                        1 if (one) stmt. number must follow key immed. 
  237. X*                        2 if all stmt. no.s are inside first bracket   
  238. X*                        3 if all stmt. no.s follow immed. first bracket
  239. X*                        4 if (one) after FMT=, or second in first br.  
  240. X*                   11 = exec flag ( 0 = non-executable)
  241. X*                   12 = names flag ( 0 = no names, 1 = one, 2 = any)   
  242. X*                   13 = special treatement flag ( if 1) +2 * smflag
  243. X*                       where smflag = 1 allows for simple keyword match
  244. X*                   14 = routine header flag (0 no, 1 yes)  
  245. X*                   15 = type flag: 
  246. X*                        0 if types valid for all names 
  247. X*                        1 if separate types for first name + rest  
  248. X*                        2 if special treatment (IMPLICIT)  
  249. X*                        to this, 10 is added if only names outside 
  250. X*                        brackets to be taken, +10 for COMMON   
  251. X*                   16 = n1 = no. of types for first or all 
  252. X*                   17 to 16 + n1 = types   
  253. X*                   17 + n1  = n2   
  254. X*                   18 + n1 to 21 = types for rest (0 filled)   
  255. X*       IALPHA(2,27)   for letters 1 to 26 (A to Z),
  256. X*                   first and last class under that letter. 
  257. X*                   ( keys are in alphabetic order) 
  258. X*                   27 for those not starting with any key. 
  259. X*                   if not specified otherwise, those will be   
  260. X*                   processed last  
  261. X*       IPRIOR(MXSTAT)       refs of priority statements
  262. X*       IHEADR(MXSTAT)       refs of header statements  
  263. X*-----------------------------------------------------------------------
  264. X*EI 
  265. /
  266. echo 'x - CLASSF.f'
  267. sed 's/^X//' > CLASSF.f << '/'
  268. X      SUBROUTINE CLASSF 
  269. X*-----------------------------------------------------------------------
  270. X*   
  271. X*--- classifies a FORTRAN statement.
  272. X*   
  273. X*--- input  
  274. X*    SSTA       string containing the statement 
  275. X*    NCHST      last ch. of statement in SSTA   
  276. X*    SSTM (,ISTMDS,IALPHA,IPRIOR,IHEADR) statement descriptors  
  277. X*--- output 
  278. X*    ICURCL = statement numbers of first part and second part   
  279. X*          ( ICURCL(2) set for ICURCL(1) = IIF = logical IF, else = ILL)
  280. X*                 ICURCL(1) = ILL for illegal statements
  281. X*   
  282. X*-----------------------------------------------------------------------
  283. X      include 'PARAM.h' 
  284. X      include 'ALCAZA.h' 
  285. X      include 'CLASS.h' 
  286. X      include 'FLAGS.h' 
  287. X      include 'FLWORK.h' 
  288. X      include 'CURSTA.h' 
  289. X      CHARACTER STEMP*1,STRING*25   
  290. X      include 'CONVEX.h' 
  291. X      ICURCL(1)=ILL 
  292. X      ICURCL(2)=ILL 
  293. X*--- if illegal during extraction (EXTRAC), return  
  294. X      IF (STATUS(3)) GOTO 999   
  295. X      KSTART=1  
  296. X*--- loop over (possibly) two parts of statement
  297. X      DO 50 IPRTS=1,2   
  298. X         KPOS=0 
  299. X   10    STEMP=SSTA(KSTART:)
  300. X         IF (STEMP.EQ.' ')  THEN
  301. X*--- skip blanks
  302. X            KSTART=KSTART+1 
  303. X            GOTO 10 
  304. X         ENDIF  
  305. X*--- check priority statements first if '=' present 
  306. X         IF(INDEX(SSTA(KSTART:NCHST),'=').NE.0) THEN
  307. X            DO 20 JS=1,NPRIOR   
  308. X               JSS=IPRIOR(JS)   
  309. X               CALL MATCH(SSTM,ISTMDS(3,JSS),ISTMDS(4,JSS),SSTA,KSTART, 
  310. X     +         NCHST,.FALSE.,KPOS,ILEV,NDUMMY,IWS,IWS)  
  311. X               IF (KPOS.NE.0) GOTO 40   
  312. X   20       CONTINUE
  313. X         ENDIF  
  314. X*--- no match yet - get alphabetic group and compare
  315. X         IF (ALPHCH(STEMP))  THEN   
  316. X            K=ICVAL(STEMP)  
  317. X         ELSE   
  318. X            K=27
  319. X         ENDIF  
  320. X         IF(K.LE.0.OR.K.GT.27) GOTO 999 
  321. X*--- KBLP = pos. of first blank after start of keyword, 
  322. X         KBLP=INDEX(SSTA(KSTART:NCHST),' ') 
  323. X         DO 30 JSS=IALPHA(1,K),IALPHA(2,K)  
  324. X            IF (ISTMDS(7,JSS).EQ.0.AND.ISTMDS(3,JSS).NE.0)  THEN
  325. X               IF(ISTMDS(13,JSS).GE.2) THEN 
  326. X*--- simple match is sufficient 
  327. X                  I1=ISTMDS(3,JSS)  
  328. X                  I2=ISTMDS(4,JSS)  
  329. X                  N1=I2-I1  
  330. X                  N2=N1+1   
  331. X                  IF(KBLP.EQ.0.OR.KBLP.GT.N2) THEN  
  332. X                     IF(SSTA(KSTART:KSTART+N1).EQ.SSTM(I1:I2)) KPOS=1   
  333. X                  ELSE  
  334. X                     CALL GETNBL(SSTA(KSTART:NCHST),STRING(1:N2),KEXT)  
  335. X                     IF(KEXT.GE.N2) THEN
  336. X                        IF(STRING(:N2).EQ.SSTM(I1:I2)) KPOS=1   
  337. X                     ENDIF  
  338. X                  ENDIF 
  339. X               ELSE 
  340. X                  CALL MATCH(SSTM,ISTMDS(3,JSS),ISTMDS(4,JSS),SSTA, 
  341. X     +            KSTART, NCHST,.FALSE.,KPOS,ILEV,NDUMMY,IWS,IWS)   
  342. X               ENDIF
  343. X               IF (KPOS.NE.0) GOTO 40   
  344. X            ENDIF   
  345. X   30    CONTINUE   
  346. X*--- exit if no match at all
  347. X         GOTO 999   
  348. X   40    CONTINUE   
  349. X*--- matched
  350. X         IF (IPRTS.EQ.1)  THEN  
  351. X            ICURCL(1)=JSS   
  352. X            IF (ICURCL(1).NE.IIF) GOTO 999  
  353. X*--- skip to end of if(...) 
  354. X            KMT=INDEX(SSTA(1:NCHST),'(')
  355. X            CALL SKIPLV(SSTA,KMT+1,NCHST,.FALSE.,KPOS,ILEV) 
  356. X            KSTART=KPOS+1   
  357. X         ELSE   
  358. X*--- second part matched
  359. X            ICURCL(2)=JSS   
  360. X         ENDIF  
  361. X   50 CONTINUE  
  362. X  999 END   
  363. /
  364. echo 'x - FILTER.f'
  365. sed 's/^X//' > FILTER.f << '/'
  366. X      SUBROUTINE FILTER(KEY,NFLAG)  
  367. X*-----------------------------------------------------------------------
  368. X*   
  369. X*   Filters a statement according to user specifications.   
  370. X*   Input:  
  371. X*   KEY             = 10 : filter for routines  
  372. X*                   = 11 : filter for names 
  373. X*                   = 12 : filter for strings   
  374. X*                   = 13 : filter for classes   
  375. X*                   (see INDECO for input)  
  376. X*   NFLAG           STATUS(NFLAG) will be true if accepted, false if not
  377. X*                   at return from FILTER   
  378. X*   Output  
  379. X*   STATUS(NFLAG)   
  380. X*   
  381. X*-----------------------------------------------------------------------
  382. X      include 'PARAM.h' 
  383. X      include 'ALCAZA.h' 
  384. X      include 'CLASS.h' 
  385. X      include 'FLAGS.h' 
  386. X      include 'CURSTA.h' 
  387. X      include 'STATE.h' 
  388. X      include 'KEYCOM.h' 
  389. X      LOGICAL HASHFL
  390. X      DIMENSION LRL(MXORST) 
  391. X      CHARACTER*1 STEMP 
  392. X      SAVE NRL,LRL  
  393. X      IF (IFILTR.LT.0)  THEN
  394. X*--- start of routine: reset to overall OR-sets 
  395. X         NRL=NORSET 
  396. X         NRORST=NORSET  
  397. X         DO 10 I=1,NRL  
  398. X            LRL(I)=I
  399. X            LRORST(I)=I 
  400. X   10    CONTINUE   
  401. X      ELSEIF (IFILTR.EQ.0)  THEN
  402. X*--- FILTER called first time for statement: reset to routine OR-set
  403. X         NRL=NRORST 
  404. X         DO 20 I=1,NRL  
  405. X            LRL(I)=LRORST(I)
  406. X   20    CONTINUE   
  407. X      ENDIF 
  408. X      IFILTR=1  
  409. X*--- reset counter for new valid OR-sets
  410. X      NEW=0 
  411. X*--- loop over currently valid OR-sets  
  412. X      DO 90 I=1,NRL 
  413. X         IOR=LRL(I) 
  414. X         DO 30 JK=KORCOM(IOR)+1,KORCOM(IOR)+NORCOM(IOR) 
  415. X*--- check whether key in this OR-set   
  416. X            IF (KEYREF(JK,1).EQ.KEY) GOTO 40
  417. X   30    CONTINUE   
  418. X*--- key not present - accept OR-set
  419. X         NEW=NEW+1  
  420. X         LRL(NEW)=IOR   
  421. X         GOTO 90
  422. X   40    CONTINUE   
  423. X*--- KEY is present 
  424. X         IF (KEY.EQ.10)  THEN   
  425. X*--- routine name filter
  426. X            CALL NAMSRC(SCROUT,SKEYLS(KEYREF(JK,5)+1),KEYREF(JK,4),IPOS,
  427. X     +      LAST)   
  428. X            IF (IPOS.GT.0)  THEN
  429. X*-- name found  
  430. X               NEW=NEW+1
  431. X               LRL(NEW)=IOR 
  432. X            ENDIF   
  433. X         ELSEIF (KEY.EQ.11)  THEN   
  434. X*--- names in statement 
  435. X            DO 50 J=1,NSNAME
  436. X               CALL NAMSRC(SNAMES(ISNAME+J),SKEYLS(KEYREF(JK,5)+1), 
  437. X     +         KEYREF(JK,4),IPOS,LAST)  
  438. X               IF (IPOS.GT.0)  THEN 
  439. X                  NEW=NEW+1 
  440. X                  LRL(NEW)=IOR  
  441. X                  GOTO 90   
  442. X               ENDIF
  443. X   50       CONTINUE
  444. X         ELSEIF (KEY.EQ.12)  THEN   
  445. X*--- string filter  
  446. X            DO 60 J=KEYREF(JK,7)+1,KEYREF(JK,7)+KEYREF(JK,6)
  447. X               KREF=KSTREF(J,1) 
  448. X*--- set '#' in front if not there  
  449. X               K1=KKYSTA(KREF)  
  450. X               K2=KKYEND(KREF)  
  451. X               HASHFL=SKYSTR(K1:K1).NE.'#'  
  452. X               IF (HASHFL)  THEN
  453. X                  K1=K1-1   
  454. X                  STEMP=SKYSTR(K1:K1)   
  455. X                  SKYSTR(K1:K1)='#' 
  456. X               ENDIF
  457. X               CALL MATCH(SKYSTR,K1,K2,SSTA,1,NCHST,.TRUE.,KPOS,ILEV,N, 
  458. X     +         IWS,IWS) 
  459. X               IF (HASHFL) SKYSTR(K1:K1)=STEMP  
  460. X               IF (KPOS.GT.0)  THEN 
  461. X                  NEW=NEW+1 
  462. X                  LRL(NEW)=IOR  
  463. X                  GOTO 90   
  464. X               ENDIF
  465. X   60       CONTINUE
  466. X         ELSEIF (KEY.EQ.13)  THEN   
  467. X*---  classes   
  468. X            K1=KEYREF(JK,3)+1   
  469. X            N1=KEYINT(K1)   
  470. X            N2=KEYINT(K1+N1+1)  
  471. X*--- N1 counts simple classes, N2 those behind logical IF   
  472. X            IF(ICURCL(1).NE.IIF.OR.N2.EQ.0)  THEN   
  473. X               DO 70 J=K1+1,K1+N1   
  474. X                  JC=KEYINT(J)  
  475. X                  IF (JC.EQ.ISTMDS(6,ICURCL(1)).OR.(ICURCL(1).EQ.IIF.AND
  476. X     +            .JC.EQ.ISTMDS(6,ICURCL(2))))  THEN
  477. X                     NEW=NEW+1  
  478. X                     LRL(NEW)=IOR   
  479. X                     GOTO 90
  480. X                  ENDIF 
  481. X   70          CONTINUE 
  482. X            ELSE
  483. X               K1=K1+N1+1   
  484. X               DO 80 J=K1+1,K1+N2   
  485. X                  IF (KEYINT(J).EQ.ISTMDS(6,ICURCL(2)))  THEN   
  486. X                     NEW=NEW+1  
  487. X                     LRL(NEW)=IOR   
  488. X                     GOTO 90
  489. X                  ENDIF 
  490. X   80          CONTINUE 
  491. X            ENDIF   
  492. X         ENDIF  
  493. X   90 CONTINUE  
  494. X      NRL=NEW   
  495. X      IF(KEY.EQ.10)  THEN   
  496. X*--- set OR-set for routine 
  497. X         NRORST=NRL 
  498. X         DO 100 I=1,NRL 
  499. X            LRORST(I)=LRL(I)
  500. X  100    CONTINUE   
  501. X      ENDIF 
  502. X      STATUS(NFLAG)=NRL.GT.0
  503. X      END   
  504. /
  505. echo 'x - GETALL.f'
  506. sed 's/^X//' > GETALL.f << '/'
  507. X      SUBROUTINE GETALL 
  508. X*-----------------------------------------------------------------------
  509. X*   
  510. X*--- gets all names in one statement
  511. X*   
  512. X*--- input  
  513. X*    SSTA      statement in /ALCAZA/
  514. X*    ICURCL etc. from /CURSTA/  
  515. X*--- output 
  516. X*    NSNAME    no. of names /STATE/ 
  517. X*    SNAMES(ISNAME+1)...SNAMES(ISNAME+NSNAME)  /ALCAZA/ = names 
  518. X*    NSSTRT, NSEND   /STATE/ = start and end of each name in SSTA   
  519. X*   
  520. X*-----------------------------------------------------------------------
  521. X      include 'PARAM.h' 
  522. X      include 'ALCAZA.h' 
  523. X      include 'CLASS.h' 
  524. X      include 'FLAGS.h' 
  525. X      include 'CURSTA.h' 
  526. X      include 'STATE.h' 
  527. X      include 'FLWORK.h' 
  528. X      CHARACTER STEMP*1 
  529. X      NSNAME=0  
  530. X      IF(ICURCL(1).EQ.ILL)  THEN
  531. X         IUP=0  
  532. X      ELSEIF(ICURCL(1).EQ.IIF)  THEN
  533. X         IUP=2  
  534. X*--- find end of IF(...)
  535. X         JPT=INDEX(SSTA(:NCHST),'(')
  536. X         CALL SKIPLV(SSTA,JPT+1,NCHST,.FALSE.,KND,ILEV) 
  537. X      ELSE  
  538. X         IUP=1  
  539. X         KND=NCHST  
  540. X      ENDIF 
  541. X      DO 30 IPART=1,IUP 
  542. X         IF (IPART.EQ.1)  THEN  
  543. X            ILOC=ICURCL(1)  
  544. X            KST=1   
  545. X         ELSE   
  546. X            ILOC=ICURCL(2)  
  547. X            KST=KND+1   
  548. X            KND=NCHST   
  549. X         ENDIF  
  550. X         IF (ISTMDS(12,ILOC).NE.0)  THEN
  551. X*--- this part of the statement may contain names   
  552. X*    prepare key match necessary for name scan  
  553. X            IK=ISTMDS(8,ILOC)   
  554. X            IF (IK.EQ.0)  THEN  
  555. X               KMT=KST-1
  556. X            ELSEIF (IK.EQ.99)  THEN 
  557. X               CALL MATCH(SSTM,ISTMDS(3,ILOC),ISTMDS(4,ILOC),SSTA,KST,  
  558. X     +         NCHST,.FALSE.,KMT,ILEV,NDUMMY,IWS,IWS)   
  559. X            ELSE
  560. X               CALL MATCH(SSTM,ISTMDS(3,ILOC),ISTMDS(3,ILOC)+IK-1,SSTA, 
  561. X     +         KST,NCHST,.FALSE.,KMT,ILEV,NDUMMY,IWS,IWS)   
  562. X            ENDIF   
  563. X            IF (MOD(ISTMDS(13,ILOC),2).NE.0)  THEN  
  564. X*--- there are special keys like in READ(UNIT=..,  ) etc.   
  565. X               I=INDEX(SSTA(KST:KND),'(')+KST   
  566. X               CALL SKIPLV(SSTA,I,KND,.FALSE.,JRBPOS,ILEV)  
  567. X            ELSE
  568. X               JRBPOS=0 
  569. X            ENDIF   
  570. X*--- set start and end of scan for names
  571. X            K1=KMT+1
  572. X*--- remove trailing key (THEN) 
  573. X            NTRAIL=0
  574. X            DO 10 K2=KND,KST,-1 
  575. X               IF(SSTA(K2:K2).NE.' ') THEN  
  576. X                  NTRAIL=NTRAIL+1   
  577. X                  IF(NTRAIL.GT.ISTMDS(9,ILOC)) GOTO 20  
  578. X               ENDIF
  579. X   10       CONTINUE
  580. X   20       CONTINUE
  581. X*--- start of name search loop  
  582. X            CALL GETNAM(SSTA,K1,K2,KFCH,KLCH)   
  583. X            IF (KFCH.EQ.0) GOTO 30  
  584. X            K1=KLCH+1   
  585. X            IF (K1.LE.K2.AND.KFCH.LE.JRBPOS)  THEN  
  586. X*--- exclude special keys like 'UNIT=' etc. 
  587. X               CALL GETNBL(SSTA(K1:),STEMP,NN)  
  588. X               IF (STEMP.EQ.'='.AND.NN.GT.0) GOTO 20
  589. X            ENDIF   
  590. X            IF (ISNAME+NSNAME.GE.MXNAME) CALL ERREX1
  591. X            NSNAME=NSNAME+1 
  592. X            NSSTRT(NSNAME)=KFCH 
  593. X            NSEND(NSNAME)=KLCH  
  594. X            SNAMES(ISNAME+NSNAME)=' '   
  595. X            CALL GETNBL(SSTA(KFCH:KLCH),SNAMES(ISNAME+NSNAME),NN)   
  596. X*--- continue if all names to be found  
  597. X            IF (.NOT.(ACTION(10).OR.ISTMDS(12,ILOC).EQ.1)) GOTO 20  
  598. X         ENDIF  
  599. X   30 CONTINUE  
  600. X      END   
  601. /
  602. echo 'x - NXITEM.f'
  603. sed 's/^X//' > NXITEM.f << '/'
  604. X      SUBROUTINE NXITEM(STRING,ICC1,ICC2,LAST)  
  605. X*-----------------------------------------------------------------------
  606. X*   
  607. X*   Cuts statement into pieces, one part at a time (called by REFORM)   
  608. X*   
  609. X*---Input   
  610. X*     STRING                string to be chopped
  611. X*     ICC1                  starting position for next piece
  612. X*     ICC2                  string size 
  613. X*     LAST                  last ch. position of piece  
  614. X*   
  615. X*-----------------------------------------------------------------------
  616. X      CHARACTER STRING*(*), STEMP*1 
  617. X      LOGICAL NUFL,DEFL 
  618. X      include 'CONVEX.h' 
  619. X*--- max. length for inclusive brackets 
  620. X      MAXL=12   
  621. X*--- skip leading blanks
  622. X      DO 10 IC1=ICC1,ICC2   
  623. X         IF (STRING(IC1:IC1).NE.' ') GOTO 20
  624. X   10 CONTINUE  
  625. X      LAST=ICC2 
  626. X      GOTO 999  
  627. X   20 CONTINUE  
  628. X      NSTST=INDEX(STRING(IC1:ICC2),'{')-1   
  629. X      IF(NSTST.GT.0)  THEN  
  630. X*--- always stop before start of next string
  631. X         IC2=IC1+NSTST-1
  632. X      ELSE  
  633. X         IC2=ICC2   
  634. X      ENDIF 
  635. X      IF(STRING(IC1:IC1).EQ.'{')  THEN  
  636. X*--- get string 
  637. X         IN=IC1+INDEX(STRING(IC1+1:IC2),'}')
  638. X         IF (IN.EQ.IC1.OR.IN.EQ.IC2)  THEN  
  639. X            LAST=IC2
  640. X         ELSE   
  641. X            LAST=IN 
  642. X         ENDIF  
  643. X         GOTO 999   
  644. X      ELSE  
  645. X*--- no string  
  646. X         DO 30 I=IC1,IC2
  647. X            STEMP=STRING(I:I)   
  648. X            IF (INDEX(':(=*/+-',STEMP).EQ.0)GOTO 40 
  649. X            LAST=I  
  650. X            IF (STEMP.EQ.'(') THEN  
  651. X               CALL SKIPLV(STRING,I+1,IC2,.FALSE.,KPOS,ILEV)
  652. X               IF (KPOS.GT.0.AND.KPOS-ICC1.LT.MAXL)  THEN   
  653. X                  LAST=KPOS 
  654. X                  GOTO 90   
  655. X               ENDIF
  656. X            ENDIF   
  657. X   30    CONTINUE   
  658. X         GOTO 999   
  659. X   40    CONTINUE   
  660. X         IF (I.EQ.IC1) LAST=I   
  661. X         IF (STEMP.EQ.'.')  THEN
  662. X*--- look for relational symbol 
  663. X            CALL POSCH('.',STRING,I+1,IC2,.FALSE.,9999,KPOS,ILEV)   
  664. X            IF (KPOS.EQ.0) GOTO 999 
  665. X            DO 50 J=I+1,KPOS-1  
  666. X               IF (.NOT.ALPHCH(STRING(J:J))) GOTO 999   
  667. X   50       CONTINUE
  668. X            LAST=KPOS   
  669. X         ELSEIF (ANUMCH(STEMP))  THEN   
  670. X            NUFL=NUMCH(STEMP)   
  671. X            DEFL=.FALSE.
  672. X            DO 70 J=I,IC2   
  673. X               STEMP=STRING(J:J)
  674. X               IF (STEMP.EQ.' '.OR.NUMCH(STEMP)) GOTO 60
  675. X               IF (.NOT.NUFL.AND.ALPHCH(STEMP)) GOTO 60 
  676. X               IF (NUFL.AND.STEMP.EQ.'.') GOTO 60   
  677. X               IF (DEFL.AND.(STEMP.EQ.'+'.OR.STEMP.EQ.'-')) GOTO 60 
  678. X               DEFL=STEMP.EQ.'D'.OR.STEMP.EQ.'E'
  679. X               NUFL=.FALSE. 
  680. X               IF (DEFL) GOTO 60
  681. X               GOTO 80  
  682. X   60          LAST=J   
  683. X   70       CONTINUE
  684. X            GOTO 999
  685. X   80       CONTINUE
  686. X            IF (STEMP.EQ.')') LAST=J
  687. X         ENDIF  
  688. X      ENDIF 
  689. X   90 CONTINUE  
  690. X      IF(LAST.LT.IC2.AND.STRING(LAST+1:LAST+1).EQ.',')  THEN
  691. X         LAST=LAST+1
  692. X      ELSEIF(LAST+1.LT.IC2.AND.STRING(LAST+1:LAST+1).EQ.' ' .AND.STRING 
  693. X     +(LAST+2:LAST+2).EQ.',') THEN  
  694. X         LAST=LAST+2
  695. X      ENDIF 
  696. X  999 END   
  697. /
  698. echo 'x - READEC.f'
  699. sed 's/^X//' > READEC.f << '/'
  700. X      SUBROUTINE READEC 
  701. X*-----------------------------------------------------------------------
  702. X*   
  703. X*--- extracts one complete routine from input file, buffers it. 
  704. X*    the routine must end with an 'END' statement, or EOF   
  705. X*   
  706. X*   Routines longer than MXSIMA lines are split.
  707. X*   
  708. X*   Blocks of comment lines in front of routines are treated as 
  709. X*   separate entities.  
  710. X*   
  711. X*   The statements are counted, start and end of each statement 
  712. X*   (including comments between cont. lines) kept. Blocks of
  713. X*   comment lines are treated like statements.  
  714. X*   
  715. X*--- output 
  716. X*    SIMA           COMMON/ALCAZA/ statement images 
  717. X*    NLINES,NSTAMM,NFSTAT,NKEEPL    ,/STATE/
  718. X*    NLTYPE(1..NLINES), NFLINE(1..NSTAMM), NLLINE(1..NSTAMM),   
  719. X*    ICLASS(1..NSTAMM)                         /STATE/  
  720. X*    NSTATC(..)  statistics 
  721. X*    STATUS(1), STATUS(2), STATUS(5), STATUS(6),   /FLAGS/  
  722. X*   
  723. X*-----------------------------------------------------------------------
  724. X      include 'PARAM.h' 
  725. X      include 'ALCAZA.h' 
  726. X      include 'FLAGS.h' 
  727. X      include 'STATE.h' 
  728. X      include 'CLASS.h' 
  729. X*   
  730. X      STATUS(6)=STATUS(5)   
  731. X      NCOMM=0   
  732. X      NFSTAT=0  
  733. X      NSTAMM=0  
  734. X      NPL=NLINES
  735. X      NLINES=0  
  736. X   10 CONTINUE  
  737. X*--- loop over input lines until E.O.F., or END, or 
  738. X*    start of a new routine, or routine too long which  
  739. X*    will then be split behind a convenient statement.  
  740. X      IF(NLINES.EQ.MXSIMA)  THEN
  741. X*--- buffer full
  742. X         STATUS(5)=.TRUE.   
  743. X         IF (.NOT.STATUS(6)) WRITE (MPUNIT,10000)MXSIMA,SIMA(1) 
  744. X         CALL READSB(NCOMM,NST,ICL) 
  745. X         IF (NST.GT.0)  THEN
  746. X*--- last FORTRAN statement could be incomplete - split before; 
  747. X*    check as well for routine header   
  748. X            IF (NST.EQ.NSTAMM.OR.(NFSTAT.GT.1.AND.ISTMDS(14,ICL).NE.0)) 
  749. X     +      THEN
  750. X               NSTAMM=NSTAMM-1  
  751. X               NFSTAT=NFSTAT-1  
  752. X               NKEEPL=NLINES-NLLINE(NSTAMM) 
  753. X            ENDIF   
  754. X         ENDIF  
  755. X         GOTO 999   
  756. X      ENDIF 
  757. X      IF(NKEEPL.EQ.0)  THEN 
  758. X         IF (.NOT.STATUS(1)) CALL INLINE(MIUNIT,SIMA(NLINES+1),STATUS(1)
  759. X     +   ,NLTYPE(NLINES+1)) 
  760. X         IF (STATUS(1))  THEN   
  761. X*--- EOF on input file  
  762. X            STATUS(2)=NLINES.EQ.0   
  763. X            IF (STATUS(2)) GOTO 999 
  764. X            STATUS(5)=.FALSE.   
  765. X            CALL READSB(NCOMM,NST,ICL)  
  766. X*--- last FORTRAN statement could be routine header 
  767. X            IF (NFSTAT.GT.1)  THEN  
  768. X               IF (ISTMDS(14,ICL).NE.0)  THEN   
  769. X*--- leave routine header for next time 
  770. X                  NSTAMM=NST-1  
  771. X                  NFSTAT=NFSTAT-1   
  772. X                  NKEEPL=NLINES-NLLINE(NSTAMM)  
  773. X               ENDIF
  774. X            ENDIF   
  775. X            GOTO 999
  776. X         ENDIF  
  777. X      ELSE  
  778. X*--- transfer buffered lines to start of buffer 
  779. X         NKEEPL=NKEEPL-1
  780. X         NLTYPE(NLINES+1)=NLTYPE(NPL-NKEEPL)
  781. X         SIMA(NLINES+1)=SIMA(NPL-NKEEPL)
  782. X      ENDIF 
  783. X*--- now a new line in SIMA(NLINES+1), with type NLTYPE(NLINES+1)   
  784. X      IF(NLTYPE(NLINES+1).EQ.0)  THEN   
  785. X*--- comment line   
  786. X         NCOMM=NCOMM+1  
  787. X         NLINES=NLINES+1
  788. X      ELSEIF (NLTYPE(NLINES+1).EQ.2)  THEN  
  789. X*--- this is a cont. line - accept comment lines in between 
  790. X         NCOMM=0
  791. X         NLINES=NLINES+1
  792. X      ELSE  
  793. X*--- start of FORTRAN statement 
  794. X         CALL READSB(NCOMM,NST,ICL) 
  795. X         NLINES=NLINES+1
  796. X         IF (NST.GT.0)  THEN
  797. X*--- previous statement could be END
  798. X            IF (ICL.EQ.IEND)  THEN  
  799. X               NKEEPL=1 
  800. X               STATUS(5)=.FALSE.
  801. X               GOTO 999 
  802. X*--- or routine header ?
  803. X            ELSEIF (ISTMDS(14,ICL).NE.0)  THEN  
  804. X               IF (NFSTAT.GT.1)  THEN   
  805. X                  NSTAMM=NST-1  
  806. X                  NFSTAT=NFSTAT-1   
  807. X                  NKEEPL=NLINES-NLLINE(NSTAMM)  
  808. X                  STATUS(5)=.FALSE. 
  809. X                  GOTO 999  
  810. X               ELSE 
  811. X                  STATUS(6)=.FALSE. 
  812. X               ENDIF
  813. X            ENDIF   
  814. X         ENDIF  
  815. X*--- accept the new line as start of a statement
  816. X         NSTAMM=NSTAMM+1
  817. X         NFLINE(NSTAMM)=NLINES  
  818. X      ENDIF 
  819. X      GOTO 10   
  820. X10000 FORMAT(/' +++++++++ WARNING - deck with more than ',I5,   
  821. X     +' lines encountered, deck split'/' first line =',A90) 
  822. X  999 END   
  823. /
  824. echo 'x - REPNAM.f'
  825. sed 's/^X//' > REPNAM.f << '/'
  826. X      SUBROUTINE REPNAM 
  827. X*-----------------------------------------------------------------------
  828. X*   
  829. X*   Performs replacements of names, or names+strings attached   
  830. X*   
  831. X*-----------------------------------------------------------------------
  832. X      include 'PARAM.h' 
  833. X      include 'ALCAZA.h' 
  834. X      include 'FLAGS.h' 
  835. X      include 'CURSTA.h' 
  836. X      include 'STATE.h' 
  837. X      include 'KEYCOM.h' 
  838. X      include 'JOBSUM.h' 
  839. X      DIMENSION KSP1(100),KSP2(100) 
  840. X      NCH=0 
  841. X      IPT=0 
  842. X      NMOD=IMODIF(NSTREF)   
  843. X*--- check for 'REP' key
  844. X      DO 10 IK=1,NGLSET 
  845. X         IF (KEYREF(IK,1).EQ.9) GOTO 20 
  846. X   10 CONTINUE  
  847. X      GOTO 999  
  848. X   20 CONTINUE  
  849. X*--- check for name replacement 
  850. X      IF (KEYREF(IK,4).EQ.0) GOTO 999   
  851. X      DO 30 I=1,NSNAME  
  852. X         CALL NAMSRC(SNAMES(ISNAME+I),SKEYLS(KEYREF(IK,5)+1),   
  853. X     +   KEYREF(IK,4),IPOS,LAST)
  854. X         IF (IPOS.EQ.0) GOTO 30 
  855. X         IPOS=IPOS+KEYREF(IK,5) 
  856. X         KREF1=KNAMRF(IPOS,1)   
  857. X*--- check illegal  
  858. X         IF (KREF1.LT.0) GOTO 30
  859. X*--- name must behind last replacement  
  860. X         IF (NSSTRT(I).GT.IPT)  THEN
  861. X*--- check for string following 
  862. X            KPOS=0  
  863. X            NSPEC=0 
  864. X            IF (KREF1.GT.0)  THEN   
  865. X               CALL MATCH(SKYSTR,KKYSTA(KREF1),KKYEND(KREF1),SSTA,NSEND(
  866. X     +         I)+1,NCHST,.TRUE.,KPOS,ILEV,NSPEC,KSP1,KSP2) 
  867. X               IF (KPOS.EQ.0) GOTO 30   
  868. X            ENDIF   
  869. X*--- name (+string) do match
  870. X*--- set modify flag
  871. X            IF (NMOD.LT.10)  NMOD=NMOD+10   
  872. X*--- copy from pointer up to name   
  873. X            L=NSSTRT(I)-IPT-1   
  874. X            IF (L.GT.0)  THEN   
  875. X               IF (NCH+L.GT.MXLENG) GOTO 40 
  876. X               SSTR(NCH+1:NCH+L)=SSTA(IPT+1:IPT+L)  
  877. X               NCH=NCH+L
  878. X            ENDIF   
  879. X            IPT=MAX(NSEND(I),KPOS)  
  880. X            KREF2=KNAMRF(IPOS,2)
  881. X            IF (KREF2.GT.0)  THEN   
  882. X*--- non-empty replacement string exists
  883. X               L=KKYEND(KREF2)-KKYSTA(KREF2)+1  
  884. X               IF (NSPEC.EQ.0)  THEN
  885. X                  IF (NCH+L.GT.MXLENG) GOTO 40  
  886. X*--- replace name by string 
  887. X                  SSTR(NCH+1:NCH+L)=SKYSTR(KKYSTA(KREF2):KKYEND(KREF2)) 
  888. X                  NCH=NCH+L 
  889. X               ELSE 
  890. X                  CALL REPSUB(KREF1,KREF2,NSPEC,KSP1,KSP2,NCH)  
  891. X                  IF (NCH.GT.MXLENG) GOTO 40
  892. X               ENDIF
  893. X            ENDIF   
  894. X         ENDIF  
  895. X   30 CONTINUE  
  896. X      IF(NMOD.GE.10)  THEN  
  897. X*--- copy SSTR to SSTA, NCH to NCHST
  898. X         L=NCHST-IPT
  899. X         IF (L.GT.0)  THEN  
  900. X            IF (NCH+L.GT.MXLENG) GOTO 40
  901. X            SSTR(NCH+1:NCH+L)=SSTA(IPT+1:NCHST) 
  902. X            NCH=NCH+L   
  903. X         ENDIF  
  904. X         IMODIF(NSTREF)=NMOD
  905. X         NCHST=NCH  
  906. X         SSTA(:NCH)=SSTR(:NCH)  
  907. X      ENDIF 
  908. X      GOTO 999  
  909. X   40 CONTINUE  
  910. X      WRITE (MPUNIT,10000)  
  911. X      CALL FLPRNT(1,'OVERFLOW',NLLINE(NSTREF)-NFLINE(NSTREF)+1, SIMA
  912. X     +(NFLINE(NSTREF)),NDUMMY)  
  913. X      NSTATC(6)=NSTATC(6)+1 
  914. X      STATUS(11)=.TRUE. 
  915. X10000 FORMAT(/' ++++++ Warning - replacements would lead to overflow',  
  916. X     +' in following statement, not done')  
  917. X  999 END   
  918. /
  919. echo 'x - RSTART.f'
  920. sed 's/^X//' > RSTART.f << '/'
  921. X      SUBROUTINE RSTART 
  922. X*-----------------------------------------------------------------------
  923. X*   
  924. X*   Processes the routine start 
  925. X*   
  926. X*-----------------------------------------------------------------------
  927. X      include 'PARAM.h' 
  928. X      include 'ALCAZA.h' 
  929. X      include 'CLASS.h' 
  930. X      include 'FLAGS.h' 
  931. X      include 'CURSTA.h' 
  932. X      include 'STATE.h' 
  933. X      include 'TREECOM.h' 
  934. X      LOGICAL FLOC  
  935. X*--- reset modify and filter flag   
  936. X      DO 10 I=1,NSTAMM  
  937. X         IMODIF(I)=0
  938. X   10 CONTINUE  
  939. X*--- only initialize for new routine if really true 
  940. X      IF(.NOT.STATUS(6))  THEN  
  941. X         IF(ACTION(24)) THEN
  942. X*--- reset counters and flags for c.b. names
  943. X            STATUS(12)=.FALSE.  
  944. X            STATUS(13)=.FALSE.  
  945. X            NCBNAM=0
  946. X            NEQNAM=0
  947. X            NCBVAR=0
  948. X            DO 20 I=1,MAXGRP
  949. X               LCBNAM(I)=0  
  950. X   20       CONTINUE
  951. X            DO 30 I=1,MXNAME
  952. X               LCBVAR(I)=0  
  953. X   30       CONTINUE
  954. X         ENDIF  
  955. X         IF(ACTION(29)) THEN
  956. X*--- reset counters for TREE
  957. X            NCALLR=0
  958. X            NCALLD=0
  959. X            NEXEL=0 
  960. X         ENDIF  
  961. X*--- set flag to re-initialize filters  
  962. X         IFILTR=-1  
  963. X*--- 'print routine header' flag
  964. X         STATUS(9)=.TRUE.   
  965. X*--- reset SUBROUTINE flag  
  966. X         STATUS(14)=.FALSE. 
  967. X*--- get routine name   
  968. X         DO 40 I=1,NSTAMM   
  969. X            IF (ICLASS(I,1).NE.0) GOTO 50   
  970. X   40    CONTINUE   
  971. X*--- only comments  
  972. X         SCROUT='COMMENTS'  
  973. X         GOTO 60
  974. X   50    CONTINUE   
  975. X         CALL EXTRAC(I,'PART')  
  976. X         CALL CLASSF
  977. X*--- find routine name  
  978. X         IF (ISTMDS(14,ICURCL(1)).NE.0)  THEN   
  979. X*--- proper routine header  
  980. X            STATUS(14)=ISTMDS(6,ICURCL(1)).EQ.66
  981. X            FLOC=ACTION(10) 
  982. X            ACTION(10)=.TRUE.   
  983. X            ISNAME=IRNAME+NRNAME
  984. X            CALL GETALL 
  985. X            ACTION(10)=FLOC 
  986. X            IF(NSNAME.GT.0)  THEN   
  987. X               SCROUT=SNAMES(ISNAME+1)  
  988. X            ELSEIF(ISTMDS(6,ICURCL(1)).EQ.4)  THEN  
  989. X               SCROUT='BLOCKDAT'
  990. X            ELSE
  991. X               SCROUT='NOHEADER'
  992. X            ENDIF   
  993. X         ELSE   
  994. X            SCROUT='NOHEADER'   
  995. X         ENDIF  
  996. X   60    CONTINUE   
  997. X*--- reset variable type routine
  998. X         IF (ACTION(20)) CALL SETTYP(0) 
  999. X*--- preset 'routine filtered' flag 
  1000. X         STATUS(7)=.TRUE.   
  1001. X*--- filter for routine names   
  1002. X         IF (ACTION(16)) CALL FILTER(10,7)  
  1003. X      ENDIF 
  1004. X*--- process only if routine selected   
  1005. X      IF (STATUS(7))  THEN  
  1006. X*--- classify all statements
  1007. X         DO 70 J=1,NSTAMM   
  1008. X            IF (ICLASS(J,1).NE.0)  THEN 
  1009. X               CALL EXTRAC(J,'FULL')
  1010. X               CALL CLASSF  
  1011. X               ICLASS(J,1)=ICURCL(1)
  1012. X               ICLASS(J,2)=ICURCL(2)
  1013. X            ENDIF   
  1014. X   70    CONTINUE   
  1015. X*--- prepare re-numbering if requested  
  1016. X         IF (ACTION(13)) CALL PRENUM
  1017. X      ENDIF 
  1018. X*--- reset variables
  1019. X      KNTDO=0   
  1020. X      KNTIF=0   
  1021. X      WRITE(MPUNIT,'(2A)') '  +++ start processing routine:  ',SCROUT   
  1022. X      END   
  1023. /
  1024. echo 'x - STATE.h'
  1025. sed 's/^X//' > STATE.h << '/'
  1026. X      COMMON/STATE/NLINES,NKEEPL,NSTAMM,NFSTAT,ISNAME,NSNAME,IRNAME,
  1027. X     1   NRNAME,IGNAME,NGNAME,INDCNT,INDFAC,KNTDO,KNTIF,IBLPAD,NRORST,  
  1028. X     2   NSTANU,ICBPRT,NCBNAM,NEQNAM,NCBVAR,
  1029. X     +   NCBGRP(MAXGRP),KCBGRP(MAXGRP),LCBNAM(MAXGRP),LCBVAR(MXNAME),   
  1030. X     +   NEQGRP(MAXGRP),KEQGRP(MAXGRP), 
  1031. X     +   LRORST(MXORST),NAMTYP(MXNAME),NSSTRT(700),NSEND(700),  
  1032. X     3   KSTANU(MAXNUM),KSTARE(MAXNUM),NLTYPE(MXSIMA),ICLASS(MXSIMA,2), 
  1033. X     4   IMODIF(MXSIMA),NFLINE(MXSIMA),NLLINE(MXSIMA)   
  1034. X*IF DEF,NEVER   
  1035. X*-----------------------------------------------------------------------
  1036. X*      /STATE/    contains the information concerning the actual
  1037. X*                 status of the program 
  1038. X*      NLINES     no. of lines in line image buffer SIMA
  1039. X*      NKEEPL     buffered line number in READEC, or 0  
  1040. X*      NSTAMM     total no. of statements in current routine
  1041. X*      NFSTAT     no. of FORTRAN statements in current routine  
  1042. X*      ISNAME     pointer to start-1 of stmt. names in SNAMES   
  1043. X*      NSNAME     no. of names found in statement   
  1044. X*      IRNAME     pointer to start-1 of names/routine in SNAMES 
  1045. X*      NRNAME     no. of names/routine  
  1046. X*      IGNAME     pointer to start-1 of global names in SNAMES  
  1047. X*      NGNAME     no. of global names   
  1048. X*      INDCNT     current indentation level (reset at routine start)
  1049. X*      INDFAC     no. of ch./level to indent
  1050. X*      KNTDO      current DO loop level (for indentation)   
  1051. X*      KNTIF      current IF...THEN level (for indentation) 
  1052. X*      IBLPAD     in QUOTES option, string blank-padded to multiples
  1053. X*                 of IBLPAD (default = 1)   
  1054. X*      NRORST     no. of currently selected OR-sets in LRORST   
  1055. X*      NSTANU     no. of statement numbers in KSTANU, KSTARE
  1056. X*      ICBPRT     no. of c.b. variables printed at ACTION(24)   
  1057. X*      NCBNAM     no. of c.b. names in NCBGRP, KCBGRP, SCBNAM   
  1058. X*      NEQNAM     no. of equiv. groups in NEQGRP, KEQGRP
  1059. X*      NCBVAR     no. of names in SEQNAM
  1060. X*      NCBGRP     no. of common block variables per c.b.
  1061. X*      KCBGRP     pos.-1 of start of c.b. name list in  SCBNAM  
  1062. X*      LCBNAM     # of c.b. variables used in current routine   
  1063. X*      LCBVAR     counts number of times a variable is referenced   
  1064. X*      NEQGRP     no. of names in equiv. group  
  1065. X*      KEQGRP     pos.-1 of start of equiv. group in SCBNAM 
  1066. X*      LRORST     list of OR-sets valid for current routine 
  1067. X*      NAMTYP     variable type, parallel to SNAMES 
  1068. X*      NSSTRT     start of name I in SSTA   
  1069. X*      NSEND      end of name I in SSTA 
  1070. X*      KSTANU     statement numbers in routine (sorted) 
  1071. X*      KSTARE     new statement numbers, corresponding to KSTANU
  1072. X*      NLTYPE     type of line I (0 comment, 1 start, 2 cont. of stmt. )
  1073. X*      ICLASS(I,1)  type of statement I 
  1074. X*                   0 = comment 
  1075. X*                   999 = no comment, not classified
  1076. X*                   class = ICURCL(1), common /CURSTA/  
  1077. X*      ICLASS(I,2)  type of second part of statement I if logical IF
  1078. X*      IMODIF     10*n2 + n1
  1079. X*                 n1 = 1 : statement has been filtered  
  1080. X*                 n2 = 1 : statement has been modified  
  1081. X*      NFLINE     start of statement I in SIMA  
  1082. X*      NLLINE     end of statement I in SIMA
  1083. X*-----------------------------------------------------------------------
  1084. X*EI 
  1085. /
  1086. echo 'x - TREESU.f'
  1087. sed 's/^X//' > TREESU.f << '/'
  1088. X      SUBROUTINE TREESU 
  1089. X*-----------------------------------------------------------------------
  1090. X*   
  1091. X*--- Writes TREE output for each routine
  1092. X*   
  1093. X*-----------------------------------------------------------------------
  1094. X      include 'PARAM.h' 
  1095. X      include 'ALCAZA.h' 
  1096. X      include 'TREECOM.h' 
  1097. X      include 'STATE.h' 
  1098. X      include 'FLAGS.h' 
  1099. X      include 'CLASS.h' 
  1100. X      include 'CURSTA.h' 
  1101. X      include 'USUNIT.h' 
  1102. X      include 'USARGS.h' 
  1103. X      CHARACTER SNAME*(MXNMCH),STEMP*1,ATYP*7,UNUCOM(MAXGRP)*1  
  1104. X      SAVE IFIRST   
  1105. X      DATA ATYP/'IRLKDC$'/  
  1106. X      DATA IFIRST/0/
  1107. X*--- find types of callers, and argument list   
  1108. X      DO 30 I=1,NCALLR  
  1109. X         NUMBER=ICALLR(I)   
  1110. X         CERARG(I)=' '  
  1111. X         KODE(I)=' '
  1112. X         IF(NUMBER.EQ.0) THEN   
  1113. X*--- routine without header - treat as program  
  1114. X            CERARG(I)(:4)='MAIN'
  1115. X         ELSE   
  1116. X            CALL EXTRAC(NUMBER,'FULL')  
  1117. X            ICURCL(1)=ICLASS(NUMBER,1)  
  1118. X            ICURCL(2)=ICLASS(NUMBER,2)  
  1119. X*--- external class 
  1120. X            ICLE=ISTMDS(6,ICURCL(1))
  1121. X            IF(ICLE.EQ.55) THEN 
  1122. X*--- PROGRAM
  1123. X               CERARG(I)(:4)='MAIN' 
  1124. X            ELSEIF(ICLE.EQ.4)  THEN 
  1125. X*--- block data 
  1126. X               KODE(I)='B'  
  1127. X            ELSE
  1128. X               CALL GETALL  
  1129. X               CALL SETTYP(1)   
  1130. X               NT=NAMTYP(ISNAME+1)  
  1131. X               DO 10 J=1,6  
  1132. X                  IF(ITBIT(NT,J).NE.0) THEN 
  1133. X                     KODE(I)=ATYP(J:J)  
  1134. X                                                                 GOTO 20
  1135. X                  ENDIF 
  1136. X   10          CONTINUE 
  1137. X   20          CONTINUE 
  1138. X               JLBPOS=INDEX(SSTA(1:NCHST),'(')  
  1139. X               IF(JLBPOS.NE.0) THEN 
  1140. X                  CALL ARGTYP(SSTA,.TRUE.,JLBPOS,NCHST,CERARG(I))   
  1141. X               ENDIF
  1142. X            ENDIF   
  1143. X         ENDIF  
  1144. X   30 CONTINUE  
  1145. X      IF(IFIRST.EQ.0)  THEN 
  1146. X*--- neg. version number for format check   
  1147. X         IVERS=-100.*(VERSIO+.001)  
  1148. XC        WRITE(MTUNIT)  IVERS   
  1149. X         IFIRST=1   
  1150. X      ENDIF 
  1151. X*--- common block names are added plus a flag UNUCOM:   
  1152. X*    ' ' if c.b. used in routine, otherwise '!' 
  1153. X      DO 40 I=1,NCBNAM  
  1154. X         IF(LCBNAM(I).EQ.0)  THEN   
  1155. X            UNUCOM(I)='!'   
  1156. X         ELSE   
  1157. X            UNUCOM(I)=' '   
  1158. X         ENDIF  
  1159. X   40 CONTINUE  
  1160. XC     WRITE(MTUNIT)  NCALLR,(CALLER(I),I=1,NCALLR), 
  1161. XC    +(CERARG(I),I=1,NCALLR),(KODE(I),I=1,NCALLR),  
  1162. XC    +NCALLD,(CALLED(I),I=1,NCALLD),(CEDARG(I),I=1,NCALLD), 
  1163. XC    +NCBNAM,(SCBNAM(I),I=1,NCBNAM),(UNUCOM(I),I=1,NCBNAM),0,0,0,0,0
  1164. X      WRITE(MJUNIT)  NCALLR,(CALLER(I),I=1,NCALLR), 
  1165. X     +(CERARG(I),I=1,NCALLR),(KODE(I),I=1,NCALLR),  
  1166. X     +NCALLD,(CALLED(I),I=1,NCALLD),(CEDARG(I),I=1,NCALLD), 
  1167. X     +NCBNAM,(SCBNAM(I),I=1,NCBNAM),(UNUCOM(I),I=1,NCBNAM), 
  1168. X     +CMMNT,NARGS,(CARGNM(I),I=1,NARGS),(CARGTY(I),I=1,NARGS),  
  1169. X     +(NARGDI(I),I=1,NARGS),
  1170. X     +(((CARGDI(III,II,I),II=1,2),III=1,NARGDI(I)),I=1,NARGS),  
  1171. X     +NKALL,(CKALLN(I),I=1,NKALL),(KALLIF(I),I=1,NKALL),
  1172. X     +(KALLDO(I),I=1,NKALL),
  1173. X     +0,0,0,0,0 
  1174. X      END   
  1175. /
  1176. echo 'x - UTTERM.f'
  1177. sed 's/^X//' > UTTERM.f << '/'
  1178. X      SUBROUTINE UTTERM 
  1179. X*-----------------------------------------------------------------------
  1180. X*   
  1181. X*--- user total termination 
  1182. X*   
  1183. X*-----------------------------------------------------------------------
  1184. X      include 'PARAM.h' 
  1185. X      include 'ALCAZA.h' 
  1186. X      include 'CLASS.h' 
  1187. X      include 'CURSTA.h' 
  1188. X      include 'FLWORK.h' 
  1189. X      include 'KEYCOM.h' 
  1190. X      include 'TYPDEF.h' 
  1191. X      include 'JOBSUM.h' 
  1192. X      include 'STATE.h' 
  1193. X      include 'FLAGS.h' 
  1194. X      include 'USIGNO.h' 
  1195. X      include 'USINFN.h' 
  1196. X      include 'CHECKS.h' 
  1197. X      LOGICAL BTEST 
  1198. X      CHARACTER*(MXNMCH) CNAM   
  1199. X      IF(UNFLP) RETURN  
  1200. X      WRITE(MPUNIT,500) 
  1201. X      DO 70 I=1,NGNAME  
  1202. X         NTYP = NAMTYP(IGNAME+I)
  1203. X         CNAM = SNAMES(IGNAME+I)
  1204. X         DO 10 IGN=1,NIGNOR 
  1205. X            IF(LIGNOR(IGN).NE.INDEX(CNAM,' ')-1)                 GOTO 10
  1206. X            IF(CIGNOR(IGN)(:LIGNOR(IGN)).EQ.CNAM(:LIGNOR(IGN)))  GOTO 70
  1207. X   10    CONTINUE   
  1208. XC check for use of obsolete CERN library routines   
  1209. X         IF(LCHECK(33).AND.(BTEST(NTYP,16).OR.BTEST(NTYP,14))) THEN 
  1210. X            CALL CHKOBS(CNAM,IWARN) 
  1211. X            IF(IWARN.NE.0) THEN 
  1212. X               WRITE(MPUNIT,560) CNAM   
  1213. X            ENDIF   
  1214. X         ENDIF  
  1215. X         IF(LCHECK(32).AND.BTEST(NTYP,7)) THEN  
  1216. XC sort common block names.  
  1217. X            DO 20 II=0,19   
  1218. X               IF(II.EQ.7)                                       GOTO 20
  1219. X               IF(BTEST(NTYP,II)) THEN  
  1220. X                  WRITE(MPUNIT,510) CNAM
  1221. X               ENDIF
  1222. X   20       CONTINUE
  1223. X         ENDIF  
  1224. X         IF(BTEST(NTYP,16)) THEN
  1225. XC FUNCTION  
  1226. X            ILEN = INDEX(CNAM,' ')-1
  1227. X               DO 30 INF=1,LIF  
  1228. X                  IF(INDEX(CINFUN(INF),' ')-1.EQ.ILEN) THEN 
  1229. X                     IF(CINFUN(INF).EQ.CNAM) THEN   
  1230. X                        IF(LCHECK(34).AND.BTEST(NTYP,11))   
  1231. X     &          WRITE(MPUNIT,520) CNAM  
  1232. X                                                                 GOTO 40
  1233. X                     ENDIF  
  1234. X                  ENDIF 
  1235. X   30          CONTINUE 
  1236. X            IF(LCHECK(35).AND..NOT.BTEST(NTYP,11)) WRITE(MPUNIT,530)
  1237. X     +      CNAM
  1238. X   40       CONTINUE
  1239. X         ENDIF  
  1240. XC Check for clashes between SUBROUTINE,BLOCKDATA,PROGRAM,ENTRY,FUNCTION 
  1241. X         IF(LCHECK(36)) THEN
  1242. X            DO 60 ITY=12,16 
  1243. X               IF(.NOT.BTEST(NTYP,ITY))                          GOTO 60
  1244. X               DO 50 ITY2=12,16 
  1245. X                  IF(ITY.EQ.ITY2)                                GOTO 50
  1246. X                  IF(.NOT.BTEST(NTYP,ITY2))                      GOTO 50
  1247. X                  WRITE(MPUNIT,540) CNAM
  1248. X                                                                 GOTO 70
  1249. X   50          CONTINUE 
  1250. X   60       CONTINUE
  1251. X         ENDIF  
  1252. X   70 CONTINUE  
  1253. X      WRITE(MPUNIT,550) 
  1254. X  500 FORMAT(/,1X,20('+'), ' BEGIN GLOBAL MODULE CHECKS   ',10('+'))
  1255. X  510 FORMAT(1X,'!!! WARNING ... VARIABLE ',A,  
  1256. X     +' IS NAME OF COMMON BLOCK AND OTHER') 
  1257. X  520 FORMAT(1X,'!!! WARNING ... FUNCTION ',A,  
  1258. X     +' IS EXTERNAL BUT CLASHES WITH INTRINSIC FUNCTION')   
  1259. X  530 FORMAT(1X,'!!! WARNING ... FUNCTION ',A,  
  1260. X     +' IS NOT INTRINSIC, AND IS NOT DECLARED "EXTERNAL"')  
  1261. X  540 FORMAT(1X,'!!! WARNING ... MODULE ',A,
  1262. X     +' HAS NAME CLASH WITH OTHER MODULE')  
  1263. X  550 FORMAT(1X,20('+'), ' END GLOBAL MODULE CHECKS     ',10('+'),//)   
  1264. X  560 FORMAT(1X,'!!! WARNING ... "',A,  
  1265. X     +'" IS OBSOLETE CERN LIBRARY ROUTINE') 
  1266. X      END   
  1267. /
  1268. echo 'x - floppy.panel'
  1269. sed 's/^X//' > floppy.panel << '/'
  1270. X;PANEL1
  1271. X.CYF HELP CMS QUIT
  1272. X==> FLOPPY VERSION 6.00 <=======> CODING CONVENTION CHECKER <==========>
  1273. X%&err
  1274. X                                          FN        FT      FM
  1275. X                 %Source %FORTRAN %==> ^8&fnin   ^8&ftin   ^2&fmin
  1276. X------------------------------------------------------------------------
  1277. Xa) Existing Floppy parameter file %==> ^8&fnold  ^8&ftold  ^2&fmold
  1278. Xb) Checks to be made          %==> ^30&checks
  1279. X   Specify names to ignore    %==> ^3&ignore
  1280. X------------------------------------------------------------------------
  1281. XGenerate a file for FLOW      %==> ^3&tree
  1282. X------------------------------------------------------------------------
  1283. XSend Floppy Output to disk    %==> ^3&flopo
  1284. XList all source FORTRAN lines %==> ^3&full
  1285. X------------------------------------------------------------------------
  1286. XTidy Fortran? %==> ^3&tidy Output %==> ^8&fntdy  ^8&fttdy  ^2&fmtdy
  1287. X a) Adjust GOTOs to right of page %==> ^3&gotos
  1288. X b) Indent DO/IF clauses          %==> ^3&indent Spaces %==> ^1&spaces
  1289. X c) Group FORMATs at routine ends %==> ^3&groupf
  1290. X d) Renumber FORMAT statements    %==> ^3&renumf Start  %==> ^4&startf
  1291. X                                                 Step   %==> ^4&stepf
  1292. X e) Renumber all other statements %==> ^3&renums Start  %==> ^4&starts
  1293. X                                                 Step   %==> ^4&steps
  1294. XPF1:%Help %(on %cursor)   PF2:%Enter %a %CMS %Command     PF3:%Exit
  1295. /
  1296. echo 'Part 08 of Floppy complete.'
  1297. exit
  1298.  
  1299.  
  1300.