dc. DO NL c. Preprocesses FORTRAN program containing NAMELIST ,c. c. This is an update of NAMELIST. The differences are that it c. is more careful about the key words, and produces a result file Xc. with the same name as the input, but of type .NL. c. c. The name list statements are of the following form: c. c. NAMELIST /name/ var1, var2, ,,, Lc. READ( iunit, name ) c. WRITE( iunit, name ) c. xc. For full information, see INFO NAMElist, in a while. c. @c. -end.of.info- c. c. 02/18/80 Process C=NLDEB=n lC. 02/18/80 Require delimitors c. 02/19/80 Produces xxx.nl 4C. C- == READS INITAL CARDS AND DISPATCHES c. nlcmd == Check for command ` C. NLDEF == PROCESSES 'NAMELIST' C. NLREAd == PROCESSES 'READ...' ( C. NLWRITE == PROCESSES 'WRITE...' C. LENS == DETERMINES LENGTH OF LINE C. LPAR == PARSES INPUT LINE T C. INLINE == READS AN INPUT LINE C. OUTNBL == OUTPUTS THE NON BLANK CHARS  C. OUTSTR == OUTPUTS THE COMPLETE STRING c. c. for001 == Source Input H c. for002 == Result output c. for005 == File def Input c. for006 == Debug output tc. for$type == Prompt output C. <C.NOT DONE .. CONTINUATION LINES C. ERR=, END= C. hC.  program NL 0c.  parameter numlis=100, numvar=100  COMMON /NAMECOM/ NLNAME, NLVARR \ CHARACTER NLNAME(100)*6, NLVARR(1000)*6  COMMON /pointcom/ NLDEB, numcard, NLPOINT $ INTEGER NLPOINT(100) C.  CHARACTER*72 LINE PC. C-- Request input file c. |100 CONTINUE  TYPE 110, '$Source(.for)= ' D READ(5,110,END=9000) LINE 110 FORMAT(10A) c. p IF( INDEX( LINE,'.' ) .EQ. 0 ) THEN  LL = LENS( LINE ) 8 LINE = LINE(1:LL)//'.FOR'  ENDIF C. d OPEN( UNIT=1, NAME=LINE, TYPE='OLD', READONLY  1 ,CARRIAGECONTROL='LIST',ERR=9000) ,C.  IF( LINE.EQ.'nltest.FOR' ) THEN !! note.. lower case  LINE = 'TT:' X ipos = 3  else  ipos = index(line,'.')  ENDIF  line = line(1:ipos)//'nl' L TYPE 110, ' Name List => ',line(1:lens(line))  OPEN( UNIT=2, NAME=LINE, TYPE='NEW'  1 ,CARRIAGECONTROL='LIST' ) xC.  CALL INLINE( LINE ) @C. C-- PROCESS NEXT LINE  C. l 200 CONTINUE C. 4! IF( NLCMD( LINE, IPOS, 'END ' ) ) THEN ! CALL NLDEF( LINE, IPOS ) ! ELSE IF( NLCMD( LINE, IPOS, 'NAMELIST' ) ) THEN `" CALL NLDEF( LINE, IPOS ) " ELSE IF( NLCMD( LINE, IPOS, 'READ' ) ) THEN (# CALL NLREAD( LINE, IPOS ) # ELSE IF( NLCMD( LINE, IPOS, 'WRITE' ) ) THEN # CALL NLWRITE( LINE, IPOS ) T$ ELSE IF( LINE.EQ.'!EOF!' ) THEN $ type 210, numcard, ' cards processed' %210 format( i6, a ) % CALL EXIT(1) % ELSE H&C. &C--- Process a normal card 'c. t'250 CONTINUE ' if( line(1:8).eq.'C=NLDEB=' ) then <( nldeb = ichar(line(9:9))-ichar('0') ( endif ) CALL OUTNBL( LINE ) h) CALL OUTSTR( '!EOL!' ) ) CALL INLINE( LINE ) 0* ENDIF * GOTO 200 *c. \+9000 continue + END $,c====== , function nlcmd( line, ipos, string ) ,c. P-c. Determine if is a 'delim' string 'delim' -c. . character*(*) line, string |.c. . nlcmd = .false. D/ if( line(1:1).ne.'C' ) then / ipos = index( line, string ) 0 if( ipos.gt.1 .and. line(ipos-1:ipos-1).lt.'0' p0 1 .and. line(ipos+len(string):ipos+len(string)) .lt.'0' ) 0 2 nlcmd = .true. 81 endif 1c. 2 return d2 end 2C. ,3c====== 3 SUBROUTINE NLDEF( LINE, IPOS ) 3C. X4c- Process NAMELIST /name/ item1, item2,,, 4C- 5C- Turn into: Character*6 name(n) 5C- Data name /'name','item1','item2',,,'$END'/ 5C- and store in table NLNAME, NLVAR L6C. 6 INTEGER IPOS 7 CHARACTER*(*) LINE x7C. 7 COMMON /NAMECOM/ NLNAME, NLVARR @8 CHARACTER NLNAME(100)*6, NLVARR(1000)*6 8 COMMON /pointcom/ NLDEB, numcard, NLPOINT 9 INTEGER NLPOINT(100) l9C. 9 CHARACTER STRING*80, CHEND*1 4: DATA IPT, JPT/0,0/ :C. : `; if( nldeb.ge.2 ) WRITE(6,*) ' NAMELIST', IPOS ;C. (< IF( LINE(IPOS:).EQ.'END' ) THEN < IPT = 0 < JPT = 0 T= NLNAME(1) = '$END' = CALL OUTNBL( LINE ) > CALL OUTSTR('!EOL!') > CALL INLINE( LINE ) > GOTO 9000 H? ENDIF ?C. @C-- 'NAMELIST' t@C. @ INX = IPOS