Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / perl-5.8.0 / lib / site_perl / 5.8.0 / sun4-solaris / Date / Calendar / Profiles.pm
CommitLineData
86530b38
AT
1
2###############################################################################
3## ##
4## Copyright (c) 2000 - 2002 by Steffen Beyer. ##
5## All rights reserved. ##
6## ##
7## This package is free software; you can redistribute it ##
8## and/or modify it under the same terms as Perl itself. ##
9## ##
10###############################################################################
11
12package Date::Calendar::Profiles;
13
14use strict;
15use vars qw( @ISA @EXPORT @EXPORT_OK $VERSION $Profiles );
16
17require Exporter;
18
19@ISA = qw(Exporter);
20
21@EXPORT = qw();
22
23@EXPORT_OK = qw(
24 $Profiles
25 &Previous_Friday
26 &Next_Monday
27 &Next_Monday_or_Tuesday
28 &Nearest_Workday
29 &Sunday_to_Monday
30 &Advent1
31 &Advent2
32 &Advent3
33 &Advent4
34 &Advent
35);
36
37$VERSION = '5.3';
38
39use Date::Calc qw(:all);
40use Carp::Clan qw(^Date::);
41
42##########################################################################
43# #
44# Moving ("variable") holidays depending on the date of Easter Sunday: #
45# #
46# Weiberfastnacht, Fettdonnerstag = -52 days #
47# Carnival Monday / Rosenmontag / Veille du Mardi Gras = -48 days #
48# Mardi Gras / Karnevalsdienstag / Mardi Gras = -47 days #
49# Ash Wednesday / Aschermittwoch / Mercredi des Cendres = -46 days #
50# Palm Sunday / Palmsonntag / Dimanche des Rameaux = -7 days #
51# Maundy Thursday / Gruendonnerstag / Jeudi avant Paques = -3 days #
52# Good Friday / Karfreitag / Vendredi Saint = -2 days #
53# Easter Saturday / Ostersamstag / Samedi de Paques = -1 day #
54# Easter Sunday / Ostersonntag / Dimanche de Paques = +0 days #
55# Easter Monday / Ostermontag / Lundi de Paques = +1 day #
56# Prayer Day / Bettag / Jour de la Priere (Denmark) = +26 days #
57# Ascension of Christ / Christi Himmelfahrt / Ascension = +39 days #
58# Whitsunday / Pfingstsonntag / Dimanche de Pentecote = +49 days #
59# Whitmonday / Pfingstmontag / Lundi de Pentecote = +50 days #
60# Feast of Corpus Christi / Fronleichnam / Fete-Dieu = +60 days #
61# #
62##########################################################################
63
64###############################################
65# #
66# Rules to enhance readability: #
67# #
68# 1) First level constants in single quotes, #
69# second level constants in double quotes. #
70# 2) Use leading zeros for fixed length. #
71# #
72###############################################
73
74#####################
75# Global variables: #
76#####################
77
78$Profiles = { };
79
80###############################
81# Global utility subroutines: #
82###############################
83
84sub Previous_Friday
85{
86 my($yy) = shift;
87 my($mm) = shift;
88 my($dd) = shift;
89 my($dow);
90
91# If holiday falls on Saturday or Sunday, use previous Friday instead:
92
93 $dow = Day_of_Week($yy,$mm,$dd);
94 if ($dow == 6) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,-1); }
95 elsif ($dow == 7) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,-2); }
96 return($yy,$mm,$dd,@_);
97}
98
99sub Next_Monday
100{
101 my($yy) = shift;
102 my($mm) = shift;
103 my($dd) = shift;
104 my($dow);
105
106# If holiday falls on Saturday, use following Monday instead;
107# if holiday falls on Sunday, use day thereafter (Monday) instead:
108
109 $dow = Day_of_Week($yy,$mm,$dd);
110 if ($dow == 6) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,+2); }
111 elsif ($dow == 7) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,+1); }
112 return($yy,$mm,$dd,@_);
113}
114
115sub Next_Monday_or_Tuesday # For second holiday of two adjacent ones!
116{
117 my($yy) = shift;
118 my($mm) = shift;
119 my($dd) = shift;
120 my($dow);
121
122# If holiday falls on Saturday, use following Monday instead;
123# if holiday falls on Sunday or Monday, use next Tuesday instead
124# (because Monday is already taken by adjacent holiday on the day before):
125
126 $dow = Day_of_Week($yy,$mm,$dd);
127 if ($dow == 6 or $dow == 7) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,+2); }
128 elsif ($dow == 1) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,+1); }
129 return($yy,$mm,$dd,@_);
130}
131
132sub Nearest_Workday
133{
134 my($yy) = shift;
135 my($mm) = shift;
136 my($dd) = shift;
137 my($dow);
138
139# If holiday falls on Saturday, use day before (Friday) instead;
140# if holiday falls on Sunday, use day thereafter (Monday) instead:
141
142 $dow = Day_of_Week($yy,$mm,$dd);
143 if ($dow == 6) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,-1); }
144 elsif ($dow == 7) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,+1); }
145 return($yy,$mm,$dd,@_);
146}
147
148sub Sunday_to_Monday
149{
150 my($yy) = shift;
151 my($mm) = shift;
152 my($dd) = shift;
153 my($dow);
154
155# If holiday falls on Sunday, use day thereafter (Monday) instead:
156
157 $dow = Day_of_Week($yy,$mm,$dd);
158 if ($dow == 7) { ($yy,$mm,$dd) = Add_Delta_Days($yy,$mm,$dd,+1); }
159 return($yy,$mm,$dd,@_);
160}
161
162######################################
163# Global utility callback functions: #
164######################################
165
166sub Advent1
167{
168 my($year,$label) = @_;
169 return( Add_Delta_Days($year,12,25,
170 -(Day_of_Week($year,12,25)+21)), '#' );
171}
172sub Advent2
173{
174 my($year,$label) = @_;
175 return( Add_Delta_Days($year,12,25,
176 -(Day_of_Week($year,12,25)+14)), '#' );
177}
178sub Advent3
179{
180 my($year,$label) = @_;
181 return( Add_Delta_Days($year,12,25,
182 -(Day_of_Week($year,12,25)+7)), '#' );
183}
184sub Advent4
185{
186 my($year,$label) = @_;
187 return( Add_Delta_Days($year,12,25,
188 -Day_of_Week($year,12,25)), '#' );
189}
190
191sub Advent
192{
193 my($year,$label) = @_;
194 my($offset);
195
196 $offset = (4 - substr($label,0,1)) * 7;
197 return( Add_Delta_Days($year,12,25,
198 -(Day_of_Week($year,12,25)+$offset)), '#' );
199}
200
201###################
202# Local profiles: #
203###################
204
205$Profiles->{'DE'} = # Deutschland
206{
207 # For labeling only (defaults, may be overridden):
208