c [2,20]X2700.FTN R RHODERICK June 14, 1984 c USEPA/HERL/NTD c MD74B c Research Triangle Park, NC 27711 c user-defined print processor intended for use with XEROX 2700 printer c-- FONTS (character sets, styles and orientations) are defined in the c INCLUDE file LB:[2,20]X2700FONT.CFG and may be modified to reflect c specific fonts in use at a particular installation, or to define c several different margin settings for the same font as different c form numbers. Note that this program will by default use the font c whose ID corresponds to the QMG form number (eg., if this task is c running as a print processor with form #3, then it will select c font ID #3 for printing). c - improvements: c overlay init routine with jpage, fpage... maybe also include font c loading program and overlay it too. c figure how to get dynamic font downline load to the XEROX printer c to work - LP: driver seems to throw in s whenever it decides a c record is too long c If an external task is implemented to downline load dynamic fonts, the c variable DYNAMIC should be set to .TRUE. in the PARAMETER statement at c the beginning of the main program. The external task should have the c installed name FONTLD , and should have it's output font stream c directed to the appropriate device by means of the MCR REAssign command. c****************************************************************************** c****************************************************************************** c-- main processing functions PROGRAM X2700 parameter dynamic=.false. byte bytbuf(24),jobnam(9),jname1(6),jname2(6),fname(34),opname(35) byte tmp(12),iostat byte fontstring(43),selectstring(23),fntnam(20) byte orient,recend,ff,cr,lf,vt,esc logical*1 fildel,sojflg,offset,eof integer*2 buf(13),rbuf(15),jobstatus(13),fspec(2),fnamsiz,filflg integer*2 devnam,devnum,devsiz,lunbuf(6) integer*2 filesinjob,copies,copydn,strtpg integer*2 iosb(2),pagsiz integer*2 recatt,linsiz,devbuf,curpag,lincnt,skippg,param(6) real qmg,rrcv,fontld equivalence (jobnam(1),jname1),(jobnam(7),jname2),(iosb(1),iostat) equivalence (rbuf,rrcv),(rbuf(3),buf(1)),(buf,bytbuf),(buf(5),fspec(1)) equivalence (fontstring,fntnam),(fontstring(21),selectstring) equivalence (fname,opname) data qmg,fontld/6rQMG...,6rFONTLD/ data ff,cr,lf,vt,esc/"14,"15,"12,"13,"33/ data sojflg,offset/.false.,.false./ data opname(35)/0/ data param/6*0/ common //recatt,linsiz,devbuf,curpag,lincnt,skippg,param, + orient,recend,ff,cr,lf,vt,esc call errset(29,.true.,.false.,.true.,.false.) !no msg on no-such-file call errset(30,.true.,.false.,.true.,.false.) !no msg on open failure c-- wait for QMG... to send a data block and unstop us 10 call rcst(,rbuf,idsw) c-- if idsw not =1, we must have been stopped, now unstopped - go get recv block if(idsw.ne.1)goto 10 c-- got a received data buffer; c-- use (QP.FUN +1) as index to code for this function goto (100,200,240,250,500,600,700) bytbuf(1)+1 c-- QP.SOJ - Start Of Job 100 continue call r50asc(6,buf(3),jname1) !decode 1st half of job name call r50asc(6,buf(4),jname2) !decode 2nd half of job name do 101 i=10,12 !move three low bytes up - discard three 101 jobnam(i-3)=jobnam(i) ! high bytes do 102 i=1,9 102 if(jobnam(i).eq.'?')jobnam(i)=' ' !make non-ascii chars blanks jobgrp=bytbuf(4) !job UIC group # jobown=bytbuf(3) !job UIC owner # jobfrm=bytbuf(11) !job form # joblin=bytbuf(12) !job lines-per-page jobflg=bytbuf(13) !# of job flag pages to print filflg=bytbuf(14) !# of file flag pages to print maxpag=buf(8) !page limit for job filesinjob=buf(10) !# of individual filespecs in job 105 call rcst(,rbuf,idsw) !wait for second data block of QP.SOJ c-- if idsw not =1, we must have been stopped, now unstopped - go get recv block if(idsw.ne.1)goto 105 if(buf(1).ne.0)goto 10 sojflg=.true. !set QP.SOJ flag to print job page c-- attach spool device, or wait until it can be attached 110 call wtqio("1400,1,1,,iosb) goto 10 c-- QP.FIL - Process File 200 copydn=0 !copies of this file printed copies=bytbuf(19) !copies of this file requested strtpg=buf(11) !# of page to start on fildel=.false. !file deletion if((bytbuf(6).and."200).ne.0)fildel=.true. ! requested? call r50asc(12,fspec,tmp) !decode filespec c-- make character string containing complete file specification encode(33,202,fname)buf(2),bytbuf(5),bytbuf(8),bytbuf(7), + (tmp(i),i=1,9),(tmp(i),i=10,12),buf(9) 202 format(a2,o2,':[',o3,',',o3,']',9a1,'.',3a1,';',o5) fnamsiz=1 !# of chars in filespec c-- get rid of any embeded blanks in filespec string do 205 i=1,33 fname(fnamsiz)=fname(i) if(fname(fnamsiz).eq.'.')idx=fnamsiz 205 if(fname(fnamsiz).ne.' ')fnamsiz=fnamsiz+1 fnamsiz=fnamsiz-1 do 206 j=fnamsiz+1,34 !fill end of filespec string with blanks 206 fname(j)=' ' c-- check if file name is name of file to automatically be deleted, ie c LP.LST, LP.MAP, *.DMP, *.PMD if(fnamsiz.lt.idx+3)goto 208 if(idx.lt.3)goto 207 if((fname(idx-2).eq.'L'.and.fname(idx-1).eq.'P') + .and. + (fname(idx+1).eq.'L'.and.fname(idx+2).eq.'S'.and.fname(idx+3).eq.'T') + .or. + (fname(idx+1).eq.'M'.and.fname(idx+2).eq.'A'.and.fname(idx+3).eq.'P')) + fildel=.true. 207 if(fname(idx+1).eq.'D'.and.fname(idx+2).eq.'M'.and.fname(idx+3).eq.'P') + fildel=.true. if(fname(idx+1).eq.'P'.and.fname(idx+2).eq.'M'.and.fname(idx+3).eq.'D') + fildel=.true. c-- send RESET command string to printer 208 if(sojflg)write(1,210)esc,cr,lf 210 format(1h+a1,'+X',a1,a1,$) c-- send OFFSET PAPER STACKER command for alternate print jobs if(offset)then write(1,211)esc 211 format(1h+a1,'o',$) offset=.false. else offset=.true. endif c-- send font ID commands to printer to (re)define all ten fonts do 213 i=0,9 call getfnt(i,fontstring,linsiz,pagsiz,orient) write(1,212)esc,i,fntnam,cr,lf 212 format(1h+a1,'+',i1,20a1,a1,a1,$) 213 continue c-- get default font info (ID, margins, etc.), and set printer characteristics call getfnt(jobfrm,fontstring,linsiz,pagsiz,orient) write(1,214)esc,jobfrm,selectstring 214 format(1h+a1,i1,25a1,$) c-- print job flag page if(sojflg.and.(jobflg.gt.0))call jpage(jobflg,jobgrp,jobown,jobnam, + maxpag,jobfrm,fname,fntnam) sojflg=.false. c-- print file flag page 215 if(filflg.gt.0)call fpage(filflg,fname,fnamsiz,copydn,copies,fildel) c-- open print file for input 220 open(unit=2,file=opname,status='old',readonly,err=270) call recatr(2,recatt,iostat) !find out what carriage control file has if(iostat.ne.1)recatt=2 !assume FD.CR if no attributes byte c-- print cycle: c initialize variables for processing this file curpag=1 lincnt=0 recend=0 !put null (non-escape char) in this skippg=strtpg-1 !# of pages to skip c-- read record from input file, scan it for printer commands, move it to c output buffer, send it to printer 230 call pntrec(eof) if(eof)goto 260 call receiv(,rbuf,,idsw) !look for a received data buffer if(idsw.ne.1)goto 230 !if none, process next print record c-- received a data buffer from QMG... during print cycle - process it if(bytbuf(1).eq.2)goto 240 !QP.STP - stop current processing if(bytbuf(1).eq.4)goto 260 !QP.EOJ - end of print job if(bytbuf(1).eq.6)goto 700 !QP.EXT - processor exit goto 230 !ignore anything else c-- QP.STP - Stop Current Processing 240 jobstatus(1)="101 !QM.SPA solicited pause function code jobstatus(2)=curpag-1 !indicate # of pages printed so far jobstatus(3)=copydn !indicate # of copies printed so far jobstatus(4)=curpag !indicate page # currently being printed call send(qmg,jobstatus,,idsw) !send data block to queue manager task call ustp(qmg) !unstop queue manager task c-- do an IO.KIL to kill currently queued (not completed) I/O? goto 10 c-- QP.CON - Continue Current Processing 250 if(bytbuf(1).eq.0)goto 230 !continue from current position if(bytbuf(1).eq."200)goto 230 !same as when bytbuf(1) eq 0 if(bytbuf(1).ne.4)goto 253 !continue printing, at page buf(2) if(buf(2).gt.curpag)then skippg=buf(2)-curpag else skippg=buf(2) rewind(2) !rewind input file endif goto 258 253 if(bytbuf(1).ne.5)goto 255 !continue printing, buf(2) pages ahead skippg=buf(2) goto 258 255 if(bytbuf(1).ne.6)goto 230 !continue printing, buf(2) pages back skippg=curpag-buf(2) rewind(2) !rewind input file 258 write(1,259)ff !flush current page from printer 259 format(1h+a1,$) goto 230 c-- EOF on input file, or job exceeded maximum page limit, or QP.EOJ from QMG... c (user killed active job) c close file, write to printer to flush last page 260 close(unit=2) write(1,259)ff goto 280 c-- handle file open errors 270 call errsns(ierrnum,ioerr,ioerr1,iunit) c-- make sure it's really a file open error if((iunit.ne.0.and.iunit.ne.2).or.ierrnum.eq.0)goto 290 write(1,275)devnam,devnum,(fname(i),i=1,fnamsiz),ioerr 275 format(1h 3x,a2,o,' - ERROR opening file - 'a1, + ' - FCS # ',i4) goto 290 c-- print another copy of the file? 280 copydn=copydn+1 !increment # of copies printed counter if(copydn.lt.copies)goto 215 c-- delete the printed file? if(.not.fildel)goto 290 open(unit=2,file=fname,status='old',err=290) close(unit=2,dispose='delete') c-- put QM.DUN function code w/ QM.FIL subfunction in high byte in send buffer 290 jobstatus(1)="100 jobstatus(2)=curpag !indicate pages processed call send(qmg,jobstatus,,idsw) !send data block to queue manager task call ustp(qmg) !unstop queue manager task goto 10 c-- QP.EOJ - End of Job 500 close(unit=2) !if we have a file open, close it c-- write to printer to flush possible last page write(1,259)ff c-- detach spool device call wtqio("2000,1) c-- put QM.DUN function code w/ QM.JOB subfunction in high byte in send buffer jobstatus(1)="500 jobstatus(2)=curpag !indicate pages printed call send(qmg,jobstatus,,idsw) !send data block to queue manager task call ustp(qmg) !unstop queue manager task goto 10 c-- QP.STA - Processor Startup 600 devsiz=2 devnam=buf(2) devnum=bytbuf(5) if(devnum.lt."10)devsiz=1 if(dynamic)call reques(fontld,,idsw) !run external dynamic font loader? if(idsw.ne.-2)goto 610 c-- error - external font loading task not installed - tell console (CL0:) call asnlun(1,'CL',0) write(1,605)devnam,devnum 605 format(1h03x,a2,o,' - ERROR - external FONT load task (FONTLD)' + ' not installed in system'/) close(unit=1) c-- assign LUN 1 to output device 610 call asnlun(1,devnam,devnum) call getlun(1,lunbuf) !get lun information devbuf=lunbuf(6) !save buffer size of printer goto 10 c-- QP.EXT - Processor Exit 700 continue call exit(1) !exit with success status goto 10 end c****************************************************************************** c****************************************************************************** c******************************************************************************* SUBROUTINE JPAGE(jobflg,jobgrp,jobown,jobnam,maxpag,jobfrm,fname,fntnam) c******************************************************************************* byte jobnam(9),fname(34),rsxlit(24),datlit(30),tim(8),dat(9) byte esc,cr,lf,ff,fntnam(20),fontlen data ff,cr,lf,esc/"14,"15,"12,"33/ data rsxlit/"33,'q','*','*','*','*',' ','R','S','X','-','1','1','M', + ' ','V','4','.','1',' ','*','*','*','*'/ data datlit/'*','*','*','*',22*' ','*','*','*','*'/ equivalence (datlit(6),dat(1)),(datlit(18),tim(1)) call time(tim) call date(dat) j=3 if(jobgrp.lt."100)j=2 if(jobgrp.lt."10)j=1 k=3 if(jobown.lt."100)k=2 if(jobown.lt."10)k=1 jnamelen=0 do 10 i=1,9 10 if(jnamelen.eq.0.and.(jobnam(i).eq.' '.or.jobnam(i).eq.0))jnamelen=i-1 if(jnamelen.eq.0)jnamelen=9 ivar=16-(j+k+jnamelen) c-- find length of FONT name literal do 20 i=1,20 20 if(fntnam(i).ne.0)fontlen=i c-- job flag page print loop - print 'jobflg' job flag pages do 200 i=1,jobflg c-- first heading line - print job name, page limit if(maxpag.eq.0)write(1,100)rsxlit,jobgrp,jobown, + (jobnam(i),i=1,jnamelen),datlit 100 format(1h 24a1,x,'[',o,',',o,']', + a1,x,'- NO PAGE LIMIT',4x,,30a1) if(maxpag.ne.0)write(1,101)rsxlit,jobgrp,jobown, + (jobnam(i),i=1,jnamelen),maxpag,datlit 101 format(1h 24a1,x,'[',o,',',o,']', + a1,x,'-',i4,' PAGE LIMIT',4x,30a1) c-- second heading line - form number and font name write(1,110)rsxlit,jobfrm,esc,(fntnam(i),i=1,fontlen),esc,datlit 110 format(1h 24a1,x,'FORM #',i1,' - FONT ', + a1,'u',a1,a1,'w',<21-fontlen>x,30a1) c-- third line - first filespec in the job write(1,130)rsxlit,fname,datlit 130 format(1h 24a1,x,34a1,t65,30a1) c-- skip down 3.5" write(1,135)esc,cr,lf 135 format(1h+a1,'rd1050 ',a1,a1,$) c-- write job uic and job name, centered, bolded and underlined by the printer write(1,140)esc,esc,cr,lf,lf, + esc,jobgrp,jobown,cr,lf,lf, + esc,esc,(jobnam(i),i=1,jnamelen),cr,lf,lf,esc, + esc,cr,lf,esc 140 format(1h a1,'b',a1,'q',20('='),a1,a1,a1, + a1,'q','[',o,',',o,']',a1,a1,a1, + a1,'u',a1,'q',a1,a1,a1,a1,a1,'w', + a1,'q',20('='),a1,a1,a1,'p',$) c-- skip down write(1,135)esc,cr,lf c-- three trailer lines, same as three header lines if(maxpag.eq.0)write(1,100)rsxlit,jobgrp,jobown, + (jobnam(i),i=1,jnamelen),datlit if(maxpag.ne.0)write(1,101)rsxlit,jobgrp,jobown, + (jobnam(i),i=1,jnamelen),maxpag,datlit write(1,110)rsxlit,jobfrm,esc,(fntnam(i),i=1,fontlen),esc,datlit write(1,130)rsxlit,fname,datlit write(1,150)ff 150 format(1h+,a1,$) 200 continue !end of job page print loop return end c****************************************************************************** c****************************************************************************** c****************************************************************************** SUBROUTINE FPAGE(filflg,fname,namelen,copydn,copies,fildel) c****************************************************************************** byte fname(34),rsxlit(16),datlit(22),tim(8),dat(9),esc,cr,lf,ff logical*1 fildel integer*2 copydn,copies,filflg,namelen data ff,cr,lf,esc/"14,"15,"12,"33/ data rsxlit/'*','*','R','S','X','-','1','1','M', + ' ','V','4','.','1','*','*'/ data datlit/'*','*',18*' ','*','*'/ equivalence (datlit(3),dat(1)),(datlit(13),tim(1)) call time(tim) call date(dat) c-- File Flag Page print loop - print 'filflg' File Flag pages do 150 i=1,filflg c--first heading line - copy #, no. of copies requested write(1,100)rsxlit,copydn+1,copies,datlit 100 format(1h 16a1,' COPY',i2,' OF',i2,t51,22a1,a1,a1) c-- second heading line - deletion specified/not specified notification if(fildel)write(1,110)rsxlit,datlit 110 format(1h 16a1,' FILE DELETION SPECIFIED',t51,22a1/) if(.not.fildel)write(1,111)rsxlit,datlit 111 format(1h 16a1,' DELETION NOT SPECIFIED',t51,22a1/) c-- skip down 3.5" write(1,120)esc,cr,lf 120 format(1h+a1,'rd1200 ',a1,a1,$) c-- write file name, hardware centered and bolded by the printer write(1,130)esc,esc,cr,lf,lf, + esc,(fname(i),i=1,namelen),cr,lf,lf, + esc,cr,lf,esc 130 format(1h a1,'b',a1,'q',20('='),a1,a1,a1, + a1,'q',a1,a1,a1,a1, + a1,'q',20('='),a1,a1,a1,'p',$) c-- skip down write(1,120)esc,cr,lf c-- two trailer lines, same as two header lines write(1,100)rsxlit,copydn+1,copies,datlit if(fildel)write(1,110)rsxlit,datlit,cr,lf if(.not.fildel)write(1,111)rsxlit,datlit write(1,140)ff 140 format(1h+,a1) 150 continue !end of Flag Page print loop return end c****************************************************************************** c****************************************************************************** c****************************************************************************** SUBROUTINE GETFNT(nfont,fontstring,linewidth,pagelen,orient) c****************************************************************************** c routine is called with form number to select in nfont. c Returns selected font information string, line length and page length. c Font information string format is: c ffffffffffffffffffffmn1,n2,n3,n4,n5 c c where: ffffffffffffffffffff is the FONT ID, left justified, null filled c n1,n2,n3,n4 and n5 are parameters for the margin set command character fontid(-1:9)*20,fontstring*43,cnull,orient byte cr,lf,esc,null integer*2 tm(0:9),bm(0:9),lm(0:9),rm(0:9),ht(0:9),wd(0:9),pg(0:9) integer*2 linewidth,pagelen equivalence (null,cnull) data cr,lf,esc,null/"15,"12,"33,0/ include 'LB:[2,20]X2700FONT.CFG' c-- if specified form# doesn't have a named font, default font is font #0 if(nfont.lt.0.or.nfont.gt.9)nfont=0 write(fontstring,100)fontid(nfont), + esc,ht(nfont),tm(nfont),bm(nfont),lm(nfont),rm(nfont),cr,lf 100 format(a20,a1,'m',i3.3,4(',',i3.3),a1,a1) c-- find where trailing spaces begin in font ID string do 120 i=1,20 120 if(fontstring(i:i).ne.' ')j=i if(j.eq.20)goto 150 c-- change trailing spaces in font ID string to nulls do 130 i=j+1,20 130 fontstring(i:i)=cnull 150 linewidth=wd(nfont) !max chars per line for selected font pagelen=pg(nfont) !max lines per page for selected font orient=fontstring(j:j) !font orientation is last char of ID return end c****************************************************************************** c****************************************************************************** c****************************************************************************** SUBROUTINE PNTREC(eof) c****************************************************************************** c read record from input file, scan for , , and characters, c and for n font select commands. Update current page and current c line counters. Move characters from input to output buffer. Insert c margin set commands after any font select commands found. Send record c to printer if SKIPPG is less than 1. Otherwise, decrement pages-to-skip c counter whenever we end a logical page. c On return, RECEND contains the last character of the processed input c record. This routine checks to see if RECEND is an character c when this routine is again called to process the next input record. c This variable MUST be set to any non-escape character before this c routine is called to process the first record of a file, and MUST NOT c be modified by the caller between successive calls of this routine while c processing successive records of a file. byte orsav,fontstring(43),inbuf(0:255),outbuf(255) byte orient,recend,ff,cr,lf,vt,esc logical*1 eof,end integer*2 bufmax,num,pagsiz,iosb(2),qiofnc integer*2 recatt,linsiz,devbuf,curpag,lincnt,skippg,param(6) equivalence (param(2),num) data qiofnc/"11000/ common //recatt,linsiz,devbuf,curpag,lincnt,skippg,param, + orient,recend,ff,cr,lf,vt,esc end=.false. !outbut buffer holds end of input record eof=.false. !read past end-of-file or exceeded page limit idx=1 !next character to process from input record orsav=orient !save font orientation before processing record c-- get address of output buffer if we don't already have it if(param(1).eq.0)call getadr(param,outbuf) bufmax=min(linsiz,devbuf) !define maximum output record byte count nchar=0 !in case we get an read(2,50,end=260)nchar,(inbuf(i),i=1,nchar) 50 format(q,a1) c-- if null record (zero bytes), make it a single byte record containing a null if(nchar.eq.0)then inbuf(1)=0 nchar=1 endif c-- put last character of the previous record at the beginning of c this input record (to check for escape sequence split by record boundary) inbuf(0)=recend c-- initialize output buffer for new line outbuf(1)=lf lincnt=lincnt+1 num=1 !count of characters in output record c-- check if file has embedded carraige control record attributes (F.RATT=0) if(recatt.eq.0)then lincnt=lincnt-1 num=0 endif c-- check if file has FORTRAN record attributes (F.RATT=1) if(recatt.eq.1)then idx=2 !change this to skip first character later if(inbuf(1).eq.'+')then lincnt=lincnt-1 num=0 endif if(inbuf(1).eq.'0')then num=2 !double spacing lincnt=lincnt+1 outbuf(2)=lf endif if(inbuf(1).eq.'1')then outbuf(1)=ff !next page curpag=curpag+1 lincnt=1 endif endif c-- have we exceeded the job page limit? if(maxpag.gt.0.and.curpag.gt.maxpag)goto 260 c-- scan input record for n font select command, , , or - c move characters from input record to output buffer 100 do 200 i=idx,nchar if(skippg.gt.0.and.inbuf(i).ne.ff)goto 200 c-- ? if(inbuf(i).eq.ff)then curpag=curpag+1 lincnt=0 if(skippg.gt.0)skippg=skippg-1 endif c-- skip the page this character is on? if(skippg.gt.0)goto 200 num=num+1 !no - move this character to output buffer outbuf(num)=inbuf(i) c-- n? if(inbuf(i-1).eq.esc.and.(inbuf(i).ge.'0'.and.inbuf(i).le.'9')) + then j=inbuf(i)-'0' c-- -- make sure there's still room in the output buffer for the c -- margin set escape sequence (23 characters) and c a line terminator (if required) and a form feed (required if c new font orientation is different from the current orientation) if(num+25.gt.bufmax)then num=num-2 !leave the font select idx=i-1 ! command in input buffer goto 210 !go print partial record endif c-- get descriptor string, line length and page length for this new font call getfnt(j,fontstring,linsiz,pagsiz,orient) c-- if new font has orientation different than the old font, shove an explicit c into the output buffer to avoid XEROX printer's status sheets ... if(orient.ne.orsav)then num=num+1 outbuf(num)=outbuf(num-1) !move n up outbuf(num-1)=esc ! ... outbuf(num-2)=ff !put in endif orsav=orient !save new font orientation c-- put margin set command in output buffer do 120 j=21,43 num=num+1 120 outbuf(num)=fontstring(j) bufmax=min(linsiz,devbuf) !redefine maximum output record size goto 150 endif c-- ? if(inbuf(i).eq.lf)lincnt=lincnt+1 c-- ? if(inbuf(i).eq.vt)lincnt=(lincnt/6)*6+6 !compute vertical tab stop c-- is output buffer too full to add more characters to? 150 idx=i+1 !point to next character to process in input record if(num.ge.bufmax)goto 210 200 continue c-- finished processing all characters in input record end=.true. c-- add line terminator to output buffer, unless file has embedded carraige c control, or if it has FORTRAN carraige control, and the carraige control c byte is '$' 210 outbuf(num+1)=cr if(end.and.(recatt.eq.2.or.(recatt.eq.1.and.inbuf(1).ne.'$')))num=num+1 c-- check if the line count spills over the current page if(lincnt.ge.pagsiz)then do 235 i=1,pagsiz,lincnt curpag=curpag+1 !increment page number 235 lincnt=lincnt-pagsiz !reset line counter endif c-- write output buffer to printer call wtqio(qiofnc,1,1,,iosb,param) c-- go process rest of input buffer if we haven't finished it yet if(end)goto 900 num=0 goto 100 c-- read past end-of-file or exceeded maximum page limit - return that status 260 eof=.true. 900 if(nchar.gt.0)recend=inbuf(nchar) return end c****************************************************************************** c******************************************************************************