KGRKJGETMRETU895U-589TY5MIGM5JGB5SDFESFREWTGR54TY
Server : Apache/2.4.62
System : FreeBSD fbsdweb2.web.rcn.net 14.1-RELEASE FreeBSD 14.1-RELEASE releng/14.1-n267679-10e31f0946d8 GENERIC amd64
User : www ( 80)
PHP Version : 8.3.8
Disable Function : NONE
Directory :  /domains/mandarintools/cgi-bin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /domains/mandarintools/cgi-bin/callib.pl
# -*- coding:utf-8 -*-



@monthnames = ("January", "February", "March", "April", "May", "June", 

	       "July", "August", "September", "October", "November", 

	       "December");



@daysofweek = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", 

	       "Saturday");



$yue = "月";

$ri = "日";

$run = "闰";



@calnumbers = ("零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十",

	       "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "廿",

	       "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "卅",

	       "卅一");





@stems = ("7532", "4E59", "4E19", "4E01", "620A", "5DF1", "5E9A", "8F9B", 

	  "58EC", "7678");



@stemsu8 = ("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸");



@stempy = ("jia", "yi", "bing", "ding", "wu", "ji", "geng", "xin", "ren", "gui");





@branches = ("5B50", "4E11", "5BC5", "536F", "8FB0", "5DF3", "5348", 

	     "672A", "7533", "9149", "620C", "4EA5");



@branchesu8 = ("子", "丑", "寅", "卯", "辰", "巳",

	       "午", "未", "申", "酉", "戌", "亥");



@branchpy = ("zi", "chou", "yin", "mao", "chen", "si",

	     "wu", "wei", "shen", "yu", "xu", "hai");





@signs = ("Rat", "Ox", "Tiger", "Rabbit", "Dragon", "Snake", 

	  "Horse", "Sheep", "Monkey", "Chicken", "Dog", "Pig");



@signuni = ("9F20", "725B", "864E", "5154", "9F8D", "86C7", 

	    "99AC", "7F8A", "7334", "96DE", "72D7", "8C6C");



@signu8 = ("鼠", "牛", "虎", "兔", "龙", "蛇", 

	   "马", "羊", "猴", "鸡", "狗", "猪");





%months = (

	   "january" => 31,

	   "february" => 28,

	   "march" => 31,

	   "april" => 30,

	   "may" => 31,

	   "june" => 30,

	   "july" => 31,

	   "august" => 31,

	   "september" => 30,

	   "october" => 31,

	   "november" => 30,

	   "december" => 31

	   );



@months = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);



%leapmonths = (

	       "january" => 31,

	       "february" => 29,

	       "march" => 31,

	       "april" => 30,

	       "may" => 31,

	       "june" => 30,

	       "july" => 31,

	       "august" => 31,

	       "september" => 30,

	       "october" => 31,

	       "november" => 30,

	       "december" => 31

	   );



@leapmonths = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);



%daysofweek = (

	       "sunday" => 0,

	       "monday" => 1,

	       "tuesday" => 2,

	       "wednesday" => 3,

	       "thursday" => 4,

	       "friday" => 5,

	       "saturday" => 6

	       );



%yearstart = (

	      1 => "sunday",

	      2 => "monday",

	      3 => "tuesday",

	      4 => "wednesday",

	      5 => "thursday",

	      6 => "friday",

	      7 => "saturday",

	      8 => "sunday",

	      9 => "monday",

	      10 => "tuesday",

	      11 => "wednesday",

	      12 => "thursday",

	      13 => "friday",

	      14 => "saturday"

	      );



#print JGDate2Day(AD, 1, 1, 1), "\n";



# Finds the day of the week for a given date.  Assumes

# dates before 1582 are Julian Calendar, after are Gregorian



