generational gc
OBS-URL: https://build.opensuse.org/package/show/devel:languages:misc/clisp?expand=0&rev=103
This commit is contained in:
parent
d5c9def339
commit
75b908bc2f
18
clisp.spec
18
clisp.spec
@ -28,7 +28,6 @@ Url: http://clisp.cons.org
|
||||
Source: %name-%version.tar.bz2
|
||||
Source3: clisp-rpmlintrc
|
||||
Source4: README.SUSE
|
||||
Source42: test-s390x.c
|
||||
# PATCH-EXTEND-OPENSUSE Set the process execution domain
|
||||
Patch1: clisp-2.49-personality.patch
|
||||
# PATCH-FIX-OPENSUSE Fix crash on Ia64
|
||||
@ -186,14 +185,14 @@ case "$(uname -m)" in
|
||||
i[0-9]86)
|
||||
MYCFLAGS="${MYCFLAGS}" ;;
|
||||
arm*) MYCFLAGS="${MYCFLAGS} ${safety}" ;;
|
||||
aarch64)MYCFLAGS="${MYCFLAGS}" ;;
|
||||
aarch64)MYCFLAGS="${MYCFLAGS}" ;;
|
||||
ppc) MYCFLAGS="${MYCFLAGS}" ;;
|
||||
s390) MYCFLAGS="${MYCFLAGS}" ;;
|
||||
x86_64) MYCFLAGS="${MYCFLAGS}" ;;
|
||||
sparc*) MYCFLAGS="${MYCFLAGS} ${safety}" ;;
|
||||
ppc64) MYCFLAGS="${MYCFLAGS} ${safety}" ;;
|
||||
ppc64le)MYCFLAGS="${MYCFLAGS} ${safety}" ;;
|
||||
s390x) MYCFLAGS="${MYCFLAGS} ${safety} -DSAFETY=3" ;;
|
||||
s390x) MYCFLAGS="${MYCFLAGS} ${safety} -DNO_GENERATIONAL_GC" ;;
|
||||
ia64) MYCFLAGS="${MYCFLAGS} ${safety}" ;;
|
||||
axp|alpha)
|
||||
MYCFLAGS="${MYCFLAGS}" ;;
|
||||
@ -201,14 +200,6 @@ esac
|
||||
export CC
|
||||
export MYCFLAGS
|
||||
unset noexec nommap safety
|
||||
#
|
||||
# Test for s390x
|
||||
#
|
||||
%ifarch s390x
|
||||
$CC $MYCFLAGS -o test-s390x %{S:42}
|
||||
./test-s390x
|
||||
CC="gcc -g3 -O -fno-strict-aliasing -fPIC -pipe"
|
||||
%endif
|
||||
|
||||
#
|
||||
# Report final architectures
|
||||
@ -280,7 +271,10 @@ tail -q -s 0.5 -f $SCREENLOG & pid=$!
|
||||
--with-module=clx/new-clx \
|
||||
--with-module=berkeley-db \
|
||||
--with-module=postgresql
|
||||
|
||||
%ifarch s390x
|
||||
%_make lispbibl.h
|
||||
cat lispbibl.h
|
||||
%endif
|
||||
%_make -C build
|
||||
%_make -C build check
|
||||
|
||||
|
243
test-s390x.c
243
test-s390x.c
@ -1,243 +0,0 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#define local static
|
||||
|
||||
/* Calendar computations using the Hebrew calendar.
|
||||
Algorithms taken from emacs-20.6/lisp/calendar/cal-hebrew.el
|
||||
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
|
||||
Copyright (C) 2003 Bruno Haible
|
||||
*/
|
||||
|
||||
/* Test whether the given year is a Hebrew calendar leap year. */
|
||||
/* Example:
|
||||
hebrew_calendar_leap_year_p (5763) = true
|
||||
hebrew_calendar_leap_year_p (5764) = false
|
||||
*/
|
||||
local inline bool hebrew_calendar_leap_year_p (int year)
|
||||
{
|
||||
return ((7 * year + 1) % 19) < 7;
|
||||
}
|
||||
|
||||
/* Months up to mean conjunction of Tishri of the given year. */
|
||||
/* Example:
|
||||
hebrew_calendar_elapsed_months (5763) = 71266
|
||||
hebrew_calendar_elapsed_months (5764) = 71279
|
||||
Note that
|
||||
hebrew_calendar_elapsed_months (year + 1)
|
||||
- hebrew_calendar_elapsed_months (year)
|
||||
== (hebrew_calendar_leap_year_p (year) ? 13 : 12).
|
||||
*/
|
||||
local inline int hebrew_calendar_elapsed_months (int year)
|
||||
{
|
||||
return ((year - 1) / 19) * 235
|
||||
+ ((year - 1) % 19) * 12
|
||||
+ (((year - 1) % 19) * 7 + 1) / 19;
|
||||
}
|
||||
|
||||
/* Days up to mean conjunction of Tishri of the given year. */
|
||||
/* Example:
|
||||
hebrew_calendar_elapsed_days (5763) = 2104528
|
||||
hebrew_calendar_elapsed_days (5764) = 2104913
|
||||
*/
|
||||
local int hebrew_calendar_elapsed_days (int year)
|
||||
{
|
||||
int months_elapsed = hebrew_calendar_elapsed_months (year);
|
||||
int parts_elapsed = (months_elapsed % 1080) * 793 + 204;
|
||||
int hours_elapsed =
|
||||
5 + months_elapsed * 12 + (months_elapsed / 1080) * 793
|
||||
+ (parts_elapsed / 1080);
|
||||
int parts = (hours_elapsed % 24) * 1080 + (parts_elapsed % 1080);
|
||||
int day = 1 + months_elapsed * 29 + (hours_elapsed / 24);
|
||||
int day1 =
|
||||
(parts >= 19440
|
||||
|| ((day % 7) == 2 && parts >= 9924
|
||||
&& !hebrew_calendar_leap_year_p (year))
|
||||
|| ((day % 7) == 1 && parts >= 16789
|
||||
&& hebrew_calendar_leap_year_p (year - 1))
|
||||
? day + 1
|
||||
: day);
|
||||
int day2 =
|
||||
((day1 % 7) == 0 || (day1 % 7) == 3 || (day1 % 7) == 5
|
||||
? day1 + 1
|
||||
: day1);
|
||||
return day2;
|
||||
}
|
||||
|
||||
/* Return the number of days in the given year. */
|
||||
/* Example:
|
||||
hebrew_calendar_days_in_year (5763) = 385
|
||||
hebrew_calendar_days_in_year (5764) = 355
|
||||
Note that the result is in the range 351..357 or 380..386.
|
||||
Probably (but I cannot prove it) it is in the range 353..355 or 383..385.
|
||||
*/
|
||||
local inline int hebrew_calendar_days_in_year (int year)
|
||||
{
|
||||
return hebrew_calendar_elapsed_days (year + 1)
|
||||
- hebrew_calendar_elapsed_days (year);
|
||||
}
|
||||
|
||||
/* Test whether in the given year, the Heshvan month is long. */
|
||||
local inline bool hebrew_calendar_long_heshvan_p (int year)
|
||||
{
|
||||
return (hebrew_calendar_days_in_year (year) % 10) == 5;
|
||||
}
|
||||
|
||||
/* Test whether in the given year, the Kislev month is short. */
|
||||
local inline bool hebrew_calendar_short_kislev_p (int year)
|
||||
{
|
||||
return (hebrew_calendar_days_in_year (year) % 10) == 3;
|
||||
}
|
||||
|
||||
/* Return the number of months of the given year. */
|
||||
local inline int hebrew_calendar_months_in_year (int year)
|
||||
{
|
||||
return (hebrew_calendar_leap_year_p (year) ? 13 : 12);
|
||||
}
|
||||
|
||||
/* Return the number of days in the given month of the given year. */
|
||||
local int hebrew_calendar_last_day_of_month (int year, int month)
|
||||
{
|
||||
/* Note that month 7 is the first month, and month 6 is the last one. */
|
||||
switch (month)
|
||||
{
|
||||
case 7: /* Tishri */
|
||||
return 30;
|
||||
case 8: /* Heshvan */
|
||||
return (hebrew_calendar_long_heshvan_p (year) ? 30 : 29);
|
||||
case 9: /* Kislev */
|
||||
return (hebrew_calendar_short_kislev_p (year) ? 29 : 30);
|
||||
case 10: /* Teveth */
|
||||
return 29;
|
||||
case 11: /* Shevat */
|
||||
return 30;
|
||||
case 12: /* Adar, or - if leap year - Adar I */
|
||||
return (hebrew_calendar_leap_year_p (year) ? 30 : 29);
|
||||
case 13: /* - only if leap year - Adar II */
|
||||
return 29;
|
||||
case 1: /* Nisan */
|
||||
return 30;
|
||||
case 2: /* Iyar */
|
||||
return 29;
|
||||
case 3: /* Sivan */
|
||||
return 30;
|
||||
case 4: /* Tammuz */
|
||||
return 29;
|
||||
case 5: /* Av */
|
||||
return 30;
|
||||
case 6: /* Elul */
|
||||
return 29;
|
||||
default: abort ();
|
||||
}
|
||||
}
|
||||
|
||||
/* Return the number of days since 1900-01-01 of a given Hebrew date. */
|
||||
/* Example:
|
||||
hebrew_calendar_to_universal (5763, 6, 29) = 37888
|
||||
hebrew_calendar_to_universal (5764, 7, 1) = 37889
|
||||
*/
|
||||
local int hebrew_calendar_to_universal (int year, int month, int day)
|
||||
{
|
||||
int days;
|
||||
int m;
|
||||
|
||||
days = hebrew_calendar_elapsed_days (year) - 2067024;
|
||||
if (month < 7) {
|
||||
int max_month = hebrew_calendar_months_in_year (year);
|
||||
for (m = 7; m <= max_month; m++)
|
||||
days += hebrew_calendar_last_day_of_month (year, m);
|
||||
for (m = 1; m < month; m++)
|
||||
days += hebrew_calendar_last_day_of_month (year, m);
|
||||
} else {
|
||||
for (m = 7; m < month; m++)
|
||||
days += hebrew_calendar_last_day_of_month (year, m);
|
||||
}
|
||||
days += day - 1;
|
||||
return days;
|
||||
}
|
||||
|
||||
/* Return the Hebrew date corresponding to a given universal date (= number
|
||||
of days since 1900-01-01). */
|
||||
/* Example:
|
||||
hebrew_calendar_from_universal (37888) = { 5763, 6, 29 }
|
||||
hebrew_calendar_from_universal (37889) = { 5764, 7, 1 }
|
||||
*/
|
||||
struct hebrew_date { int year; int month; int day; };
|
||||
local void hebrew_calendar_from_universal (int udate, struct hebrew_date *result)
|
||||
{
|
||||
int year;
|
||||
int elapsed_days;
|
||||
int remaining_days;
|
||||
int max_month;
|
||||
int month;
|
||||
|
||||
year = (int)((float)udate/(float)365.2422) + 5661;
|
||||
for (;; year--) {
|
||||
elapsed_days = hebrew_calendar_elapsed_days (year) - 2067024;
|
||||
if (udate >= elapsed_days)
|
||||
break;
|
||||
}
|
||||
|
||||
remaining_days = udate - elapsed_days;
|
||||
max_month = hebrew_calendar_months_in_year (year);
|
||||
for (month = 7; month <= max_month; month++) {
|
||||
int mlength = hebrew_calendar_last_day_of_month (year, month);
|
||||
if (remaining_days < mlength)
|
||||
break;
|
||||
remaining_days -= mlength;
|
||||
}
|
||||
if (month > max_month) {
|
||||
for (month = 1; month < 7; month++) {
|
||||
int mlength = hebrew_calendar_last_day_of_month (year, month);
|
||||
if (remaining_days < mlength)
|
||||
break;
|
||||
remaining_days -= mlength;
|
||||
}
|
||||
if (month == 7)
|
||||
abort ();
|
||||
}
|
||||
|
||||
result->year = year;
|
||||
result->month = month;
|
||||
result->day = remaining_days + 1;
|
||||
}
|
||||
|
||||
/* Return the number of Hanukka candles for a given universal date. */
|
||||
local int hebrew_calendar_hanukka_candles (int udate)
|
||||
{
|
||||
/* The first day of Hanukka is on 25 Kislev. */
|
||||
struct hebrew_date date;
|
||||
int hanukka_first_day;
|
||||
|
||||
hebrew_calendar_from_universal (udate, &date);
|
||||
hanukka_first_day = hebrew_calendar_to_universal (date.year, 9, 25);
|
||||
if (udate - hanukka_first_day >= 0 && udate - hanukka_first_day <= 7)
|
||||
return (udate - hanukka_first_day + 1);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
time_t now = time(NULL);
|
||||
struct tm now_local;
|
||||
struct tm now_gm;
|
||||
|
||||
now_local = *(localtime(&now));
|
||||
now_gm = *(gmtime(&now));
|
||||
|
||||
long int dayswest = (now_gm.tm_year < now_local.tm_year ? -1 :
|
||||
now_gm.tm_year > now_local.tm_year ? 1 :
|
||||
(now_gm.tm_mon < now_local.tm_mon ? -1 :
|
||||
now_gm.tm_mon > now_local.tm_mon ? 1 :
|
||||
(now_gm.tm_mday < now_local.tm_mday ? -1 :
|
||||
now_gm.tm_mday > now_local.tm_mday ? 1 :
|
||||
0)));
|
||||
long int hourswest = 24*dayswest
|
||||
+ (long int)(now_gm.tm_hour - now_local.tm_hour);
|
||||
unsigned long int hours_since_1900 = ((unsigned long)now / 3600) - hourswest + 613608;
|
||||
unsigned long int days_since_1900 = (hours_since_1900 + 6) / 24;
|
||||
int candles = hebrew_calendar_hanukka_candles(days_since_1900);
|
||||
return printf("candles = %d\n", candles) > 0 ? 0 : 1;
|
||||
}
|
Loading…
Reference in New Issue
Block a user