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

  1. Newsgroups: comp.sources.misc
  2. organization: CERN, Geneva, Switzerland
  3. keywords: fortran
  4. subject: v12i092: Floppy - Fortran Coding Convention Checker Part 06/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 92
  9. Submitted-by: julian@cernvax.cern.ch (julian bunn)
  10. Archive-name: ffccc/part06
  11.  
  12. #!/bin/sh
  13. echo 'Start of Floppy, part 06 of 11:'
  14. echo 'x - COMRUL.f'
  15. sed 's/^X//' > COMRUL.f << '/'
  16. X      SUBROUTINE COMRUL 
  17. X      include 'CHECKS.h' 
  18. X      CCHECK(1) ='Avoid comment lines after end of program unit'
  19. X      CCHECK(2) ='End all program program units with the END statement' 
  20. X      CCHECK(3) =   
  21. X     & 'Declared COMMON blocks must be used in the program unit'
  22. X      CCHECK(4) ='COMPLEX and DOUBLEPRECISION vars at end of COMMON'
  23. X      CCHECK(5) ='COMMON block definitions should not change'   
  24. X      CCHECK(6) ='Variable names should be 6 or fewer characters long'  
  25. X      CCHECK(7) ='Variables in COMMON should be 6 characters long'  
  26. X      CCHECK(8) ='Variables not in COMMON should be <6 characters'  
  27. X      CCHECK(9) ='Integer variables should begin with I to N'   
  28. X      CCHECK(10)='Variable names should not equal FORTRAN keywords' 
  29. X      CCHECK(11)='Avoid comment lines before header line'   
  30. X      CCHECK(12)=   
  31. X     &'Program unit names should not equal intrinsic function names'
  32. X      CCHECK(13)=   
  33. X     &'First statement in a program unit should be header line' 
  34. X      CCHECK(14)=   
  35. X     &'Program unit should begin with at least 3 comment lines' 
  36. X      CCHECK(15)='Comment lines should begin with a C'  
  37. X      CCHECK(16)='No comment lines between continuations'   
  38. X      CCHECK(17)='Avoid non-standard variable types eg INTEGER*2'   
  39. X      CCHECK(18)='Avoid multiple COMMON definitions per line'   
  40. X      CCHECK(19)='Do not dimension COMMON variables outside COMMON' 
  41. X      CCHECK(20)='Avoid embedded blanks in variable names'  
  42. X      CCHECK(21)='Avoid embedded blanks in syntactic entities'  
  43. X      CCHECK(22)='Avoid the use of PRINT statements (use WRITE)'
  44. X      CCHECK(23)='Do not give the END statement a label'
  45. X      CCHECK(24)='Avoid WRITE(* construction'   
  46. X      CCHECK(25)='Avoid WRITE statement in a FUNCTION'  
  47. X      CCHECK(26)='Avoid the use of PAUSE statements'
  48. X      CCHECK(27)='Statement labels should not begin in column 1'
  49. X      CCHECK(28)='Always precede STOP by a descriptive WRITE'   
  50. X      CCHECK(29)='Avoid the use of ENTRY in FUNCTIONS'  
  51. X      CCHECK(30)='Avoid using I/O in FUNCTIONs' 
  52. X      CCHECK(31)='Avoid the use of the alternate RETURN statement'  
  53. X      CCHECK(32)='COMMON block names should not equal variable names'   
  54. X      CCHECK(33)='Avoid use of obsolete CERN library routines'  
  55. X      CCHECK(34)='Avoid FUNCTION names the same as intrinsics'  
  56. X      CCHECK(35)='Local functions should be declared EXTERNAL'  
  57. X      CCHECK(36)='program unit names should all be different'   
  58. X      CCHECK(37)='Avoid expressions of mixed mode eg A=B/I' 
  59. X      CCHECK(38)='Length of passed CHARACTER variables should be *' 
  60. X      CCHECK(39)='Order of statements should conform to note'   
  61. X      CCHECK(40)='Separate Statement Functions by comment lines'
  62. X      CCHECK(41)='No names in Statement Function definitions elsewhere' 
  63. X      CCHECK(42)='Use LLT,LGT etc to compare CHARACTER vars. in IFs'
  64. X      CCHECK(43)='Variables (not COMMON, not PARAMs) <6 characters' 
  65. X      CCHECK(44)=   
  66. X     & 'Passed arguments should be dimensioned * in program unit'   
  67. X      DO 1 IRULE=45,MCHEKS  
  68. X        CCHECK(IRULE) ='$$$$'   
  69. X        LCHECK(IRULE) =.FALSE.  
  70. X    1 CONTINUE  
  71. X      RETURN
  72. X      END   
  73. /
  74. echo 'x - MATCH.f'
  75. sed 's/^X//' > MATCH.f << '/'
  76. X      SUBROUTINE MATCH(SEARCH,IMC1,IMC2,STATEM,ICC1,ICC2, HOLFLG,KPOSM, 
  77. X     +ILEVEL,NSPEC,KSPEC1,KSPEC2)   
  78. X*-----------------------------------------------------------------------
  79. X*   
  80. X* matches two strings   
  81. X*   
  82. X* blanks outside strings are ignored in STATEM  
  83. X*   
  84. X* input 
  85. X* SEARCH      string (possibly with special symbols) to be matched  
  86. X*             special symbols and their meanings are :  
  87. X*             @  ( commercial at  )     numeric string  
  88. X*             &  ( ampersand )          alphabetic string   
  89. X*             $  ( dollar )             alphanumeric string 
  90. X*             #  ( hash )               any string ( including null )   
  91. X*             ?  ( questionmark )       FORTRAN name type ( length not  
  92. X*                                                          limited) 
  93. X*             !  ( exclam. mark )       expression (no [,] at level 0)  
  94. X*             >)                        string up to open bracket level 
  95. X*             ;  (semicolon)            nothing must follow, i.e.   
  96. X*                                       ICC2 must be last matched ch.   
  97. X* IMC1        first ch. in SEARCH   
  98. X* IMC2        last ch. in SEARCH
  99. X* STATEM      input string (typically a statement)  
  100. X* ICC1        first ch. in STATEM   
  101. X* ICC2        last ch. in STATEM
  102. X* HOLFLG      if TRUE, hollerith included in STATEM 
  103. X* output
  104. X* KPOSM       position of last ch. in STATEM for first fit of SEARCH.   
  105. X*             if last ch. in SEARCH is a special ch.( as above),
  106. X*             the match will be performed to the ENDC of that type. 
  107. X*             KPOSM = 0 in case of no match 
  108. X* ILEVEL      round bracket level relative to input level 0, at KPOS
  109. X* NSPEC       no. of special ch. encountered in SEARCH  
  110. X* KSPEC1(i)   start of i-th special ch. corresp. string in STATEM   
  111. X* KSPEC2(i)   end   -  -     -      -     -        -    -   -   
  112. X*             attention: KSPEC2(i) < KSPEC1(i) for null string match
  113. X*   
  114. X*-----------------------------------------------------------------------
  115. X      DIMENSION KSPEC1(*),KSPEC2(*) 
  116. X      LOGICAL HOLFLG,FREE,EVER,POSIT
  117. X      CHARACTER SEARCH*(*),STATEM*(*),STEMP*1,STEMP1*1  
  118. X      include 'CONVEX.h' 
  119. X      KPOSM=0   
  120. X      ILEVEL=0  
  121. X      NSPEC=0   
  122. X*--- INSTR = string indicator for SEARCH, ISSTR for STATEM  
  123. X      INSTR=0   
  124. X      ISSTR=0   
  125. X      FREE=.FALSE.  
  126. X      EVER=.FALSE.  
  127. X*--- KSTR is the current ch. pos. in STATEM 
  128. X      KSTR=ICC1 
  129. X      KEEP=ICC2 
  130. X      JC=IMC1-1 
  131. X*--- loop over characters in 'SEARCH' string
  132. X*--- exits are: 
  133. X*                 10   continue looping 
  134. X*                 30   match exit   
  135. X*                 40   nomatch exit 
  136. X   10 JC=JC+1   
  137. X      IF (JC.GT.IMC2) GOTO 30   
  138. X      STEMP=SEARCH(JC:JC)   
  139. X      IF(STEMP.EQ.'''')  INSTR=1-INSTR  
  140. X      IF(INSTR.EQ.0)  THEN  
  141. X*--- not inside quotes  
  142. X         IF (STEMP.EQ.';')  THEN
  143. X*--- matches if nothing follows in STATEM   
  144. X            IF (KSTR.GT.ICC2)  THEN 
  145. X               GOTO 30  
  146. X            ENDIF   
  147. X            GOTO 40 
  148. X         ENDIF  
  149. X         IF (KSTR.GT.ICC2)  THEN
  150. X            IF (STEMP.EQ.'#'.AND.JC.EQ.IMC2)  THEN  
  151. X*--- '#' at end of SEARCH string
  152. X               NSPEC=NSPEC+1
  153. X               KSPEC1(NSPEC)=KSTR   
  154. X               FREE=.TRUE.  
  155. X               GOTO 30  
  156. X            ENDIF   
  157. X            GOTO 40 
  158. X         ENDIF  
  159. X*   
  160. X*--- for '#' and '>)', move the pointer forward 
  161. X*   
  162. X         IF (STEMP.EQ.'#')  THEN
  163. X*--- any string, including null 
  164. X            JCFREE=JC   
  165. X            FREE=.TRUE. 
  166. X            EVER=.TRUE. 
  167. X            NSPEC=NSPEC+1   
  168. X            NSPECK=NSPEC
  169. X            KSPEC1(NSPEC)=KSTR  
  170. X            GOTO 10 
  171. X         ELSEIF (STEMP.EQ.'>')  THEN
  172. X*---  look for ')' (level jump) 
  173. X            IF (JC.EQ.IMC2) GOTO 40 
  174. X            IF (SEARCH(JC+1:JC+1).NE.')')GOTO 40
  175. X*--- ')' is next character - perform level jump 
  176. X            CALL SKIPLV(STATEM,KSTR,ICC2,HOLFLG,KPOS,ILEV)  
  177. X            IF (KPOS.EQ.0)  THEN
  178. X               IF (EVER)  THEN  
  179. X                  JC=JCFREE 
  180. X                  FREE=.TRUE.   
  181. X                  KSTR=KEEP+1   
  182. X                  GOTO 10   
  183. X               ENDIF
  184. X               GOTO 40  
  185. X            ENDIF   
  186. X            NSPEC=NSPEC+1   
  187. X            KSPEC1(NSPEC)=KSTR  
  188. X            KSTR=KPOS   
  189. X            KSPEC2(NSPEC)=KPOS-1
  190. X            GOTO 10 
  191. X         ENDIF  
  192. X*   
  193. X*--- set ITYPE to indicate normal ch. (0) or special
  194. X*   
  195. X         ITYPE=INDEX(SPCHAR,STEMP)  
  196. X      ELSE  
  197. X*--- inside quotes in SEARCH - treat as normal  
  198. X         ITYPE=0
  199. X      ENDIF 
  200. X      POSIT=.FALSE. 
  201. X      IF(FREE)  THEN
  202. X*--- look for STEMP further upstream
  203. X         FREE=.FALSE.   
  204. X         POSIT=.TRUE.   
  205. X         IF (ITYPE.EQ.0)  THEN  
  206. X*--- normal character   
  207. X            CALL POSCH(STEMP,STATEM,KSTR,ICC2,HOLFLG,9999,KPOS,ILEV)
  208. X         ELSE   
  209. X*--- special character  
  210. X            CALL CHRTYP(ITYPE,STATEM,KSTR,ICC2,HOLFLG,KPOS,ILEV)
  211. X         ENDIF  
  212. X*--- no match if not found  
  213. X         IF (KPOS.EQ.0) GOTO 40 
  214. X         KEEP=KPOS  
  215. X         KSTR=KPOS  
  216. X         ILEVEL=ILEVEL+ILEV 
  217. X         KSPEC2(NSPEC)=KPOS-1   
  218. X*--- following ENDIF for IF FREE
  219. X      ENDIF 
  220. X*   
  221. X*--- now STEMP must match, or be special
  222. X*   
  223. X      IF(ITYPE.EQ.0)  THEN  
  224. X*--- normal 
  225. X   20    CONTINUE   
  226. X         IF (KSTR.GT.ICC2) GOTO 40  
  227. X         STEMP1=STATEM(KSTR:KSTR)   
  228. X*--- skip blanks  outside strings   
  229. X         IF (STEMP1.EQ.' '.AND.ISSTR.EQ.0)  THEN
  230. X            KSTR=KSTR+1 
  231. X            GOTO 20 
  232. X         ELSEIF (STEMP1.EQ.'{')  THEN   
  233. X*--- start of character string  
  234. X            IF (HOLFLG)  THEN   
  235. X*--- strings are included in match  
  236. X               KSTR=KSTR+1  
  237. X               ISSTR=1  
  238. X            ELSE
  239. X*--- skip over string   
  240. X               I=INDEX(STATEM(KSTR:ICC2),'}')   
  241. X               IF (I.EQ.0) GOTO 40  
  242. X               KSTR=I+KSTR  
  243. X            ENDIF   
  244. X            GOTO 20 
  245. X         ELSEIF (STEMP1.EQ.'}')  THEN   
  246. X*--- skip   
  247. X            KSTR=KSTR+1 
  248. X            ISSTR=0 
  249. X            GOTO 20 
  250. X         ENDIF  
  251. X*--- now match STEMP and STEMP1 
  252. X         IF (STEMP.EQ.STEMP1)  THEN 
  253. X            KSTR=KSTR+1 
  254. X            IF (.NOT.POSIT)  THEN   
  255. X               IF (STEMP.EQ.'(')  THEN  
  256. X                  ILEVEL=ILEVEL+1   
  257. X               ELSEIF (STEMP.EQ.')')  THEN  
  258. X                  ILEVEL=ILEVEL-1   
  259. X               ENDIF
  260. X            ENDIF   
  261. X            GOTO 10 
  262. X         ELSE   
  263. X*--- try further upstream if possible   
  264. X            IF (EVER)  THEN 
  265. X               JC=JCFREE
  266. X               FREE=.TRUE.  
  267. X               KSTR=KEEP+1  
  268. X               NSPEC=NSPECK 
  269. X               GOTO 10  
  270. X            ENDIF   
  271. X            GOTO 40 
  272. X         ENDIF  
  273. X      ELSE  
  274. X*--- string of type ITYPE   
  275. X         CALL SKIPTP(ITYPE,STATEM,KSTR,ICC2,.FALSE.,KPOS,ILEV)  
  276. X         IF (KPOS.EQ.0)  THEN   
  277. X            IF (EVER)  THEN 
  278. X               JC=JCFREE
  279. X               KSTR=KEEP+1  
  280. X               NSPEC=NSPECK 
  281. X               FREE=.TRUE.  
  282. X               GOTO 10  
  283. X            ENDIF   
  284. X            GOTO 40 
  285. X         ELSE   
  286. X*--- KPOS ne 0, i.e. found  
  287. X            NSPEC=NSPEC+1   
  288. X            KSPEC1(NSPEC)=KSTR  
  289. X            KSPEC2(NSPEC)=KPOS  
  290. X            KSTR=KPOS+1 
  291. X            ILEVEL=ILEVEL+ILEV  
  292. X            GOTO 10 
  293. X         ENDIF  
  294. X      ENDIF 
  295. X   30 CONTINUE  
  296. X*--- when arriving here, strings do match   
  297. X      IF (FREE)  THEN   
  298. X         KPOSM=ICC2 
  299. X         KSPEC2(NSPEC)=ICC2 
  300. X      ELSE  
  301. X         KPOSM=KSTR-1   
  302. X      ENDIF 
  303. X   40 CONTINUE  
  304. X      END   
  305. /
  306. echo 'x - README'
  307. sed 's/^X//' > README << '/'
  308. XInstructions for Installing Floppy
  309. X----------------------------------
  310. X
  311. XFloppy is a Fortran Coding Convention Checker and Fortran
  312. Xcode tidier. Floppy understands standard Fortran 77 code.
  313. XThe user may specify any combination of a total of 44
  314. Xdifferent coding conventions. These are described fully 
  315. Xin the Floppy guide, which comes as a PostScript file in
  316. Xthe posting. (I also include the list of checks at the
  317. Xend of this article, those marked with an asterisk 
  318. Xcorrespond to what we consider to be a "standard" set.)
  319. XUsers may tidy their code by renumbering all
  320. Xstatement labels, renumbering all FORMAT statements, 
  321. Xindenting DO and IF clauses, right-adjusting GOTOs and
  322. Xby moving all FORMAT statements to the end of each program
  323. Xmodule. Any combination of these tidy options is possible.
  324. X
  325. XFloppy was initially written for VMS systems. The posting
  326. Xincludes routines and execs that allow Floppy to be built
  327. Xfor VM/CMS, VAX/VMS and Unix systems. The procedure for
  328. Xeach system is described briefly below. 
  329. X
  330. XFloppy was written by Julian Bunn and Hans Grote, at the
  331. XEuropean Centre for Particle Physics in Geneva, Switzerland.
  332. X
  333. XFirst Steps
  334. X-----------
  335. X
  336. XEach part of the posting should be saved into a
  337. Xdirectory called "floppy". The mail headers should be
  338. Xremoved from each part and then each part
  339. Xshould be executed as a script (Floppy was packed using
  340. Xthe Packmail utility on a VMS Ultrix system).
  341. X
  342. XThere is a document in PostScript form, called "floppy.ps", 
  343. Xwhich describes in detail how Floppy works and is used on
  344. XUltrix, VAX/VMS and VM/CMS systems.
  345. X
  346. XPlease read the file called "copyright".
  347. X
  348. XPlease also note that the source code for Floppy does
  349. XNOT necessarily conform to the coding conventions it
  350. Xitself checks ! You may draw whatever conclusions you
  351. Xwish from this fact !
  352. X
  353. XInstalling on Unix Systems
  354. X--------------------------
  355. X1)  After unpacking the source files, you should type "make".
  356. X2)  If your Fortran compiler is not called "f77" then you
  357. X    should first edit the file called "makefile" accordingly. 
  358. X
  359. XAs installation has not been checked on many Unix
  360. Xplatforms, you may also have to fiddle a bit with the
  361. Xmakefile, and possibly with the syntax of the "include"
  362. Xdirectives in the .f files.
  363. X
  364. XThe "man" page for Floppy is called "floppy.l". 
  365. X
  366. XInstalling on VMS Systems
  367. X-------------------------
  368. X1)  Copy all the .f and .h files to your VMS system. 
  369. X2)  Copy also the files "floppy.vmsfor","floppy.vmshlp", 
  370. X    and "floppy.vmscld".
  371. X3)  Remove the file "floppy.f", and replace it with the
  372. X    "floppy.vmsfor" file. 
  373. X4)  You will then have to edit all the "include" directives 
  374. X    in the .f files to correspond with the VMS syntax. 
  375. X    (If you're handy with "awk", you can probably do this 
  376. X    already on your Unix machine.)
  377. X5)  You should also edit PARAM.h so that MCUNIT=5. 
  378. X6)  Then compile the Fortran files, and link them together.
  379. X    No libraries should be required. 
  380. X7)  Take the "floppy.vmscld" file, edit it so that the 
  381. X    image name is correct for your .EXE, and save it as 
  382. X    "floppy.cld". 
  383. X8)  Then type "$ set command floppy". 
  384. X9)  Refer to the VMS help file in "floppy.vmshlp" for the 
  385. X    syntax of the command. 
  386. X
  387. XTo make Floppy available for all users on your VMS system, you
  388. Xwill need privilege to update DCLTABLES with the
  389. X"set command" command.
  390. X
  391. XInstalling on VM/CMS
  392. X--------------------
  393. X1)  Copy all the .f and .h files to your CMS minidisk. 
  394. X2)  Remove the "floppy.f" file.
  395. X3)  Make one big file out of all the .f files. 
  396. X4)  Copy also the files "floppy.rexx" (call it "floppy exec"),
  397. X    "floppy.panel" (call it "floppy panel"), and "floppy.helpcms"
  398. X    (call it "floppy helpcms").
  399. X5)  You will then have to edit all the "include" directives 
  400. X    to correspond with the CMS MACLIB syntax. 
  401. X    (If you're handy with "awk", you can probably do this already 
  402. X    on your Unix machine.)
  403. X6)  Create a CMS MACLIB, and place all the .h files in it.
  404. X7)  Issue the GLOBAL MACLIB command to make the MACLIB available.
  405. X8)  Edit PARAM.h so that MCUNIT=5. 
  406. X9)  Then compile the Fortran, and load it. 
  407. X    No libraries should be required. 
  408. X10) Generate a LOAD module called FLOPPY$M using the GENMOD
  409. X    command. 
  410. X
  411. XNote that, for full-screen interaction, you need
  412. Xthe IOS3270 Program Offering from IBM. But Floppy also
  413. Xworks in command line mode. Refer to the HELPCMS file
  414. Xfor details.
  415. X
  416. XDisclaimer
  417. X----------
  418. XAlthough Floppy has been in constant use for some years at
  419. XCERN, we make no guarantees of its correctness or "buglessness".
  420. XIf you manage to port Floppy to another platform, I would be
  421. Xvery interested to hear details. Unfortunately, I cannot assist
  422. Xin any way with such exercises. Please read the file called
  423. X"copyright" in the posting.
  424. X
  425. X-------------------------------------------------------------------
  426. X
  427. XJulian Bunn
  428. XComputing and Networks Division
  429. XCERN
  430. XGeneva
  431. XSwitzerland
  432. XTel. 767 50 29
  433. X14th. May 1990
  434. X
  435. XList of Coding Conventions in Floppy
  436. X
  437. X*  1   Avoid comment lines after end of module
  438. X*  2   End all program modules with the END statement
  439. X*  3   Declared COMMON blocks must be used in the module
  440. X*  4   COMPLEX and DOUBLEPRECISION vars at end of COMMON
  441. X*  5   COMMON block definitions should not change
  442. X*  6   Variable names should be 6 or fewer characters long
  443. X   7   Variables in COMMON should be 6 characters long
  444. X   8   Variables not in COMMON should be <6 characters
  445. X*  9   Integer variables should begin with I to N
  446. X*  10  Variable names should not equal FORTRAN keywords
  447. X*  11  Avoid comment lines before module declaration
  448. X*  12  Module names should not equal intrinsic functions
  449. X*  13  First statement in a module should be declaration
  450. X*  14  Module should begin with at least 3 comment lines
  451. X   15  Comment lines should begin with a C
  452. X*  16  No comment lines between continuations
  453. X*  17  Avoid non-standard variable types eg INTEGER*2
  454. X*  18  Avoid multiple COMMON definitions per line
  455. X*  19  Do not dimension COMMON variables outside COMMON
  456. X*  20  Avoid embedded blanks in variable names
  457. X*  21  Avoid embedded blanks in syntactic entities
  458. X*  22  Avoid the use of PRINT statements (use WRITE)
  459. X   23  Do not give the END statement a label
  460. X*  24  Avoid WRITE(* construction
  461. X   25  Avoid WRITE statement in a FUNCTION
  462. X*  26  Avoid the use of PAUSE statements
  463. X*  27  Statement labels should not begin in column 1
  464. X*  28  Always preceede STOP by a descriptive WRITE
  465. X*  29  Avoid the use of ENTRY in FUNCTIONS
  466. X*  30  Avoid using I/O in FUNCTIONs
  467. X   31  Avoid the use of the alternate RETURN statement
  468. X*  32  COMMON block names should not equal variable names
  469. X*  33  Avoid use of obsolete CERN library routines
  470. X   34  Avoid FUNCTION names the same as intrinsics
  471. X*  35  Local functions should be declared EXTERNAL
  472. X*  36  Module names should all be different
  473. X*  37  Avoid expressions of mixed mode eg A=B/I
  474. X*  38  Length of passed CHARACTER variables should be *
  475. X*  39  Order of statements should conform !
  476. X*  40  Separate Statement Functions by comment lines
  477. X*  41  No names in Statement Function definitions elsewhere
  478. X   42  Use LLT,LGT etc to compare CHARACTER vars. in IFs
  479. X   43  Variables (not COMMON, not PARAMs) <6 characters
  480. X*  44  Passed arguments should be dimensioned * in module
  481. /
  482. echo 'x - UTINIT.f'
  483. sed 's/^X//' > UTINIT.f << '/'
  484. X      SUBROUTINE UTINIT 
  485. X*-----------------------------------------------------------------------
  486. X*   
  487. X*--- user total initialization  
  488. X*   
  489. X*-----------------------------------------------------------------------
  490. X      include 'PARAM.h' 
  491. X      include 'ALCAZA.h' 
  492. X      include 'CLASS.h' 
  493. X      include 'CURSTA.h' 
  494. X      include 'FLWORK.h' 
  495. X      include 'KEYCOM.h' 
  496. X      include 'TYPDEF.h' 
  497. X      include 'JOBSUM.h' 
  498. X      include 'STATE.h' 
  499. X      include 'FLAGS.h' 
  500. X      include 'USIGNO.h' 
  501. X      include 'USLIST.h' 
  502. X      include 'USGCOM.h' 
  503. X      include 'USSTMT.h' 
  504. X      include 'USUNIT.h' 
  505. X      include 'CHECKS.h' 
  506. X      CHARACTER*80 CARD 
  507. X      PARAMETER(ISTCHK=35,IALCHK=40)
  508. X      INTEGER NSTCHK(ISTCHK)
  509. X      INTEGER NALCHK(IALCHK)
  510. X      DATA NSTCHK /1,2,3,4,5,6,9,10,11,12,13,14,16,17,18,19,20,21,  
  511. X     &             22,24,26,27,28,29,30,32,33,35,36,37,38,39,40,41,44/  
  512. X      DATA NALCHK /1,2,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19, 
  513. X     &             20,21,22,23,24,26,27,28,29,30,31,32,33,34,36,37, 
  514. X     &             38,39,40,41,42,43,44/
  515. X      NFIOLD = 0
  516. X      NFAULT = 0
  517. X      USFULL = .FALSE.  
  518. X      RPROCS = .TRUE.   
  519. X      UNFLP = .FALSE.   
  520. X      NGCON = 0 
  521. X      NGCOT = 0 
  522. X      WRITE(MPUNIT,500) 
  523. XC   
  524. XC Start of process ... define FORTRAN intrinsics
  525. X      CALL DEFINF   
  526. XC   
  527. XC Define comments for each rule 
  528. X      CALL COMRUL   
  529. XC   
  530. XC Check for USERs list of variables to be ignored in checks.
  531. X      NIGNOR = 0
  532. X      NIGNOS = 0
  533. X      DO 10 I=1,MXIGNV  
  534. X         CIGNOR(I) = '        ' 
  535. X         LIGNOR(I) = 0  
  536. X   10 CONTINUE  
  537. X      DO 20 I=1,MXIGNS  
  538. X         CIGNOS(I) = '        ' 
  539. X         LIGNOS(I) = 0  
  540. X   20 CONTINUE  
  541. X      DO 30 I=1,MCHEKS  
  542. X         LCHECK(I) = .FALSE.
  543. X   30 CONTINUE  
  544. X      GALEPH = .FALSE.  
  545. X      ISTAN = 0 
  546. X      IALEP = 0 
  547. X   40 READ(MUUNIT,510,ERR=70,END=70) CARD   
  548. X      ICHAR = 0 
  549. X      LSUB = 0  
  550. X      LVAR = 0  
  551. X      DO 50 I=1,MXLINE-1
  552. X         IF(CARD(I:I).EQ.' ')                                    GOTO 50
  553. X         IF(CARD(I:I).EQ.'*') THEN  
  554. XC SPECIAL PROGRAM   
  555. X            IF(INDEX(CARD,'GALEPH').NE.0) GALEPH = .TRUE.   
  556. XC FULL LIST OF SOURCE WITH LINE NUMBERS 
  557. X            IF(INDEX(CARD,'FULL').NE.0) USFULL = .TRUE. 
  558. XC CHECK FOR JUST FLOP   
  559. X            IF(INDEX(CARD,'NOFLOPPY').NE.0) UNFLP = .TRUE.  
  560. XC CHECK FOR INTERACTIVE RULE SPECIFICATION  
  561. X            IF(INDEX(CARD,'SPECIFY RULE').NE.0) CALL SPERUL 
  562. XC CHECK FOR ALEPH RULES 
  563. X            IF(INDEX(CARD,'ALEPH').NE.0) THEN   
  564. X               IALEP = 1
  565. X               DO 333 IA=1,IALCHK   
  566. X                  LCHECK(NALCHK(IA)) = .TRUE.   
  567. X  333          CONTINUE 
  568. X            ENDIF   
  569. XC CHECK FOR RULE NUMBER 
  570. X            IF(INDEX(CARD,'*CHECK RULE').NE.0) THEN 
  571. X               LOCE = INDEX(CARD,'*CHECK RULE')+12  
  572. X               IF(CARD(LOCE:LOCE).EQ.'*') THEN  
  573. XC CHECK STANDARD SET
  574. X                 ISTAN=1
  575. X                 DO 61 IR=1,ISTCHK  
  576. X                   LCHECK(NSTCHK(IR)) = .TRUE.  
  577. X   61            CONTINUE   
  578. X                 GOTO 60
  579. X               ENDIF
  580. X               READ(CARD(LOCE:LOCE+2),'(I3)') IRULE 
  581. X               IF(IRULE.EQ.99) THEN 
  582. X                  DO 777 IC=1,MCHEKS
  583. X                     LCHECK(IC)=.TRUE.  
  584. X  777             CONTINUE  
  585. X               ELSE IF(IRULE.EQ.-99) THEN   
  586. X                  DO 888 IC=1,MCHEKS
  587. X                     LCHECK(IC)=.FALSE. 
  588. X  888             CONTINUE  
  589. X               ELSE IF(IRULE.GE.1.AND.IRULE.LE.MCHEKS) THEN 
  590. X                  LCHECK(IRULE) = .TRUE.
  591. X               ELSE IF (IRULE.LT.0.AND.IRULE.GE.-MCHEKS) THEN   
  592. X                  LCHECK(IABS(IRULE)) = .FALSE. 
  593. X               ELSE 
  594. X                  WRITE(MPUNIT,580) CARD(LOCE:LOCE+2)   
  595. X               ENDIF
  596. X            ENDIF   
  597. X                                                                 GOTO 60
  598. X         ENDIF  
  599. X         ICHAR = ICHAR + 1  
  600. X         IF(ICHAR.GT.MXNMCH)                                     GOTO 60
  601. X         IF(ICHAR.EQ.1.AND.CARD(I:I).NE.'#') THEN   
  602. X            NIGNOR = NIGNOR + 1 
  603. X            IF(NIGNOR.GT.MXIGNV) THEN   
  604. X               WRITE(MPUNIT,520) MXIGNV 
  605. X                                                                 GOTO 70
  606. X            ENDIF   
  607. X            LVAR = 1
  608. X         ELSEIF (ICHAR.EQ.1.AND.CARD(I:I).EQ.'#') THEN  
  609. X            NIGNOS = NIGNOS + 1 
  610. X            IF(NIGNOS.GT.MXIGNS) THEN   
  611. X               WRITE(MPUNIT,560) MXIGNS 
  612. X                                                                 GOTO 70
  613. X            ENDIF   
  614. X            LSUB = 1
  615. X                                                                 GOTO 50
  616. X         ENDIF  
  617. X         IF(LVAR.EQ.1) THEN 
  618. X            CIGNOR(NIGNOR)(ICHAR:ICHAR) = CARD(I:I) 
  619. X            LIGNOR(NIGNOR) = ICHAR  
  620. X            IF(CARD(I+1:I+1).EQ.' ')                             GOTO 60
  621. X         ELSE IF(LSUB.EQ.1) THEN
  622. X            CIGNOS(NIGNOS)(ICHAR-1:ICHAR-1) = CARD(I:I) 
  623. X            LIGNOS(NIGNOS) = ICHAR-1
  624. X            IF(CARD(I+1:I+1).EQ.' ')                             GOTO 60
  625. X         ENDIF  
  626. X   50 CONTINUE  
  627. X   60 CONTINUE  
  628. X                                                                 GOTO 40
  629. XC   
  630. X   70 CONTINUE  
  631. X      NCHK = 0  
  632. X      DO 71 IR=1,MCHEKS 
  633. X        IF(.NOT.LCHECK(IR)) GOTO 71 
  634. X        IF(CCHECK(IR)(:4).EQ.'$$$$') GOTO 71
  635. X        NCHK = NCHK + 1 
  636. X        WRITE(MPUNIT,543) IR,CCHECK(IR) 
  637. X   71 CONTINUE  
  638. X      IF(NCHK.EQ.0) WRITE(MPUNIT,544)   
  639. X      IF(UNFLP) WRITE(MPUNIT,542)   
  640. X      IF(ISTAN.EQ.1) WRITE(MPUNIT,545)  
  641. X      IF(IALEP.EQ.1) WRITE(MPUNIT,585)  
  642. X      IF(NIGNOR.NE.0) THEN  
  643. X         WRITE(MPUNIT,530) NIGNOR,(CIGNOR(II),II=1,NIGNOR)  
  644. X      ENDIF 
  645. X      IF(NIGNOS.NE.0) THEN  
  646. X         WRITE(MPUNIT,570) NIGNOS,(CIGNOS(II),II=1,NIGNOS)  
  647. X      ENDIF 
  648. X      IF(GALEPH) WRITE(MPUNIT,540)  
  649. X      IF(USFULL) WRITE(MPUNIT,550)  
  650. X  500 FORMAT(/,'NB Check that your source compiles before using FLOPPY!',   
  651. X     +       /,'   The quoted line numbers start at 1 and step by 1 in',
  652. X     +         ' the source file.', 
  653. X     +       /,'   Non-standard F77 statements are treated as Comments!',   
  654. X     +       /,'   This includes ALL LOWER CASE not in strings.')   
  655. X  510 FORMAT(A80)   
  656. X  520 FORMAT(1X,'MAXIMUM OF ',I3,' IGNORABLE NAMES EXCEEDED')   
  657. X  530 FORMAT(1X,20('+'),' YOU HAVE CHOSEN TO IGNORE',I3,
  658. X     +' VARIABLES. THEIR NAMES FOLLOW',/,(2X,A))
  659. X  540 FORMAT(//,1X,20('+'),' SPECIAL PROCESSING FOR   G A L E P H  !',/)
  660. X  550 FORMAT(//,1X,20('+'),' FULL SOURCE LISTING WITH LINE NUMBERS !',/)
  661. X  560 FORMAT(1X,'MAXIMUM OF ',I3,' IGNORABLE SUBROUTINES EXCEEDED') 
  662. X  570 FORMAT(1X,20('+'),' YOU HAVE CHOSEN TO IGNORE ',I3,   
  663. X     +' SUBROUTINES. THEIR NAMES FOLLOW',/,(2X,A))  
  664. X  543 FORMAT(1X,'RULE ',I3,' "',A,'"')  
  665. X  544 FORMAT(1X,'NO CODING CONVENTIONS WILL BE CHECKED')
  666. X  580 FORMAT(1X,'INVALID RULE NUMBER ',A,' CANNOT BE CHECKED')  
  667. X  542 FORMAT(//,1X,' YOU SPECIFIED NO CONVENTION CHECKING !')   
  668. X  545 FORMAT(1X,'THE STANDARD SET OF CONVENTIONS WILL BE CHECKED')  
  669. X  585 FORMAT(1X,'THE ALEPH CODING CONVENTIONS WILL BE CHECKED') 
  670. X      END   
  671. /
  672. echo 'x - floppy.f'
  673. sed 's/^X//' > floppy.f << '/'
  674. X      PROGRAM FLOPPY
  675. XC-------------------------------------------------------------------------
  676. XC Floppy UNIX interface routine.
  677. XC Sets up various required input files for Floppy.
  678. XC 
  679. XC Julian Bunn 1990
  680. XC-------------------------------------------------------------------------
  681. X      PARAMETER (MLEN=256,MXLIN=80,maxarg=100)
  682. X      character*(mxlin) argval
  683. X      character*1 key,char
  684. X      CHARACTER*(MLEN)  CFILE,COLD,CFORT,CTEMP,CBAD
  685. X      LOGICAL LOG,fexist,fold,fqold,tidy
  686. Xc
  687. Xc get all arguments
  688. Xc
  689. X      numargs = iargc()
  690. X      if(numargs.gt.maxarg) then
  691. X         write(6,'(A)') ' Floppy --> Too many arguments '
  692. X         goto 900
  693. X      endif
  694. Xc
  695. Xc get target filename(s)
  696. Xc
  697. X      call getarg(numargs,cfile)       
  698. X      lfile = index(cfile,' ')-1
  699. X      write(6,'(A)') ' Floppy --> Target file '//cfile(:lfile)
  700. X      inquire(file=cfile(:lfile),exist=fexist)
  701. X      if(.not.fexist) then
  702. X        write(6,'(A)') ' Floppy --> Target file not found !'
  703. X        goto 900
  704. X      endif
  705. Xc
  706. X      log = .false.                          
  707. X      fold = .false.  
  708. X      tidy = .false.
  709. X      cfort = ' '
  710. Xc
  711. X      do 400 iarg=1,numargs-1
  712. X         call getarg(iarg,argval)
  713. X         if(argval(:2).eq.'-l') log = .true.
  714. X         if(argval(:2).eq.'-o') fqold = .true.
  715. X         if(argval(:2).eq.'-o') cold = argval(3:)
  716. X  400 continue
  717. Xc
  718. X      cbad = 'scratch'
  719. X      open(7,status='scratch',err=999)
  720. X      WRITE(7,'(A)') 'LIST,GLOBAL,TYPE;'
  721. X      WRITE(7,'(A)') 'PRINT,ILLEGAL;'
  722. X      WRITE(7,'(A)') 'OPTIONS,USER;'
  723. X      if(fqold) then
  724. X        if(cold(1:1).eq.' ') cold = cfile(:lfile)//'.flopold'
  725. X        lold = index(cold,' ')-1
  726. X        inquire(file=cold(:lold),exist=fold)
  727. X        if(log) write(6,'(A)') ' Floppy --> Old file: '//cold(:lold)
  728. X        if(.not.fold) then
  729. X           write(6,'(A)') ' Floppy --> Old file not found !'
  730. X           goto 900
  731. X        endif
  732. X        cbad = cold
  733. X        open(15,file=cold,status='old',err=999)
  734. X  450   read(15,'(A)',end=451,err=999) ctemp      
  735. X        goto 450
  736. X  451   continue
  737. X      else
  738. X        cold = cfile(:lfile)//'.flopold'     
  739. X        lold = index(cold,' ')-1
  740. X        cbad = cold
  741. X        open(15,file=cold(:lold),status='unknown',err=999)
  742. X      endif
  743. Xc
  744. Xc loop over all qualifiers
  745. Xc
  746. X      icheck = 0
  747. X      do 500 iarg = 1,numargs-1
  748. X         call getarg(iarg,argval)
  749. X         larg = index(argval,' ')-1 
  750. X         key = argval(2:2)
  751. X         if(key.eq.'l') then
  752. X           log = .true.
  753. X         else if(key.eq.'n') then
  754. X           if(argval(3:3).eq.' ') then
  755. X              write(6,'(A)') ' Floppy --> Missing value for -n'
  756. X              goto 900
  757. X           endif 
  758. X           cfort = argval(3:)
  759. X           lfort = index(cfort,' ')-1 
  760. X           if(log) write(6,'(A)') ' Floppy --> Tidied Fortran: '//
  761. X     &             cfort(:lfort) 
  762. X         else if(key.eq.'o') then
  763. Xc
  764. X         else if(key.eq.'f') then
  765. X           if(log) write(6,'(A)') ' Floppy --> List source line numbers'
  766. X           write(15,'(a)') '*FULL'
  767. X         else if(key.eq.'i') then
  768. X           ctemp = argval(3:)
  769. X   50      iend = index(ctemp,',')
  770. X           if(iend.ne.0) then
  771. X             write(15,'(A)') ctemp(:iend-1)
  772. X             if(log) write(6,'(A)') 
  773. X     &         ' Floppy --> Ignore: '//ctemp(:iend-1) 
  774. X             ctemp = ctemp(iend+1:)
  775. X             goto 50
  776. X           endif
  777. X           iend = index(ctemp,' ')
  778. X           write(15,'(A)') ctemp(:iend)
  779. X           if(log) write(6,'(A)') ' Floppy --> Ignore: '//ctemp(:iend)
  780. X         else if(key.eq.'c') then
  781. X           icheck = 1
  782. X           ctemp = argval(3:)
  783. X           if(ctemp.eq.'standard') then
  784. X             write(15,'(A)') '*CHECK RULE *'
  785. X             if(log) write(6,'(A)') ' Floppy --> Check Standard rules'
  786. X           else if(ctemp.eq.' ') then
  787. X             write(15,'(A)') '*CHECK RULE *'
  788. X             if(log) write(6,'(A)') ' Floppy --> Check Standard rules'
  789. X           else if(ctemp.eq.'a') then
  790. X              write(15,'(A)') '*CHECK RULE 99'
  791. X              if(log) write(6,'(A)') ' Floppy --> Check all rules'
  792. X           else if(ctemp.eq.'n') then
  793. X             write(15,'(A)') '*CHECK RULE -99'
  794. X              if(log) write(6,'(A)') ' Floppy --> No rule checks'
  795. X           else 
  796. X             ctemp = ctemp(:index(ctemp,' ')-1)
  797. X             if(log) write(6,'(A)') ' Floppy --> Check rules: '//
  798. X     &               ctemp(:index(ctemp,' ')-1)
  799. X   51        iend = index(ctemp,',')
  800. X             if(iend.ne.0) then
  801. X               write(15,'(A)') '*CHECK RULE '//ctemp(:iend-1)
  802. X               ctemp = ctemp(iend+1:)
  803. X               goto 51
  804. X             endif
  805. X             write(15,'(A)') '*CHECK RULE '//ctemp
  806. X           endif 
  807. X         else if(key.eq.'t') then
  808. X         else if(key.eq.'j') then
  809. X           char = argval(3:3)
  810. X           if(char.eq.' ') char = '3'
  811. X           write(7,'(A)') 'OPTIONS,INDENT='//char//';'
  812. X           if(log) write(6,'(A)') ' Floppy --> Indent clauses by '//char
  813. X           tidy = .true.
  814. X         else if(key.eq.'f') then
  815. X           write(7,'(A)') 'STATEMENTS,SEPARATE;'
  816. X           if(log) write(6,'(A)') ' Floppy --> Group FORMATs at end'
  817. X           tidy = .true.
  818. X         else if(key.eq.'g') then
  819. X           write(7,'(A)') 'STATEMENTS,GOTO;'
  820. X           if(log) write(6,'(A)') ' Floppy --> Right align GOTOs'
  821. X           tidy = .true.
  822. X         else if(key.eq.'r') then
  823. X           ctemp = argval(3:)
  824. X           iend = index(ctemp,',')
  825. X           if (iend.eq.0) ctemp = ctemp(:index(ctemp,' ')-1)//',10'
  826. X           write(7,'(A)') 'STATEMENTS,FORMAT='//
  827. X     &                    ctemp(:index(ctemp,' ')-1)//';'
  828. X           if(log) write(6,'(A)') ' Floppy --> Renumber FORMATs: '//
  829. X     &             'start,step '//ctemp(:index(ctemp,' '))
  830. X           tidy = .true.
  831. X         else if(key.eq.'s') then
  832. X           ctemp = argval(3:)
  833. X           iend = index(ctemp,',')
  834. X           if (iend.eq.0) ctemp = ctemp(:index(ctemp,' ')-1)//',10'
  835. X           write(7,'(A)') 'STATEMENTS,NUMBER='//
  836. X     &                    ctemp(:index(ctemp,' ')-1)//';'
  837. X           if(log) write(6,'(A)') ' Floppy --> Renumber statements: '//
  838. X     &             'start,step '//ctemp(:index(ctemp,' '))
  839. X           tidy = .true.
  840. X         else 
  841. X           write(6,'(A)') ' Floppy --> Unrecognized qualifier '//key
  842. X         endif
  843. X  500 continue
  844. Xc
  845. X      if(tidy) then
  846. X         write(7,'(A)') 'OUTPUT,FULL,COMPRESS;'
  847. X         if(cfort(1:1).eq.' ') then
  848. X           cfort = cfile(:lfile)//'.out'
  849. X           lfort = index(cfort,' ')-1
  850. X         endif
  851. X         cbad = cfort
  852. X         open(14,file=cfort(:lfort),status='unknown',err=999)
  853. X      endif 
  854. Xc
  855. Xc default action is to check standard rules
  856. Xc
  857. X      if(icheck.eq.0.and..not.fqold) then
  858. X         write(15,'(A)') '*CHECK RULE *'
  859. X      endif
  860. X         
  861. X      write(7,'(A)') 'END;'
  862. X      if(log) write(6,'(A)') ' Floppy --> Finished parsing command' 
  863. X      rewind(7)
  864. X      rewind(15)
  865. X      cbad = cfile
  866. X      open(11,file=cfile(:lfile),status='old',err=999)
  867. X      cbad = 'scratch'
  868. X      open(99,status='scratch',err=999)
  869. Xc
  870. X      call allpro
  871. Xc
  872. X      close(11)
  873. X      if(tidy) close(14)
  874. X      close(7)
  875. X      close(99)
  876. X      goto 2000
  877. XC
  878. X  999 CONTINUE
  879. X      WRITE(6,'(A)') ' Floppy --> Error opening '//
  880. X     &               cbad(:index(cbad,' ')) 
  881. X  900 write(6,'(A)') ' Floppy aborted'     
  882. X 2000 CONTINUE
  883. X      END
  884. /
  885. echo 'x - floppy.f'
  886. sed 's/^X//' > floppy.f << '/'
  887. X      PROGRAM FLOPPY
  888. XC-------------------------------------------------------------------------
  889. XC Floppy UNIX interface routine.
  890. XC Sets up various required input files for Floppy.
  891. XC 
  892. XC Julian Bunn 1990
  893. XC-------------------------------------------------------------------------
  894. X      PARAMETER (MLEN=256,MXLIN=80,maxarg=100)
  895. X      character*(mxlin) argval
  896. X      character*1 key,char
  897. X      CHARACTER*(MLEN)  CFILE,COLD,CFORT,CTEMP,CBAD
  898. X      LOGICAL LOG,fexist,fold,fqold,tidy
  899. Xc
  900. Xc get all arguments
  901. Xc
  902. X      numargs = iargc()
  903. X      if(numargs.gt.maxarg) then
  904. X         write(6,'(A)') ' Floppy --> Too many arguments '
  905. X         goto 900
  906. X      endif
  907. Xc
  908. Xc get target filename(s)
  909. Xc
  910. X      call getarg(numargs,cfile)       
  911. X      lfile = index(cfile,' ')-1
  912. X      write(6,'(A)') ' Floppy --> Target file '//cfile(:lfile)
  913. X      inquire(file=cfile(:lfile),exist=fexist)
  914. X      if(.not.fexist) then
  915. X        write(6,'(A)') ' Floppy --> Target file not found !'
  916. X        goto 900
  917. X      endif
  918. Xc
  919. X      log = .false.                          
  920. X      fold = .false.  
  921. X      tidy = .false.
  922. X      cfort = ' '
  923. Xc
  924. X      do 400 iarg=1,numargs-1
  925. X         call getarg(iarg,argval)
  926. X         if(argval(:2).eq.'-l') log = .true.
  927. X         if(argval(:2).eq.'-o') fqold = .true.
  928. X         if(argval(:2).eq.'-o') cold = argval(3:)
  929. X  400 continue
  930. Xc
  931. X      cbad = 'scratch'
  932. X      open(7,status='scratch',err=999)
  933. X      WRITE(7,'(A)') 'LIST,GLOBAL,TYPE;'
  934. X      WRITE(7,'(A)') 'PRINT,ILLEGAL;'
  935. X      WRITE(7,'(A)') 'OPTIONS,USER;'
  936. X      if(fqold) then
  937. X        if(cold(1:1).eq.' ') cold = cfile(:lfile)//'.flopold'
  938. X        lold = index(cold,' ')-1
  939. X        inquire(file=cold(:lold),exist=fold)
  940. X        if(log) write(6,'(A)') ' Floppy --> Old file: '//cold(:lold)
  941. X        if(.not.fold) then
  942. X           write(6,'(A)') ' Floppy --> Old file not found !'
  943. X           goto 900
  944. X        endif
  945. X        cbad = cold
  946. X        open(15,file=cold,status='old',err=999)
  947. X  450   read(15,'(A)',end=451,err=999) ctemp      
  948. X        goto 450
  949. X  451   continue
  950. X      else
  951. X        cold = cfile(:lfile)//'.flopold'     
  952. X        lold = index(cold,' ')-1
  953. X        cbad = cold
  954. X        open(15,file=cold(:lold),status='unknown',err=999)
  955. X      endif
  956. Xc
  957. Xc loop over all qualifiers
  958. Xc
  959. X      icheck = 0
  960. X      do 500 iarg = 1,numargs-1
  961. X         call getarg(iarg,argval)
  962. X         larg = index(argval,' ')-1 
  963. X         key = argval(2:2)
  964. X         if(key.eq.'l') then
  965. X           log = .true.
  966. X         else if(key.eq.'n') then
  967. X           if(argval(3:3).eq.' ') then
  968. X              write(6,'(A)') ' Floppy --> Missing value for -n'
  969. X              goto 900
  970. X           endif 
  971. X           cfort = argval(3:)
  972. X           lfort = index(cfort,' ')-1 
  973. X           if(log) write(6,'(A)') ' Floppy --> Tidied Fortran: '//
  974. X     &             cfort(:lfort) 
  975. X         else if(key.eq.'o') then
  976. Xc
  977. X         else if(key.eq.'f') then
  978. X           if(log) write(6,'(A)') ' Floppy --> List source line numbers'
  979. X           write(15,'(a)') '*FULL'
  980. X         else if(key.eq.'i') then
  981. X           ctemp = argval(3:)
  982. X   50      iend = index(ctemp,',')
  983. X           if(iend.ne.0) then
  984. X             write(15,'(A)') ctemp(:iend-1)
  985. X             if(log) write(6,'(A)') 
  986. X     &         ' Floppy --> Ignore: '//ctemp(:iend-1) 
  987. X             ctemp = ctemp(iend+1:)
  988. X             goto 50
  989. X           endif
  990. X           iend = index(ctemp,' ')
  991. X           write(15,'(A)') ctemp(:iend)
  992. X           if(log) write(6,'(A)') ' Floppy --> Ignore: '//ctemp(:iend)
  993. X         else if(key.eq.'c') then
  994. X           icheck = 1
  995. X           ctemp = argval(3:)
  996. X           if(ctemp.eq.'standard') then
  997. X             write(15,'(A)') '*CHECK RULE *'
  998. X             if(log) write(6,'(A)') ' Floppy --> Check Standard rules'
  999. X           else if(ctemp.eq.' ') then
  1000. X             write(15,'(A)') '*CHECK RULE *'
  1001. X             if(log) write(6,'(A)') ' Floppy --> Check Standard rules'
  1002. X           else if(ctemp.eq.'a') then
  1003. X              write(15,'(A)') '*CHECK RULE 99'
  1004. X              if(log) write(6,'(A)') ' Floppy --> Check all rules'
  1005. X           else if(ctemp.eq.'n') then
  1006. X             write(15,'(A)') '*CHECK RULE -99'
  1007. X              if(log) write(6,'(A)') ' Floppy --> No rule checks'
  1008. X           else 
  1009. X             ctemp = ctemp(:index(ctemp,' ')-1)
  1010. X             if(log) write(6,'(A)') ' Floppy --> Check rules: '//
  1011. X     &               ctemp(:index(ctemp,' ')-1)
  1012. X   51        iend = index(ctemp,',')
  1013. X             if(iend.ne.0) then
  1014. X               write(15,'(A)') '*CHECK RULE '//ctemp(:iend-1)
  1015. X               ctemp = ctemp(iend+1:)
  1016. X               goto 51
  1017. X             endif
  1018. X             write(15,'(A)') '*CHECK RULE '//ctemp
  1019. X           endif 
  1020. X         else if(key.eq.'t') then
  1021. X         else if(key.eq.'j') then
  1022. X           char = argval(3:3)
  1023. X           if(char.eq.' ') char = '3'
  1024. X           write(7,'(A)') 'OPTIONS,INDENT='//char//';'
  1025. X           if(log) write(6,'(A)') ' Floppy --> Indent clauses by '//char
  1026. X           tidy = .true.
  1027. X         else if(key.eq.'f') then
  1028. X           write(7,'(A)') 'STATEMENTS,SEPARATE;'
  1029. X           if(log) write(6,'(A)') ' Floppy --> Group FORMATs at end'
  1030. X           tidy = .true.
  1031. X         else if(key.eq.'g') then
  1032. X           write(7,'(A)') 'STATEMENTS,GOTO;'
  1033. X           if(log) write(6,'(A)') ' Floppy --> Right align GOTOs'
  1034. X           tidy = .true.
  1035. X         else if(key.eq.'r') then
  1036. X           ctemp = argval(3:)
  1037. X           iend = index(ctemp,',')
  1038. X           if (iend.eq.0) ctemp = ctemp(:index(ctemp,' ')-1)//',10'
  1039. X           write(7,'(A)') 'STATEMENTS,FORMAT='//
  1040. X     &                    ctemp(:index(ctemp,' ')-1)//';'
  1041. X           if(log) write(6,'(A)') ' Floppy --> Renumber FORMATs: '//
  1042. X     &             'start,step '//ctemp(:index(ctemp,' '))
  1043. X           tidy = .true.
  1044. X         else if(key.eq.'s') then
  1045. X           ctemp = argval(3:)
  1046. X           iend = index(ctemp,',')
  1047. X           if (iend.eq.0) ctemp = ctemp(:index(ctemp,' ')-1)//',10'
  1048. X           write(7,'(A)') 'STATEMENTS,NUMBER='//
  1049. X     &                    ctemp(:index(ctemp,' ')-1)//';'
  1050. X           if(log) write(6,'(A)') ' Floppy --> Renumber statements: '//
  1051. X     &             'start,step '//ctemp(:index(ctemp,' '))
  1052. X           tidy = .true.
  1053. X         else 
  1054. X           write(6,'(A)') ' Floppy --> Unrecognized qualifier '//key
  1055. X         endif
  1056. X  500 continue
  1057. Xc
  1058. X      if(tidy) then
  1059. X         write(7,'(A)') 'OUTPUT,FULL,COMPRESS;'
  1060. X         if(cfort(1:1).eq.' ') then
  1061. X           cfort = cfile(:lfile)//'.out'
  1062. X           lfort = index(cfort,' ')-1
  1063. X         endif
  1064. X         cbad = cfort
  1065. X         open(14,file=cfort(:lfort),status='unknown',err=999)
  1066. X      endif 
  1067. Xc
  1068. Xc default action is to check standard rules
  1069. Xc
  1070. X      if(icheck.eq.0.and..not.fqold) then
  1071. X         write(15,'(A)') '*CHECK RULE *'
  1072. X      endif
  1073. X         
  1074. X      write(7,'(A)') 'END;'
  1075. X      if(log) write(6,'(A)') ' Floppy --> Finished parsing command' 
  1076. X      rewind(7)
  1077. X      rewind(15)
  1078. X      cbad = cfile
  1079. X      open(11,file=cfile(:lfile),status='old',err=999)
  1080. X      cbad = 'scratch'
  1081. X      open(99,status='scratch',err=999)
  1082. Xc
  1083. X      call allpro
  1084. Xc
  1085. X      close(11)
  1086. X      if(tidy) close(14)
  1087. X      close(7)
  1088. X      close(99)
  1089. X      goto 2000
  1090. XC
  1091. X  999 CONTINUE
  1092. X      WRITE(6,'(A)') ' Floppy --> Error opening '//
  1093. X     &               cbad(:index(cbad,' ')) 
  1094. X  900 write(6,'(A)') ' Floppy aborted'     
  1095. X 2000 CONTINUE
  1096. X      END
  1097. /
  1098. echo 'x - makefile'
  1099. sed 's/^X//' > makefile << '/'
  1100. X# Makefile for floppy
  1101. X# FORTRAN coding convention checker - J Bunn/CERN
  1102. XF77 = f77
  1103. XFFLAGS = -w -c
  1104. XFFLAGSO = -w
  1105. XOBJS =    ALLPRO.o ARGTYP.o BINSRC.o CHKCHR.o CHKOBS.o CHRTYP.o CLASSF.o COMPAC.o \
  1106. X    COMRUL.o DEFINF.o DEFSTA.o ERREX1.o EXTRAC.o FILTER.o FLDUMP.o FLINIT.o \
  1107. X    FLPRNT.o GETALL.o GETCON.o GETINT.o GETNAM.o GETNBL.o GETOPT.o \
  1108. X    GETRNG.o HEADER.o INDECO.o INDECS.o INDECT.o INDECZ.o INEXTR.o INLINE.o \
  1109. X    INUSER.o ISBIT.o  ITBIT.o  LEXARS.o LASTNB.o LMERGE.o LSORT.o  MARKST.o \
  1110. X    MATCH.o     MIXMOD.o NAMOVE.o NAMSRC.o NAMTAB.o NEXTIN.o NLBLPS.o NXITEM.o \
  1111. X    OPRSLT.o POSCH.o  PRENUM.o PRNAMF.o PROCES.o PROCOM.o PROIND.o PRTCOM.o \
  1112. X    PUTOPA.o PUTOPT.o PUTOUT.o QUOSUB.o READEC.o READSB.o REDEXP.o RANGE.o    \
  1113. X    REFORM.o RENUMB.o REPNAM.o REPSTR.o REPSUB.o RSTART.o SAMEST.o SECPAS.o SETIMP.o \
  1114. X    SETREQ.o SETTYP.o SHUFFL.o SKIPLV.o SKIPTP.o SORTSP.o SPECCT.o SPERUL.o \
  1115. X    STADEF.o STSUMM.o SUMMRY.o SUPMOR.o SUPMUL.o TREEST.o TREESU.o TY2TYP.o \
  1116. X    URINIT.o URTERM.o USLTYP.o USSALL.o USSBEG.o USSEND.o UTINIT.o UTTERM.o \
  1117. X    btest.o     ior.o      floppy.o
  1118. XINCLUDES = *.h
  1119. X
  1120. X.f.o:
  1121. X    $(F77) $(FFLAGS) $<   
  1122. Xfloppy: $(OBJS) $(INCLUDES)
  1123. X    $(F77) -o $@ $(FFLAGSO) $(OBJS)
  1124. X
  1125. X
  1126. XALLPRO.o:    ALLPRO.f  PARAM.h  ALCAZA.h  JOBSUM.h  FLAGS.h    STATE.h
  1127. XARGTYP.o:    ARGTYP.f  PARAM.h  ALCAZA.h  CONDEC.h  STATE.h    CONDAT.h
  1128. XBINSRC.o:    BINSRC.f
  1129. XCHKCHR.o:    CHKCHR.f  PARAM.h  ALCAZA.h  CLASS.h   FLAGS.h    CURSTA.h \
  1130. X              STATE.h  USSTMT.h  USUNIT.h  USLTYD.h USIGNO.h \
  1131. X              CHECKS.h
  1132. XCHKOBS.o:    CHKOBS.f
  1133. XCHRTYP.o:    CHRTYP.f  CONVEX.h
  1134. XCLASSF.o:    CLASSF.f  PARAM.h  ALCAZA.h  CLASS.h   FLAGS.h    FLWORK.h \
  1135. X              CURSTA.h CONVEX.h
  1136. XCOMPAC.o:    COMPAC.f  PARAM.h  ALCAZA.h  CURSTA.h  STATE.h
  1137. XCOMRUL.o:    COMRUL.f  CHECKS.h
  1138. XDEFINF.o:    DEFINF.f  USINFN.h
  1139. XDEFSTA.o:    DEFSTA.f  PARAM.h  USUNIT.h
  1140. XERREX1.o:    ERREX1.f  PARAM.h
  1141. XEXTRAC.o:    EXTRAC.f  PARAM.h  ALCAZA.h  FLAGS.h   CURSTA.h STATE.h
  1142. XFILTER.o:    FILTER.f  PARAM.h  ALCAZA.h  CLASS.h   FLAGS.h    CURSTA.h \
  1143. X              STATE.h  KEYCOM.h
  1144. XFLDUMP.o:    FLDUMP.f
  1145. XFLINIT.o:    FLINIT.f  PARAM.h  CURSTA.h  FLAGS.h   JOBSUM.h STATE.h     \
  1146. X              KEYCOM.h
  1147. XFLPRNT.o:    FLPRNT.f  PARAM.h  USUNIT.h
  1148. XGETALL.o:    GETALL.f  PARAM.h  ALCAZA.h  CLASS.h   FLAGS.h    CURSTA.h \
  1149. X              STATE.h  FLWORK.h
  1150. XGETCON.o:    GETCON.f  CONVEX.h
  1151. XGETINT.o:    GETINT.f
  1152. XGETNAM.o:    GETNAM.f  CONVEX.h
  1153. XGETNBL.o:    GETNBL.f
  1154. XGETOPT.o:    GETOPT.f
  1155. XGETRNG.o:    GETRNG.f  PARAM.h  ALCAZA.h
  1156. XHEADER.o:    HEADER.f  PARAM.h
  1157. XINDECO.o:    INDECO.f  PARAM.h  ALCAZA.h  STATE.h   KEYCOM.h FLAGS.h     \
  1158. X              FLWORK.h CLASS.h   CONDEC.h  CONDAT.h
  1159. XINDECS.o:    INDECS.f  PARAM.h  ALCAZA.h  KEYCOM.h
  1160. XINDECT.o:    INDECT.f  PARAM.h  KEYCOM.h
  1161. XINDECZ.o:    INDECZ.f  PARAM.h  ALCAZA.h  KEYCOM.h  FLWORK.h CONDEC.h \
  1162. X              CONDAT.h
  1163. XINEXTR.o:    INEXTR.f  PARAM.h  ALCAZA.h  STATE.h
  1164. XINLINE.o:    INLINE.f  PARAM.h  CONVEX.h
  1165. XINUSER.o:    INUSER.f  PARAM.h  ALCAZA.h  STATE.h   KEYCOM.h CONVEX.h
  1166. XISBIT.o:    ISBIT.f
  1167. XITBIT.o:    ITBIT.f
  1168. XLASTNB.o:    LASTNB.f
  1169. XLEXARS.o:    LEXARS.f  PARAM.h  ALCAZA.h  TREECOM.h STATE.h    CURSTA.h
  1170. XLMERGE.o:    LMERGE.f  PARAM.h  FLWORK.h
  1171. XLSORT.o:    LSORT.f      PARAM.h
  1172. XMARKST.o:    MARKST.f  PARAM.h  ALCAZA.h  CURSTA.h  CONVEX.h
  1173. XMATCH.o:    MATCH.f      CONVEX.h
  1174. XMIXMOD.o:    MIXMOD.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1175. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h     \
  1176. X              USIGNO.h USLIST.h  USGCOM.h  USSTMT.h USUNIT.h \
  1177. X              USARGS.h USLTYD.h  STACK.h
  1178. XNAMOVE.o:    NAMOVE.f  PARAM.h
  1179. XNAMSRC.o:    NAMSRC.f
  1180. XNAMTAB.o:    NAMTAB.f
  1181. XNEXTIN.o:    NEXTIN.f  PARAM.h  CONVEX.h
  1182. XNLBLPS.o:    NLBLPS.f
  1183. XNXITEM.o:    NXITEM.f  CONVEX.h
  1184. XOPRSLT.o:    OPRSLT.f
  1185. XPOSCH.o:    POSCH.f
  1186. XPRENUM.o:    PRENUM.f  PARAM.h  ALCAZA.h  FLAGS.h   CLASS.h    STATE.h     \
  1187. X              KEYCOM.h FLWORK.h
  1188. XPRNAMF.o:    PRNAMF.f  PARAM.h  ALCAZA.h  STATE.h
  1189. XPROCES.o:    PROCES.f  PARAM.h  ALCAZA.h  CLASS.h   FLAGS.h    CURSTA.h \
  1190. X              STATE.h  JOBSUM.h
  1191. XPROCOM.o:    PROCOM.f  PARAM.h  ALCAZA.h  CLASS.h   FLAGS.h    CURSTA.h \
  1192. X              FLWORK.h STATE.h
  1193. XPROIND.o:    PROIND.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h STATE.h
  1194. XPRTCOM.o:    PRTCOM.f  PARAM.h  ALCAZA.h  STATE.h
  1195. XPUTOPA.o:    PUTOPA.f  STACK.h
  1196. XPUTOPT.o:    PUTOPT.f  STACK.h  OPPREC.h
  1197. XPUTOUT.o:    PUTOUT.f  PARAM.h  ALCAZA.h  FLAGS.h   STATE.h    JOBSUM.h
  1198. XQUOSUB.o:    QUOSUB.f  PARAM.h  ALCAZA.h  FLAGS.h   CURSTA.h STATE.h     \
  1199. X              JOBSUM.h
  1200. XRANGE.o:    RANGE.f
  1201. XREADEC.o:    READEC.f  PARAM.h  ALCAZA.h  FLAGS.h   STATE.h    CLASS.h
  1202. XREADSB.o:    READSB.f  PARAM.h  CURSTA.h  STATE.h
  1203. XREDEXP.o:    REDEXP.f  PARAM.h  CURSTA.h  STACK.h   ALCAZA.h USUNIT.h \
  1204. X              OPPREC.h
  1205. XREFORM.o:    REFORM.f  PARAM.h  ALCAZA.h  FLAGS.h   CURSTA.h STATE.h     \
  1206. X              JOBSUM.h FLWORK.h  CLASS.h
  1207. XRENUMB.o:    RENUMB.f  PARAM.h  ALCAZA.h  CLASS.h   FLAGS.h    CURSTA.h \
  1208. X              STATE.h  JOBSUM.h  FLWORK.h  CONDEC.h CONDAT.h
  1209. XREPNAM.o:    REPNAM.f  PARAM.h  ALCAZA.h  FLAGS.h   CURSTA.h STATE.h     \
  1210. X              KEYCOM.h JOBSUM.h
  1211. XREPSTR.o:    REPSTR.f  PARAM.h  ALCAZA.h  FLAGS.h   CURSTA.h STATE.h     \
  1212. X              KEYCOM.h JOBSUM.h
  1213. XREPSUB.o:    REPSUB.f  PARAM.h  ALCAZA.h  KEYCOM.h  FLWORK.h CONVEX.h
  1214. XRSTART.o:    RSTART.f  PARAM.h  ALCAZA.h  CLASS.h   FLAGS.h    CURSTA.h \
  1215. X              STATE.h  TREECOM.h
  1216. XSAMEST.o:    SAMEST.f  PARAM.h  ALCAZA.h  STATE.h   CURSTA.h
  1217. XSECPAS.o:    SECPAS.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1218. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h     \
  1219. X              USIGNO.h USLIST.h  USGCOM.h  USSTMT.h USUNIT.h \
  1220. X              USARGS.h USLTYD.h  CHECKS.h
  1221. XSETIMP.o:    SETIMP.f  PARAM.h  ALCAZA.h  CONDEC.h  FLWORK.h CURSTA.h \
  1222. X              TYPDEF.h CONDAT.h
  1223. XSETREQ.o:    SETREQ.f
  1224. XSETTYP.o:    SETTYP.f  PARAM.h  ALCAZA.h  CLASS.h   FLWORK.h FLAGS.h     \
  1225. X              CURSTA.h STATE.h   TYPDEF.h  CONDEC.h CONDAT.h
  1226. XSHUFFL.o:    SHUFFL.f  PARAM.h  FLWORK.h
  1227. XSKIPLV.o:    SKIPLV.f
  1228. XSKIPTP.o:    SKIPTP.f  CONVEX.h
  1229. XSORTSP.o:    SORTSP.f
  1230. XSPECCT.o:    SPECCT.f  PARAM.h  KEYCOM.h  CONVEX.h
  1231. XSPERUL.o:    SPERUL.f  PARAM.h  CHECKS.h  USUNIT.h
  1232. XSTADEF.o:    STADEF.f  PARAM.h  ALCAZA.h  CLASS.h   FLWORK.h CONDEC.h \
  1233. X              CONDAT.h
  1234. XSTSUMM.o:    STSUMM.f  PARAM.h  ALCAZA.h  FLWORK.h  JOBSUM.h CLASS.h
  1235. XSUMMRY.o:    SUMMRY.f  PARAM.h  ALCAZA.h  JOBSUM.h  STATE.h    FLAGS.h
  1236. XSUPMOR.o:    SUPMOR.f  PARAM.h
  1237. XSUPMUL.o:    SUPMUL.f  PARAM.h  PARAM.h   ALCAZA.h  TREECOM.h STATE.h \
  1238. X              FLAGS.h  CLASS.h   CURSTA.h
  1239. XTREEST.o:    TREEST.f
  1240. XTREESU.o:    TREESU.f  PARAM.h  ALCAZA.h  TREECOM.h STATE.h    FLAGS.h     \
  1241. X              CLASS.h  CURSTA.h  USUNIT.h  USARGS.h
  1242. XTY2TYP.o:    TY2TYP.f  PARAM.h  ALCAZA.h  CLASS.h   STATE.h    USINFN.h
  1243. XURINIT.o:    URINIT.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1244. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h     \
  1245. X              USARGS.h
  1246. XURTERM.o:    URTERM.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1247. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h     \
  1248. X              USGCOM.h USCOMN.h  USSTMT.h  USIGNO.h USUNIT.h \
  1249. X              USARGS.h CHECKS.h
  1250. XUSLTYP.o:    USLTYP.f
  1251. XUSSALL.o:    USSALL.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1252. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h
  1253. XUSSBEG.o:    USSBEG.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1254. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h     \
  1255. X              USCOMN.h USSTMT.h  USIGNO.h  USLIST.h USUNIT.h \
  1256. X              USARGS.h USINFN.h  USLTYD.h  CHECKS.h
  1257. XUSSEND.o:    USSEND.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1258. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h
  1259. XUTINIT.o:    UTINIT.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1260. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h     \
  1261. X              USIGNO.h USLIST.h  USGCOM.h  USSTMT.h USUNIT.h \
  1262. X              CHECKS.h
  1263. XUTTERM.o:    UTTERM.f  PARAM.h  ALCAZA.h  CLASS.h   CURSTA.h FLWORK.h \
  1264. X              KEYCOM.h TYPDEF.h  JOBSUM.h  STATE.h    FLAGS.h     \
  1265. X              USIGNO.h USINFN.h  CHECKS.h
  1266. X
  1267. X
  1268. XCONVEX.h: CONDEC.h CONDAT.h
  1269. /
  1270. echo 'Part 06 of Floppy complete.'
  1271. exit
  1272.  
  1273.  
  1274.  
  1275.  
  1276.  
  1277.  
  1278.