$STORAGE: 2 $NOFLOATCALLS c DR:[333,106]OUTPT.FTN c c----------------------------------------------------------------- c c Output subroutine for Mitch Wyle's (and Glenn Everhart's) c c D esk T op C alendar program c c Inputs: c line - character array containing date range to output c c Output: c DTC.OUT file, to be printed c c----------------------------------------------------------------- c c To the reader of this code: c c This routine does NOT perform to specifications. The date c range check is incomplete. c c c This code is worse than a kludge; it is DIE code (Designed In Editor) c The output spec was conceived and coded in the editor, and the algorithm c to get the output stinks. c The idea of using an output record a la COBOL is sound. It is conceptually c best to build up an array by calls to date functions and subroutines, c HOWEVER, the coward arrays and repetitive loops are wasteful and unneccessary c This routine needs a major re-write c !!!! c The output specification and format is fine (for my uses); If you do c re-write this routine, here are some ideas: c c o Include the file indirection to print several calendar files' c appointments. c c o build functions which call the subroutine dany; use these functions c to make the out array for printing; c o eliminate the coward arrays; do fancy math in the code instead c c o Create alternate outputs, such as c - Year-At-A-Glance output c - collumns or boxes on page with appointments AND blank areas c which are free c c I apologize for this lousy code; I hope Glenn or somebody cleans it up again. c SUBROUTINE OUTPT(line) character line(1) c input line character temp(2) CHARACTER*2 TEMP2 EQUIVALENCE(TEMP(1),TEMP2) c temporary string converting array character appoin(60) c appointment string character work(60) c scratch array for handling scheduling character esc c escape character integer id,id2 c Julian Day integer im,im2 c Julian Month integer iye,iye2 c Julian Year integer rdspfg c flag to reverse sense of display of time integer ctlfg c misc control flags here INTEGER IDYR,IDMO,IDDY COMMON/DEFDAT/IDYR,IDMO,IDDY common/ctls/rdspfg,ctlfg character fname(60) integer fnsz character*60 fnam60 equivalence(fname(1),fnam60) common/fn/fnsz,fname LOGICAL got1, got2 c flags to signal which date(s) passed in character out(80) c output record for appointment file character monthn(9) INTEGER cowrd1(7,6) c binary array for last month INTEGER cowrd2(7,6) c binary array for this month INTEGER cowrd3(7,6) c binary array for next month c maximum of 6 weeks in a month do 1 i=1,40 c trim off the 'O ' from begining line(i) = line(i+2) 1 continue got1 = .false. got2 = .false. CALL DATMUN(LINE) c if date(s) was(ere) specified in line, then Do 22 i=1,6 c extract it (them) from line: If ( ( line(i) .gt. '9' ) .or. ( line(i) .lt. '0' ) ) goto 33 22 Continue got1 = .true. c flag existence of 1st date temp(1) = line(1) c Six numbers in a row, temp(2) = line(2) c decode into numeric date: read(temp2,2)im c decode ( 2 , 2 , temp ) im temp(1) = line(3) temp(2) = line(4) read(temp2,2)id c decode ( 2 , 2 , temp ) id temp(1) = line(5) temp(2) = line(6) read(temp2,2)iye c decode ( 2 , 2 , temp ) iye 2 Format(i2) Do 3 i=1,63 c Now discard the first date line(i) = line(i+7) c part from line string: 3 continue got2 = .true. c flag existence of second date CALL DATMUN(LINE) c if 2nd date was specified in line, then Do 23 i=1,6 c extract it from line also: If ( ( line(i) .gt. '9' ) .or. ( line(i) .lt. '0' ) ) goto 33 23 Continue temp(1) = line(1) c Six numbers in a row, temp(2) = line(2) c so decode into numeric date: read(temp2,2)im2 c decode ( 2 , 2 , temp ) im2 temp(1) = line(3) temp(2) = line(4) read(temp2,2)id2 c decode ( 2 , 2 , temp ) id2 temp(1) = line(5) temp(2) = line(6) read(temp2,2)iye2 c decode ( 2 , 2 , temp ) iye2 33 continue If (.not. got1) call idate(im,id,iye) c default start date = today If (.not. got2) then c default ending date im2 = 12 c is dec 31, 1999 id2 = 31 iye2 = 99 end if open (4,file='DTC.OUT',form='FORMATTED',status='NEW') call idate(idis1,idis2,idis3) write(4,38) idis1,idis2,idis3 38 format('1 DTC Rev 22-NOV-83 Appointments Summary', 1 10x,' Print Date: ',2(i2,'/'),i2,/) Do 34 i=1,80 c start building the output line array out(i) = ' ' c first fill it with blanks 34 Continue If ( im .eq. 1 ) then c get previous month's month name string nm = 12 c logic here is for year boundaries ny = iy - 1 Else nm = im - 1 ny = iye End If call gaby(nm,monthn) c got the string, now stick it in output j = 0 c spacing it every other letter Do 4 i=1,17,2 j = j + 1 out(i) = monthn(j) 4 Continue call gaby(im,monthn) c now get this month's month name string j = 0 c and stick it into output string same way Do 5 i=1,17,2 j = j + 1 out(i+28) = monthn(j) 5 continue ly = iye lm = im + 1 c Get next month's month name string If ( lm .gt. 12 ) then c and stick into output string lm = 1 ly = iye + 1 End If call gaby(lm,monthn) Do 61 i=1,9 j = (i*2)-1 out(j+55) = monthn(i) 61 Continue write(4,6) (out(i),i=1,79) c WRITE MONTH NAME HEADERS 6 format(1x,79a1) write(4,69) 69 format(' Su Mo Tu We Th Fr Sa ',5x,' Su Mo Tu We Th Fr Sa ', 1 5x,' Su Mo Tu We Th Fr Sa') c Now do the calendar logic to build the three months' numeric c calendar displays and load them into OUT one line at a time c Hmmmmmm.... how do we wanna do this? c c I shall take the coward's way out: c we shall build three numeric arrays, one for each month c three numeric arrays which contain the dates for last month, c this month, and next month in binary, then fill OUT with the c ascii rows from each, and print OUT.... c lm contains next months month number c nm contains last months month number c im contains this months month number c send these guys into dany... c use dany and extract algorithm out of mischy to build these c three coward arrays call dany(ib,il,nm,ny) c get day of week, days in month c for last month ip = ib - 1 c day of week pointer (collumn #) iy = 1 c row number index into array Do 7 i=1,il ip = ip + 1 c increment day number If ( ip .gt. 7 ) then c is it Sunday again? ip = 1 c reset day to Sunday. iy = iy + 1 c move down one line End If cowrd1(ip,iy) = i c stick date into binary array 7 Continue call dany(ib,il,lm,ly) c get day of week, days in month c for next month ip = ib - 1 c day of week pointer (collumn #) iy = 1 c row number index into array Do 8 i=1,il ip = ip + 1 c increment day number If ( ip .gt. 7 ) then c is it Sunday again? ip = 1 c reset day to Sunday. iy = iy + 1 c move down one line End If cowrd3(ip,iy) = i c stick date into binary array 8 Continue call dany(ib,il,im,iye) c get day of week, days in month c for this month ip = ib - 1 c day of week pointer (collumn #) iy = 1 c row number index into array Do 9 i=1,il ip = ip + 1 c increment day number If ( ip .gt. 7 ) then c is it Sunday again? ip = 1 c reset day to Sunday. iy = iy + 1 c move down one line End If cowrd2(ip,iy) = i c stick date into binary array 9 Continue c Now we have finished building the coward arrays; just c stick data from them into OUT, one line at a time and print c OUT, and we are through with header section, so: Do 12 io=1,6 Do 10 i=1,79 out(i) = 0 10 continue j = 1 Do 11 i=1,7 write(temp2,2)cowrd1(i,io) c encode(2,2,temp) cowrd1(i,io) out(j)= temp(1) out(j+1) = temp(2) write(temp2,2)cowrd2(i,io) c encode(2,2,temp) cowrd2(i,io) out(j+27) = temp(1) out(j+28) = temp(2) write(temp2,2)cowrd3(i,io) c encode(2,2,temp),cowrd3(i,io) out(j+54) = temp(1) out(j+55) = temp(2) j = j + 3 11 continue Do 118 ii=1,80 c if values are if (out(ii).eq.0) out(ii) = ' ' c 0, make em blanks if ((out(ii).eq.'0').and. 1 (out(ii-1).lt.'1'))out(ii)=' ' c unless we want 0's 118 continue write(4,13) (out(i),i=1,79) 13 FORMAT(1X,79a1) 12 continue c now read appointments open (1,file=fnam60,form='FORMATTED',status='OLD') C IBM PC MINI COMPILER DOESN'T HAVE ERR= ON OPENS. write(4,15) c skip a line past last one on calendars 15 format(/) 21 continue c now process appointments: read(1,722,end=26) iyo,imo,ido,itim,(appoin(i),i=1,60) 722 format(i2,i2,i2,i3,60a1) c c Check to see if appointment is in range: c qqq stick range check code here ************** qqq ************ c c If .not.((imo.ge.ime).and.(imo.le.im2)) goto 21 c write(4,723) imo,ido,iyo,itim,(appoin(i),i=1,60) 723 format(1x,i2,'/',i2,'/',i2,2x,i3,'0',' - ',60a1) goto 21 26 continue 990 return end