summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerick Rethans <derick@php.net>2006-01-04 12:57:04 +0000
committerDerick Rethans <derick@php.net>2006-01-04 12:57:04 +0000
commit648e20c1b69ead6b90eaa56c7a433de7123eb6fd (patch)
treecf6eeef0d7eb1396843ce426ab9a56098af1cdc5
parent223aa7294d6c072c84df5d3a350606f3774f58d9 (diff)
downloadphp-git-648e20c1b69ead6b90eaa56c7a433de7123eb6fd.tar.gz
- New implementation of the sunset algorithm. Fixes bugs #33789, #33671, #32820
and #30937. #- Didn't add it to news yet, as we'll merge this to PHP 5.1.x (just need to # wait for Ilia to approve it for 5.1.2).
-rw-r--r--ext/date/lib/astro.c10
-rw-r--r--ext/date/lib/parse_date.c4
-rw-r--r--ext/date/lib/parse_date.re2
-rw-r--r--ext/date/lib/parse_tz.c18
-rw-r--r--ext/date/lib/timelib.h3
-rw-r--r--ext/date/lib/unixtime2tm.c7
-rw-r--r--ext/date/php_date.c232
-rw-r--r--ext/date/php_date.h5
-rw-r--r--ext/standard/basic_functions.c10
-rw-r--r--ext/standard/config.m42
-rw-r--r--ext/standard/config.w322
-rw-r--r--ext/standard/php_standard.h1
-rw-r--r--ext/standard/php_sunfuncs.h42
-rw-r--r--ext/standard/sunfuncs.c244
-rw-r--r--ext/standard/tests/general_functions/sunfuncts.phpt48
15 files changed, 296 insertions, 334 deletions
diff --git a/ext/date/lib/astro.c b/ext/date/lib/astro.c
index bf6b89b417..f10d4c3a84 100644
--- a/ext/date/lib/astro.c
+++ b/ext/date/lib/astro.c
@@ -204,7 +204,7 @@ static void astro_sun_RA_dec(double d, double *RA, double *dec, double *r)
* both set to the time when the sun is at south.
*
*/
-int timelib_astro_rise_set_altitude(timelib_time *t_loc, double lon, double lat, double altit, int upper_limb, double *h_rise, double *h_set, timelib_sll *ts_rise, timelib_sll *ts_set)
+int timelib_astro_rise_set_altitude(timelib_time *t_loc, double lon, double lat, double altit, int upper_limb, double *h_rise, double *h_set, timelib_sll *ts_rise, timelib_sll *ts_set, timelib_sll *ts_transit)
{
double d, /* Days since 2000 Jan 0.0 (negative before) */
sr, /* Solar distance, astronomical units */
@@ -215,11 +215,12 @@ int timelib_astro_rise_set_altitude(timelib_time *t_loc, double lon, double lat,
tsouth, /* Time when Sun is at south */
sidtime; /* Local sidereal time */
timelib_time *t_utc;
- timelib_sll timestamp;
+ timelib_sll timestamp, old_sse;
int rc = 0; /* Return cde from function - usually 0 */
/* Normalize time */
+ old_sse = t_loc->sse;
t_loc->h = 12;
t_loc->i = t_loc->s = 0;
timelib_update_ts(t_loc, NULL);
@@ -258,6 +259,7 @@ int timelib_astro_rise_set_altitude(timelib_time *t_loc, double lon, double lat,
{
double cost;
cost = (sind(altit) - sind(lat) * sind(sdec)) / (cosd(lat) * cosd(sdec));
+ *ts_transit = t_utc->sse + (tsouth * 3600);
if (cost >= 1.0) {
rc = -1;
t = 0.0; /* Sun always below altit */
@@ -281,9 +283,9 @@ int timelib_astro_rise_set_altitude(timelib_time *t_loc, double lon, double lat,
}
}
-
- /* Kill temporary time */
+ /* Kill temporary time and restore original sse */
timelib_time_dtor(t_utc);
+ t_loc->sse = old_sse;
return rc;
}
diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c
index b60ec7a0f7..c3ee77511f 100644
--- a/ext/date/lib/parse_date.c
+++ b/ext/date/lib/parse_date.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.9.12.dev on Mon Dec 19 13:18:44 2005 */
+/* Generated by re2c 0.9.12 on Wed Jan 4 13:49:18 2006 */
#line 1 "ext/date/lib/parse_date.re"
/*
+----------------------------------------------------------------------+
@@ -588,7 +588,7 @@ static timelib_tz_lookup_table* zone_search(const char *word, long gmtoffset, in
timelib_tz_lookup_table *tp, *first_found_elem;
timelib_tz_lookup_table *fmp;
- if (strcasecmp("utc", word) == 0) {
+ if (strcasecmp("utc", word) == 0 || strcasecmp("gmt", word) == 0) {
return timelib_timezone_utc;
}
diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re
index d96364101c..438367de23 100644
--- a/ext/date/lib/parse_date.re
+++ b/ext/date/lib/parse_date.re
@@ -586,7 +586,7 @@ static timelib_tz_lookup_table* zone_search(const char *word, long gmtoffset, in
timelib_tz_lookup_table *tp, *first_found_elem;
timelib_tz_lookup_table *fmp;
- if (strcasecmp("utc", word) == 0) {
+ if (strcasecmp("utc", word) == 0 || strcasecmp("gmt", word) == 0) {
return timelib_timezone_utc;
}
diff --git a/ext/date/lib/parse_tz.c b/ext/date/lib/parse_tz.c
index 963e98f065..737181da5c 100644
--- a/ext/date/lib/parse_tz.c
+++ b/ext/date/lib/parse_tz.c
@@ -364,3 +364,21 @@ timelib_time_offset *timelib_get_time_zone_info(timelib_sll ts, timelib_tzinfo *
return tmp;
}
+
+timelib_sll timelib_get_current_offset(timelib_time *t)
+{
+ timelib_time_offset *gmt_offset;
+
+ switch (t->zone_type) {
+ case TIMELIB_ZONETYPE_ABBR:
+ case TIMELIB_ZONETYPE_OFFSET:
+ return t->z * 60;
+
+ case TIMELIB_ZONETYPE_ID:
+ gmt_offset = timelib_get_time_zone_info(t->sse, t->tz_info);
+ return gmt_offset->offset;
+
+ default:
+ return 0;
+ }
+}
diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h
index 907a5883f9..ff30960b9c 100644
--- a/ext/date/lib/timelib.h
+++ b/ext/date/lib/timelib.h
@@ -71,6 +71,7 @@ int timelib_timezone_id_is_valid(char *timezone, timelib_tzdb *tzdb);
timelib_tzinfo *timelib_parse_tzfile(char *timezone, timelib_tzdb *tzdb);
int timelib_timestamp_is_in_dst(timelib_sll ts, timelib_tzinfo *tz);
timelib_time_offset *timelib_get_time_zone_info(timelib_sll ts, timelib_tzinfo *tz);
+timelib_sll timelib_get_current_offset(timelib_time *t);
void timelib_dump_tzinfo(timelib_tzinfo *tz);
timelib_tzdb *timelib_builtin_db(void);
timelib_tzdb_index_entry *timelib_timezone_builtin_identifiers_list(int *count);
@@ -96,6 +97,6 @@ void timelib_decimal_hour_to_hms(double h, int *hour, int *min, int *sec);
/* from astro.c */
double timelib_ts_to_juliandate(timelib_sll ts);
-int timelib_astro_rise_set_altitude(timelib_time *time, double lon, double lat, double altit, int upper_limb, double *h_rise, double *h_set, timelib_sll *ts_rise, timelib_sll *ts_set);
+int timelib_astro_rise_set_altitude(timelib_time *time, double lon, double lat, double altit, int upper_limb, double *h_rise, double *h_set, timelib_sll *ts_rise, timelib_sll *ts_set, timelib_sll *ts_transit);
#endif
diff --git a/ext/date/lib/unixtime2tm.c b/ext/date/lib/unixtime2tm.c
index a12474847e..4834b470d9 100644
--- a/ext/date/lib/unixtime2tm.c
+++ b/ext/date/lib/unixtime2tm.c
@@ -170,9 +170,6 @@ void timelib_unixtime2local(timelib_time *tm, timelib_sll ts)
timelib_time_offset *gmt_offset;
timelib_tzinfo *tz = tm->tz_info;
- tm->is_localtime = 1;
- tm->have_zone = 1;
-
switch (tm->zone_type) {
case TIMELIB_ZONETYPE_ABBR:
case TIMELIB_ZONETYPE_OFFSET: {
@@ -203,7 +200,11 @@ void timelib_unixtime2local(timelib_time *tm, timelib_sll ts)
default:
tm->is_localtime = 0;
tm->have_zone = 0;
+ return;
}
+
+ tm->is_localtime = 1;
+ tm->have_zone = 1;
}
void timelib_set_timezone(timelib_time *t, timelib_tzinfo *tz)
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index b4ae1d9ff1..4a05042bbf 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -74,6 +74,11 @@ zend_function_entry date_functions[] = {
/* Options and Configuration */
PHP_FE(date_default_timezone_set, NULL)
PHP_FE(date_default_timezone_get, NULL)
+
+ /* Astronomical functions */
+ PHP_FE(date_sunrise, NULL)
+ PHP_FE(date_sunset, NULL)
+ PHP_FE(date_sun_info, NULL)
{NULL, NULL, NULL}
};
@@ -113,9 +118,22 @@ ZEND_DECLARE_MODULE_GLOBALS(date)
timelib_tzdb *php_date_global_timezone_db;
int php_date_global_timezone_db_enabled;
+#define DATE_DEFAULT_LATITUDE "31.7667"
+#define DATE_DEFAULT_LONGITUDE "35.2333"
+
+/* on 90'35; common sunset declaration (start of sun body appear) */
+#define DATE_SUNSET_ZENITH "90.583333"
+
+/* on 90'35; common sunrise declaration (sun body disappeared) */
+#define DATE_SUNRISE_ZENITH "90.583333"
+
/* {{{ INI Settings */
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("date.timezone", "", PHP_INI_ALL, OnUpdateString, default_timezone, zend_date_globals, date_globals)
+ PHP_INI_ENTRY("date.default_latitude", DATE_DEFAULT_LATITUDE, PHP_INI_ALL, NULL)
+ PHP_INI_ENTRY("date.default_longitude", DATE_DEFAULT_LONGITUDE, PHP_INI_ALL, NULL)
+ PHP_INI_ENTRY("date.sunset_zenith", DATE_SUNSET_ZENITH, PHP_INI_ALL, NULL)
+ PHP_INI_ENTRY("date.sunrise_zenith", DATE_SUNRISE_ZENITH, PHP_INI_ALL, NULL)
PHP_INI_END()
/* }}} */
@@ -235,6 +253,11 @@ PHP_RSHUTDOWN_FUNCTION(date)
"methods and you are still getting this warning, you most likely " \
"misspelled the timezone identifier. "
+#define SUNFUNCS_RET_TIMESTAMP 0
+#define SUNFUNCS_RET_STRING 1
+#define SUNFUNCS_RET_DOUBLE 2
+
+
/* {{{ PHP_MINIT_FUNCTION */
PHP_MINIT_FUNCTION(date)
{
@@ -254,6 +277,10 @@ PHP_MINIT_FUNCTION(date)
REGISTER_STRING_CONSTANT("DATE_RSS", DATE_FORMAT_RFC1123, CONST_CS | CONST_PERSISTENT);
REGISTER_STRING_CONSTANT("DATE_W3C", DATE_FORMAT_ISO8601, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("SUNFUNCS_RET_TIMESTAMP", SUNFUNCS_RET_TIMESTAMP, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("SUNFUNCS_RET_STRING", SUNFUNCS_RET_STRING, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("SUNFUNCS_RET_DOUBLE", SUNFUNCS_RET_DOUBLE, CONST_CS | CONST_PERSISTENT);
+
php_date_global_timezone_db = NULL;
php_date_global_timezone_db_enabled = 0;
@@ -1797,6 +1824,211 @@ PHP_FUNCTION(date_default_timezone_get)
}
/* }}} */
+/* {{{ php_do_date_sunrise_sunset
+ * Common for date_sunrise() and date_sunset() functions
+ */
+static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_sunset)
+{
+ double latitude, longitude, zenith, gmt_offset = 0, altitude;
+ double h_rise, h_set, N;
+ timelib_sll rise, set, transit;
+ long time, retformat;
+ int rs;
+ timelib_time *t;
+ timelib_tzinfo *tzi;
+ char retstr[6];
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ldddd", &time, &retformat, &latitude, &longitude, &zenith, &gmt_offset) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ switch (ZEND_NUM_ARGS()) {
+ case 1:
+ retformat = SUNFUNCS_RET_STRING;
+ case 2:
+ latitude = INI_FLT("date.default_latitude");
+ case 3:
+ longitude = INI_FLT("date.default_longitude");
+ case 4:
+ if (calc_sunset) {
+ zenith = INI_FLT("date.sunset_zenith");
+ } else {
+ zenith = INI_FLT("date.sunrise_zenith");
+ }
+ case 5:
+ case 6:
+ break;
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid format");
+ RETURN_FALSE;
+ break;
+ }
+ if (retformat != SUNFUNCS_RET_TIMESTAMP &&
+ retformat != SUNFUNCS_RET_STRING &&
+ retformat != SUNFUNCS_RET_DOUBLE)
+ {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong return format given, pick one of SUNFUNCS_RET_TIMESTAMP, SUNFUNCS_RET_STRING or SUNFUNCS_RET_DOUBLE");
+ RETURN_FALSE;
+ }
+ altitude = 90 - zenith;
+
+ /* Initialize time struct */
+ t = timelib_time_ctor();
+ tzi = get_timezone_info(TSRMLS_C);
+ t->tz_info = tzi;
+ t->zone_type = TIMELIB_ZONETYPE_ID;
+
+ if (ZEND_NUM_ARGS() <= 5) {
+ gmt_offset = timelib_get_current_offset(t) / 3600;
+ }
+
+ timelib_unixtime2local(t, time);
+ rs = timelib_astro_rise_set_altitude(t, longitude, latitude, altitude, altitude > -1 ? 1 : 0, &h_rise, &h_set, &rise, &set, &transit);
+
+ if (rs != 0) {
+ RETURN_FALSE;
+ }
+
+ if (retformat == SUNFUNCS_RET_TIMESTAMP) {
+ RETURN_LONG(calc_sunset ? set : rise);
+ }
+ N = (calc_sunset ? h_set : h_rise) + gmt_offset;
+ while (N > 24) {
+ N -= 24;
+ }
+ while (N < 0) {
+ N += 24;
+ }
+ switch (retformat) {
+ case SUNFUNCS_RET_STRING:
+ sprintf(retstr, "%02d:%02d", (int) N, (int) (60 * (N - (int) N)));
+ RETURN_STRINGL(retstr, 5, 1);
+ break;
+ case SUNFUNCS_RET_DOUBLE:
+ RETURN_DOUBLE(N);
+ break;
+ }
+}
+/* }}} */
+
+/* {{{ proto mixed date_sunrise(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])
+ Returns time of sunrise for a given day and location */
+PHP_FUNCTION(date_sunrise)
+{
+ php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/* {{{ proto mixed date_sunset(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])
+ Returns time of sunset for a given day and location */
+PHP_FUNCTION(date_sunset)
+{
+ php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* {{{ proto array date_sun_info(long time, float latitude, float longitude)
+ Returns an array with information about sun set/rise and twilight begin/end */
+PHP_FUNCTION(date_sun_info)
+{
+ long time;
+ double latitude, longitude;
+ timelib_time *t, *t2;
+ timelib_tzinfo *tzi;
+ int rs;
+ timelib_sll rise, set, transit;
+ int dummy;
+ double ddummy;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ldd", &time, &latitude, &longitude) == FAILURE) {
+ RETURN_FALSE;
+ }
+ /* Initialize time struct */
+ t = timelib_time_ctor();
+ tzi = get_timezone_info(TSRMLS_C);
+ t->tz_info = tzi;
+ t->zone_type = TIMELIB_ZONETYPE_ID;
+ timelib_unixtime2local(t, time);
+
+ /* Setup */
+ t2 = timelib_time_ctor();
+ array_init(return_value);
+
+ /* Get sun up/down and transit */
+ rs = timelib_astro_rise_set_altitude(t, latitude, longitude, -35.0/60, 1, &ddummy, &ddummy, &rise, &set, &transit);
+ switch (rs) {
+ case -1: /* always below */
+ add_assoc_bool(return_value, "sunrise", 0);
+ add_assoc_bool(return_value, "sunset", 0);
+ break;
+ case 1: /* always above */
+ add_assoc_bool(return_value, "sunrise", 1);
+ add_assoc_bool(return_value, "sunset", 1);
+ break;
+ default:
+ t2->sse = rise;
+ add_assoc_long(return_value, "sunrise", timelib_date_to_int(t2, &dummy));
+ t2->sse = set;
+ add_assoc_long(return_value, "sunset", timelib_date_to_int(t2, &dummy));
+ }
+ t2->sse = transit;
+ add_assoc_long(return_value, "transit", timelib_date_to_int(t2, &dummy));
+
+ /* Get civil twilight */
+ rs = timelib_astro_rise_set_altitude(t, latitude, longitude, -6.0, 0, &ddummy, &ddummy, &rise, &set, &transit);
+ switch (rs) {
+ case -1: /* always below */
+ add_assoc_bool(return_value, "civil_twilight_begin", 0);
+ add_assoc_bool(return_value, "civil_twilight_end", 0);
+ break;
+ case 1: /* always above */
+ add_assoc_bool(return_value, "civil_twilight_begin", 1);
+ add_assoc_bool(return_value, "civil_twilight_end", 1);
+ break;
+ default:
+ t2->sse = rise;
+ add_assoc_long(return_value, "civil_twilight_begin", timelib_date_to_int(t2, &dummy));
+ t2->sse = set;
+ add_assoc_long(return_value, "civil_twilight_end", timelib_date_to_int(t2, &dummy));
+ }
+
+ /* Get nautical twilight */
+ rs = timelib_astro_rise_set_altitude(t, latitude, longitude, -12.0, 0, &ddummy, &ddummy, &rise, &set, &transit);
+ switch (rs) {
+ case -1: /* always below */
+ add_assoc_bool(return_value, "nautical_twilight_begin", 0);
+ add_assoc_bool(return_value, "nautical_twilight_end", 0);
+ break;
+ case 1: /* always above */
+ add_assoc_bool(return_value, "nautical_twilight_begin", 1);
+ add_assoc_bool(return_value, "nautical_twilight_end", 1);
+ break;
+ default:
+ t2->sse = rise;
+ add_assoc_long(return_value, "nautical_twilight_begin", timelib_date_to_int(t2, &dummy));
+ t2->sse = set;
+ add_assoc_long(return_value, "nautical_twilight_end", timelib_date_to_int(t2, &dummy));
+ }
+
+ /* Get astronomical twilight */
+ rs = timelib_astro_rise_set_altitude(t, latitude, longitude, -18.0, 0, &ddummy, &ddummy, &rise, &set, &transit);
+ switch (rs) {
+ case -1: /* always below */
+ add_assoc_bool(return_value, "astronomical_twilight_begin", 0);
+ add_assoc_bool(return_value, "astronomical_twilight_end", 0);
+ break;
+ case 1: /* always above */
+ add_assoc_bool(return_value, "astronomical_twilight_begin", 1);
+ add_assoc_bool(return_value, "astronomical_twilight_end", 1);
+ break;
+ default:
+ t2->sse = rise;
+ add_assoc_long(return_value, "astronomical_twilight_begin", timelib_date_to_int(t2, &dummy));
+ t2->sse = set;
+ add_assoc_long(return_value, "astronomical_twilight_end", timelib_date_to_int(t2, &dummy));
+ }
+}
+/* }}} */
/*
* Local variables:
* tab-width: 4
diff --git a/ext/date/php_date.h b/ext/date/php_date.h
index 70d8bd860e..bf486529d3 100644
--- a/ext/date/php_date.h
+++ b/ext/date/php_date.h
@@ -72,6 +72,11 @@ PHP_FUNCTION(timezone_abbreviations_list);
PHP_FUNCTION(date_default_timezone_set);
PHP_FUNCTION(date_default_timezone_get);
+/* Astro functions */
+PHP_FUNCTION(date_sunrise);
+PHP_FUNCTION(date_sunset);
+PHP_FUNCTION(date_sun_info);
+
PHP_RINIT_FUNCTION(date);
PHP_RSHUTDOWN_FUNCTION(date);
PHP_MINIT_FUNCTION(date);
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 5943d37b4e..e421c1386c 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -846,8 +846,6 @@ zend_function_entry basic_functions[] = {
PHP_FE(output_add_rewrite_var, NULL)
PHP_FE(output_reset_rewrite_vars, NULL)
- PHP_FE(date_sunrise, NULL)
- PHP_FE(date_sunset, NULL)
{NULL, NULL, NULL}
};
@@ -885,10 +883,6 @@ static PHP_INI_MH(OnUpdateSafeModeAllowedEnvVars)
PHP_INI_BEGIN()
PHP_INI_ENTRY_EX("safe_mode_protected_env_vars", SAFE_MODE_PROTECTED_ENV_VARS, PHP_INI_SYSTEM, OnUpdateSafeModeProtectedEnvVars, NULL)
PHP_INI_ENTRY_EX("safe_mode_allowed_env_vars", SAFE_MODE_ALLOWED_ENV_VARS, PHP_INI_SYSTEM, OnUpdateSafeModeAllowedEnvVars, NULL)
- PHP_INI_ENTRY("date.default_latitude", DATE_DEFAULT_LATITUDE, PHP_INI_ALL, NULL)
- PHP_INI_ENTRY("date.default_longitude", DATE_DEFAULT_LONGITUDE, PHP_INI_ALL, NULL)
- PHP_INI_ENTRY("date.sunset_zenith", DATE_SUNSET_ZENITH, PHP_INI_ALL, NULL)
- PHP_INI_ENTRY("date.sunrise_zenith", DATE_SUNRISE_ZENITH, PHP_INI_ALL, NULL)
PHP_INI_END()
@@ -1045,10 +1039,6 @@ PHP_MINIT_FUNCTION(basic)
REGISTER_LONG_CONSTANT("INI_SYSTEM", ZEND_INI_SYSTEM, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("INI_ALL", ZEND_INI_ALL, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SUNFUNCS_RET_TIMESTAMP", SUNFUNCS_RET_TIMESTAMP, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SUNFUNCS_RET_STRING", SUNFUNCS_RET_STRING, CONST_CS | CONST_PERSISTENT);
- REGISTER_LONG_CONSTANT("SUNFUNCS_RET_DOUBLE", SUNFUNCS_RET_DOUBLE, CONST_CS | CONST_PERSISTENT);
-
REGISTER_LONG_CONSTANT("PHP_URL_SCHEME", PHP_URL_SCHEME, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PHP_URL_HOST", PHP_URL_HOST, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("PHP_URL_PORT", PHP_URL_PORT, CONST_CS | CONST_PERSISTENT);
diff --git a/ext/standard/config.m4 b/ext/standard/config.m4
index 86ceb9d5be..cc1f95f313 100644
--- a/ext/standard/config.m4
+++ b/ext/standard/config.m4
@@ -489,7 +489,7 @@ PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32.
incomplete_class.c url_scanner_ex.c ftp_fopen_wrapper.c \
http_fopen_wrapper.c php_fopen_wrapper.c credits.c css.c \
var_unserializer.c ftok.c sha1.c user_filters.c uuencode.c \
- filters.c proc_open.c sunfuncs.c streamsfuncs.c http.c)
+ filters.c proc_open.c streamsfuncs.c http.c)
PHP_ADD_MAKEFILE_FRAGMENT
diff --git a/ext/standard/config.w32 b/ext/standard/config.w32
index 0bed3ee3e3..e02e6965f8 100644
--- a/ext/standard/config.w32
+++ b/ext/standard/config.w32
@@ -15,6 +15,6 @@ EXTENSION("standard", "array.c base64.c basic_functions.c browscap.c \
versioning.c assert.c strnatcmp.c levenshtein.c incomplete_class.c \
url_scanner_ex.c ftp_fopen_wrapper.c http_fopen_wrapper.c \
php_fopen_wrapper.c credits.c css.c var_unserializer.c ftok.c sha1.c \
- user_filters.c uuencode.c filters.c proc_open.c sunfuncs.c \
+ user_filters.c uuencode.c filters.c proc_open.c \
streamsfuncs.c http.c", false /* never shared */);
diff --git a/ext/standard/php_standard.h b/ext/standard/php_standard.h
index b79a3bd9e1..aae11ca83e 100644
--- a/ext/standard/php_standard.h
+++ b/ext/standard/php_standard.h
@@ -59,7 +59,6 @@
#include "php_versioning.h"
#include "php_ftok.h"
#include "php_type.h"
-#include "php_sunfuncs.h"
#define phpext_standard_ptr basic_functions_module_ptr
PHP_MINIT_FUNCTION(standard_filters);
diff --git a/ext/standard/php_sunfuncs.h b/ext/standard/php_sunfuncs.h
deleted file mode 100644
index f8dcc0254a..0000000000
--- a/ext/standard/php_sunfuncs.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 5 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2006 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.php.net/license/3_01.txt |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Moshe Doron <mosdoron@netvision.net.il> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-#ifndef PHP_SUNFUNCS_H
-#define PHP_SUNFUNCS_H
-
-/* default ini entries: */
-/* Jerusalem one. */
-#define DATE_DEFAULT_LATITUDE "31.7667"
-#define DATE_DEFAULT_LONGITUDE "35.2333"
-
-/* on 90'50; common jewish sunset declaration (start of sun body appear) */
-#define DATE_SUNSET_ZENITH "90.83"
-
-/* on 90'50; common jewish sunrise declaration (sun body disappeared) */
-#define DATE_SUNRISE_ZENITH "90.83"
-
-#define SUNFUNCS_RET_TIMESTAMP 0
-#define SUNFUNCS_RET_STRING 1
-#define SUNFUNCS_RET_DOUBLE 2
-
-PHP_FUNCTION(date_sunrise);
-PHP_FUNCTION(date_sunset);
-
-#endif /* PHP_SUNFUNCS_H */
diff --git a/ext/standard/sunfuncs.c b/ext/standard/sunfuncs.c
deleted file mode 100644
index a62648d797..0000000000
--- a/ext/standard/sunfuncs.c
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- +----------------------------------------------------------------------+
- | PHP Version 5 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2006 The PHP Group |
- +----------------------------------------------------------------------+
- | This source file is subject to version 3.01 of the PHP license, |
- | that is bundled with this package in the file LICENSE, and is |
- | available through the world-wide-web at the following url: |
- | http://www.php.net/license/3_01.txt |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: Moshe Doron <mosdoron@netvision.net.il> |
- +----------------------------------------------------------------------+
-*/
-
-/* $Id$ */
-
-/*
- The sun position algorithm taken from the 'US Naval Observatory's
- Almanac for Computers', implemented by Ken Bloom <kekabloom@ucdavis.edu>
- for the zmanim project <http://sourceforge.net/projects/zmanim/>
- and finally converted to C by Moshe Doron <mosdoron@netvision.net.il>.
-*/
-
-#include "php.h"
-#include "php_sunfuncs.h"
-#include "php_ini.h"
-#include "ext/date/php_date.h"
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-
-/* {{{ macros and constants
- */
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-#define to_rad(degrees) (degrees * M_PI / 180)
-#define to_rad_with_min(degrees) (degrees + minutes / 60)
-#define to_deg(rad) (rad * 180 / M_PI)
-/* }}} */
-
-/* {{{ php_sunrise_sunset
- returns time in UTC */
-static double php_sunrise_sunset(long N, double latitude, double longitude, double zenith, int calc_sunset)
-{
- double lngHour, t, M, L, Lx, RA, RAx, Lquadrant, RAquadrant, sinDec, cosDec, cosH, H, T, UT, UTx;
-
- /* step 1: First calculate the day of the year
- int N = theday - date(1, 1, theday.year()) + 1;
- */
-
- /* step 2: convert the longitude to hour value and calculate an approximate time */
- lngHour = longitude / 15;
-
- /* use 18 for sunset instead of 6 */
- if (calc_sunset) {
- t = (double) N + ((18 - lngHour) / 24); /* Sunset */
- } else {
- t = (double) N + ((6 - lngHour) / 24); /* Sunrise */
- }
-
- /* step 3: calculate the sun's mean anomaly */
- M = (0.9856 * t) - 3.289;
-
- /* step 4: calculate the sun's true longitude */
- L = M + (1.916 * sin(to_rad(M))) + (0.020 * sin (to_rad(2 * M))) + 282.634;
-
- while (L < 0) {
- Lx = L + 360;
- assert (Lx != L); /* askingtheguru: realy needed? */
- L = Lx;
- }
-
- while (L >= 360) {
- Lx = L - 360;
- assert (Lx != L); /* askingtheguru: realy needed? */
- L = Lx;
- }
-
- /* step 5a: calculate the sun's right ascension */
- RA = to_deg(atan(0.91764 * tan(to_rad(L))));
-
- while (RA < 0) {
- RAx = RA + 360;
- assert (RAx != RA); /* askingtheguru: realy needed? */
- RA = RAx;
- }
-
- while (RA >= 360) {
- RAx = RA - 360;
- assert (RAx != RA); /* askingtheguru: realy needed? */
- RA = RAx;
- }
-
- /* step 5b: right ascension value needs to be in the same quadrant as L */
- Lquadrant = floor(L / 90) * 90;
- RAquadrant = floor(RA / 90) * 90;
- RA = RA + (Lquadrant - RAquadrant);
-
- /* step 5c: right ascension value needs to be converted into hours */
- RA /= 15;
-
- /* step 6: calculate the sun's declination */
- sinDec = 0.39782 * sin(to_rad(L));
- cosDec = cos(asin(sinDec));
-
- /* step 7a: calculate the sun's local hour angle */
- cosH = (cos(to_rad(zenith)) - (sinDec * sin(to_rad(latitude)))) / (cosDec * cos(to_rad(latitude)));
-
- /* XXX: What's the use of this block.. ?
- * if (!calc_sunset && cosH > 1 || calc_sunset && cosH < -1) {
- * throw doesnthappen();
- * }
- */
-
- /* step 7b: finish calculating H and convert into hours */
- if (calc_sunset) {
- H = to_deg(acos(cosH)); /* Sunset */
- } else {
- H = 360 - to_deg(acos(cosH)); /* Sunrise */
- }
- H = H / 15;
-
- /* step 8: calculate local mean time */
- T = H + RA - (0.06571 * t) - 6.622;
-
- /* step 9: convert to UTC */
- UT = T - lngHour;
-
- while (UT < 0) {
- UTx = UT + 24;
- assert (UTx != UT); /* askingtheguru: realy needed? */
- UT = UTx;
- }
-
- while (UT >= 24) {
- UTx = UT - 24;
- assert (UTx != UT); /* askingtheguru: realy needed? */
- UT = UTx;
- }
-
- return UT;
-}
-/* }}} */
-
-/* {{{ php_do_date_sunrise_sunset
- * Common for date_sunrise() and date_sunset() functions
- */
-static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, int calc_sunset)
-{
- zval *date;
- double latitude, longitude, zenith, gmt_offset, ret;
- int time, N;
- long retformat;
- char retstr[6];
-
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|ldddd", &date, &retformat, &latitude, &longitude, &zenith, &gmt_offset) == FAILURE) {
- RETURN_FALSE;
- }
-
- switch (Z_TYPE_P(date)) {
- case IS_LONG:
- time = Z_LVAL_P(date);
- break;
- case IS_STRING:
- /* todo: more user friendly format */
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "date must be timestamp for now");
- RETURN_FALSE;
- }
-
- N = php_idate('z', time, 0) + 1;
-
- switch (ZEND_NUM_ARGS()) {
- case 1:
- retformat = SUNFUNCS_RET_STRING;
- case 2:
- latitude = INI_FLT("date.default_latitude");
- case 3:
- longitude = INI_FLT("date.default_longitude");
- case 4:
- if (calc_sunset) {
- zenith = INI_FLT("date.sunset_zenith");
- } else {
- zenith = INI_FLT("date.sunrise_zenith");
- }
- case 5:
- gmt_offset = php_idate('Z', time, 0) / 3600;
- case 6:
- break;
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "invalid format");
- RETURN_FALSE;
- break;
- }
-
- ret = php_sunrise_sunset(N, latitude, longitude, zenith, calc_sunset) + gmt_offset;
-
- switch (retformat) {
- case SUNFUNCS_RET_TIMESTAMP:
- RETURN_LONG((int) (time - (time % (24 * 3600))) + (int) (3600 * ret));
- break;
- case SUNFUNCS_RET_STRING:
- N = (int) ret;
- sprintf(retstr, "%02d:%02d", N, (int) (60 * (ret - (double) N)));
- RETVAL_STRINGL(retstr, 5, 1);
- break;
- case SUNFUNCS_RET_DOUBLE:
- RETURN_DOUBLE(ret);
- break;
- }
-}
-/* }}} */
-
-/* {{{ proto mixed date_sunrise(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])
- Returns time of sunrise for a given day and location */
-PHP_FUNCTION(date_sunrise)
-{
- php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
-}
-/* }}} */
-
-/* {{{ proto mixed date_sunset(mixed time [, int format [, float latitude [, float longitude [, float zenith [, float gmt_offset]]]]])
- Returns time of sunset for a given day and location */
-PHP_FUNCTION(date_sunset)
-{
- php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
-}
-/* }}} */
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: sw=4 ts=4 fdm=marker
- * vim<600: sw=4 ts=4
- */
diff --git a/ext/standard/tests/general_functions/sunfuncts.phpt b/ext/standard/tests/general_functions/sunfuncts.phpt
index a9711ffc34..6ccd128173 100644
--- a/ext/standard/tests/general_functions/sunfuncts.phpt
+++ b/ext/standard/tests/general_functions/sunfuncts.phpt
@@ -18,27 +18,27 @@ for($a=1;$a<=12;$a++){
}
?>
--EXPECT--
-1041316748 06:39 6.652455761896
-1041353169 16:46 16.76937486746
-1043994763 06:32 6.54537029266
-1044033183 17:13 17.21752470874
-1046412416 06:06 6.115652675685
-1046453799 17:36 17.6108549623
-1049088501 05:28 5.472742029069
-1049133501 17:58 17.97255258437
-1051678444 04:54 4.901229982859
-1051726729 18:18 18.31368876948
-1054355667 04:34 4.57442928945
-1054406363 18:39 18.65640094324
-1056947818 04:36 4.616120450519
-1056998911 18:48 18.80887165777
-1059627264 04:54 4.906882509836
-1059676557 18:35 18.59928600203
-1062306852 05:14 5.236889557074
-1062353017 18:03 18.06054178788
-1064899952 05:32 5.542366581139
-1064942681 17:24 17.41150561492
-1067579698 05:54 5.916208842058
-1067619001 16:50 16.83369857063
-1070173246 06:20 6.34622155207
-1070210100 16:35 16.58358905554
+1041395864 06:37 6.629013145891
+1041432452 16:47 16.79245111439
+1044073855 06:30 6.515408927984
+1044112463 17:14 17.23987028904
+1046491495 06:04 6.082214503339
+1046533075 17:37 17.63201103534
+1049167581 05:26 5.439443811173
+1049212774 17:59 17.99303572948
+1051757532 04:52 4.870193412616
+1051806007 18:20 18.33539050867
+1054434776 04:32 4.548982718277
+1054485647 18:40 18.67981294906
+1057026949 04:35 4.597195637274
+1057078197 18:49 18.83256339675
+1059706409 04:53 4.891657508917
+1059755837 18:37 18.62144070428
+1062385999 05:13 5.222095112101
+1062432291 18:04 18.08095716848
+1064979098 05:31 5.527319921542
+1065021952 17:25 17.43133913592
+1067658845 05:54 5.901629287093
+1067698274 16:51 16.85390245353
+1070252387 06:19 6.329924268934
+1070289382 16:36 16.60631260094