Postscript Calendar Program

Michael A. Patton map at gaak.LCS.MIT.Edu
Wed Sep 20 05:14:21 AEST 1989


After receiving Rolf's post, I added a few "features" to the script.
It now has defaults for everything on the command line (these defaults
are, of course, the ones I like, your mileage may vary).  Hack away.

	-Mike
----------------------------------------------------------------
#!/bin/csh -f
# pscal - Postscript year calendar
#
# Originally...
# From: patwood at unirot.UUCP (Patrick Wood)
# Newsgroups: net.sources
# Subject: PostScript Calendar
# Date: 7 Mar 87 18:43:51 GMT
# Organization: Public Access Unix, Piscataway, NJ
# 
# The following is a PostScript program to print calendars.  It doesn't
# work on or before 1752.
# 
# Shell stuff added 3/9/87 by King Ables
# Leap year bug fixed Dec. 4th, 1987 by Neil Crellin (neilc at dmscanb.dms.oz.au)
#
# Modified to produce calendar for whole year Aug 1988 - Rolf
# Twelve months from any month - 17/9/89 Rolf Howarth (rolf at flame.warwick.ac.uk)
#
# Modified to add defaults		Sep 1989 - MAP at LCS.MIT.Edu
#	printer	defaults to your "default" printer
#	title	defaults to "user's calendar"
#	month	defaults to January
#	year	defaults to this year
# Note: if there is a message and you wish to default the month or year,
#	the first word of the message cannot begin with a digit.
#	
#
# Usage: pscal [-Pprinter] [[month] year] [message ...] , eg.
#     pscal -Ppsc 9 1989 "Rolf's Calendar"
# will produce a twelve month calendar from Sept 89 to Aug 90.

# printer defaults to the default (i.e. we say nothing, lpr figures it out)
set printer=""

top:
if ($#argv > 0) then
	switch ("$argv[1]")
		case -P*:
			set printer="$argv[1]"
			shift argv
			goto top
		case -*:
			echo "usage: $0 [-Pprinter] [[month] year] [title ...]"
			exit 1
		case [0-9]*:
			if ($?name) then
			    set name="$name $argv[1]"
			else
			    if ($?month) then
				if ($?year) then
				    set name="$argv[1]"
				else
				    set year="$argv[1]"
				endif
			    else
				set month="$argv[1]"
			    endif
			endif
			shift argv
			goto top
		case *:
			if ($?name) then
			    set name="$name $argv[1]"
			else
			    set name="$argv[1]"
			endif
			shift argv
			goto top
	endsw
endif

if ($?year) then
else
	if ($?month) then
		set year=$month
	else
		set year=`date|awk '{print $6}'`
	endif
	set month=1
endif

if ($?name) then
else
	set name="$user's calendar"
endif

lpr $printer <<END-OF-CALENDAR
%!
% PostScript program to draw calendar
% Copyright (C) 1987 by Pipeline Associates, Inc.
% Permission is granted to modify and distribute this free of charge.

% /month should be set to a number from 1 to 12
% /year should be set to the year you want
% you can change the title and date fonts, if you want
% we figure out the rest
% won't produce valid calendars before 1800 (weird stuff happened
% in September of 1752)

/year $year def
/month $month 1 sub def
/titlefont /Times-Bold def
/dayfont /Helvetica-Bold def

/month_names [ (January) (February) (March) (April) (May) (June) (July)
		(August) (September) (October) (November) (December) ] def

/prtnum { 3 string cvs show} def

/drawgrid {		% draw calendar boxes
	dayfont findfont 7 scalefont setfont
	0 1 6 {
		dup dup 25 mul 12 moveto
		[ (Sun) (Mon) (Tue) (Wed) (Thu) (Fri) (Sat) ] exch get
		22.5 center
		25 mul 11.5 moveto
		.1 setlinewidth
		50 {
			gsave
			22 0 rlineto stroke
			grestore
			0 -2.5 rmoveto
		} repeat
	} for

} def

/drawnums {		% place day numbers on calendar
	dayfont findfont 12 scalefont setfont
	/start startday def
	/days ndays def
	start 25 mul 0 rmoveto
	1 1 days {
		/day exch def
		gsave
		  isdouble
		  {
			day prtdouble
		  }
		  {
			day prtnum
		  } ifelse
		grestore
		day start add 7 mod 0 eq
		{
			currentpoint exch pop 25 sub 0 exch moveto
		}
		{
			25 0 rmoveto
		} ifelse
	} for
} def

/isdouble {		% is today going to be overlaid on next week's?
	days start add 35 gt
	{
		day start add 35 gt
		{
			true true
		}
		{
			day start add 28 gt
			day 7 add days le and
			{
				false true
			}
			{
				false
			} ifelse
		} ifelse
	}
	{
		false
	} ifelse
} def

/prtdouble {
	gsave
	  dayfont findfont 6 scalefont setfont
	  exch
	  {
		9 25 rmoveto
		prtnum
	  }
	  {
		0 4 rmoveto
		prtnum
		0 -4 rmoveto
		gsave
		  dayfont findfont 12 scalefont setfont
		  (/) show
		grestore
	  } ifelse
	grestore
} def

/isleap {		% is this a leap year?
	year 4 mod 0 eq		% multiple of 4
	year 100 mod 0 ne 	% not century
	year 1000 mod 0 eq or and	% unless it's a millenia
} def

/days_month [ 31 28 31 30 31 30 31 31 30 31 30 31 ] def

/ndays {		% number of days in this month
	days_month month 1 sub get
	month 2 eq	% Feb
	isleap and
	{
		1 add
	} if
} def

/startday {		% starting day-of-week for this month
	/off year 2000 sub def	% offset from start of "epoch"
	off
	off 4 idiv add		% number of leap years
	off 100 idiv sub	% number of centuries
	off 1000 idiv add	% number of millenia
	6 add 7 mod 7 add 	% offset from Jan 1 2000
	/off exch def
	1 1 month 1 sub {
                1 copy
		days_month exch 1 sub get
		exch 2 eq
		isleap and
		{
			1 add
		} if
		/off exch off add def
	} for
	off 7 mod		% 0--Sunday, 1--monday, etc.
} def

/center {		% center string in given width
	/width exch def
	/str exch def width str 
	stringwidth pop sub 2 div 0 rmoveto str show
} def

90 rotate
40 -100 translate
titlefont findfont 36 scalefont setfont
/yearstring 10 string def
year yearstring cvs
month 0 ne {
    yearstring 4 47 put	% 47 is ascii for slash
    yearstring 5 year 1 add 100 mod 2 string cvs putinterval
    } if
0 40 moveto
($name) show
775 yearstring stringwidth pop sub 40 moveto
% 388 yearstring stringwidth pop 2 div sub 36 moveto
yearstring show

/showmonth {
    titlefont findfont 12 scalefont setfont
    0 20 moveto
    month_names month 1 sub get show
    0 0 moveto
    drawnums
    0 0 moveto
    drawgrid
} def

/nextmonth {
    month 1 add dup 13 eq {/year year 1 add def pop 1} if
    /month exch def
    showmonth
    } def

nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
-600 -160 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
-600 -160 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth

showpage

END-OF-CALENDAR



More information about the Alt.sources mailing list