sub JGDate2Day {

    local($era, $year, $month, $day) = @_;

    $month--;

    if ($era eq "AD") {

	if ($year > 1582) {	# Gregorian Calendar

	    $yeartype = 7;

	    for ($i = 1583; $i <  $year; $i++) {

		#print "$i, $yeartype\n";

		if (isGregorianleap($era, $i + 1)) {

		    $yeartype = ($yeartype % 7) + 8;

		} else {

		    if ($yeartype == 13) {

			$yeartype = 1;

		    } elsif ($yeartype > 7) {

			$yeartype = ($yeartype % 7) + 2;

		    } else {

			$yeartype = ($yeartype % 7) + 1;

		    }

		}

	    }

	    #print $yeartype;

	    $julianday = 0;

	    for ($j = 0; $j < $month; $j++) {

		$julianday += isGregorianleap($era, $year) ? $leapmonths[$j] : $months[$j];

	    }

	    $julianday += $day;

	    #print $julianday , "\n";

	    return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];

	} elsif ($year < 1582) { # Julian Calendar

	    $yeartype = 7;

	    for ($i = 1; $i <  $year; $i++) {

		#print "$i, $yeartype\n";

		if (isJulianleap($i + 1)) {

		    $yeartype = ($yeartype % 7) + 8;

		} else {

		    if ($yeartype == 13) {

			$yeartype = 1;

		    } elsif ($yeartype > 7) {

			$yeartype = ($yeartype % 7) + 2;

		    } else {

			$yeartype = ($yeartype % 7) + 1;

		    }

		}

	    }

	    #print $yeartype;

	    $julianday = 0;

	    for ($j = 0; $j < $month; $j++) {

		$julianday += isJulianleap($year) ? $leapmonths[$j] : $months[$j];

	    }

	    $julianday += $day;

	    #print $julianday , "\n";

	    return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];

	} else {		# 1582 AD, year of the switch

	    if ($month < 9) {

		$yeartype = 2;

	    } elsif ($month == 9 and $day <= 4) {

		$yeartype = 2;

	    } elsif ($month == 9 and $day >= 15) {

		$yeartype = 6;

	    } elsif ($month == 9 and $day > 4 and $day < 15) {

		return "Non-existent";

	    } else {

		$yeartype = 6;

	    }

	    $julianday = 0;

	    for ($j = 0; $j < $month; $j++) {

		$julianday += $months[$j];

	    }

	    $julianday += $day;

	    #print $julianday , "\n";

	    return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];

	}

    } else {			# BC



    }

}



#print "Gregorian " , GregorianDate2Day("BC", 1, 12, 31) , "\n";



# Find day of week for a given Gregorian date



sub GregorianDate2Day {

    local($era, $year, $month, $day) = @_;

    $month--;

    if ($era eq "AD") {

	$yeartype = 2;

	for ($i = 1; $i <  $year; $i++) {

	    #print "$i, $yeartype\n";

	    if (isGregorianleap($era, $i + 1)) {

		$yeartype = ($yeartype % 7) + 8;

	    } else {

		if ($yeartype == 13) {

		    $yeartype = 1;

		} elsif ($yeartype > 7) {

		    $yeartype = ($yeartype % 7) + 2;

		} else {

		    $yeartype = ($yeartype % 7) + 1;

		}

	    }

	}

	#print $yeartype;

	$julianday = 0;

	for ($j = 0; $j < $month; $j++) {

	    $julianday += isGregorianleap($era, $year) ? $leapmonths[$j] : $months[$j];

	}

	$julianday += $day;

	#print $julianday , "\n";

	return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];

    } else {			# BC

	$yeartype = 6;

	for ($i = 4713; $i > $year; $i--) {

	    #print "$i, $yeartype\n";

	    if (isGregorianleap($era, $i + 1)) {

		$yeartype = ($yeartype % 7) + 8;

	    } else {

		if ($yeartype == 13) {

		    $yeartype = 1;

		} elsif ($yeartype > 7) {

		    $yeartype = ($yeartype % 7) + 2;

		} else {

		    $yeartype = ($yeartype % 7) + 1;

		}

	    }

	}

	#print $yeartype;

	$julianday = 0;

	for ($j = 0; $j < $month; $j++) {

	    $julianday += isGregorianleap($era, $year) ? $leapmonths[$j] : $months[$j];

	}

	$julianday += $day;

	#print $julianday , "\n";

	return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];	

    }

}



#print "Julian ", JulianDate2Day("BC", 1, 12, 31) , "\n";



