PROGRAM TIDY LOGICAL*1 SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON ICOLON,IEQUAL,ISEMI COMMON SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON /DATA/IWIDTH,IEOL,IEOF,ISYMB,IMAC,IENDM,IPSEUD COMMON /DATA/ IASC,LABEL,JSEMI COMMON/STAT/LINESR,LINESS !LINES READ , STRATENED DATA LINESR,LINESS/0,0/ IWIDTH=0 IEOL=1 IEOF=2 ISYMB=3 IMAC=4 IENDM=5 LABEL=6 IPSEUD=7 IASC=8 JSEMI=9 SPACE="40 SLASH="57 TAB="11 SEMI="73 COLON="72 EQUAL="75 PERIOD="56 DOLLAR="44 1 CALL FILES STRT=SECNDS(0.) CALL STRATE SECS=SECNDS(STRT) WRITE(7,1001)LINESR,LINESS,SECS 1001 FORMAT(I7,' LINES READ.',I7,' STRAIGHTENED IN ',F7.0,' SECS.') WRITE(7,1003)IWIDTH 1003 FORMAT(' MAX WIDTH=',I4) 5 ENDFILE 2 REWIND 1 REWIND 2 CALL CLOSE(2) STOP END SUBROUTINE FILES LOGICAL*1 SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON ICOLON,IEQUAL,ISEMI COMMON SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR LOGICAL*1 LINE1(80),INFILE(14),OUTFIL(14) 5 WRITE(7,100) 100 FORMAT(' ENTER FILES IN FORMAT: INPUT FILE/OUTPUT FILE?') READ(5,101,ERR=10,END=10)LINE1 GO TO 7 101 FORMAT(136A1) 10 WRITE(7,102) GO TO 5 102 FORMAT(' FILES NOT IN CORRECT FORM') 7 I=0 15 I=I+1 IF(I .EQ. 136)GO TO 10 IF(LINE1(I) .EQ. SPACE)GO TO 15 DO 20 IN=1,14 INFILE(I)=SPACE OUTFIL(I)=SPACE 20 CONTINUE DO 30 J=1,14 IF(LINE1(I) .EQ. SLASH)GO TO 35 INFILE(J)=LINE1(I) I=I+1 IF(I .EQ. 136)GO TO 10 30 CONTINUE IF(LINE1(I).NE.SLASH)GO TO 10 35 I=I+1 DO 36 K=J,14 INFILE(K)=0 36 CONTINUE DO 40 J=1,14 IF(LINE1(I) .EQ. SPACE)GO TO 50 OUTFIL(J)=LINE1(I) I=I+1 IF(I .EQ. 136)GO TO 10 40 CONTINUE 50 CONTINUE DO 51 K=J,14 OUTFIL(K)=0 51 CONTINUE WRITE(7,200)INFILE WRITE(7,200)OUTFIL 200 FORMAT(1X,14A1) CALL ASSIGN(1,INFILE,0,'RDO','NC',1) CALL ASSIGN(2,OUTFIL,0,'NEW','NC',1) REWIND 1 REWIND 2 RETURN 1000 STOP 'EOF' RETURN END SUBROUTINE STRATE LOGICAL*1 SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON ICOLON,IEQUAL,ISEMI COMMON SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON /DATA/IWIDTH,IEOL,IEOF,ISYMB,IMAC,IENDM,IPSEUD COMMON /DATA/ IASC,LABEL,JSEMI LOGICAL*1 LINE1(200),LINE2(200) COMMON/INFO/LINE1,LINE2 INTEGER*2 TAB1,TAB2,TAB3 COMMON/STAT/LINESR,LINESS !LINES READ , STRATENED DATA MAC/0/ 5 J=0 LINESS=LINESS+1 ITAB=0 INDEX=0 TAB1=8+32*MAC TAB2=16+32*MAC TAB3=40+16*MAC CALL ITEM(LINE1,INDEX,ISTRT,LIM,ITYPE) D WRITE(7,75)ITYPE,LIM,(LINE1(I),I=ISTRT,INDEX) 75 FORMAT(' TYPE=',I3,' LIM=',I3,1X,80A1) IF(ITYPE.EQ.IEOF)RETURN IF(ITYPE.NE.LABEL)GO TO 10 CALL INSERT(LINE1,INDEX,ISTRT,LINE2,J,ITAB,0) CALL ITEM(LINE1,INDEX,ISTRT,LIM,ITYPE) D WRITE(7,75)ITYPE,LIM,(LINE1(I),I=ISTRT,INDEX) C C PROCESS OP CODE C 10 IF(MAC.NE.0.AND.ITYPE.EQ.IPSEUD)GO TO 400 IF(ITYPE.EQ.JSEMI)GO TO 500 IF(ITYPE.EQ.IEOL)GO TO 600 IF(ITYPE.EQ.IMAC)GO TO 200 IF(ITYPE.EQ.IENDM)GO TO 300 15 CALL INSERT(LINE1,INDEX,ISTRT,LINE2,J,ITAB,TAB1) 20 CALL ITEM(LINE1,INDEX,ISTRT,LIM,ITYPE) D WRITE(7,75)ITYPE,LIM,(LINE1(I),I=ISTRT,INDEX) IF(ITYPE.EQ.JSEMI)GO TO 500 IF(ITYPE.EQ.IEOL)GO TO 600 CALL INSERT(LINE1,INDEX,ISTRT,LINE2,J,ITAB,TAB2) GO TO 20 200 MAC=MAC+1 GO TO 15 300 MAC=MAC-1 TAB1=8 TAB2=16 TAB3=40 GO TO 15 400 WRITE(2,700)(LINE1(I),I=1,LIM) ! PROPOGATE THE LINE GO TO 5 500 CALL INSERT(LINE1,INDEX,ISTRT,LINE2,J,ITAB,TAB3) 501 IF(INDEX.EQ.LIM)GO TO 600 INDEX=INDEX+1 IF(LINE1(INDEX).EQ.SPACE)GO TO 501 IF(LINE1(INDEX).EQ.TAB)GO TO 501 CALL INSERT(LINE1,LIM,INDEX,LINE2,J,ITAB,TAB3) 600 WRITE(2,700)(LINE2(I),I=1,J) D WRITE(7,700)SPACE,(LINE2(I),I=1,J) IF(IWIDTH.LT.ITAB)IWIDTH=ITAB 700 FORMAT(200A1) GO TO 5 END SUBROUTINE INSERT(LINE1,INDEX,ISTRT,LINE2,J,ITAB,IMIN) LOGICAL*1 SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON ICOLON,IEQUAL,ISEMI COMMON SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON /DATA/IWIDTH,IEOL,IEOF,ISYMB,IMAC,IENDM,IPSEUD COMMON /DATA/ IASC,LABEL,JSEMI LOGICAL*1 LINE1(200),LINE2(200) D WRITE(7,40)J,ITAB,IMIN,(LINE1(I),I=ISTRT,INDEX) 40 FORMAT(' INSERT J=',I3,' ITAB=',I3,' IMIN=',I3,1X,80A1) 1 IF(ITAB.GE.IMIN)GO TO 10 5 J=J+1 LINE2(J)=TAB ITAB=(ITAB/8)*8+8 IF(ITAB.GE.IMIN)GO TO 20 GO TO 5 10 IF(IMIN.EQ.0)GO TO 20 ITAB=ITAB+1 J=J+1 LINE2(J)=SPACE 20 J=J+1 LINE2(J)=LINE1(ISTRT) IF(LINE2(J).EQ.TAB)ITAB=(ITAB/8)*8+8 IF(LINE2(J).NE.TAB)ITAB=ITAB+1 ISTRT=ISTRT+1 IF(ISTRT.LE.INDEX)GO TO 20 RETURN END SUBROUTINE ITEM(LINEX,INDEX,ISTRT,LIM,ITYPE) LOGICAL*1 SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON ICOLON,IEQUAL,ISEMI COMMON SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON /DATA/IWIDTH,IEOL,IEOF,ISYMB,IMAC,IENDM,IPSEUD COMMON /DATA/ IASC,LABEL,JSEMI LOGICAL*1 LINEX(200),LT,GT LOGICAL*1 LINE(100) COMMON/INFO/LINE COMMON/STAT/LINESR,LINESS !LINES READ , STRATENED LOGICAL*1 STRING(26) DATA STRING(1),STRING(2),STRING(3),STRING(4)/'M','A','C','R'/ DATA STRING(5)/0/ DATA STRING(6),STRING(7),STRING(8),STRING(9)/'E','N','D','M'/ DATA STRING(10)/0/ DATA STRING(11),STRING(12),STRING(13),STRING(14)/'A','S','C','I'/ DATA STRING(15)/0/ DATA STRING(16),STRING(17),STRING(18),STRING(19)/'I','D','E','N'/ DATA STRING(20)/0/ DATA STRING(21),STRING(22),STRING(23),STRING(24)/'R','A','D','5'/ DATA STRING(25),STRING(26)/0,0/ DATA LT,GT/"74,"76/ DATA LIMIT/200/ IF(INDEX.NE.0)GO TO 5 1 CALL READER(LINE,IFLAG) IF(IFLAG.NE.0)GO TO 15 LINESR=LINESR+1 ! INC LINES READ D WRITE(7,100)SPACE,(LINE(I),I=1,100) 100 FORMAT(200A1) DO 2 I=1,100 LIM=101-I IF(LINE(LIM).EQ.SPACE.OR.LINE(LIM).EQ.TAB)GO TO 2 GO TO 3 2 CONTINUE C BLANK LINE WRITE(2,100) GO TO 1 4 WRITE(2,100)SPACE,LINE(1) GO TO 1 3 ISTR=0 IF(LINE(1).EQ."14)GO TO 4 ! FORM FEED IF(LINE(1).NE.SEMI)GO TO 5 WRITE(2,100)(LINE(I),I=1,LIM) GO TO 1 5 INDEX=INDEX+1 IF(INDEX.GT.LIM)GO TO 10 ! DONT GO TOO FAR IF(LINE(INDEX).EQ.SPACE)GO TO 5 IF(LINE(INDEX).EQ.TAB)GO TO 5 GO TO 20 10 INDEX=0 ITYPE=IEOL RETURN 15 ITYPE=IEOF RETURN 20 ISTRT=INDEX IF(ISTRT.NE.1)GO TO 200 ! COL1 FOR LABEL GO TO 23 22 INDEX=INDEX+1 23 IF(LINE(INDEX).GE."101.AND.LINE(INDEX).LE."132)GO TO 22 IF(LINE(INDEX).GE."60.AND.LINE(INDEX).LE."71)GO TO 22 !0-9 IF(LINE(INDEX).EQ.PERIOD)GO TO 22 IF(LINE(INDEX).EQ.DOLLAR)GO TO 22 IF(LINE(INDEX).EQ."47)GO TO 22 ! SINGLE QUOTE CONCAT ' ITYPE=LABEL IF(LINE(INDEX).EQ.COLON)RETURN IF(LINE(INDEX).EQ.EQUAL)GO TO 24 IF(LINE(INDEX).EQ.SPACE.OR.LINE(INDEX).EQ.TAB)GO TO 26 IF(LINE(INDEX).EQ."14)GO TO 26 ! CHECK FORM FEED WRITE(7,29)INDEX,LINE(INDEX) 29 FORMAT('OOPS AT 29',1X,I5,1X,A1) WRITE(7,100)(LINE(I),I=1,LIM) STOP 'LABEL ERROR' 24 INDEX=INDEX-1 RETURN 26 ITEMP=INDEX 27 ITEMP=ITEMP+1 IF(ITEMP.GT.LIM)GO TO 700 IF(LINE(ITEMP).EQ.SPACE)GO TO 27 IF(LINE(ITEMP).EQ.TAB)GO TO 27 IF(LINE(ITEMP).EQ.EQUAL)GO TO 24 INDEX=1 C C CONTINUE TO FIELD 2 PROCESSING C 200 IF(ISTR.EQ.1)GO TO 400 IF(LINE(INDEX).EQ.PERIOD)GO TO 300 IF(LINE(INDEX).EQ.SEMI)GO TO 350 201 INDEX=INDEX+1 IF(INDEX.GT.LIM)GO TO 202 IF(LINE(INDEX).NE.SPACE.AND.LINE(INDEX).NE.TAB)GO TO 201 202 INDEX=INDEX-1 ITYPE=ISYMB RETURN 300 CALL MATCH(LINE(INDEX+1),STRING,KEY) ITYPE=IPSEUD 301 INDEX=INDEX+1 IF(INDEX.GT.LIM)GO TO 302 IF(LINE(INDEX).NE.SPACE.AND.LINE(INDEX).NE.TAB)GO TO 301 302 INDEX=INDEX-1 IF(KEY.EQ.0)RETURN IF(KEY.GE.3)GO TO 310 IF(KEY.EQ.2)GO TO 305 ITYPE=IMAC RETURN 305 ITYPE=IENDM RETURN 310 ISTR=1 ! EXPECT A STRING OF ASCII ITYPE=IPSEUD RETURN 350 ITYPE=JSEMI RETURN 400 ITYPE=IASC ISTR=0 ! GET RID OF ASCII FORNEXT CALL IF(LINE(INDEX).EQ.LT)GO TO 500 IDEL=LINE(INDEX) D WRITE(7,100)SPACE,(LINE(I),I=1,LIM) D WRITE(7,403)IDEL 403 FORMAT(' LOOKING FOR ',A1) 401 INDEX=INDEX+1 IF(INDEX.GT.LIM)GO TO 450 IF(LINE(INDEX).NE.IDEL)GO TO 401 IF(LINE(INDEX+1).NE.LT)RETURN 500 INDEX=INDEX+1 IF(INDEX.GT.LIM)GO TO 450 IF(LINE(INDEX).NE.GT)GO TO 500 D WRITE(7,503) 503 FORMAT(' > FOUND') IF(LINE(INDEX+1).EQ.SEMI)RETURN IF(LINE(INDEX+1).EQ.SPACE)RETURN IF(LINE(INDEX+1).EQ.TAB)RETURN INDEX=INDEX+1 ! NEXT DELIMITER GO TO 400 450 WRITE(7,451) 451 FORMAT(' BAD ASCII FIELD') WRITE(7,456) 456 FORMAT(' 1234567890123456789012345678901234567890') WRITE(7,457)IDEL,INDEX,LIM 457 FORMAT(1X,A1,' IS DEL. INDEX=',I5,'LIM=',I5) WRITE(7,100)SPACE,(LINE(I),I=1,LIM) STOP 'ERROR' 700 WRITE(7,701)ITEMP,LIM,INDEX 701 FORMAT(1X,'ITEMP=',I5,' LIM=',I5,' INDEX=',I5) WRITE(7,100)(LINE(I),I=1,ITEMP) WRITE(7,703)(I,LINE(I),LINE(I),I=1,ITEMP) 703 FORMAT(2X,I3,2X,O3,1X,A1) STOP 'LIMIT ERROR' END SUBROUTINE MATCH(LINE,STR,INDEX) LOGICAL*1 SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON ICOLON,IEQUAL,ISEMI COMMON SPACE,SLASH,TAB,SEMI,COLON,EQUAL,PERIOD,DOLLAR COMMON /DATA/IWIDTH,IEOL,IEOF,ISYMB,IMAC,IENDM,IPSEUD COMMON /DATA/ IASC,LABEL,JSEMI LOGICAL*1 LINE(10),STR(140) IPNT=1 INDEX=0 5 INDEX=INDEX+1 DO 10 J=1,10 ! MAX STRING LENGTH IS 10 IF(STR(IPNT).EQ.0)RETURN IF(STR(IPNT).NE.LINE(J))GO TO 20 IPNT=IPNT+1 10 CONTINUE C 20 IPNT=IPNT+1 IF(STR(IPNT).NE.0)GO TO 20 IPNT=IPNT+1 !NEXT STRING IF(STR(IPNT).NE.0)GO TO 5 INDEX=0 !NO MATCH RETURN END SUBROUTINE PROMPT D WRITE(7,6) 6 FORMAT(' TYPE GO') D READ(5,4)I 4 FORMAT(A1) RETURN END SUBROUTINE READER(LINE,IFLAG) LOGICAL*1 LINE(200) LOGICAL*1 IN(100),SPACE COMMON/INFO/IN SPACE="40 IFLAG=0 5 READ(1,100,ERR=200,END=200)IN D WRITE(7,100)SPACE,IN 100 FORMAT(200A1) RETURN 200 IFLAG=1 RETURN END