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

  1. Newsgroups: comp.sources.misc
  2. organization: CERN, Geneva, Switzerland
  3. keywords: fortran
  4. subject: v12i096: Floppy - Fortran Coding Convention Checker Part 10/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 96
  9. Submitted-by: julian@cernvax.cern.ch (julian bunn)
  10. Archive-name: ffccc/part10
  11.  
  12. #!/bin/sh
  13. echo 'Start of Floppy, part 10 of 11:'
  14. echo 'x - BINSRC.f'
  15. sed 's/^X//' > BINSRC.f << '/'
  16. X      SUBROUTINE BINSRC(KELEM,KLIST,NLIST,IPOS,LAST)
  17. X*-----------------------------------------------------------------------
  18. X*   
  19. X*---Purpose:    finds number in sorted list (ascending) 
  20. X*               with binary search. 
  21. X*   
  22. X*---Input   
  23. X*   KELEM           number to be looked up  
  24. X*   KLIST           table   
  25. X*   NLIST           length of table 
  26. X*   
  27. X*---Output  
  28. X*   IPOS            = 0: name not in table  
  29. X*                   > 0: position in table  
  30. X*   LAST            for IPOS=0, position behind which number belongs
  31. X*   
  32. X*---Author :    HG      date: 17.5.79     last revision: 20.6.84
  33. X*   
  34. X*-----------------------------------------------------------------------
  35. X      DIMENSION KLIST(*)
  36. X      IPOS=0
  37. X      LAST=0
  38. X      N=NLIST   
  39. X      IF(N.GT.0)  THEN  
  40. X         KPOS=0 
  41. X   10    M=(N+1)/2  
  42. X         LAST=KPOS+M
  43. X         IF (KELEM.LT.KLIST(LAST))  THEN
  44. X            N=M 
  45. X            LAST=LAST-1 
  46. X            IF (N.GT.1) GOTO 10 
  47. X         ELSEIF (KELEM.GT.KLIST(LAST))  THEN
  48. X            KPOS=LAST   
  49. X            N=N-M   
  50. X            IF (N.GT.0) GOTO 10 
  51. X         ELSE   
  52. X            IPOS=LAST   
  53. X         ENDIF  
  54. X      ENDIF 
  55. X      END   
  56. /
  57. echo 'x - CFLAGS.h'
  58. sed 's/^X//' > CFLAGS.h << '/'
  59. X*IF DEF,NEVER   
  60. X*-----------------------------------------------------------------------
  61. X* +++++++++++++++++++++++++ action flags - as listed
  62. X*  1      make namelist/routine 
  63. X*  2      make global namelist  
  64. X*  3      print illegal statements  
  65. X*  4      print changed statements  
  66. X*  5      print filtered statements 
  67. X*  6      print all statements  
  68. X*  7      write changed statements only on output file  
  69. X*  8      write filtered on output file 
  70. X*  9      write all on output file  
  71. X* 10      take first name only in statement 
  72. X* 11      convert hollerith to quotes   
  73. X* 12      string replacement requested  
  74. X* 13      resequence statement numbers  
  75. X* 14      FORMAT to end of routine  
  76. X* 15      name replacements requested   
  77. X* 16      routine filters given 
  78. X* 17      class filters given   
  79. X* 18      name filters given
  80. X* 19      string filters given  
  81. X* 20      type variables
  82. X* 21      indent
  83. X* 22      USER command given
  84. X* 23      compressed output file requested  
  85. X* 24      COMMON block option (signal unused and used C.B.) 
  86. X* 25      print namelist / routine  
  87. X* 26      print global namelist 
  88. X* 27      print COMMON block and variable usage 
  89. X* 28      adjust GOTO to the right  
  90. X* 29      write tree output file on unit 13 
  91. X* +++++++++++++++++++++++++ status flags - as listed
  92. X*  1      no more lines on input
  93. X*  2      no more lines to process  
  94. X*  3      illegal stmnt. detected in EXTRAC (unclosed string, or
  95. X*         illegal character '{', '}'  ).
  96. X*  4      end of program due to time limit  
  97. X*  5      currently buffered routine without end (split)
  98. X*  6      currently buffered routine continuation (split)   
  99. X*  7      current routine filtered  
  100. X*  8      last filter passed
  101. X*  9      routine header still to be printed
  102. X* 10      statement still to be printed 
  103. X* 11      statement cannot be changed (length overflow,or illegal repl.)
  104. X* 12      c.b. name list overflow in PROCOM, discard current routine
  105. X* 13      true when equiv. groups and commons have been merged (PROCOM) 
  106. X* 14      true when current routine is a SUBROUTINE 
  107. X*-----------------------------------------------------------------------
  108. X*EI 
  109. /
  110. echo 'x - CHRTYP.f'
  111. sed 's/^X//' > CHRTYP.f << '/'
  112. X      SUBROUTINE CHRTYP(ITYPE,STRING,ICC1,ICC2,HOLFLG,KPOS,ILEV)
  113. X*-----------------------------------------------------------------------
  114. X* returns first ch. of specified type, or 0 
  115. X* input 
  116. X* ITYPE       type  
  117. X*            1 = numeric
  118. X*            2 = alpha  
  119. X*            3 = alpha-numeric  
  120. X*            4 = special
  121. X*            5 = FORTRAN-name   
  122. X* string      string to be looked up
  123. X* ICC1        first ch. in string   
  124. X* ICC2        last ch. in string
  125. X* HOLFLG      if TRUE, hollerith included in search 
  126. X* output
  127. X* KPOS        position of first ch. of specified type, or 0 
  128. X* ILEV        relative level, including KPOS
  129. X*   
  130. X*-----------------------------------------------------------------------
  131. X      LOGICAL HOLFLG
  132. X      CHARACTER STRING*(*),STEMP*1  
  133. X      include 'CONVEX.h' 
  134. X      ILEV=0
  135. X      KPOS=0
  136. X      NCNT=0
  137. X      JC=ICC1-1 
  138. X   10 JC=JC+1   
  139. X      IF (JC.GT.ICC2) GOTO 999  
  140. X      STEMP=STRING(JC:JC)   
  141. X      IF(STEMP.EQ.'{')  THEN
  142. X*--- start of character string  
  143. X         IF (.NOT.HOLFLG) THEN  
  144. X            I=INDEX(STRING(JC:ICC2),'}')
  145. X            IF (I.EQ.0) GOTO 999
  146. X            JC=I+JC-1   
  147. X         ENDIF  
  148. X         GOTO 10
  149. X      ELSEIF(STEMP.EQ.'}')  THEN
  150. X         GOTO 10
  151. X      ELSEIF(STEMP.EQ.'(')  THEN
  152. X         ILEV=ILEV+1
  153. X      ELSEIF(STEMP.EQ.')')  THEN
  154. X         ILEV=ILEV-1
  155. X      ENDIF 
  156. X      IF(ITYPE.EQ.1)  THEN  
  157. X         IF (NUMCH(STEMP)) KPOS=JC  
  158. X      ELSEIF(ITYPE.EQ.2)  THEN  
  159. X         IF (ALPHCH(STEMP)) KPOS=JC 
  160. X      ELSEIF(ITYPE.EQ.3)  THEN  
  161. X         IF (ANUMCH(STEMP)) KPOS=JC 
  162. X      ELSEIF(ITYPE.EQ.4)  THEN  
  163. X         IF (SPECCH(STEMP)) KPOS=JC 
  164. X      ELSEIF(ITYPE.EQ.5)  THEN  
  165. X         IF (NCNT.EQ.0)  THEN   
  166. X            IF (ALPHCH(STEMP))  THEN
  167. X               KPOS=JC  
  168. X               NCNT=NCNT+1  
  169. X            ENDIF   
  170. X         ELSEIF (ANUMCH(STEMP))  THEN   
  171. X            KPOS=JC 
  172. X         ENDIF  
  173. X      ENDIF 
  174. X      IF (KPOS.NE.JC) GOTO 10   
  175. X  999 END   
  176. /
  177. echo 'x - CKEYCOM.h'
  178. sed 's/^X//' > CKEYCOM.h << '/'
  179. X*IF DEF,NEVER   
  180. X*-----------------------------------------------------------------------
  181. X*    NORSET = no. of OR-sets
  182. X*    NGLSET = no. of global commands
  183. X*    NKYNAM = no. of names in SKEYLS
  184. X*    NKYSTR = no. of strings in SKYSTR  
  185. X*    LKYSTR = occupation of  SKYSTR 
  186. X*    NKYCHR = no. of string refs in KSTREF  
  187. X*    NORCOM = no. of commands / OR-set  
  188. X*    KORCOM = start-1 of each OR-set in KEYREF  
  189. X*    KEYREF 
  190. X*            (I,1) = ref. number (=pos.) of key 
  191. X*            (I,2) = no. of integers in KEYINT  
  192. X*            (I,3) = start-1 of integers in KEYINT  
  193. X*            (I,4) = no. of names in SKEYLS 
  194. X*            (I,5) = start-1 of names in SKEYLS 
  195. X*            (I,6) = no. of string refs in KSTREF   
  196. X*            (I,7) = start-1 of string refs in KSTREF   
  197. X*    KEYINT = integer list for sub-keys etc.
  198. X*    KNAMRF 
  199. X*            (I,1) = ref. to string following name, or zero if none,
  200. X*                   or < 0 if to be ignored (illegal)   
  201. X*            (I,2) = ref. to replacement string, or zero
  202. X*    KSTREF 
  203. X*            (I,1) = ref. to string (stand alone), or < 0 if illegal
  204. X*            (I,2) = ref. to replacement string for above, or zero  
  205. X*    KKYSTA = start of string in SKYSTR 
  206. X*    KKYEND = end of string in SKYSTR   
  207. X*   
  208. X*    SKEYLS = name list for input commands  
  209. X*    SKYSTR = contains stand-alone or name-associated strings   
  210. X*-----------------------------------------------------------------------
  211. X*EI 
  212. /
  213. echo 'x - COMPAC.f'
  214. sed 's/^X//' > COMPAC.f << '/'
  215. X      SUBROUTINE COMPAC(NUMBER) 
  216. X*-----------------------------------------------------------------------
  217. X*   
  218. X* extracts the FORTRAN field contents from the statement image. 
  219. X*   
  220. X*--- input  
  221. X*    NUMBER          number of the statement to be extracted
  222. X*    SIMA            COMMON/ALCAZA/ (contains one complete routine) 
  223. X*    NLTYPE,NFLINE,NLLINE,  COMMON/STATE/   
  224. X*   
  225. X*--- output 
  226. X*    SSTA            COMMON/ALCAZA/  FORTRAN fields 7-72 of SIMA
  227. X*    NCHST           COMMON/STATE/  last non-blank in SSTA  
  228. X*                    or =0 if statement consists of comment lines only  
  229. X*    NLIMA, NLREF(1..NLIMA),   /STATE/  
  230. X*   
  231. X*   
  232. X*-----------------------------------------------------------------------
  233. X      include 'PARAM.h' 
  234. X      include 'ALCAZA.h' 
  235. X      include 'CURSTA.h' 
  236. X      include 'STATE.h' 
  237. X      NCHST=0   
  238. X      NLIMA=0   
  239. X*--- find last non-blank (only last line)   
  240. X      JEND=LASTNB(SIMA(NLLINE(NUMBER)),8,72)
  241. X      DO 10 JLINE=NFLINE(NUMBER),NLLINE(NUMBER) 
  242. X         IF (NLTYPE(JLINE).EQ.0) GOTO 10
  243. X         NLIMA=NLIMA+1  
  244. X         NLREF(NLIMA)=JLINE 
  245. X         IF (JLINE.EQ.NLLINE(NUMBER))  THEN 
  246. X            JLAST=JEND  
  247. X         ELSE   
  248. X            JLAST=72
  249. X         ENDIF  
  250. X         L=JLAST-6  
  251. X         SSTA(NCHST+1:NCHST+L)=SIMA(JLINE)(7:JLAST) 
  252. X         NCHST=NCHST+L  
  253. X   10 CONTINUE  
  254. X      END   
  255. /
  256. echo 'x - CPARAM.h'
  257. sed 's/^X//' > CPARAM.h << '/'
  258. X*IF DEF,NEVER   
  259. X*-----------------------------------------------------------------------
  260. X*--- MXNAME = dimension of IWS, COMMON/FLWORK/, and of SNAMES /ALCAZA/  
  261. X*    MXSSTM = length of string SSTM, COMMON/ALCAZA/ 
  262. X*    MXSTAT = max. no. of statement definitions 
  263. X*    MCLASS = first dim. of ISTMDS( , ) = no. of control words/statement
  264. X*    MXLENG = max. length of statement field (20*66)
  265. X*    MXLINE = line length of input image
  266. X*    MXSIMA = max. no. of lines in input image (one routine)
  267. X*    MXSIMD = dim. of SIMA (excess for replacement overflows)   
  268. X*    MCUNIT = file for command input (data cards)   
  269. X*    MPUNIT = file for printed output   
  270. X*    MIUNIT = FORTRAN code input unit   
  271. X*    MTUNIT = TREE output unit  
  272. X*    MOUNIT = FORTRAN code output unit  
  273. X*    MXFLAG = no. of status and action flags
  274. X*    MXNMCH = max. no. of characters per name   
  275. X*    MXORST = max. no. of OR-sets in control commands   
  276. X*    MDIMST = dimension of SSTA, SSTR, SKYSTR   
  277. X*    MGLOKY = no. of global command keys
  278. X*    MLOCKY = no. of local (in each OR-set) command keys
  279. X*    MSUBKY = no. of command sub-keys   
  280. X*    MXKINT = dim. of KEYINT  /KEYINP/  
  281. X*    MXKNAM = max. no. of names or strings on input commands (total)
  282. X*    MXTYPE = max. no. of variable types
  283. X*    MAXNUM = max. no. of statement numbers per routine 
  284. X*    MAXGRP = max. no. of c.b. names or equiv. groups (for ACTION(24))  
  285. X*    TIMLIM = if less time left, refrain from reading next routine  
  286. X*    VERSIO = program version   
  287. X*    KALL   = max. no. of different externals / routine (TREE)  
  288. X*    KENT   = max. no. of ENTRY statements / routine    (TREE)  
  289. X*    NOARG  = max. no. of arguments / call              (TREE)  
  290. X*-----------------------------------------------------------------------
  291. X*EI 
  292. /
  293. echo 'x - DEFINF.f'
  294. sed 's/^X//' > DEFINF.f << '/'
  295. X      SUBROUTINE DEFINF 
  296. X*-----------------------------------------------------------------------
  297. X* Define the table of FORTRAN intrinsic functions, and label the
  298. X* generic ones. 
  299. X*-----------------------------------------------------------------------
  300. X      include 'USINFN.h' 
  301. X      PARAMETER (NGEN=43)   
  302. X      CHARACTER*6 CINF(LIF) 
  303. X      CHARACTER*1 CGEN(NGEN)
  304. X      INTEGER IGEN(NGEN)
  305. X      DATA CINF/'INT   ','IFIX  ','IDINT ','IQINT ','REAL  ','FLOAT ',  
  306. X     +'SNGL  ','DBLE  ','CMPLX ','ICHAR ','CHAR  ','AINT  ','DINT  ',   
  307. X     +'ANINT ','DNINT ','NINT  ','IDNINT','ABS   ','IABS  ','DABS  ',   
  308. X     +'CABS  ','MOD   ','AMOD  ','DMOD  ','SIGN  ','ISIGN ','DSIGN ',   
  309. X     +'DIM   ','DDIM  ','DPROD ','MAX   ','MAX0  ','AMAX1 ','DMAX1 ',   
  310. X     +'AMAX0 ','MAX1  ','MIN   ','MIN0  ','AMIN1 ','DMIN1 ','AMIN0 ',   
  311. X     +'MIN1  ','LEN   ','INDEX ','IMAG  ','AIMAG ','CONJG ','SQRT  ',   
  312. X     +'DSQRT ','CSQRT ','EXP   ','DEXP  ','CEXP  ','LOG   ','ALOG  ',   
  313. X     +'DLOG  ','CLOG  ','LOG10 ','ALOG10','DLOG10','SIN   ','DSIN  ',   
  314. X     +'CSIN  ','COS   ','DCOS  ','CCOS  ','TAN   ','DTAN  ','ASIN  ',   
  315. X     +'DASIN ','ACOS  ','DACOS ','ATAN  ','DATAN ','ATAN2 ','DATAN2',   
  316. X     +'SINH  ','DSINH ','COSH  ','DCOSH ','TANH  ','DTANH ','LGE   ',   
  317. X     +'LGT   ','LLE   ','LLT   ','QEXT  ','DCMPLX','QCMPLX','CBRT  ',   
  318. X     +'EXP2  ','EXP10 ','LOG2  ','COTAN ','ERF   ','ERFC  ','GAMMA ',   
  319. X     +'LGAMMA','IRE   ','AMT   ','NOT   ','IAND  ','IOR   ','IEOR  ',   
  320. X     +'ISHFT ','IBSET ','IBCLR ','BTEST ','REAL  '/ 
  321. X      DATA IGEN /1,5,8,9,12,14,16,18,22,25,28,31,37,45,47,48,51,54,58,  
  322. X     &           61,64,67,69,71,73,75,77,79,81,87,88,89,90,91,92,93,
  323. X     &           94,95,96,97,98,99,100/ 
  324. X      DATA CGEN /'I','R','D','K','R','R','I',6*'$','R','K',14*'$','D',  
  325. X     &           'D','K',9*'$','I','$'/ 
  326. X      DO 10 INF=1,LIF   
  327. X        CINFUN(INF) = CINF(INF) 
  328. X        INFUNG(INF) = 0 
  329. X   10 CONTINUE  
  330. X      DO 15 IG=1,NGEN   
  331. X        INFUNG(IGEN(IG)) = 1
  332. X        CTYFUN(IGEN(IG)) = CGEN(IG) 
  333. X   15 CONTINUE  
  334. X      RETURN
  335. X      END   
  336. /
  337. echo 'x - EXTRAC.f'
  338. sed 's/^X//' > EXTRAC.f << '/'
  339. X      SUBROUTINE EXTRAC(NUMBER,OPTION)  
  340. X*-----------------------------------------------------------------------
  341. X*   
  342. X* extracts the FORTRAN field contents from the statement image. 
  343. X* holl.  and character strings are included in special characters,  
  344. X* '{' and '}'. strings may be either ...H, or be
  345. X* included in single or double quotes.  
  346. X*   
  347. X*--- input  
  348. X*    NUMBER          number of the statement to be extracted
  349. X*    OPTION          (character) 'FULL' or 'PART' to extract
  350. X*                    all, or just start (up to first bracket)   
  351. X*    SIMA            COMMON/ALCAZA/ (contains one complete routine) 
  352. X*    NLTYPE,ICLASS,NFLINE,NLLINE,  COMMON/STATE/
  353. X*   
  354. X*--- output 
  355. X*    SSTA            COMMON/ALCAZA/  FORTRAN fields 7-72 of SIMA
  356. X*    NCHST           COMMON/STATE/  last non-blank in SSTA  
  357. X*                    or =0 if statement consists of comment lines only  
  358. X*    NLIMA, NLREF(1..NLIMA),   /STATE/  
  359. X*    STATUS(3)      if illegal (containing '{', '}' )   
  360. X*   
  361. X*   
  362. X*-----------------------------------------------------------------------
  363. X      include 'PARAM.h' 
  364. X      include 'ALCAZA.h' 
  365. X      include 'FLAGS.h' 
  366. X      include 'CURSTA.h' 
  367. X      include 'STATE.h' 
  368. X      CHARACTER OPTION*4
  369. X      NCHST=0   
  370. X      NSTREF=0  
  371. X      IF (NUMBER.LE.0.OR.NUMBER.GT.NSTAMM) GOTO 999 
  372. X      IF (ICLASS(NUMBER,1).EQ.0) GOTO 999   
  373. X      NSTREF=NUMBER 
  374. X*--- compact statement into SSTA
  375. X      CALL COMPAC(NUMBER)   
  376. X      IF (NCHST.EQ.0) GOTO 999  
  377. X*--- insert {} around strings, suppress multiple blanks 
  378. X      CALL MARKST(OPTION,IERR)  
  379. X      STATUS(3)=IERR.NE.0   
  380. X  999 END   
  381. /
  382. echo 'x - FLINIT.f'
  383. sed 's/^X//' > FLINIT.f << '/'
  384. X      SUBROUTINE FLINIT 
  385. X*-----------------------------------------------------------------------
  386. X*   
  387. X*--- initializes FLOP   
  388. X*   
  389. X*-----------------------------------------------------------------------
  390. X      include 'PARAM.h' 
  391. X      include 'CURSTA.h' 
  392. X      include 'FLAGS.h' 
  393. X      include 'JOBSUM.h' 
  394. X      include 'STATE.h' 
  395. X      include 'KEYCOM.h' 
  396. X      NSTBUF=0  
  397. X      IGNAME=0  
  398. X      NGNAME=0  
  399. X      NKEEPL=0  
  400. X      DO 10 I=1,10  
  401. X   10 NSTATC(I)=0   
  402. X      DO 20 I=1,MXFLAG  
  403. X         ACTION(I)=.FALSE.  
  404. X         STATUS(I)=.FALSE.  
  405. X   20 CONTINUE  
  406. X      NDUMMY=0  
  407. X      NORSET=0  
  408. X      NGLSET=0  
  409. X      NKYINT=0  
  410. X      NKYNAM=0  
  411. X      NKYSTR=0  
  412. X      NKYCHR=0  
  413. X*--- LKYSTR must start at one to leave room for an extra '#'
  414. X      LKYSTR=1  
  415. X      DO 30 I=1,MXORST  
  416. X         NORCOM(I)=0
  417. X         KORCOM(I)=0
  418. X   30 CONTINUE  
  419. X      DO 40 I=1,7   
  420. X         DO 40 J=1,MXKEYS   
  421. X            KEYREF(J,I)=0   
  422. X   40 CONTINUE  
  423. X      DO 50 I=1,2   
  424. X         DO 50 J=1,MXKNAM   
  425. X            KNAMRF(J,I)=0   
  426. X            KSTREF(J,I)=0   
  427. X   50 CONTINUE  
  428. X      DO 60 I=1,MXKINT  
  429. X         KEYINT(I)=0
  430. X   60 CONTINUE  
  431. X      DO 70 I=1,2   
  432. X         DO 70 J=1,MXSTAT   
  433. X   70 NFDCLS(J,I)=0 
  434. X      END   
  435. /
  436. echo 'x - GETNAM.f'
  437. sed 's/^X//' > GETNAM.f << '/'
  438. X      SUBROUTINE GETNAM(STRING,K1,K2,KFCH,KLCH) 
  439. X*-----------------------------------------------------------------------
  440. X*   
  441. X*--- finds one name at a time   
  442. X*   
  443. X*--- input  
  444. X*    STRING           input string  
  445. X*    K1, K2           first and last ch. in STRING for scan 
  446. X*--- output 
  447. X*    KFCH             start of name in STRING, or 0 if none 
  448. X*    KLCH             end of name in STRING 
  449. X*   
  450. X*-----------------------------------------------------------------------
  451. X      CHARACTER STRING*(*), STEMP*1, SLAST*1
  452. X      LOGICAL STARTD,SKIP   
  453. X      include 'CONVEX.h' 
  454. X      SLAST=' ' 
  455. X      STARTD=.FALSE.
  456. X      SKIP=.FALSE.  
  457. X      KNB=0 
  458. X      KFCH=0
  459. X      JC=K1-1   
  460. X   10 JC=JC+1   
  461. X      KLCH=KNB  
  462. X      IF (JC.GT.K2) GOTO 999
  463. X      STEMP=STRING(JC:JC)   
  464. X*--- skip blanks
  465. X      IF (STEMP.EQ.' ') GOTO 10 
  466. X      IF(STEMP.EQ.'{')  THEN
  467. X*--- start of string - quit or skip 
  468. X         IF (STARTD) GOTO 999   
  469. X         I=INDEX(STRING(JC+1:K2),'}')   
  470. X         IF (I.EQ.0) GOTO 999   
  471. X         JC=I+JC
  472. X         GOTO 10
  473. X      ENDIF 
  474. X      KNB=JC
  475. X      IF(SPECCH(STEMP))  THEN   
  476. X         IF (STARTD) GOTO 999   
  477. X*--- 'SKIP' helps to ignore .ge. etc
  478. X         SKIP=STEMP.EQ.'.'.AND.(.NOT.SKIP.OR.SLAST.EQ.'.')  
  479. X      ELSEIF(ALPHCH(STEMP))  THEN   
  480. X         IF (.NOT.(SKIP.OR.NUMCH(SLAST)))  THEN 
  481. X*--- preceding if is to catch 1E3 etc   
  482. X            IF (.NOT.STARTD) KFCH=JC
  483. X            STARTD=.TRUE.   
  484. X         ENDIF  
  485. X      ELSE  
  486. X*--- numeric
  487. X         SKIP=.FALSE.   
  488. X*--- this is necessary for 1.E3 etc.
  489. X      ENDIF 
  490. X*--- keep last character
  491. X      SLAST=STEMP   
  492. X      GOTO 10   
  493. X  999 END   
  494. /
  495. echo 'x - GETOPT.f'
  496. sed 's/^X//' > GETOPT.f << '/'
  497. X      SUBROUTINE GETOPT(SLINE,NLEN,SOPT,LOPT,IERR)  
  498. XC find if character string SLINE is a recognised operator, and if so
  499. XC return that operator (minus any blanks) in SOPT. The operator does
  500. XC not need to necessarily fill the whole of SLINE.  
  501. X      PARAMETER (NOPER=22,LTEMP=100)
  502. X      CHARACTER*(*) SLINE   
  503. X      CHARACTER*(LTEMP) STEMP   
  504. X      CHARACTER*6 SOPER(NOPER),SOPT 
  505. X      INTEGER LOPER(NOPER)  
  506. XC all possible operators
  507. X      DATA SOPER /'=     ','(     ',')     ',',     ',':     ', 
  508. X     &            '.EQV. ','.NEQV.','.OR.  ','.AND. ','.NOT. ', 
  509. X     &            '.GT.  ','.GE.  ','.LT.  ','.LE.  ','.EQ.  ', 
  510. X     &            '.NE.  ','//    ','+     ','-     ','**    ', 
  511. X     &            '/     ','*     '/
  512. X      DATA LOPER /1,1,1,1,1,5,6,4,5,5,4,4,4,4,4,4,2,1,1,2,1,1/  
  513. X      NC = 0
  514. XC loop over characters in the line segment and remove blanks
  515. X      DO 10 I=1,NLEN
  516. X        IF(SLINE(I:I).EQ.' ') GOTO 10   
  517. X        NC = NC + 1 
  518. X        STEMP(NC:NC) = SLINE(I:I)   
  519. X   10 CONTINUE  
  520. X      IF(NC.EQ.0.OR.NC.GT.LTEMP) GOTO 900   
  521. XC find the operator. Note that ** is found correctly due to its order   
  522. XC in the SOPER list. Similarly for //   
  523. X      DO 20 I=1,NOPER   
  524. X        IF(LOPER(I).GT.NC) GOTO 20  
  525. X        IF(STEMP(:LOPER(I)).NE.SOPER(I)(:LOPER(I))) GOTO 20 
  526. X        SOPT(:LOPER(I)) = SOPER(I)(:LOPER(I))   
  527. X        LOPT = LOPER(I) 
  528. X        IERR = 0
  529. X        RETURN  
  530. X   20 CONTINUE  
  531. X  900 IERR = 1  
  532. X      RETURN
  533. X      END   
  534. /
  535. echo 'x - INEXTR.f'
  536. sed 's/^X//' > INEXTR.f << '/'
  537. X      SUBROUTINE INEXTR(SKEY,I1,I2,N)   
  538. X*-----------------------------------------------------------------------
  539. X*  compacts all occurrences of a given key in the range indicated,  
  540. X*  removes the key-words
  541. X*   
  542. X*   Input   
  543. X*   SKEY         = key to look for  
  544. X*   I1           = start of input command range in SIMA 
  545. X*   I2           = end         -         -  
  546. X*   Output  
  547. X*   N            = no. of characters in compacted string
  548. X*                  or -1 if key not found.  
  549. X*   SSTA, common /ALCAZA/  contains the string  
  550. X*-----------------------------------------------------------------------
  551. X      include 'PARAM.h' 
  552. X      include 'ALCAZA.h' 
  553. X      include 'STATE.h' 
  554. X      CHARACTER*3 SKEY  
  555. X      N=-1  
  556. X      DO 20 I=I1,I2 
  557. X         IF (SKEY.EQ.SIMA(NFLINE(I))(1:3))  THEN
  558. X*--- key found - skip key-word, string, replace ';' by ','  
  559. X            IF (N.LT.0) N=0 
  560. X            IS=NFLINE(I)
  561. X            IL=NLLINE(I)
  562. X            IP=NLTYPE(IL)   
  563. X            SIMA(IL)(IP:IP)=',' 
  564. X            IND=INDEX(SIMA(IS),',') 
  565. X            IF (IND.EQ.0.OR.IND.EQ.NLTYPE(IS))  THEN
  566. X               KADD=1   
  567. X            ELSE
  568. X               KADD=0   
  569. X            ENDIF   
  570. X            DO 10 J=IS+KADD,IL  
  571. X               IF (J.EQ.IS)  THEN   
  572. X                  IT=IND+1  
  573. X               ELSE 
  574. X                  IT=1  
  575. X               ENDIF
  576. X               L=NLTYPE(J)+1-IT 
  577. X               IF (N+L.GT.MDIMST)  THEN 
  578. X                  WRITE (MPUNIT,10000) SKEY,MDIMST  
  579. X                  N=-1  
  580. X                  GOTO 999  
  581. X               ENDIF
  582. X               SSTA(N+1:N+L)=SIMA(J)(IT:NLTYPE(J))  
  583. X               N=N+L
  584. X   10       CONTINUE
  585. X         ENDIF  
  586. X   20 CONTINUE  
  587. X10000 FORMAT(/1X,8('*=*='),' WARNING - total length of key ', A,
  588. X     +' more than ',I5,' characters, key ignored')  
  589. X  999 END   
  590. /
  591. echo 'x - INLINE.f'
  592. sed 's/^X//' > INLINE.f << '/'
  593. X      SUBROUTINE INLINE(IUNIT,STRING,EOFFLG,NTYP)   
  594. X*-----------------------------------------------------------------------
  595. X*   
  596. X*--- reads one line from input  
  597. X*   
  598. X*--- input  
  599. X*    IUNIT       logical unit number
  600. X*--- output 
  601. X*    STRING      line read (up to MXLINE characters)
  602. X*    EOFFLG      TRUE when end of file  
  603. X*    NTYP        type if line : 0 comment line  
  604. X*                               1 start of statement
  605. X*                               2 contination line  
  606. X*   
  607. X*-----------------------------------------------------------------------
  608. X      include 'PARAM.h' 
  609. X      CHARACTER STRING*(MXLINE),STEMP*1 
  610. X      LOGICAL EOFFLG
  611. X      include 'CONVEX.h' 
  612. X      EOFFLG=.FALSE.
  613. X      READ (IUNIT,'(A)',END=40) STRING  
  614. X      DO 10 I=1,72  
  615. X         IF (STRING(I:I).NE.' ') GOTO 20
  616. X   10 CONTINUE  
  617. X*--- all blank = comment
  618. X      NTYP=0
  619. X      GOTO 999  
  620. X   20 CONTINUE  
  621. X*--- check for comment  
  622. X      IF(I.LE.6)  THEN  
  623. X         DO 30 J=I,5
  624. X            STEMP=STRING(J:J)   
  625. X            IF (.NOT.(STEMP.EQ.' '.OR.NUMCH(STEMP))) THEN   
  626. X               NTYP=0   
  627. X               GOTO 999 
  628. X            ENDIF   
  629. X   30    CONTINUE   
  630. X*--- not a comment line - check for continuation
  631. X         STEMP=STRING(6:6)  
  632. X         IF (STEMP.EQ.' '.OR.STEMP.EQ.'0')  THEN
  633. X            NTYP=1  
  634. X         ELSE   
  635. X            NTYP=2  
  636. X         ENDIF  
  637. X      ELSE  
  638. X         NTYP=1 
  639. X      ENDIF 
  640. X      GOTO 999  
  641. X   40 CONTINUE  
  642. X      EOFFLG=.TRUE. 
  643. X  999 END   
  644. /
  645. echo 'x - KEYCOM.h'
  646. sed 's/^X//' > KEYCOM.h << '/'
  647. X      COMMON/KEYINP/NORSET,NGLSET,NKYINT,NKYNAM,NKYSTR,LKYSTR,NKYCHR,   
  648. X     1  NORCOM(MXORST),KORCOM(MXORST),KEYREF(MXKEYS,7),KEYINT(MXKINT),  
  649. X     2  KNAMRF(MXKNAM,2),KSTREF(MXKNAM,2),KKYSTA(MXKNAM),KKYEND(MXKNAM) 
  650. X      COMMON/SKEYNP/SKYSTR,SKEYLS(MXKNAM)   
  651. X      CHARACTER SKYSTR*(MDIMST),SKEYLS*(MXNMCH) 
  652. X*IF DEF,NEVER   
  653. X*-----------------------------------------------------------------------
  654. X*    NORSET = no. of OR-sets
  655. X*    NGLSET = no. of global commands
  656. X*    NKYNAM = no. of names in SKEYLS
  657. X*    NKYSTR = no. of strings in SKYSTR  
  658. X*    LKYSTR = occupation of  SKYSTR 
  659. X*    NKYCHR = no. of string refs in KSTREF  
  660. X*    NORCOM = no. of commands / OR-set  
  661. X*    KORCOM = start-1 of each OR-set in KEYREF  
  662. X*    KEYREF 
  663. X*            (I,1) = ref. number (=pos.) of key 
  664. X*            (I,2) = no. of integers in KEYINT  
  665. X*            (I,3) = start-1 of integers in KEYINT  
  666. X*            (I,4) = no. of names in SKEYLS 
  667. X*            (I,5) = start-1 of names in SKEYLS 
  668. X*            (I,6) = no. of string refs in KSTREF   
  669. X*            (I,7) = start-1 of string refs in KSTREF   
  670. X*    KEYINT = integer list for sub-keys etc.
  671. X*    KNAMRF 
  672. X*            (I,1) = ref. to string following name, or zero if none,
  673. X*                   or < 0 if to be ignored (illegal)   
  674. X*            (I,2) = ref. to replacement string, or zero
  675. X*    KSTREF 
  676. X*            (I,1) = ref. to string (stand alone), or < 0 if illegal
  677. X*            (I,2) = ref. to replacement string for above, or zero  
  678. X*    KKYSTA = start of string in SKYSTR 
  679. X*    KKYEND = end of string in SKYSTR   
  680. X*   
  681. X*    SKEYLS = name list for input commands  
  682. X*    SKYSTR = contains stand-alone or name-associated strings   
  683. X*-----------------------------------------------------------------------
  684. X*EI 
  685. /
  686. echo 'x - LMERGE.f'
  687. sed 's/^X//' > LMERGE.f << '/'
  688. X      SUBROUTINE LMERGE(SLIST,NACC,FLACC,IS,N1,N2)  
  689. X*-----------------------------------------------------------------------
  690. X*   
  691. X*--- merges two successive, alphabetically sorted lists 
  692. X*    in SLIST in place, updates NACC
  693. X*   
  694. X*--- input  
  695. X*    SLIST     list containing all names
  696. X*    NACC      array to be re-arranged with sort
  697. X*    FLACC     if true, NACC is actually updated
  698. X*    IS        start-1 of first list in IS  
  699. X*    N1        length of first list 
  700. X*    N2        length of second list
  701. X*   
  702. X*-----------------------------------------------------------------------
  703. X      include 'PARAM.h' 
  704. X      include 'FLWORK.h' 
  705. X      CHARACTER *(MXNMCH)  SLIST(*) 
  706. X      DIMENSION NACC(*) 
  707. X      LOGICAL FLACC 
  708. X      KADD=0
  709. X      K2=N1 
  710. X      DO 20 I=1,N1  
  711. X         II=I   
  712. X   10    IF (K2.EQ.N1+N2) GOTO 40   
  713. X         IF (SLIST(IS+I).GT.SLIST(IS+K2+1))  THEN   
  714. X            K2=K2+1 
  715. X            IWS(K2)=I+KADD  
  716. X            KADD=KADD+1 
  717. X            GOTO 10 
  718. X         ELSE   
  719. X            IWS(I)=I+KADD   
  720. X         ENDIF  
  721. X   20 CONTINUE  
  722. X      DO 30 I=K2+1,N1+N2
  723. X   30 IWS(I)=I  
  724. X      GOTO 60   
  725. X   40 CONTINUE  
  726. X      DO 50 I=II,N1 
  727. X   50 IWS(I)=I+KADD 
  728. X   60 CONTINUE  
  729. X*   
  730. X*--- put in place   
  731. X*   
  732. X      CALL SHUFFL(SLIST,NACC,FLACC,IS,N1+N2)
  733. X      END   
  734. /
  735. echo 'x - NAMOVE.f'
  736. sed 's/^X//' > NAMOVE.f << '/'
  737. X      SUBROUTINE NAMOVE(SLIST,K1,K2,N2) 
  738. X*-----------------------------------------------------------------------
  739. X*   
  740. X*   moves a set of names from one place in a list to another
  741. X*   
  742. X*   Input   
  743. X*   SLIST           table   
  744. X*   K1              start-1 of target position  
  745. X*   K2              start-1 of source position  
  746. X*   N2              number of names to move 
  747. X*   
  748. X*   Output  
  749. X*   SLIST is rearranged 
  750. X*   
  751. X*-----------------------------------------------------------------------
  752. X      include 'PARAM.h' 
  753. X      PARAMETER (MBUFF=200) 
  754. X      CHARACTER *(MXNMCH) SLIST(*),SBUFF(MBUFF) 
  755. X      N=N2  
  756. X      KADD=K1   
  757. X      K=K2  
  758. X      NMOV=ABS(K1-K2)   
  759. X   10 CONTINUE  
  760. X      NT=MIN(N,MBUFF)   
  761. X      DO 20 I=1,NT  
  762. X         SBUFF(I)=SLIST(K+I)
  763. X   20 CONTINUE  
  764. X      IF(K2.GT.K1)  THEN
  765. X         DO 30 I=K,K-NMOV+1,-1  
  766. X            SLIST(NT+I)=SLIST(I)
  767. X   30    CONTINUE   
  768. X         DO 40 I=1,NT   
  769. X            SLIST(KADD+I)=SBUFF(I)  
  770. X   40    CONTINUE   
  771. X         IF(NT.LT.N) THEN   
  772. X            N=N-NT  
  773. X            K=K+NT  
  774. X            KADD=KADD+NT
  775. X            GOTO 10 
  776. X         ENDIF  
  777. X      ELSEIF(K2.LT.K1)  THEN
  778. X         NMOV=NMOV-NT   
  779. X         KADD=K1-NT 
  780. X         DO 50 I=K2+1,K2+NMOV   
  781. X            SLIST(I)=SLIST(NT+I)
  782. X   50    CONTINUE   
  783. X         DO 60 I=1,NT   
  784. X            SLIST(KADD+I)=SBUFF(I)  
  785. X   60    CONTINUE   
  786. X         IF(NT.LT.N) THEN   
  787. X            N=N-NT  
  788. X            NMOV=NMOV+NT
  789. X            GOTO 10 
  790. X         ENDIF  
  791. X      ENDIF 
  792. X      END   
  793. /
  794. echo 'x - NAMTAB.f'
  795. sed 's/^X//' > NAMTAB.f << '/'
  796. X      SUBROUTINE NAMTAB(SNAME,SLIST,NLIST,IPOS) 
  797. X*-----------------------------------------------------------------------
  798. X*   
  799. X*   enters a name in an alphabetic table, or gives position if already in.  
  800. X*   
  801. X*   input   
  802. X*   SNAME                   name to be entered  
  803. X*   SLIST                   name list   
  804. X*   NUMTAB                  reference list to be updated (integers) 
  805. X*   NLIST                   no. of names in SLIST   
  806. X*   Output  
  807. X*   IPOS                    <0: -pos of name already in table   
  808. X*                           =0: NLIST <0
  809. X*                           >0: pos of newly entered name in table  
  810. X*   
  811. X*+++++++++++ IMPORTANT  
  812. X*   In case the name has been entered, the user must increase the list  
  813. X*   length himself. 
  814. X*-----------------------------------------------------------------------
  815. X      CHARACTER *(*) SNAME,SLIST(*) 
  816. X      IF(NLIST.LT.0)  THEN  
  817. X         IPOS=0 
  818. X      ELSEIF(NLIST.EQ.0)  THEN  
  819. X         IPOS=1 
  820. X         SLIST(1)=SNAME 
  821. X      ELSE  
  822. X         CALL NAMSRC(SNAME,SLIST,NLIST,KPOS,LAST)   
  823. X         IF (KPOS.EQ.0)  THEN   
  824. X*--- name not yet in table  
  825. X            IPOS=LAST+1 
  826. X            DO 10 I=NLIST,IPOS,-1   
  827. X               SLIST(I+1)=SLIST(I)  
  828. X   10       CONTINUE
  829. X            SLIST(IPOS)=SNAME   
  830. X         ELSE   
  831. X            IPOS=-KPOS  
  832. X         ENDIF  
  833. X      ENDIF 
  834. X      END   
  835. /
  836. echo 'x - OPRSLT.f'
  837. sed 's/^X//' > OPRSLT.f << '/'
  838. X      SUBROUTINE OPRSLT(STYP1,SOPER,STYP2,IERR,SRSLT)   
  839. XC! Get the type of an operator result   
  840. XC   
  841. XC for a given pair of operands, with a given operator,  
  842. XC returns the type of the result, and indicates whether 
  843. XC expression was mixed mode by IERR=0 (not mixed),  
  844. XC IERR=1 (mixed).   
  845. XC   
  846. X      CHARACTER*6 SOPER 
  847. X      CHARACTER*1 STYP1,STYP2,SRSLT 
  848. XC   
  849. XC throw out SOME operators  
  850. XC   
  851. X      IF(SOPER(:1).EQ.'*'.OR.   
  852. X     &   SOPER(:1).EQ.'/'.OR.SOPER(:1).EQ.'+'.OR.   
  853. X     &   SOPER(:1).EQ.'-') GOTO 5   
  854. X        IERR = 0
  855. X        SRSLT=STYP1 
  856. X        GOTO 999
  857. X    5 CONTINUE  
  858. XC   
  859. X      SRSLT = ' '   
  860. X      IF(STYP1.EQ.'I') THEN 
  861. XC INTEGER 1 
  862. X        IF(STYP2.EQ.'I') SRSLT='I'  
  863. X        IF(STYP2.EQ.'R') SRSLT='R'  
  864. X        IF(STYP2.EQ.'D') SRSLT='D'  
  865. X        IF(STYP2.EQ.'K') SRSLT='K'  
  866. X      ELSE IF(STYP1.EQ.'R') THEN
  867. XC REAL 1
  868. X        IF(STYP2.EQ.'I') SRSLT='R'  
  869. X        IF(STYP2.EQ.'R') SRSLT='R'  
  870. X        IF(STYP2.EQ.'D') SRSLT='D'  
  871. X        IF(STYP2.EQ.'K') SRSLT='K'  
  872. X      ELSE IF(STYP1.EQ.'D') THEN
  873. XC DOUBLE PRECISION  
  874. X        IF(STYP2.EQ.'I') SRSLT='D'  
  875. X        IF(STYP2.EQ.'R') SRSLT='D'  
  876. X        IF(STYP2.EQ.'D') SRSLT='D'  
  877. X      ELSE IF(STYP1.EQ.'K') THEN
  878. XC COMPLEX   
  879. X        IF(STYP2.EQ.'I') SRSLT='K'  
  880. X        IF(STYP2.EQ.'R') SRSLT='K'  
  881. X        IF(STYP2.EQ.'K') SRSLT='K'  
  882. X      ENDIF 
  883. X      IF(SRSLT.EQ.' ') THEN 
  884. XC UNRECOGNISED TYPE 
  885. X        SRSLT='$'   
  886. X        IERR = 0
  887. X        GOTO 999
  888. X      ENDIF 
  889. XC CHECK FOR EXPONENTIATION  
  890. X      IF(SOPER(:2).EQ.'**') THEN
  891. X        SRSLT = STYP1   
  892. X        IERR = 0
  893. X        GOTO 999
  894. X      ENDIF 
  895. XC CHECK FOR MIXED MODE  
  896. X      IF(STYP1.NE.STYP2) THEN   
  897. X        IERR = 1
  898. X        GOTO 999
  899. X      ENDIF 
  900. X      IERR = 0  
  901. X  999 CONTINUE  
  902. X      RETURN
  903. X      END   
  904. /
  905. echo 'x - POSCH.f'
  906. sed 's/^X//' > POSCH.f << '/'
  907. X      SUBROUTINE POSCH(SFIND,STRING,ICC1,ICC2,HOLFLG,MLEV,KPOS,ILEV)
  908. X*-----------------------------------------------------------------------
  909. X* positions on a specified character
  910. X* input 
  911. X* SFIND     character looked for
  912. X* STRING    string to be looked up  
  913. X* ICC1      first ch. in LSTRNG 
  914. X* ICC2      last ch.       -
  915. X* HOLFLG    if TRUE, hollerith included 
  916. X* MLEV      max. level allowed for character (relative to ICC1...ICC2)  
  917. X* output
  918. X* KPOS      position of ICOMP in LSTRNG, or 0   
  919. X* ILEV      relative level, including KPOS  
  920. X*-----------------------------------------------------------------------
  921. X      LOGICAL HOLFLG
  922. X      CHARACTER STRING*(*),SFIND*1,STEMP*1  
  923. X      ILEV=0
  924. X      KPOS=0
  925. X      JC=ICC1-1 
  926. X   10 JC=JC+1   
  927. X      IF (JC.GT.ICC2) GOTO 999  
  928. X      STEMP=STRING(JC:JC)   
  929. X      IF(STEMP.EQ.'(')  THEN
  930. X         ILEV=ILEV+1
  931. X      ELSEIF(STEMP.EQ.')')  THEN
  932. X         ILEV=ILEV-1
  933. X      ENDIF 
  934. X      IF(STEMP.EQ.SFIND.AND.ILEV.LE.MLEV)  THEN 
  935. X         KPOS=JC
  936. X         GOTO 999   
  937. X      ENDIF 
  938. X      IF(STEMP.EQ.'{')  THEN
  939. X*--- start of character string  
  940. X         IF (.NOT.HOLFLG) THEN  
  941. X            I=INDEX(STRING(JC:ICC2),'}')
  942. X            IF (I.EQ.0) GOTO 999
  943. X            JC=I+JC-1   
  944. X         ENDIF  
  945. X      ENDIF 
  946. X      GOTO 10   
  947. X  999 END   
  948. /
  949. echo 'x - PROIND.f'
  950. sed 's/^X//' > PROIND.f << '/'
  951. X      SUBROUTINE PROIND 
  952. X*-----------------------------------------------------------------------
  953. X*   
  954. X*   Prepares indentation by updating current DO and IF levels   
  955. X*   
  956. X*-----------------------------------------------------------------------
  957. X      include 'PARAM.h' 
  958. X      include 'ALCAZA.h' 
  959. X      include 'CLASS.h' 
  960. X      include 'CURSTA.h' 
  961. X      include 'STATE.h' 
  962. X      DIMENSION IDO(100)
  963. X      SAVE IDO  
  964. X*--- get external class number  
  965. X      ICLEXT=ISTMDS(6,ICURCL(1))
  966. X      IF(ICLEXT.EQ.33)  THEN
  967. X*--- FORMAT, do not indent  
  968. X         INDCNT=0   
  969. X         GOTO 999   
  970. X      ELSE  
  971. X         INDCNT=KNTDO+KNTIF 
  972. X      ENDIF 
  973. X      IF(ICLEXT.EQ.39)  THEN
  974. X*--- IF...THEN  
  975. X         KNTIF=KNTIF+1  
  976. X      ELSEIF(ICLEXT.EQ.23.OR.ICLEXT.EQ.24)  THEN
  977. X*--- ELSE or ELSEIF 
  978. X         INDCNT=INDCNT-1
  979. X      ELSEIF(ICLEXT.EQ.27)  THEN
  980. X*--- ENDIF  
  981. X         KNTIF=KNTIF-1  
  982. X         INDCNT=INDCNT-1
  983. X      ELSEIF(ICLEXT.EQ.20)  THEN
  984. X*--- DO loop
  985. X         IF (KNTDO.LT.100)  THEN
  986. X            KNTDO=KNTDO+1   
  987. X            CALL GETINT(SSTA,1,NCHST,KFCH,KLCH,NN)  
  988. X            IDO(KNTDO)=NN   
  989. X         ENDIF  
  990. X      ELSEIF(KNTDO.GT.0)  THEN  
  991. X*--- check for (possibly multiple) end of DO loop   
  992. X         K=NEXTIN(SIMA(NFLINE(NSTREF)),1,5) 
  993. X         KST=KNTDO  
  994. X         DO 10 I=KST,1,-1   
  995. X            IF (IDO(I).NE.K) GOTO 20
  996. X            KNTDO=KNTDO-1   
  997. X            INDCNT=INDCNT-1 
  998. X   10    CONTINUE   
  999. X   20    CONTINUE   
  1000. X      ENDIF 
  1001. X      INDCNT=MAX(0,INDCNT)  
  1002. X  999 END   
  1003. /
  1004. echo 'x - READSB.f'
  1005. sed 's/^X//' > READSB.f << '/'
  1006. X      SUBROUTINE READSB(NCOMM,NST,ICL)  
  1007. X*-----------------------------------------------------------------------
  1008. X*   
  1009. X*   Purpose:    performs sub-task for READEC by accepting the start of  
  1010. X*               a new FORTRAN statement.
  1011. X*   
  1012. X*   Input:      NCOMM     number of comment lines preceding the new line
  1013. X*   
  1014. X*   Output:     NST       no. of last FORTRAN statement 
  1015. X*               ICL       class of last FORTRAN statement   
  1016. X*   
  1017. X*   Various variables in common are used and modified.  
  1018. X*   
  1019. X*   Author :    HG      date: 7.9.84      last revision: 7.9.84 
  1020. X*-----------------------------------------------------------------------
  1021. X      include 'PARAM.h' 
  1022. X      include 'CURSTA.h' 
  1023. X      include 'STATE.h' 
  1024. X      NST=0 
  1025. X      IF(NSTAMM.GT.0)  THEN 
  1026. X*--- close previous if FORTRAN  
  1027. X         IF (NLTYPE(NFLINE(NSTAMM)).EQ.1)  THEN 
  1028. X            NLLINE(NSTAMM)=NLINES-NCOMM 
  1029. X            NFSTAT=NFSTAT+1 
  1030. X            ICLASS(NSTAMM,1)=999
  1031. X            NST=NSTAMM  
  1032. X            CALL EXTRAC(NSTAMM,'PART')  
  1033. X            CALL CLASSF 
  1034. X            ICL=ICURCL(1)   
  1035. X         ENDIF  
  1036. X      ENDIF 
  1037. X      IF(NCOMM.GT.0)  THEN  
  1038. X*--- make comment line blocks into one statement
  1039. X         NSTAMM=NSTAMM+1
  1040. X         NFLINE(NSTAMM)=NLINES-NCOMM+1  
  1041. X         NLLINE(NSTAMM)=NLINES  
  1042. X         ICLASS(NSTAMM,1)=0 
  1043. X         NCOMM=0
  1044. X      ENDIF 
  1045. X      END   
  1046. /
  1047. echo 'x - REPSUB.f'
  1048. sed 's/^X//' > REPSUB.f << '/'
  1049. X      SUBROUTINE REPSUB(KREF1,KREF2,NSPEC,KSP1,KSP2,NCH)
  1050. X*-----------------------------------------------------------------------
  1051. X*   
  1052. X*   Sub-task of inserting the replacement string (for REPNAM, REPSTR)   
  1053. X*   
  1054. X*--- Input  
  1055. X*    KREF1         ref. to string to be replaced (cf. KKYSTA, KKYEND)   
  1056. X*    KREF2         ref. to replacement string   
  1057. X*    NSPEC         no. of special symbols in STR1   
  1058. X*    KSP1, KSP2    start and end of special symbol matches in STR1  
  1059. X*---Input/Output
  1060. X*    NCH           occupation of NCH before and after replacement   
  1061. X*   
  1062. X*-----------------------------------------------------------------------
  1063. X      include 'PARAM.h' 
  1064. X      include 'ALCAZA.h' 
  1065. X      include 'KEYCOM.h' 
  1066. X      include 'FLWORK.h' 
  1067. X      DIMENSION KSP1(*),KSP2(*) 
  1068. X      DIMENSION ICT(10),ICT1(10),ICT2(10),IREF1(MXNAME/20,10), IREF2
  1069. X     +(MXNAME/20,10)
  1070. X      EQUIVALENCE (IREF1(1,1),IWS(1)),(IREF2(1,1),IWS(MXNAME/2+1))  
  1071. X      CHARACTER STEMP*1 
  1072. X      LOGICAL SKIPFL
  1073. X      include 'CONVEX.h' 
  1074. X      CALL SPECCT(1,KREF1,NTOT1,ICT1,IREF1,IERR)
  1075. X      CALL SPECCT(2,KREF2,NTOT2,ICT2,IREF2,IERR)
  1076. X      SKIPFL=.FALSE.
  1077. X      DO 10 I=1,10  
  1078. X         ICT(I)=0   
  1079. X   10 CONTINUE  
  1080. X      INSTR=0   
  1081. X      DO 30 I=KKYSTA(KREF2),KKYEND(KREF2)   
  1082. X         STEMP=SKYSTR(I:I)  
  1083. X         IF (SKIPFL) GOTO 20
  1084. X         IF (STEMP.EQ.'''') INSTR=1-INSTR   
  1085. X         IN=INDEX(SPCHAR,STEMP) 
  1086. X         IF (IN.EQ.0.OR.INSTR.NE.0)  THEN   
  1087. X*--- normal character   
  1088. X            NCH=NCH+1   
  1089. X            IF (NCH.GT.MXLENG) GOTO 999 
  1090. X            SSTR(NCH:NCH)=STEMP 
  1091. X         ELSE   
  1092. X*--- count  
  1093. X            ICT(IN)=ICT(IN)+1   
  1094. X*--- get count in [...], or default 
  1095. X            N=IREF2(ICT(IN),IN) 
  1096. X            K=IREF1(N,IN)   
  1097. X            L=KSP2(K)-KSP1(K)+1 
  1098. X            IF (L.GT.0)  THEN   
  1099. X               IF (NCH+L.GT.MXLENG)  THEN   
  1100. X                  NCH=MXLENG+1  
  1101. X                  GOTO 999  
  1102. X               ENDIF
  1103. X               SSTR(NCH+1:NCH+L)=SSTA(KSP1(K):KSP2(K))  
  1104. X               NCH=NCH+L
  1105. X               SKIPFL=SKYSTR(I+1:I+1).EQ.'['
  1106. X            ENDIF   
  1107. X         ENDIF  
  1108. X         GOTO 30
  1109. X   20    CONTINUE   
  1110. X         SKIPFL=STEMP.NE.']'
  1111. X   30 CONTINUE  
  1112. X  999 END   
  1113. /
  1114. echo 'x - SHUFFL.f'
  1115. sed 's/^X//' > SHUFFL.f << '/'
  1116. X      SUBROUTINE SHUFFL(SLIST,NACC,FLACC,IS,NS) 
  1117. X*-----------------------------------------------------------------------
  1118. X*   
  1119. X*--- puts the names in a list in the order given in an array.   
  1120. X*    Updates NACC.  
  1121. X*   
  1122. X*--- input  
  1123. X*    SLIST     list containing all names
  1124. X*    NACC      array to be re-arranged with sort
  1125. X*    FLACC     if true, NACC is actually updated
  1126. X*    IS         start-1 of list in SLIST
  1127. X*    NS         # of elements   
  1128. X*    IWS        array containing for element I its target place L,  
  1129. X*                /FLWORK/   
  1130. X* ++++++++ warning +++++++++++  IWS is destroyed +++++++++++++++
  1131. X*-----------------------------------------------------------------------
  1132. X      include 'PARAM.h' 
  1133. X      include 'FLWORK.h' 
  1134. X      CHARACTER *(MXNMCH) SLIST(*), SW(2)   
  1135. X      DIMENSION KEEP(2),NACC(*) 
  1136. X      LOGICAL STD,FLACC 
  1137. X      K=1   
  1138. X      I=1   
  1139. X   10 STD=.TRUE.
  1140. X   20 CONTINUE  
  1141. X      L=IWS(I)  
  1142. X      IF(L.EQ.I)  THEN  
  1143. X         IWS(I)=0   
  1144. X         I=I+1  
  1145. X         IF (I.LE.NS) GOTO 10   
  1146. X      ELSEIF(L.GT.0)  THEN  
  1147. X         IF (STD)  THEN 
  1148. X            SW(K)=SLIST(IS+I)   
  1149. X            IF(FLACC)  KEEP(K)=NACC(IS+I)   
  1150. X            STD=.FALSE. 
  1151. X         ENDIF  
  1152. X         SW(3-K)=SLIST(IS+L)
  1153. X         IF(FLACC)  KEEP(3-K)=NACC(IS+L)
  1154. X         SLIST(IS+L)=SW(K)  
  1155. X         IF(FLACC)  NACC(IS+L)=KEEP(K)  
  1156. X         K=3-K  
  1157. X         IWS(I)=0   
  1158. X         I=L
  1159. X         GOTO 20
  1160. X      ELSE  
  1161. X*--- look for new non-zero element to start with
  1162. X         DO 30 I=1,NS   
  1163. X            IF (IWS(I).GT.0) GOTO 10
  1164. X   30    CONTINUE   
  1165. X      ENDIF 
  1166. X      END   
  1167. /
  1168. echo 'x - SKIPLV.f'
  1169. sed 's/^X//' > SKIPLV.f << '/'
  1170. X      SUBROUTINE SKIPLV(STRING,ICC1,ICC2,HOLFLG,KPOS,ILEV)  
  1171. X*-----------------------------------------------------------------------
  1172. X* scans back to right bracket corresponding to last left one
  1173. X* input 
  1174. X* STRING    string to be looked up  
  1175. X* ICC1      first ch. in LSTRNG 
  1176. X* ICC2      last ch.       -
  1177. X* HOLFLG    if TRUE, hollerith included 
  1178. X* output
  1179. X* KPOS      position of right bracket or 0  
  1180. X* ILEV      relative level, including KPOS (i.e. -1, if found)  
  1181. X*-----------------------------------------------------------------------
  1182. X      LOGICAL HOLFLG
  1183. X      CHARACTER STRING*(*),STEMP*1  
  1184. X      ILEV=0
  1185. X      KPOS=0
  1186. X      JC=ICC1-1 
  1187. X   10 JC=JC+1   
  1188. X      IF (JC.GT.ICC2) GOTO 999  
  1189. X      STEMP=STRING(JC:JC)   
  1190. X      IF(STEMP.EQ.'{')  THEN
  1191. X*--- start of character string  
  1192. X         IF (.NOT.HOLFLG) THEN  
  1193. X            I=INDEX(STRING(JC:ICC2),'}')
  1194. X            IF (I.EQ.0) GOTO 999
  1195. X            JC=I+JC-1   
  1196. X         ENDIF  
  1197. X      ELSEIF(STEMP.EQ.'(')  THEN
  1198. X         ILEV=ILEV+1
  1199. X      ELSEIF(STEMP.EQ.')')  THEN
  1200. X         ILEV=ILEV-1
  1201. X         IF (ILEV.LT.0) GOTO 20 
  1202. X      ENDIF 
  1203. X      GOTO 10   
  1204. X   20 CONTINUE  
  1205. X      KPOS=JC   
  1206. X  999 END   
  1207. /
  1208. echo 'x - SUMMRY.f'
  1209. sed 's/^X//' > SUMMRY.f << '/'
  1210. X      SUBROUTINE SUMMRY 
  1211. X*-----------------------------------------------------------------------
  1212. X*   
  1213. X*--- Prints job summary 
  1214. X*   
  1215. X*-----------------------------------------------------------------------
  1216. X      include 'PARAM.h' 
  1217. X      include 'ALCAZA.h' 
  1218. X      include 'JOBSUM.h' 
  1219. X      include 'STATE.h' 
  1220. X      include 'FLAGS.h' 
  1221. X      IF(ACTION(26).AND.NGNAME.GT.0)  THEN  
  1222. X*--- print list of global names first   
  1223. XC         WRITE (MPUNIT,10000) NGNAME   
  1224. X         IF (ACTION(20))  THEN  
  1225. X*--- print name list with types 
  1226. XC            CALL PRNAMF(IGNAME+1,IGNAME+NGNAME)
  1227. X         ELSE   
  1228. XC            WRITE (MPUNIT,10010) (SNAMES(IGNAME+J),J=1,NGNAME) 
  1229. X         ENDIF  
  1230. X      ENDIF 
  1231. XC      CALL STSUMM  
  1232. X      IF(.NOT.STATUS(2))  THEN  
  1233. XC         WRITE (MPUNIT,10020)  
  1234. X      ENDIF 
  1235. X      IF(STATUS(4))  THEN   
  1236. XC         WRITE (MPUNIT,10030)  
  1237. X      ENDIF 
  1238. X      WRITE (MPUNIT,10040)  
  1239. X      WRITE (MPUNIT,10050) (NSTATC(J),J=1,8)
  1240. X10000 FORMAT(//' Global list of',I6,' names'/)  
  1241. X10010 FORMAT(1X,10A10)  
  1242. X10020 FORMAT(//1X,10('*=*='),' WARNING - EOF not reached on input') 
  1243. X10030 FORMAT(//1X,10('*=*='),' WARNING - ending job at time limit') 
  1244. X10040 FORMAT(//1X,10('****'),' Job Summary ',10('****'))
  1245. X10050 FORMAT(' no. of lines read                 =',I10/
  1246. X     +' no. of lines out                  =',I10/   
  1247. X     +' no. of statements                 =',I10/   
  1248. X     +' no. of filtered stmts.            =',I10/   
  1249. X     +' no. of changed  stmts.            =',I10/   
  1250. X     +' no. of stmts. unable to change    =',I10/   
  1251. X     +' no. of comment lines              =',I10/   
  1252. X     +' no. of lines printed              =',I10)   
  1253. X10060 FORMAT(/' time (sec)              =',F10.3/   
  1254. X     +' time per statement(msec)=',F10.3)   
  1255. X      END   
  1256. /
  1257. echo 'x - SUPMOR.f'
  1258. sed 's/^X//' > SUPMOR.f << '/'
  1259. X      SUBROUTINE SUPMOR(SLIST,NACC,FLACC,IS,NS,NOUT)
  1260. X*-----------------------------------------------------------------------
  1261. X*   
  1262. X*--- suppresses multiple entries in sorted table, logically ORs NAMTYP  
  1263. X*   
  1264. X*--- input  
  1265. X*    SLIST     list containing all names
  1266. X*    NACC      array to be re-arranged, and logically ORed  
  1267. X*    FLACC     if true, NACC is actually updated
  1268. X*    IS      start-1 of table in SNAMES, /ALCAZA/   
  1269. X*    NS      length of table
  1270. X*--- output 
  1271. X*    NOUT    new table length   
  1272. X*   
  1273. X*-----------------------------------------------------------------------
  1274. X      include 'PARAM.h' 
  1275. X      CHARACTER *(MXNMCH) SLIST(*)  
  1276. X      DIMENSION NACC(*) 
  1277. X      LOGICAL FLACC 
  1278. X      NQ=NS 
  1279. X      IF (NQ.LE.0)  THEN
  1280. X         NOUT=0 
  1281. X      ELSE  
  1282. X         NOUT=1 
  1283. X         DO 10 I=2,NQ   
  1284. X            IF (SLIST(IS+I).NE.SLIST(IS+NOUT))  THEN
  1285. X               NOUT=NOUT+1  
  1286. X               IF (I.NE.NOUT) THEN  
  1287. X                  SLIST(IS+NOUT)=SLIST(IS+I)
  1288. X                  IF(FLACC)  NACC(IS+NOUT)=NACC(IS+I)   
  1289. X               ENDIF
  1290. X            ELSEIF(FLACC)  THEN 
  1291. X               NACC(IS+NOUT)=IOR(NACC(IS+NOUT),NACC(IS+I))  
  1292. X            ENDIF   
  1293. X   10    CONTINUE   
  1294. X      ENDIF 
  1295. X      END   
  1296. /
  1297. echo 'x - SUPMUL.f'
  1298. sed 's/^X//' > SUPMUL.f << '/'
  1299. X      SUBROUTINE SUPMUL(SLIST,NACC,FLACC,IS,NS,NOUT)
  1300. X*-----------------------------------------------------------------------
  1301. X*   
  1302. X*--- suppresses multiple entries in sorted table, update NAMTYP 
  1303. X*   
  1304. X*--- input  
  1305. X*    SLIST     list containing all names
  1306. X*    NACC      array to be re-arranged with sort
  1307. X*    FLACC     if true, NACC is actually updated
  1308. X*    IS      start-1 of table in SNAMES, /ALCAZA/   
  1309. X*    NS      length of table
  1310. X*--- output 
  1311. X*    NOUT    new table length   
  1312. X*   
  1313. X*-----------------------------------------------------------------------
  1314. X      include 'PARAM.h' 
  1315. X      CHARACTER *(MXNMCH) SLIST(*)  
  1316. X      DIMENSION NACC(*) 
  1317. X      LOGICAL FLACC 
  1318. X      NQ=NS 
  1319. X      IF (NQ.LE.0)  THEN
  1320. X         NOUT=0 
  1321. X      ELSE  
  1322. X         NOUT=1 
  1323. X         DO 10 I=2,NQ   
  1324. X            IF (SLIST(IS+I).NE.SLIST(IS+NOUT))  THEN
  1325. X               NOUT=NOUT+1  
  1326. X               IF (I.NE.NOUT) THEN  
  1327. X                  SLIST(IS+NOUT)=SLIST(IS+I)
  1328. X                  IF(FLACC)  NACC(IS+NOUT)=NACC(IS+I)   
  1329. X               ENDIF
  1330. X            ENDIF   
  1331. X   10    CONTINUE   
  1332. X      ENDIF 
  1333. X      END   
  1334. /
  1335. echo 'x - TY2TYP.f'
  1336. sed 's/^X//' > TY2TYP.f << '/'
  1337. X      SUBROUTINE TY2TYP(ISN,STYP)   
  1338. XC! Reduces types of operand to smaller set  
  1339. X      include 'PARAM.h' 
  1340. X      include 'ALCAZA.h' 
  1341. X      include 'CLASS.h' 
  1342. X      include 'STATE.h' 
  1343. X      include 'USINFN.h' 
  1344. X      LOGICAL BTEST 
  1345. XC   
  1346. XC Here we attempt to evaluate the type of a FLOP statement  
  1347. XC 'name' using e.g. generic intrinsic function rules etc.   
  1348. XC   
  1349. X      CHARACTER*(*) STYP
  1350. X      CHARACTER*1 STYPE(7)  
  1351. XC I=integer R=real D=doubleprecision K=complex L=logical C=complex $=aaargh!
  1352. X      DATA STYPE /'I','R','D','K','L','C','$'/  
  1353. X      STYP = STYPE(7)   
  1354. X      DO 10 IR=1,NRNAME 
  1355. X        IF(SNAMES(ISN+ISNAME).NE.SNAMES(IR+IRNAME)) GOTO 10 
  1356. X        NTYP = NAMTYP(IR+IRNAME)
  1357. XC check for generic intrinsic function  
  1358. X        IF(BTEST(NTYP,16)) THEN 
  1359. XC marked as a function  
  1360. X          IFOUN = 0 
  1361. X          LEN = INDEX(SNAMES(IR+IRNAME),' ')-1  
  1362. X          DO 20 INFUN=1,LIF 
  1363. X            IF(CINFUN(INFUN)(:LEN).NE.SNAMES(IR+IRNAME)(:LEN)) GOTO 20  
  1364. X            IF(INFUNG(INFUN).EQ.0) GOTO 20  
  1365. XC generic function  
  1366. X            IFOUN = INFUN   
  1367. X   20     CONTINUE  
  1368. X          IF(IFOUN.NE.0) THEN   
  1369. XC? is this correct ?
  1370. X            STYP = CTYFUN(IFOUN)
  1371. X            RETURN  
  1372. X          ENDIF 
  1373. X        ENDIF   
  1374. X        IF(BTEST(NTYP,0)) THEN  
  1375. X          STYP = STYPE(1)   
  1376. X          RETURN
  1377. X        ELSE IF(BTEST(NTYP,1)) THEN 
  1378. X          STYP = STYPE(2)   
  1379. X          RETURN
  1380. X        ELSE IF(BTEST(NTYP,3)) THEN 
  1381. X          STYP = STYPE(4)   
  1382. X          RETURN
  1383. X        ELSE IF(BTEST(NTYP,4)) THEN 
  1384. X          STYP = STYPE(3)   
  1385. X          RETURN
  1386. X        ELSE IF(BTEST(NTYP,2)) THEN 
  1387. X          STYP = STYPE(5)   
  1388. X          RETURN
  1389. X        ELSE IF(BTEST(NTYP,5)) THEN 
  1390. X          STYP = STYPE(6)   
  1391. X          RETURN
  1392. X        ENDIF   
  1393. X        RETURN  
  1394. X   10 CONTINUE  
  1395. X      RETURN
  1396. X      END   
  1397. /
  1398. echo 'x - floppy.vmscld'
  1399. sed 's/^X//' > floppy.vmscld << '/'
  1400. X DEFINE VERB FLOPPY
  1401. X        IMAGE "CERN$CERNEXE:FLOPPY.EXE"
  1402. X        PARAMETER P1,PROMPT="Input FORTRAN file", VALUE(TYPE=$FILE, REQUIRED)
  1403. X        QUALIFIER OLD, VALUE(TYPE=$FILE)
  1404. X        QUALIFIER CHECKS, VALUE(LIST,TYPE=$NUMBER),DEFAULT
  1405. X        QUALIFIER FORTRAN, VALUE(TYPE=$FILE,DEFAULT="FORTRAN.FOR")
  1406. X        QUALIFIER OUTPUT, VALUE(TYPE=$FILE), BATCH
  1407. X        QUALIFIER LOG, DEFAULT
  1408. X        QUALIFIER SPECIAL, VALUE(TYPE=NAMES,DEFAULT="STANDARD"),NONNEGATABLE
  1409. X        QUALIFIER IGNORE, VALUE(LIST), NONNEGATABLE
  1410. X        QUALIFIER FULL, NONNEGATABLE
  1411. X        QUALIFIER TREE, NONNEGATABLE
  1412. X        QUALIFIER TIDY, NONNEGATABLE
  1413. X        QUALIFIER INDENT, VALUE(TYPE=$NUMBER,DEFAULT="3"), NONNEGATABLE
  1414. X        QUALIFIER GROUPF, NONNEGATABLE
  1415. X        QUALIFIER FORMAT, VALUE(LIST,TYPE=RANGE,REQUIRED), NONNEGATABLE
  1416. X        QUALIFIER STMNTS, VALUE(LIST,TYPE=RANGE,REQUIRED), NONNEGATABLE
  1417. X        QUALIFIER GOTOS, NONNEGATABLE
  1418. X        DISALLOW  SPECIAL AND CHECKS
  1419. X        DISALLOW ((OLD OR OUTPUT OR FULL OR SPECIAL OR IGNORE) AND NEG CHECKS)
  1420. X        DISALLOW  TIDY AND NOT (FORTRAN OR INDENT OR GROUPF OR FORMAT OR STMNTS OR GOTOS)
  1421. X        DISALLOW  (FORMAT.STEP AND NOT FORMAT.START)
  1422. X        DISALLOW  (FORMAT.START AND NOT FORMAT.STEP)
  1423. X        DISALLOW  (STMNTS.STEP AND NOT STMNTS.START)
  1424. X        DISALLOW  (STMNTS.START AND NOT STMNTS.STEP)
  1425. X        DISALLOW  (FORTRAN OR INDENT OR GROUPF OR FORMAT OR STMNTS OR GOTOS) AND NOT TIDY
  1426. XDEFINE TYPE NAMES
  1427. X        KEYWORD STANDARD, DEFAULT
  1428. X        KEYWORD ALEPH
  1429. X        KEYWORD GALEPH
  1430. X        KEYWORD ONLINE
  1431. XDEFINE TYPE RANGE
  1432. X        KEYWORD START, VALUE(TYPE=$NUMBER)
  1433. X        KEYWORD STEP, VALUE(TYPE=$NUMBER)
  1434. /
  1435. echo 'Part 10 of Floppy complete.'
  1436. exit
  1437.  
  1438.  
  1439.