sub JulianDate2Day {

    local($era, $year, $month, $day) = @_;

    $month--;

    if ($era eq "AD") {

	$yeartype = 7;

	for ($i = 1; $i <  $year; $i++) {

	    #print "$i, $yeartype\n";

	    if (isJulianleap($i + 1)) {

		$yeartype = ($yeartype % 7) + 8;

	    } else {

		if ($yeartype == 13) {

		    $yeartype = 1;

		} elsif ($yeartype > 7) {

		    $yeartype = ($yeartype % 7) + 2;

		} else {

		    $yeartype = ($yeartype % 7) + 1;

		}

	    }

	}

	#print $yeartype;

	$julianday = 0;

	for ($j = 0; $j < $month; $j++) {

	    $julianday += isJulianleap($year) ? $leapmonths[$j] : $months[$j];

	}

	$julianday += $day;

	#print $julianday , "\n";

	return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];

    } else {			# BC

	$yeartype = 3;

	for ($i = 4713; $i > $year; $i--) {

	    #print "$i, $yeartype\n";

	    if (isJulianleap($i + 1)) {

		$yeartype = ($yeartype % 7) + 8;

	    } else {

		if ($yeartype == 13) {

		    $yeartype = 1;

		} elsif ($yeartype > 7) {

		    $yeartype = ($yeartype % 7) + 2;

		} else {

		    $yeartype = ($yeartype % 7) + 1;

		}

	    }

	}

	#print $yeartype;

	$julianday = 0;

	for ($j = 0; $j < $month; $j++) {

	    $julianday += isJulianleap($year) ? $leapmonths[$j] : $months[$j];

	}

	$julianday += $day;

	#print $julianday , "\n";

	return $daysofweek[((($yeartype % 7) + $julianday - 1) % 7) - 1];

    }

}





# Returns true if year is a leap year under Gregorian calendar



sub isGregorianleap {

    local($era, $year) = @_;

    if ($era eq "AD") {

	if (($year % 4) == 0) {

	    if (($year % 400) == 0) {

		return 1;

	    } elsif (($year % 100) == 0) {

		return 0;

	    } else {

		return 1;

	    }

	} else {

	    return 0;

	}

    } else {

	if (($year % 4) == 1) {

	    if (($year % 400) == 1) {

		return 1;

	    } elsif (($year % 100) == 1) {

		return 0;

	    } else {

		return 1;

	    }

	} else {

	    return 0;

	}

    }

}



sub isJulianleap {

    local($year) = @_;

    if (($year % 4) == 0) {

	return 1;

    } else {

	return 0;

    }

}



sub isJulianPerleap {

    local($era, $year) = @_;

    if ($era eq "AD") {

	if (($year % 4) == 0) {

	    return 1;

	} else {

	    return 0;

	}

    } elsif ($era eq "BC") {

	if (($year % 4) == 1) {

	    return 1;

	} else {

	    return 0;

	}

    }

}



# Julian2Gregorian("AD", 1582, 10, 5);



