home *** CD-ROM | disk | FTP | other *** search
- program fromxmod
- c convert file of XMODEM 128 byte records with embedded <CR><LF>
- c marking end-of-line and CTRL-Z marking end-of-file
- c to carriage-control=LIST (normal VAX editable file)
-
- character*254 line,input,output
- character*1 CR,LF,recchar
- integer blank
- logical eof
- data eof/.false./
-
- CR=char(13)
- LF=char(10)
- call lib$get_foreign(line,'$_From To: ',)
-
- blank=index(line,' ')
- input=line( 1:blank )
- output=line( blank:)
-
- open(6,file=input,status='OLD')
- open(7,file=output,status='NEW',carriagecontrol='LIST')
-
- c getchar (read new record if no input characters left)
- c if EOF on input, write line and exit
- c if CR then
- c if getchar LF then write line
- c else put back char and putchar CR into line (error if too long)
- c endif
- c else putchar (write error message if line too long)
- c endif
- c loop
-
- 100 call getchar(recchar,eof)
- if(eof) goto 200
- if(recchar.eq.CR) then
- c PRINT *,' CR'
- call getchar(recchar,eof)
- if(eof.or.recchar.ne.LF) then
- call putback
-
- len=len+1
- if(len.gt.255) print *,' Out line too long.'
- c print*,' too long line=',line
- line(len:len)=recchar
- else
- c was LF
- c PRINT *,' LEN=',LEN
- c print*,' after LF, line=',line(1:len)
- write(7,2000) line(1:len)
- len=0
- endif
- else
- c not CR, was "ordinary" character
- len=len+1
- if(len.gt.255) then
- print *,' Out line too long.'
- c PRINT *,' LINE=',LINE(1:len)
- endif
- line(len:len)=recchar
- endif
-
- go to 100
-
- c flush last line and exit
- 200 continue
- if(len.ne.0) then
- write(7,2000) line(1:len)
- 2000 format(a)
- endif
- close(6)
- close(7)
- call exit
-
- end
- c------------------------------------------
- subroutine getchar(c,eof)
- character*1 c
- logical eof
- c point to next character in record (read record if necessary)
- character*128 record
- character*1 CTRLZ
- integer point
- logical firsttime
- common /reccom/point,firsttime
- common /rec2com/record
- data point/0/
- data firsttime/.true./
-
- CTRLZ=char(26)
- point=point+1
- if(point.gt.128.or.firsttime) then
- firsttime=.false.
- 100 read(6,1000,end=200) record
- 1000 format(a)
- c PRINT *,RECORD
- point=1
- endif
- c strip parity in case CP/M file had it
- c=char(iand(ichar(record(point:point)),127))
- if(c.eq.CTRLZ) eof=.true.
- return
-
- 200 eof=.true.
- return
- end
- c----------------------------------------------
- subroutine putback
- c point to previous input character so this character will be getchar result
- c even works if 1st char of record
- integer point
- logical eof
- common /reccom/point
-
- point=point-1
- return
- end
-