calendar

Dave Schuller schuller at indigo2.biomol.uci.edu
Thu Dec 14 12:26:24 EST 1995


Happy winter solstice.

below is a FORTRAN program which produces monthly calendars in Postscript.
It compiles and runs on Irix 4.0.5 and Irix 5.3 machines.
It could conceivably run on other Unix machines, but i have no resources
for testing that.

The calendar page has been developed for U.S. 8.5" x 11" paper, but I
think it may work acceptably with A4.

=======================================================================
              "The gene is the basic unit of selfishness"
                   - Richard Dawkins in The Selfish Gene
=======================================================================
                        Dave Schuller
                        University of California-Irvine
                        schuller at indigo2.biomol.uci.edu
                        modern man in a post-modern world

----------------------- pscal.f -----------------------------------------------
	program pscal
c
c		djms Unix version apr 1995
c
c		produce calendar for given month and year as Postscript file
c		requires unix utilities cal, time, wait to be present (they are on Irix)
c		default month and year are taken from current date;
c		can be overridden by command line arguments for month and year:
c		e.g.:  pscal 12 1995
c		will produce calendar for december 1995
c		(note that year 95 and year 1995 are not equivalent)
c		e.g.: pscal 12
c		will produce calendar for december of current year
c		usually you will want to pipe the output to a file:
c		pscal 12 1995 >dec95.ps
c
c
        integer i_arg, n_arg, iargc, temp, i
	external time
	integer time
	integer itime, itarray(9)
	integer test, wait, status
	integer month, year
	integer clen, true_clen, zip_check
	character*80 line
	character*2 short_text
	character*9 weekday(7)
c
	data weekday /'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday',
     *	'Friday', 'Saturday' /
c
c
c	fill in current month and year as default (Irix Unix fashion)
	itime = time()
	call ltime(itime, itarray)
	month = itarray(5) + 1
	year  = itarray(6) + 1900

c
c               look for command line arguments
        n_arg = iargc()
        if (n_arg .NE. 0) then
c	    recover month
            call getarg(1, line)
	    read(line, *, end=666, err=666) temp
	    month = temp
	  if (n_arg .gt. 1) then
c	    recover year
	    call getarg(2, line)
	    read(line, *, end=666, err=666) temp
	    year = temp
	  endif
	endif

	if (month .lt. 1 .or. month .gt. 12) then
	  stop ' PSCAL> bad month'
	endif

c	have year and date; call 'cal'

	write(line,'(a4, 1x, i2, 1x, i5, 1x, a20)')
     &	  'cal ',month, year, '> time_temp_asdfasdf'
	call system(line)

c	wait for completion of file write
	status = 0
	test = wait(status)
	
	open (unit=10, file='time_temp_asdfasdf',carriagecontrol='LIST',
     &	status='OLD', err=667, form='FORMATTED')


c	Postscript file header, define routines
c
	write(6,'(A)') '%!Postscript'
	write(6,*) '90 rotate'			!set landscape orientation
	write(6,*) '0 -612 translate'
	write(6,*) '106 45 { dup mul exch'	!goodgray shades
	write(6,*) '	dup mul add 1.0'
	write(6,*) '	exch sub } setscreen'
c
	write(6,*) '/rightjust {'		!routine to rightjustify txt
	write(6,*) 'moveto'
	write(6,*) 'dup stringwidth pop neg 0 rmoveto'
	write(6,*) 'show} def'
c
	write(6,*) '/leftjust {'		!routine to leftjustify txt
	write(6,*) 'moveto'
	write(6,*) 'show} def'
c
	write(6,*) '/center { moveto'		!routine to center txt
	write(6,*) 'dup stringwidth pop 2 div neg'
	write(6,*) '0 rmoveto show } def'
c
c					!write month and year
	write(6,*) '/Helvetica findfont'
	write(6,*) '72 scalefont setfont'

c
c	first line is month and year; e.g. 'April 1995'
	read(10,'(A)',end=668, err=668) line
	call left_just(line)
	clen = true_clen(line)

 	write(6,*) '(', line(1:clen), ') 396 512 center'

c	  !read and discard 'S  M Tu  W Th  F S' line
c	  !write full weekday names
	read(10,'(A)',end=668, err=668) line
	write(6,'(A)') '/Helvetica-Bold findfont'
	write(6,'(A)') '17 scalefont setfont'
	do i = 1,7
	  write(6,210) weekday(i), i * 100 - 4
 210	  format('(',a9,') ',i3,' 470 center')
	end do

c	set up font for dates
	write(6,*) '/Helvetica-Bold findfont'
	write(6,*) '50 scalefont setfont'

 300	continue

c	  read, write a line of dates

	  read(10,'(A)',end=669, err=668) line
	  if (zip_check(line) .eq. 0) goto 669

c					!draw boxes
	  write(6,'(A)') '0 setgray'
	  do i = 0, 7
	    write(6,220) i * 100 + 46, 458, i *100 + 46, 390
 220	    format(i3,1x,i3,' moveto ',i3,1x,i3, ' lineto stroke')
	  end do
	  do i = 0, 1
	    write(6,220) 46, 458 - (i * 68), 746, 458 - (i * 68)
	  end do

c					!write dates
	  write(6,'(A)') '0.8 setgray'
c
	  do i = 1, 7
	    read(line((i*3-2):(i*3-1)), '(A2)') short_text
	    write(6,250) short_text, (i * 100 + 30), 402
 250	    format ('(',a2,') ',i3,1x,i3,' rightjust')
	  end do

	  write(6,'(A)') '0 -68 translate'
	goto 300



c	each day of week is 100 wide; left margin 46, right margin 46
c	top margin 46, bottom margin 46, each week 68 high, daynames 36, title 72
c	title 396 494
c	daynames x 458
c	week boxes 458 - 5x68 or 6x68



 666	continue
	stop 'PSCAL> bad command line argument'
 667	continue
	stop 'PSCAL> err opening temp file'
 668	continue
	stop 'PSCAL> err reading temp file'
 669	continue
c	finish output, terminate
	write(6,*) 'showpage'
	close(6)
	open (unit=10, file='time_temp_asdfasdf',
     &	status='OLD', dispose='DELETE')
	close(10, dispose='DELETE')

	end

c==========================================================================
	integer function true_clen( string )
C**************************************************************************
c	find length of string, excluding trailing blanks
	character*(*) string
	integer clen, i
c
	true_clen = 0
	clen = len(string)
	do i = clen, 1, -1
	  if (string(i:i) .ne. ' ') then
	    true_clen = i
	    return
	  endif
	end do
c	if reach end of loop, string is all blank, return with 0.
	return
	end

c==========================================================================
	subroutine left_just( string )
C**************************************************************************
c	left-justify character string
c
	character*(*) string
	integer clen, i
	integer true_clen
c
	clen = true_clen(string)
	if (clen .gt. 0) then
	  do i = 1, clen
	    if (string(i:i) .ne. ' ') then
	      if (i .gt. 1) then
		string = string(i:clen)
	      endif
	      return
	    endif
	  end do
	endif

	return
	end

c==========================================================================
	integer function zip_check( string )
C**************************************************************************
c	return 0 if nothing but spaces; otherwise return 1
c
	character*(*) string
	integer clen, i
	integer true_clen
c
	zip_check = 0

	clen = true_clen(string)
	if (clen .gt. 0) then
	  do i = 1, clen
	    if (string(i:i) .ne. ' ') then
	      zip_check = 1
	      return
	    endif
	  end do
	endif
	return
	end





More information about the Xtal-log mailing list