diff -ur kpcal-2.0-orig/kpcal.c kpcal-2.0/kpcal.c --- kpcal-2.0-orig/kpcal.c 1990-01-30 19:19:40.000000000 +0900 +++ kpcal-2.0/kpcal.c 2003-04-21 22:07:00.000000000 +0900 @@ -169,6 +169,7 @@ */ PRT("/year %d def\n", year); PRT("/month %d def\n", m); + PRT("defineholiday\n"); PRT("printmonth\n\n"); /* diff -ur kpcal-2.0-orig/kpcal_header.h kpcal-2.0/kpcal_header.h --- kpcal-2.0-orig/kpcal_header.h 1990-01-30 19:19:40.000000000 +0900 +++ kpcal-2.0/kpcal_header.h 2004-05-18 19:57:49.000000000 +0900 @@ -46,21 +46,25 @@ "/month_names [ (January) (February) (March) (April) (May) (June) (July)", " (August) (September) (October) (November) (December) ] def", "", - "/holidays [", - " [] % NONE", - " [ 1 15 ] % January", - " [ 11 ] % Feburay", - " [ 21 ] % March", - " [ 29 ] % April", - " [ 3 4 5 ] % March", - " [] % June", - " [] % July", - " [] % Auguest", - " [ 15 23 ] % September", - " [ 10 ] % October", - " [ 3 23 ] % November", - " [ 23 ] % December", - "] def", + "/defineholiday {", + " /holidays [", + " [] % NONE", + " [ 1 year 2000 ge { 15 year 1 1 startday dup 1 le { 6 add sub } { 1 sub sub } ifelse } { 15 } ifelse ] % January", + " [ 11 ] % February", + " [ year 1980 ge year 2099 le and { 20.8431 0.242194 year 1980 sub mul year 1980 sub 4 div cvi sub add cvi } { 21 } ifelse] % March", + " [ 29 ] % April", + " [ 3 4 5 ] % May", + " [] % June", + " [ year 2003 ge { 22 year 7 1 startday dup 1 le { 6 add sub } { 1 sub sub } ifelse } { 20 } ifelse ] % July", + " [] % Auguest", + " [ year 2003 ge { 22 year 9 1 startday dup 1 le { 6 add sub } { 1 sub sub } ifelse } { 15 } ifelse", + " year 1980 ge year 2099 le and { 23.2488 0.242194 year 1980 sub mul year 1980 sub 4 div cvi sub add cvi } { 23 } ifelse", + " 4 { 1 index } repeat sub abs 2 eq { add 2 div cvi } { pop pop } ifelse ] % September", + " [ year 2000 ge { 10 year 10 1 startday dup 1 le { 1 add sub } { 6 exch sub add } ifelse } { 10 } ifelse ] % October", + " [ 3 23 ] % November", + " [ 23 ] % December", + " ] def", + "} def", "", "/daymap 32 array def", "", @@ -90,7 +94,7 @@ "", "/drawnums { % place day numbers on calendar", " dayfont findfont 30 scalefont setfont", - " /start startday def", + " /start year month 1 startday def", " /days ndays def", " start 100 mul 5 add 10 rmoveto", " submonth 0 eq {", @@ -98,18 +102,21 @@ " daymap exch dup", " start add 7 mod", " dup 1 eq {", - " pop 2", + " pop 2 % Sunday", " }", " {", - " 0 eq { 1 } { 0 } ifelse", + " 0 eq { 1 } { 0 } ifelse % Saturday / Weekday", " } ifelse", " put", " } for", " holidays month get {", - " dup daymap exch get 2 eq {", - " 1 add", + " /tmpday exch def", + " daymap tmpday get 2 eq", + " daymap tmpday 1 sub get 2 ne", + " daymap tmpday 1 add get 2 ne and and { % substitute holiday", + " /tmpday tmpday 1 add def", " } { } ifelse", - " daymap exch 2 put", + " daymap tmpday 2 put % holiday", " } forall", " }", " {", @@ -144,7 +151,7 @@ "} def", "", "/drawfill { % place fill squares on calendar", - " /start startday def", + " /start year month 1 startday def", " /days ndays def", " 0 35 rmoveto", " 1.0 setlinewidth", @@ -190,7 +197,7 @@ "/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", + " year 400 mod 0 eq or and", "} def", "", "/days_month [ 31 28 31 30 31 30 31 31 30 31 30 31 ] def", @@ -205,24 +212,27 @@ "} 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 {", - " /idx exch def", - " days_month idx 1 sub get", - " idx 2 eq", - " isleap and", - " {", - " 1 add", - " } if", - " /off exch off add def", - " } for", - " off 7 mod % 0--Sunday, 1--monday, etc.", + " /_d exch def % day", + " /_m exch def % month", + " /_y exch def % year", + " _m 2 le {", + " /mm _m 12 add def /yy _y 1 sub def", + " } {", + " /mm _m def /yy _y def", + " } ifelse", + " /yy1 yy 100 div truncate cvi def", + " /yy2 yy yy1 100 mul sub cvi def", + " /off yy2 yy2 4 idiv add", + " yy1 4 idiv add", + " 26 mm 1 add mul 10 idiv add", + " 2 yy1 mul sub", + " _d add", + " 7 mod", + " def", + " off 0 le {", + " /off off 7 add def", + " } if", + " off 1 sub % 0--Sunday, 1--monday, etc.", "} def", "", "/center { % center string in given width", @@ -252,7 +262,7 @@ " /CompTextFont findfont 6 scalefont setfont", " /mytext exch def", " /myday exch def", - " startday myday 1 sub add dup 7 mod 100 mul 5 add % gives column", + " year month 1 startday myday 1 sub add dup 7 mod 100 mul 5 add % gives column", " exch 7 idiv -80 mul % gives row", " dup /ypos exch def moveto", " /LM currentpoint pop def /RM LM 95 add def",