sub Julian2Gregorian {

    local($era, $year, $month, $day) = @_;

    if ($era eq "BC") {

	$offset = - (ceiling(int(($year - 1) / 100) * .75) + 2); 

	if ($year % 100 == 1 and $year % 400 != 1) {  # leap year discrepancy

	    $offset = - $offset;

	    ($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", $offset);

	    if ($month2 <= 2) {

		($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", 1);

	    }

	    return ($era2, $year2, $month2, $day2);

	} else {		# leap years will match

	    if ($offset >= 0) {

		date_plus_days($era, $year, $month, $day, "Julian", $offset);

	    } else {

		$offset = - $offset;

		date_minus_days($era, $year, $month, $day, "Julian", $offset);

	    }

	}

    } else {

	$offset = ceiling((int $year / 100) * .75) - 2;

	if ($offset % 100 == 0 and $offset % 400 != 0) {

	    if ($offset >= 0) {

		($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", $offset);

		if ($month2 <= 2) {

		    ($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", 1);

		}

		return ($era2, $year2, $month2, $day2);

	    } else {

		$offset = - $offset;

		($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", $offset);

		if ($month2 <= 2) {

		    ($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", 1);

		}

		return ($era2, $year2, $month2, $day2);

	    }

	} else {

	    if ($offset >= 0) {

		date_plus_days($era, $year, $month, $day, "Julian", $offset);

	    } else {

		$offset = - $offset;

		date_minus_days($era, $year, $month, $day, "Julian", $offset);

	    }

	}

    }

    

}



# Gregorian2Julian("AD", 1582, 10, 15);



sub Gregorian2Julian {

    local($era, $year, $month, $day) = @_;

    if ($era eq "BC") {

	$offset = - (ceiling(int(($year - 1) / 100) * .75) + 2); 

	if ((($year - 1) % 100 == 0) and (($year - 1) % 400 != 0)) {

	    $offset = - $offset;

	    ($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", $offset);

	    if ($month2 <= 2) {

		($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", 1);

	    }

	    return ($era2, $year2, $month2, $day2);

	} else {

	    if ($offset >= 0) {

		date_minus_days($era, $year, $month, $day, "Julian", $offset);

	    } else {

		$offset = - $offset;

		date_plus_days($era, $year, $month, $day, "Julian", $offset);

	    }



	}

    } else {			# A.D.

	$offset = ceiling((int $year / 100) * .75) - 2;

	if ($offset % 100 == 0 and $offset % 400 != 0) {

	    if ($offset >= 0) {

		($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", $offset);

		if ($month2 <= 2) {

		    ($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", 1);

		}

		return ($era2, $year2, $month2, $day2);

	    } else {

		$offset = - $offset;

		($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", $offset);

		if ($month2 <= 2) {

		    ($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", 1);

		}

		return ($era2, $year2, $month2, $day2);

	    }

	} else {

	    if ($offset >= 0) {

		($era2, $year2, $month2, $day2) = date_minus_days($era, $year, $month, $day, "Julian", $offset);

	    } else {

		$offset = - $offset;

		($era2, $year2, $month2, $day2) = date_plus_days($era, $year, $month, $day, "Julian", $offset);

	    }

	    return ($era2, $year2, $month2, $day2);

	}

    }

}





sub isValidJulian {

}



sub isValidGregorian {

}





# Converts a date to a Julian Day number, assumes

# date is from Julian Calendar so Gregorian

# dates must be converted to Julian first



sub JulianPeriod {		# Day 1:  Jan. 1, 4713 BC

    local($era, $year, $month, $day) = @_;

    $month--;

    if ($era eq "BC") {

	$yearstart = 1;

	$julianyear = 1;

	$juliandate = -1;

	for ($i = 4713; $i > $year; $i--) {

	    if (isJulianPerleap($era, $i)) {

		$juliandate += 366;

	    } else {

		$juliandate += 365;

	    }

	}

	for ($j = 0; $j < $month; $j++) {

	    $juliandate += isJulianPerleap($era, $year) ? $leapmonths[$j] : $months[$j];

	}

	$juliandate += $day;

#	print $juliandate . " Julian date\n";

	return $juliandate;

    } else {

	$yearstart = 1;

	$julianyear = 1;

	$juliandate = -1;

	for ($i = 4713; $i >= 1; $i--) {

	    if (isJulianPerleap("BC", $i)) {

		$juliandate += 366;

	    } else {

		$juliandate += 365;

	    }

	    $julianyear++;

	}

	for ($i = 1; $i < $year; $i++) {

	    if (isJulianleap($i)) {

		$juliandate += 366;

	    } else {

		$juliandate += 365;

	    }

	    $julianyear++;

	}

	for ($j = 0; $j < $month; $j++) {

	    $juliandate += isJulianPerleap("AD", $year) ? $leapmonths[$j] : $months[$j];

	}

	$juliandate += $day;

#	print $juliandate . ": Julian date\n";

	return $juliandate;

    }

}







sub JulianPeriod2Julian {

    local($jd) = @_;

    $jd++;    # life is easier starting from 1

    $year = 4713;

    $era = "BC";

    $yearlen = 366;

    while ($jd > $yearlen) {

	$jd -= $yearlen;

	if ($era eq "BC") {

	    if ($year == 1) {

		$era = "AD";

	    } else {

		$year--;

	    }

	} else {

	    $year++;

	}

	$yearlen = isJulianPerleap($era, $year) ? 366 : 365;

    }

    

    $month = 0;

    $monthlen = 31;

    while ($jd > $monthlen) {

	$jd -= $monthlen;

	$month++;

	$monthlen = isJulianPerleap($era, $year) ? $leapmonths[$month] : $months[$month];

    }

    $day = $jd;

    return ($era, $year, ++$month, $day);

}







# print &date_plus_days("BC", 1369, 2, 27, "Julian", 30) , "\n";



sub date_plus_days {

    local($era, $year, $month, $day, $caltype, $adddays) = @_;

    $month--;

    for ($i = 0; $i < $adddays; $i++) {

	if ($caltype eq "Julian") {

	    $leap = isJulianPerleap($era, $year);

	} else {

	    $leap = isGregorianleap($era, $year);

	}

	if (($day + 1) > ($leap ? $leapmonths[$month] : $months[$month])) {

	    $day = 1;

	    if (($month + 1) == 12) {

		$month = 0;

		if ($era eq "BC") {

		    if ($year == 1) {

			$era = "AD";

		    } else {

			$year--;

		    }

		} else {

		    $year++;

		}

	    } else {

		$month++;

	    }

	} else {

	    $day++;

	}

    }

   # print "$monthnames[$month] $day, $year $era\n";

    return ($era, $year, ++$month, $day);

}





#date_minus_days("AD", 1996, 10, 5, "Gregorian", 350);



sub date_minus_days {

    local($era, $year, $month, $day, $caltype, $subdays) = @_;

    $month--;

    for ($i = 0; $i < $subdays; $i++) {

#	print "Sub-days $month $day <BR> \n";

	if ($caltype eq "Julian") {

	    $leap = isJulianPerleap($era, $year);

	} else {

	    $leap = isGregorianleap($era, $year);

	}

	if ($day == 1) {

	    if ($month == 0) {

		$month = 11;

		$day = 31;

		if ($era eq "AD") {

		    if ($year == 1) {

			$era = "BC";

		    } else {

			$year--;

		    } 

		} else {

		    $year++;

		}

	    } else {

		$month--;

		$day = $leap ? $leapmonths[$month] : $months[$month];

	    }

	} else {

	    $day--;

	}

    }

#    print "$monthnames[$month] $day, $year $era\n";

    return ($era, $year, ++$month, $day);

}





sub ceiling {

    local($number) = @_;

    if ((int $number) != $number) {

	return (int $number + 1);

    } else {

	return $number;

    }

}





#cyclical_year("AD", 1944, 3, 3);



sub cyclical_year {

    ($era, $year, $month, $day) = @_;

    if ($era eq "BC") {

	$cyears =  2697 - $year;

    } else {

	$cyears = 2696 + $year

    }

    $stem = $cyears % 10;

    $branch = $cyears % 12;

#    print "$stem, $branch\n";

    return ($stem, $branch);

}







#($era, $year, $month, $day) = Gregorian2Julian("AD", 1804, 3, 12);



#cyclical_day($era, $year, $month, $day);



sub cyclical_day {

    ($era, $year, $month, $day) = @_;

    $julian_day = JulianPeriod($era, $year, $month, $day);

    #print "$julian_day julian_day\n";

    $cyc_index = ($julian_day - 11) % 60;

   # print $cyc_index , " cyc\n";

    $stem = $cyc_index % 10;

    $branch = $cyc_index % 12;

#    print "$stem, $branch\n";

    return ($stem, $branch);

}





sub julian_day_to_chinese {

    local($jd) = @_;

    open(INDEXFD, "calinfo/calindex") or die "Can't open $!";

    while (<INDEXFD>) {

	@indices = split(/\t/);

	if ($jd >= $indices[0] and $jd < $indices[1]) {

	    $dynasty = $indices[2];

	    last;

	}

    }

    close(INDEXFD);

    if ($dynasty eq "") {

	print "Outside of presently supported ranges.<BR>\n";

	return "";

    }



    open(DFD, "calinfo/$dynasty");

    $initline = <DFD>;

    ($curdynastyjd, $curdynasty, $curruler, $curreign_title, $curreign_year, $curyear, $curmonthtype, $curmonthcycle, $comment) = split(/\t/, $initline);

    

    while (<DFD>) {

	($dynastyjd, $dynasty, $ruler, $reign_title, $reignyear, $year, $monthtype, $monthcycle, $comment) = split(/\t/);

	if ($jd < $dynastyjd) {

	    $curday = $jd - $curdynastyjd + 1;

	    return ($curdynasty, $curruler, $curreign_title, $curreign_year, $curyear, $curmonthtype, $curmonthcycle, $curday);

	}



	$curdynastyjd = $dynastyjd;

	if ($dynasty ne "#") {$curdynasty = $dynasty;}

	if ($ruler ne "#") {$curruler = $ruler;}

	if ($reign_title ne "#") {$curreign_title = $reign_title;}

	$curmonthtype = $monthtype;

	if ($monthtype eq "1") {

	    $curreign_year++;

	    $curyear = ($curyear % 60) + 1;

	    $curmonthcycle = ($curmonthcycle % 60) + 1;

	} elsif ($monthtype eq "L") {

	    # don't advance monthcycle

	} else {

	    $curmonthcycle = ($curmonthcycle % 60) + 1;

	}

	if ($reignyear ne "#") { $curreign_year = $reignyear; }

    }

    close(DFD);

}



1;


Anon7 - 2021