ruby-calendrical 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f3d3f00ad1d48c523bcaafdff4d5d89486fcd1ca
4
+ data.tar.gz: e981441fa663ea07949b5d02fc1f94f65b5a9e8f
5
+ SHA512:
6
+ metadata.gz: c74dd37be5b81672fee5fd87ea27d389315ee7106a44105989e8e1a54210824c808e5b0cb37f3afbb6abf78b07b349d6b37921443785264e1f715810fd8b6661
7
+ data.tar.gz: b8b3ea4415a6c29f4e8b64e7b4ea65037c7f37fb13f0e05287be8ffce1b5273ee158554ed40685dff0b32c0eb7244eb4fcc6d872e1ac59e833311a7b753650a1
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 1997-2014, Tadayoshi Funaba
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are
6
+ met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright
12
+ notice, this list of conditions and the following disclaimer in the
13
+ documentation and/or other materials provided with the
14
+ distribution.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README ADDED
@@ -0,0 +1,72 @@
1
+ "Calendrical" モジュール
2
+ ========================
3
+
4
+ これは様々な暦についての計算をあつかうモジュールです。暦の計算は
5
+ "Calendrical Calculations"、および "Calendrical Calculations, II:
6
+ Three Historical Calendars" にもとづいています。
7
+
8
+ また、上記のものに加え、いくつかの暦のためにコードを追加しています。
9
+
10
+ このモジュールはつぎの暦をあつかいます:
11
+
12
+ グレゴリオ暦 (いわゆる新暦)、暦週 ("ISO")、ユリウス暦 (欧州旧暦)、
13
+ イスラム暦、ユダヤ暦、マヤ暦、フランス革命暦、古ヒンドゥ、アケリス
14
+ の世界暦、コプト暦、エチオピア暦、ジャラリ暦、バハイ暦、インド国民
15
+ 暦、改訂ベンガル暦、新シク暦 (Nanakshahi)、いわゆる旧暦
16
+
17
+ このモジュールは、以前にただ "Calendar" モジュール群として扱っていたも
18
+ のから分離して "Calendrical" モジュールとしたものです。後方互換性のため
19
+ に lib/calendar.rb を用意しています。
20
+
21
+ 注意: マヤ長期暦の対照は GMT (584,283) です。ジャラリ暦はまだ完全ではあ
22
+ りません。インド国民暦、改訂ベンガル暦、新シク暦 (Nanakshahi) は試験実
23
+ 装です。旧暦の年は西暦をつかいます。このモジュールは、ユリウス日、およ
24
+ び修正ユリウス日を「年代学的」にあつかいます。
25
+
26
+
27
+ インストール
28
+ ------------
29
+
30
+ スクリプト "install.rb" をつかいます。
31
+
32
+ $ ruby install.rb config
33
+ $ ruby install.rb setup
34
+ ($ su)
35
+ # ruby install.rb install
36
+
37
+ くわしくは、"ruby install.rb --help" としてください。
38
+
39
+
40
+ 謝辞
41
+ ----
42
+
43
+ さまざまな暦計算のためのコードを書かれた Edward M. Reingold、
44
+ Nachum Dershowitz、Stewart M. Clamen 氏らに感謝します。
45
+
46
+
47
+ 参考文献
48
+ --------
49
+
50
+ Nachum Dershowitz and Edward M. Reingold, "Calendrical Calculations"
51
+ Software---Practice & Experience, vol. 20, no. 9 (Sept. 1990),
52
+ pp. 899--928.
53
+
54
+ Edward M. Reingold, Nachum Dershowitz and Stewart M. Clamen,
55
+ "Calendrical Calculations, II: Three Historical Calendars"
56
+ Software---Practice & Experience, vol. 23, no. 4 (April. 1993),
57
+ pp. 383--404.
58
+
59
+ 暦計算研究会編「新こよみ便利帳」恒星社厚生閣 1991
60
+
61
+ 野島寿三郎編「日本暦西暦月日対照表」日外アソシエーツ 1987,1996
62
+
63
+ 暦の会編「暦の百科事典」(新旧暦月日対照表:西沢利男)新人物往来社 1986,1989
64
+
65
+ 内田正男編著「日本暦日原典第四版」雄山閣出版 1975,1992
66
+
67
+ 日外アソシエーツ編集部編「21世紀暦」日外アソシエーツ 2000
68
+
69
+
70
+ ふなばただよし
71
+ mailto:tadf@funaba.org
72
+ http://www.funaba.org/
data/README.en ADDED
@@ -0,0 +1,76 @@
1
+ A "Calendrical" module
2
+ ======================
3
+
4
+ This module handles calculations about various calendars. It is based
5
+ on "Calendrical Calculations" and "Calendrical Calculations, II: Three
6
+ Historical Calendars".
7
+
8
+ In addition to the above, I also wrote code for a few calendars.
9
+
10
+ This module supports the following calendars:
11
+
12
+ Gregorian (New Style), Week Date ("ISO"), Julian (Old Style),
13
+ Islamic (Moslem), Hebrew (Jewish), Mayan, French Revolutionary,
14
+ Old Hindu, Achelis', Coptic, Ethiopian, Jalali, Bahá'í, Indian
15
+ National (experimental), Revised Bengali (experimental),
16
+ Nanakshahi (experimental) and Kyūreki
17
+
18
+ This "Calendrical" module was derived from old "Calendar" modules.
19
+ lib/calendar.rb is avaiable for backward compatibility.
20
+
21
+ NOTE: The correlation of Mayan Long Count is GMT (584,283). Jalali is
22
+ not complete yet. Indian National, Revised Bengali and Nanakshahi are
23
+ now experimental. This module represents Japanese traditional
24
+ calendar ("Kyūreki") in Gregorian year. This module handles Julian
25
+ day number and Modified Julian daynumber as "chronological" ones.
26
+
27
+
28
+ Install
29
+ -------
30
+
31
+ Use the script "install.rb".
32
+
33
+ $ ruby install.rb config
34
+ $ ruby install.rb setup
35
+ ($ su)
36
+ # ruby install.rb install
37
+
38
+ For more information, type "ruby install.rb --help".
39
+
40
+
41
+ Acknowledgments
42
+ ---------------
43
+
44
+ I thank Edward M. Reingold, Nachum Dershowitz and Stewart M. Clamen
45
+ who wrote various calendrical code.
46
+
47
+
48
+ References
49
+ ----------
50
+
51
+ Nachum Dershowitz and Edward M. Reingold, "Calendrical Calculations"
52
+ Software---Practice & Experience, vol. 20, no. 9 (Sept. 1990),
53
+ pp. 899--928.
54
+
55
+ Edward M. Reingold, Nachum Dershowitz and Stewart M. Clamen,
56
+ "Calendrical Calculations, II: Three Historical Calendars"
57
+ Software---Practice & Experience, vol. 23, no. 4 (April. 1993),
58
+ pp. 383--404.
59
+
60
+ Koyomi-keisan Kenkyū-kai, Shin Koyomi Benrichō, Kōseisha Kōseikaku,
61
+ 1991
62
+
63
+ Jusaburō Nojima, Nihon-reki Sei-reki Tsuki-hi Taishō-hyō, Nichigai
64
+ Associates, 1987,1996
65
+
66
+ Koyomi no Kai, Koyomi no Hyakka-jiten, Shin Jinbutsu Ōraisha,
67
+ 1986,1989
68
+
69
+ Masao Uchida, Nihon Rekijitsu Genten 4th ed, Yūzan Kaku, 1975,1992
70
+
71
+ Nichigai Associates, 21 Seiki-reki, Nichigai Associates 2000
72
+
73
+
74
+ Tadayoshi Funaba
75
+ mailto:tadf@funaba.org
76
+ http://www.funaba.org/
data/example/cal.rb ADDED
@@ -0,0 +1,39 @@
1
+ #! /usr/local/bin/ruby
2
+
3
+ require 'calendrical'
4
+ include Calendrical
5
+
6
+ def cal(m, y)
7
+ printf(" %s %d\n", MONTH_NAMES[m], y)
8
+ printf(" S M Tu W Th F S\n")
9
+ fst = gregorian_to_rd(y, m, 1)
10
+ print(' ' * rd_to_day_of_week(fst))
11
+ days = gregorian_last_day_of_month(y, m)
12
+ for i in 1..days
13
+ printf('%2d', i)
14
+ if rd_to_day_of_week(fst + i) != 0
15
+ print(' ')
16
+ else
17
+ print("\n")
18
+ end
19
+ end
20
+ if ((rd_to_day_of_week(fst) + days) / 7) < 5
21
+ print("\n")
22
+ end
23
+ print("\n")
24
+ end
25
+
26
+ def main()
27
+ if $*.length > 2
28
+ printf($stderr, "usage: cal [ month [year] ]\n")
29
+ exit(1)
30
+ end
31
+ now = Time.now
32
+ m = now.mon
33
+ y = now.year
34
+ m = $*[0].to_i if $*.length >= 1
35
+ y = $*[1].to_i if $*.length >= 2
36
+ cal(m, y)
37
+ end
38
+
39
+ main()
@@ -0,0 +1,10 @@
1
+ MANIFEST
2
+ calendrical.h
3
+ calendrical.c
4
+ calendrical2.c
5
+ calendrical2.h
6
+ calendricalmodule.c
7
+ depend
8
+ extconf.rb
9
+ qref.c
10
+ qref.h
@@ -0,0 +1,1197 @@
1
+ /*
2
+ calendrical.c: Translated by Tadayoshi Funaba 1996-2001,2014
3
+
4
+ The original Common Lisp code is from ``Calendrical
5
+ Calculations'' by Nachum Dershowitz and Edward
6
+ M. Reingold, Software---Practice & Experience,
7
+ vol. 20, no. 9 (September, 1990), pp. 899--928 and
8
+ from ``Calendrical Calculations, II: Three Historical
9
+ Calendars'' by Edward M. Reingold, Nachum Dershowitz,
10
+ and Stewart M. Clamen, Software---Practice & Experience,
11
+ vol. 23, no. 4 (April, 1993), pp. 383--404.
12
+
13
+ This code is in the public domain, but any use of it
14
+ should publically acknowledge its source.
15
+
16
+ $Id: calendrical.c,v 1.9 2014-04-08 19:27:31+09 tadf Exp $
17
+ */
18
+
19
+ #define MODULE
20
+
21
+ #ifndef NULL
22
+ #define NULL 0
23
+ #endif
24
+
25
+ #include <stdlib.h>
26
+ #include <math.h>
27
+ #include "calendrical.h"
28
+
29
+ static div_t
30
+ divmod(int m, int n)
31
+ {
32
+ div_t d;
33
+
34
+ d = div(m, n);
35
+ if ((m < 0) != (n < 0) && d.rem != 0) {
36
+ d.quot -= 1;
37
+ d.rem += n;
38
+ }
39
+ return d;
40
+ }
41
+
42
+ #undef quotient
43
+ #define quotient(m, n) i_quotient(m, n)
44
+ static int
45
+ i_quotient(int m, int n)
46
+ {
47
+ return divmod(m, n).quot;
48
+ }
49
+ #undef mod
50
+ #define mod(m, n) i_mod(m, n)
51
+ static int
52
+ i_mod(int m, int n)
53
+ {
54
+ return divmod(m, n).rem;
55
+ }
56
+ #undef oddp
57
+ #define oddp(n) ((n) % 2)
58
+
59
+ static int
60
+ approximate(int x, int y)
61
+ {
62
+ return quotient(x, (x < 0) ? (y - 1) : y);
63
+ }
64
+
65
+ int
66
+ gregorian_leap_year(int year)
67
+ {
68
+ return
69
+ mod(year, 4) == 0 &&
70
+ !(mod(year, 400) == 100 ||
71
+ mod(year, 400) == 200 ||
72
+ mod(year, 400) == 300);
73
+ }
74
+
75
+ int
76
+ gregorian_last_day_of_month(int year, int month)
77
+ {
78
+ if (month == 2 && gregorian_leap_year(year))
79
+ return 29;
80
+ switch (month) {
81
+ case 1: return 31;
82
+ case 2: return 28;
83
+ case 3: return 31;
84
+ case 4: return 30;
85
+ case 5: return 31;
86
+ case 6: return 30;
87
+ case 7: return 31;
88
+ case 8: return 31;
89
+ case 9: return 30;
90
+ case 10: return 31;
91
+ case 11: return 30;
92
+ case 12: return 31;
93
+ default: return 0;
94
+ }
95
+ }
96
+
97
+ int
98
+ gregorian_to_rd(int year, int month, int day)
99
+ {
100
+ int sumres;
101
+
102
+ {
103
+ int temp, m;
104
+ for (temp = 0, m = 1;
105
+ (m < month);
106
+ temp = temp + gregorian_last_day_of_month(year, m), m++)
107
+ ;
108
+ sumres = temp;
109
+ }
110
+ return day
111
+ + sumres
112
+ + (365 * (year - 1))
113
+ + quotient(year - 1, 4)
114
+ - quotient(year - 1, 100)
115
+ + quotient(year - 1, 400);
116
+ }
117
+
118
+ void
119
+ rd_to_gregorian(int date, int *ryear, int *rmonth, int *rday)
120
+ {
121
+ int approx, month, day, year;
122
+ int sumres1, sumres2;
123
+
124
+ #ifndef PAPER
125
+ approx = approximate(date, 366);
126
+ #else
127
+ approx = quotient(date, 366);
128
+ #endif
129
+ {
130
+ int temp, y;
131
+ for (temp = 0, y = approx;
132
+ (date >= gregorian_to_rd(1 + y, 1, 1));
133
+ temp = temp + 1, y++)
134
+ ;
135
+ sumres1 = temp;
136
+ }
137
+ year = approx
138
+ + sumres1;
139
+ {
140
+ int temp, m;
141
+ for (temp = 0, m = 1;
142
+ (date > gregorian_to_rd
143
+ (year, m, gregorian_last_day_of_month(year, m)));
144
+ temp = temp + 1, m++)
145
+ ;
146
+ sumres2 = temp;
147
+ }
148
+ month = 1
149
+ + sumres2;
150
+ day = date
151
+ - (gregorian_to_rd(year, month, 1) - 1);
152
+ if (rmonth)
153
+ *rmonth = month;
154
+ if (rday)
155
+ *rday = day;
156
+ if (ryear)
157
+ *ryear = year;
158
+ }
159
+
160
+ int
161
+ kday_on_or_before(int date, int k)
162
+ {
163
+ return date - mod(date - k, 7);
164
+ }
165
+
166
+ int
167
+ iso_to_rd(int year, int week, int day)
168
+ {
169
+ return kday_on_or_before(gregorian_to_rd(year, 1, 4), 1)
170
+ + (7 * (week - 1))
171
+ + (day - 1);
172
+ }
173
+
174
+ void
175
+ rd_to_iso(int date, int *ryear, int *rweek, int *rday)
176
+ {
177
+ int approx, week, day, year;
178
+
179
+ rd_to_gregorian(date - 3, &approx, NULL, NULL);
180
+ year = (date >= iso_to_rd(1 + approx, 1, 1)) ?
181
+ 1 + approx : approx;
182
+ week = 1 + quotient(date - iso_to_rd(year, 1, 1), 7);
183
+ day = (mod(date, 7) == 0) ?
184
+ 7 : mod(date, 7);
185
+ if (rweek)
186
+ *rweek = week;
187
+ if (rday)
188
+ *rday = day;
189
+ if (ryear)
190
+ *ryear = year;
191
+ }
192
+
193
+ int
194
+ julian_leap_year(int year)
195
+ {
196
+ #if !defined(PAPER) && defined(OMIT_LEAP4)
197
+ return year != 4 && mod(year, 4) == 0;
198
+ #else
199
+ return mod(year, 4) == 0;
200
+ #endif
201
+ }
202
+
203
+ int
204
+ julian_last_day_of_month(int year, int month)
205
+ {
206
+ if (month == 2 && julian_leap_year(year))
207
+ return 29;
208
+ switch (month) {
209
+ case 1: return 31;
210
+ case 2: return 28;
211
+ case 3: return 31;
212
+ case 4: return 30;
213
+ case 5: return 31;
214
+ case 6: return 30;
215
+ case 7: return 31;
216
+ case 8: return 31;
217
+ case 9: return 30;
218
+ case 10: return 31;
219
+ case 11: return 30;
220
+ case 12: return 31;
221
+ default: return 0;
222
+ }
223
+ }
224
+
225
+ int
226
+ julian_to_rd(int year, int month, int day)
227
+ {
228
+ int sumres;
229
+
230
+ {
231
+ int temp, m;
232
+ for (temp = 0, m = 1;
233
+ (m < month);
234
+ temp = temp + julian_last_day_of_month(year, m), m++)
235
+ ;
236
+ sumres = temp;
237
+ }
238
+ return day
239
+ + sumres
240
+ + (365 * (year - 1))
241
+ + quotient(year - 1, 4)
242
+ #if !defined(PAPER) && defined(OMIT_LEAP4)
243
+ - ((year > 4) ? 2 : 1);
244
+ #else
245
+ - 2;
246
+ #endif
247
+ }
248
+
249
+ void
250
+ rd_to_julian(int date, int *ryear, int *rmonth, int *rday)
251
+ {
252
+ int approx, month, day, year;
253
+ int sumres1, sumres2;
254
+
255
+ #if !defined(PAPER) && defined(OMIT_LEAP4)
256
+ approx = approximate(date + 1, 366);
257
+ #elif !defined(PAPER)
258
+ approx = approximate(date + 2, 366);
259
+ #else
260
+ approx = quotient(date + 2, 366);
261
+ #endif
262
+
263
+ {
264
+ int temp, y;
265
+ for (temp = 0, y = approx;
266
+ (date >= julian_to_rd(1 + y, 1, 1));
267
+ temp = temp + 1, y++)
268
+ ;
269
+ sumres1 = temp;
270
+ }
271
+ year = approx
272
+ + sumres1;
273
+ {
274
+ int temp, m;
275
+ for (temp = 0, m = 1;
276
+ (date > julian_to_rd
277
+ (year, m, julian_last_day_of_month(year, m)));
278
+ temp = temp + 1, m++)
279
+ ;
280
+ sumres2 = temp;
281
+ }
282
+ month = 1
283
+ + sumres2;
284
+ day = date - (julian_to_rd(year, month, 1) - 1);
285
+ if (rmonth)
286
+ *rmonth = month;
287
+ if (rday)
288
+ *rday = day;
289
+ if (ryear)
290
+ *ryear = year;
291
+ }
292
+
293
+ int
294
+ islamic_leap_year(int year)
295
+ {
296
+ return mod(14 + (11 * year), 30) < 11;
297
+ }
298
+
299
+ int
300
+ islamic_last_day_of_month(int year, int month)
301
+ {
302
+ return (oddp (month) ||
303
+ ((month == 12) && islamic_leap_year(year))) ?
304
+ 30 : 29;
305
+ }
306
+
307
+ int
308
+ islamic_to_rd(int year, int month, int day)
309
+ {
310
+ return day
311
+ + (29 * (month - 1))
312
+ + quotient(month, 2)
313
+ + ((year - 1) * 354)
314
+ + quotient(3 + (11 * year), 30)
315
+ + 227014;
316
+ }
317
+
318
+ void
319
+ rd_to_islamic(int date, int *ryear, int *rmonth, int *rday)
320
+ {
321
+ int approx, month, day, year;
322
+ int sumres1, sumres2;
323
+
324
+ #ifdef PAPER
325
+ if (date <= 227014) {
326
+ if (rmonth)
327
+ *rmonth = 0;
328
+ if (rday)
329
+ *rday = 0;
330
+ if (ryear)
331
+ *ryear = 0;
332
+ return;
333
+ }
334
+ #endif
335
+ #ifndef PAPER
336
+ approx = approximate(date - 227014, 355);
337
+ #else
338
+ approx = quotient(date - 227014, 355);
339
+ #endif
340
+ {
341
+ int temp, y;
342
+ for (temp = 0, y = approx;
343
+ (date >= islamic_to_rd(1 + y, 1, 1));
344
+ temp = temp + 1, y++)
345
+ ;
346
+ sumres1 = temp;
347
+ }
348
+ year = approx
349
+ + sumres1;
350
+ {
351
+ int temp, m;
352
+ for (temp = 0, m = 1;
353
+ (date > islamic_to_rd
354
+ (year, m, islamic_last_day_of_month(year, m)));
355
+ temp = temp + 1, m++)
356
+ ;
357
+ sumres2 = temp;
358
+ }
359
+ month = 1
360
+ + sumres2;
361
+ day = date
362
+ - (islamic_to_rd(year, month, 1) - 1);
363
+ if (rmonth)
364
+ *rmonth = month;
365
+ if (rday)
366
+ *rday = day;
367
+ if (ryear)
368
+ *ryear = year;
369
+ }
370
+
371
+ int
372
+ hebrew_leap_year(int year)
373
+ {
374
+ return mod(1 + (7 * year), 19) < 7;
375
+ }
376
+
377
+ int
378
+ hebrew_last_month_of_year(int year)
379
+ {
380
+ return (hebrew_leap_year(year)) ?
381
+ 13 : 12;
382
+ }
383
+
384
+ int
385
+ hebrew_last_day_of_month(int year, int month)
386
+ {
387
+ return
388
+ ((month == 2 ||
389
+ month == 4 ||
390
+ month == 6 ||
391
+ month == 10 ||
392
+ month == 13) ||
393
+ (month == 12 && !hebrew_leap_year(year)) ||
394
+ (month == 8 && !long_heshvan(year)) ||
395
+ (month == 9 && short_kislev(year))) ?
396
+ 29 : 30;
397
+ }
398
+
399
+ int
400
+ hebrew_calendar_elapsed_days(int year)
401
+ {
402
+ int months_elapsed, parts_elapsed, hours_elapsed,
403
+ day, parts, alternative_day;
404
+
405
+ months_elapsed = (235 * quotient(year - 1, 19))
406
+ + (12 * mod(year - 1, 19))
407
+ + quotient(1 + (7 * mod (year - 1, 19)), 19);
408
+ parts_elapsed = 204
409
+ + (793 * mod(months_elapsed, 1080));
410
+ hours_elapsed = 5
411
+ + (12 * months_elapsed)
412
+ + (793 * quotient(months_elapsed, 1080))
413
+ + quotient(parts_elapsed, 1080);
414
+ day = 1
415
+ + (29 * months_elapsed)
416
+ + quotient(hours_elapsed, 24);
417
+ parts = (1080 * mod(hours_elapsed, 24))
418
+ + mod(parts_elapsed, 1080);
419
+ alternative_day =
420
+ ((parts >= 19440) ||
421
+ ((mod(day, 7) == 2) && (parts >= 9924)
422
+ && !hebrew_leap_year(year)) ||
423
+ ((mod(day, 7) == 1) && (parts >= 16789)
424
+ && hebrew_leap_year(year - 1))) ?
425
+ 1 + day : day;
426
+ return ((mod (alternative_day, 7) == 0) ||
427
+ (mod(alternative_day, 7) == 3) ||
428
+ (mod(alternative_day, 7) == 5)) ?
429
+ 1 + alternative_day : alternative_day;
430
+ }
431
+
432
+ int
433
+ hebrew_days_in_year(int year)
434
+ {
435
+ return
436
+ hebrew_calendar_elapsed_days(1 + year)
437
+ - hebrew_calendar_elapsed_days(year);
438
+ }
439
+
440
+ int
441
+ long_heshvan(int year)
442
+ {
443
+ return mod(hebrew_days_in_year(year), 10) == 5;
444
+ }
445
+
446
+ int
447
+ short_kislev(int year)
448
+ {
449
+ return mod(hebrew_days_in_year (year), 10) == 3;
450
+ }
451
+
452
+ int
453
+ hebrew_to_rd(int year, int month, int day)
454
+ {
455
+ if (month < 7) {
456
+ int sumres1, sumres2;
457
+
458
+ {
459
+ int temp, m;
460
+ for (temp = 0, m = 7;
461
+ (m <= hebrew_last_month_of_year(year));
462
+ temp = temp + hebrew_last_day_of_month(year, m), m++)
463
+ ;
464
+ sumres1 = temp;
465
+ }
466
+ {
467
+ int temp, m;
468
+ for (temp = 0, m = 1;
469
+ (m < month);
470
+ temp = temp + hebrew_last_day_of_month(year, m), m++)
471
+ ;
472
+ sumres2 = temp;
473
+ }
474
+ return day
475
+ + sumres1
476
+ + sumres2
477
+ + hebrew_calendar_elapsed_days(year)
478
+ - 1373429;
479
+ } else {
480
+ int sumres;
481
+
482
+ {
483
+ int temp, m;
484
+ for (temp = 0, m = 7;
485
+ (m < month);
486
+ temp = temp + hebrew_last_day_of_month(year, m), m++)
487
+ ;
488
+ sumres = temp;
489
+ }
490
+ return day
491
+ + sumres
492
+ + hebrew_calendar_elapsed_days(year)
493
+ - 1373429;
494
+ }
495
+ }
496
+
497
+ void
498
+ rd_to_hebrew(int date, int *ryear, int *rmonth, int *rday)
499
+ {
500
+ int approx, year, start, month, day;
501
+ int sumres1, sumres2;
502
+
503
+ #ifndef PAPER
504
+ approx = approximate(date + 1373429, 366);
505
+ #else
506
+ approx = quotient(date + 1373429, 366);
507
+ #endif
508
+ {
509
+ int temp, y;
510
+ for (temp = 0, y = approx;
511
+ (date >= hebrew_to_rd(1 + y, 7, 1));
512
+ temp = temp + 1, y++)
513
+ ;
514
+ sumres1 = temp;
515
+ }
516
+ year = approx
517
+ + sumres1;
518
+ start = (date < hebrew_to_rd(year, 1, 1)) ?
519
+ 7 : 1;
520
+ {
521
+ int temp, m;
522
+ for (temp = 0, m = start;
523
+ (date > hebrew_to_rd
524
+ (year, m, hebrew_last_day_of_month(year, m)));
525
+ temp = temp + 1, m++)
526
+ ;
527
+ sumres2 = temp;
528
+ }
529
+ month = start
530
+ + sumres2;
531
+ day = date
532
+ - (hebrew_to_rd(year, month, 1) - 1);
533
+ if (rmonth)
534
+ *rmonth = month;
535
+ if (rday)
536
+ *rday = day;
537
+ if (ryear)
538
+ *ryear = year;
539
+ }
540
+
541
+ #if !defined(PLUTO) && !defined(MODULE)
542
+ int
543
+ independence_day(int year)
544
+ {
545
+ return gregorian_to_rd(year, 7, 4);
546
+ }
547
+ #endif
548
+
549
+ #ifndef PLUTO
550
+ int
551
+ nth_kday(int year, int month, int n, int k)
552
+ {
553
+ if (n > 0)
554
+ return
555
+ kday_on_or_before
556
+ (gregorian_to_rd(year, month, 7), k)
557
+ + (7 * (n - 1));
558
+ return
559
+ kday_on_or_before
560
+ (gregorian_to_rd
561
+ (year, month,
562
+ gregorian_last_day_of_month(year, month)),
563
+ k)
564
+ + (7 * (1 + n));
565
+ }
566
+ #endif
567
+
568
+ #if !defined(PLUTO) && !defined(MODULE)
569
+ int
570
+ labor_day(int year)
571
+ {
572
+ return Nth_Kday(1, 1, 9, year);
573
+ }
574
+
575
+ int
576
+ memorial_day(int year)
577
+ {
578
+ return Nth_Kday(-1, 1, 5, year);
579
+ }
580
+
581
+ int
582
+ daylight_savings_start(int year)
583
+ {
584
+ return Nth_Kday(1, 0, 4, year);
585
+ }
586
+
587
+ int
588
+ daylight_savings_end(int year)
589
+ {
590
+ return Nth_Kday(-1, 0, 10, year);
591
+ }
592
+
593
+ int
594
+ christmas(int year)
595
+ {
596
+ return gregorian_to_rd(year, 12, 25);
597
+ }
598
+
599
+ int
600
+ advent(int year)
601
+ {
602
+ return kday_on_or_before(gregorian_to_rd(year, 12, 3), 0);
603
+ }
604
+
605
+ int
606
+ epiphany(int year)
607
+ {
608
+ return 12 + christmas(year);
609
+ }
610
+
611
+ int
612
+ eastern_orthodox_christmas(int year)
613
+ {
614
+ int jan1, dec31, y, c1, c2;
615
+
616
+ jan1 = gregorian_to_rd(year, 1, 1);
617
+ dec31 = gregorian_to_rd(year, 12, 31);
618
+ rd_to_julian(jan1, &y, NULL, NULL);
619
+ c1 = julian_to_rd(y, 12, 25);
620
+ c2 = julian_to_rd(1 + y, 12, 25);
621
+ if (jan1 <= c1 && c1 <= dec31)
622
+ return c1;
623
+ else if (jan1 <= c2 && c2 <= dec31)
624
+ return c2;
625
+ return 0;
626
+ }
627
+ #endif /* not PLUTO and not MODULE */
628
+
629
+ int
630
+ nicaean_rule_easter(int year)
631
+ {
632
+ int shifted_epact, paschal_moon;
633
+
634
+ shifted_epact = mod(14 + (11 * mod(year, 19)), 30);
635
+ paschal_moon = julian_to_rd(year, 4, 19)
636
+ - shifted_epact;
637
+ return kday_on_or_before(paschal_moon + 7, 0);
638
+ }
639
+
640
+ int
641
+ easter(int year)
642
+ {
643
+ int century, shifted_epact, adjusted_epact, paschal_moon;
644
+
645
+ century = 1 + quotient(year, 100);
646
+ shifted_epact = mod(14 + (11 * mod(year, 19))
647
+ - quotient(3 * century, 4)
648
+ + quotient(5 + (8 * century), 25)
649
+ + (30 * century),
650
+ 30);
651
+ adjusted_epact = ((shifted_epact == 0)
652
+ || ((shifted_epact == 1) && (10 < mod(year, 19)))) ?
653
+ 1 + shifted_epact : shifted_epact;
654
+ paschal_moon = gregorian_to_rd(year, 4, 19)
655
+ - adjusted_epact;
656
+ return kday_on_or_before(paschal_moon + 7, 0);
657
+ }
658
+
659
+ #if !defined(PLUTO) && !defined(MODULE)
660
+ int
661
+ pentecost(int year)
662
+ {
663
+ return 49 + easter(year);
664
+ }
665
+
666
+ void
667
+ islamic_date(int year, int month, int day, int date[3])
668
+ {
669
+ int jan1, dec31, y, date1, date2, date3;
670
+
671
+ jan1 = gregorian_to_rd(year, 1, 1);
672
+ dec31 = gregorian_to_rd(year, 12, 31);
673
+ rd_to_islamic(jan1, &y, NULL, NULL);
674
+ date1 = islamic_to_rd(y, month, day);
675
+ date2 = islamic_to_rd(1 + y, month, day);
676
+ date3 = islamic_to_rd(2 + y, month, day);
677
+ date[0] = (jan1 <= date1 && date1 <= dec31) ?
678
+ date1 : 0;
679
+ date[1] = (jan1 <= date2 && date2 <= dec31) ?
680
+ date2 : 0;
681
+ date[2] = (jan1 <= date3 && date3 <= dec31) ?
682
+ date3 : 0;
683
+ }
684
+
685
+ void
686
+ mulad_al_nabi(int year, int date[3])
687
+ {
688
+ islamic_date(year, 3, 12, date);
689
+ }
690
+
691
+ int
692
+ yom_kippur(int year)
693
+ {
694
+ return hebrew_to_rd(year + 3761, 7, 10);
695
+ }
696
+
697
+ int
698
+ passover(int year)
699
+ {
700
+ return hebrew_to_rd(year + 3760, 1, 15);
701
+ }
702
+
703
+ int
704
+ purim(int year)
705
+ {
706
+ return
707
+ hebrew_to_rd
708
+ (year + 3760,
709
+ hebrew_last_month_of_year(year + 3760), 14);
710
+ }
711
+
712
+ int
713
+ ta_anit_esther(int year)
714
+ {
715
+ int purim_date;
716
+
717
+ purim_date = purim(year);
718
+ return (mod(purim_date, 7) == 0) ?
719
+ purim_date - 3 : purim_date - 1;
720
+ }
721
+
722
+ int
723
+ tisha_b_av(int year)
724
+ {
725
+ int ninth_of_av;
726
+
727
+ ninth_of_av = hebrew_to_rd(year + 3760, 5, 9);
728
+ return (mod(ninth_of_av, 7) == 6) ?
729
+ 1 + ninth_of_av : ninth_of_av;
730
+ }
731
+
732
+ int
733
+ hebrew_birthday(int birth_year, int birth_month, int birth_day, int year)
734
+ {
735
+ return
736
+ (birth_month == hebrew_last_month_of_year(birth_year)) ?
737
+ hebrew_to_rd(year, hebrew_last_month_of_year(year), birth_day) :
738
+ hebrew_to_rd(year, birth_month, birth_day);
739
+ }
740
+
741
+ int
742
+ yahrzeit(int death_year, int death_month, int death_day, int year)
743
+ {
744
+ if (death_month == 8 &&
745
+ death_day == 30 &&
746
+ !long_heshvan(1 + death_year))
747
+ return hebrew_to_rd(year, 9, 1) - 1;
748
+ if (death_month == 9 &&
749
+ death_day == 30 &&
750
+ !short_kislev(1 + death_year))
751
+ return hebrew_to_rd(year, 10, 1) - 1;
752
+ if (death_month == 13)
753
+ return hebrew_to_rd
754
+ (year, hebrew_last_month_of_year(year), death_day);
755
+ if (death_day == 30 &&
756
+ death_month == 12 &&
757
+ !hebrew_leap_year(year))
758
+ return hebrew_to_rd(year, 11, 30);
759
+ return hebrew_to_rd(year, death_month, death_day);
760
+ }
761
+ #endif /* not PLUTO and not MODULE */
762
+
763
+ #ifndef SPINDEN_CORRELATION
764
+ #ifndef PAPER
765
+ /* GMT - Sept 6, 3114 BCE (Julian) */
766
+ #define mayan_days_before_absolute_zero 1137142
767
+ #else
768
+ /* GMT - Sept 8, 3114 BCE (Julian) */
769
+ #define mayan_days_before_absolute_zero 1137140
770
+ #endif
771
+ #else
772
+ /* SPINDEN - Nov 11, 3374 BCE (Julian) */
773
+ #define mayan_days_before_absolute_zero 1232041
774
+ #endif
775
+
776
+ int
777
+ mayan_long_count_to_rd(int baktun, int katun, int tun, int uinal, int kin)
778
+ {
779
+ return baktun * 144000
780
+ + katun * 7200
781
+ + tun * 360
782
+ + uinal * 20
783
+ + kin
784
+ - mayan_days_before_absolute_zero;
785
+ }
786
+
787
+ void
788
+ rd_to_mayan_long_count
789
+ (int date, int *rbaktun, int *rkatun, int *rtun, int *ruinal, int *rkin)
790
+ {
791
+ int long_count,
792
+ baktun, day_of_baktun,
793
+ katun, day_of_katun,
794
+ tun, day_of_tun,
795
+ uinal, kin;
796
+
797
+ long_count = date + mayan_days_before_absolute_zero;
798
+ baktun = quotient(long_count, 144000);
799
+ day_of_baktun = mod(long_count, 144000);
800
+ katun = quotient(day_of_baktun, 7200);
801
+ day_of_katun = mod(day_of_baktun, 7200);
802
+ tun = quotient(day_of_katun, 360);
803
+ day_of_tun = mod(day_of_katun, 360);
804
+ uinal = quotient(day_of_tun, 20);
805
+ kin = mod(day_of_tun, 20);
806
+ if (rbaktun)
807
+ *rbaktun = baktun;
808
+ if (rkatun)
809
+ *rkatun = katun;
810
+ if (rtun)
811
+ *rtun = tun;
812
+ if (ruinal)
813
+ *ruinal = uinal;
814
+ if (rkin)
815
+ *rkin = kin;
816
+ }
817
+
818
+ #define mayan_haab_at_epoch_day 8
819
+ #define mayan_haab_at_epoch_month 18
820
+
821
+ void
822
+ rd_to_mayan_haab(int date, int *rmonth, int *rday)
823
+ {
824
+ int long_count, day_of_haab, day, month;
825
+
826
+ long_count = date + mayan_days_before_absolute_zero;
827
+ day_of_haab = mod
828
+ (long_count
829
+ + mayan_haab_at_epoch_day
830
+ + (20 * (mayan_haab_at_epoch_month - 1)),
831
+ 365);
832
+ day = mod(day_of_haab, 20);
833
+ month = 1 + quotient(day_of_haab, 20);
834
+ if (rday)
835
+ *rday = day;
836
+ if (rmonth)
837
+ *rmonth = month;
838
+ }
839
+
840
+ int
841
+ mayan_haab_difference(int month1, int day1, int month2, int day2)
842
+ {
843
+ return mod((20 * (month2 - month1))
844
+ + (day2 - day1),
845
+ 365);
846
+ }
847
+
848
+ int
849
+ mayan_haab_on_or_before(int haab_month, int haab_day, int date)
850
+ {
851
+ int zero_day, zero_month;
852
+
853
+ rd_to_mayan_haab(0, &zero_month, &zero_day);
854
+ return date
855
+ - mod(date
856
+ - mayan_haab_difference
857
+ (zero_month, zero_day, haab_month, haab_day),
858
+ 365);
859
+ }
860
+
861
+ static int
862
+ adjusted_mod(int m, int n)
863
+ {
864
+ return 1 + mod(m - 1, n);
865
+ }
866
+
867
+ #define mayan_tzolkin_at_epoch_number 4
868
+ #define mayan_tzolkin_at_epoch_name 20
869
+
870
+ void
871
+ rd_to_mayan_tzolkin(int date, int *rname, int *rnumber)
872
+ {
873
+ int long_count, number, name;
874
+
875
+ long_count = date + mayan_days_before_absolute_zero;
876
+ number = adjusted_mod(long_count + mayan_tzolkin_at_epoch_number,
877
+ 13);
878
+ name = adjusted_mod(long_count + mayan_tzolkin_at_epoch_name,
879
+ 20);
880
+ if (rnumber)
881
+ *rnumber = number;
882
+ if (rname)
883
+ *rname = name;
884
+ }
885
+
886
+ int
887
+ mayan_tzolkin_difference(int name1, int number1, int name2, int number2)
888
+ {
889
+ int number_difference, name_difference;
890
+
891
+ number_difference = number2 - number1;
892
+ name_difference = name2 - name1;
893
+ return mod(number_difference
894
+ + (13 * mod(3 * (number_difference - name_difference),
895
+ 20)),
896
+ 260);
897
+ }
898
+
899
+ int
900
+ mayan_tzolkin_on_or_before(int name, int number, int date)
901
+ {
902
+ int zero_number, zero_name;
903
+
904
+ rd_to_mayan_tzolkin(0, &zero_name, &zero_number);
905
+ return date
906
+ - mod(date
907
+ - mayan_tzolkin_difference
908
+ (zero_name, zero_number, name, number),
909
+ 260);
910
+ }
911
+
912
+ int
913
+ mayan_haab_tzolkin_on_or_before
914
+ (int month, int day, int name, int number, int date)
915
+ {
916
+ int zero_day, zero_month, zero_number, zero_name,
917
+ haab_difference, tzolkin_difference, difference;
918
+
919
+ rd_to_mayan_haab(0, &zero_month, &zero_day);
920
+ haab_difference = mayan_haab_difference(zero_month, zero_day, month, day);
921
+ rd_to_mayan_tzolkin(0, &zero_name, &zero_number);
922
+ tzolkin_difference = mayan_tzolkin_difference(zero_name, zero_number, name, number);
923
+ difference = tzolkin_difference - haab_difference;
924
+ if (mod(difference, 5) == 0)
925
+ return date
926
+ - mod(date
927
+ - (haab_difference + (365 * difference)),
928
+ 18980);
929
+ return 0;
930
+ }
931
+
932
+ int
933
+ french_leap_year(int year)
934
+ {
935
+ return
936
+ (year == 3 ||
937
+ year == 7 ||
938
+ year == 11) ||
939
+ (year == 15 ||
940
+ year == 20) ||
941
+ #ifndef PAPER
942
+ (((year > 20) || (year < 0)) &&
943
+ #else
944
+ (year > 20 &&
945
+ #endif
946
+ (0 == mod(year, 4)) &&
947
+ !((mod(year, 400) == 100) ||
948
+ (mod(year, 400) == 200) ||
949
+ (mod(year, 400) == 300)) &&
950
+ !(0 == mod(year, 4000)));
951
+ }
952
+
953
+ int
954
+ french_last_day_of_month(int year, int month)
955
+ {
956
+ if (month < 13)
957
+ return 30;
958
+ else if (french_leap_year(year))
959
+ return 6;
960
+ return 5;
961
+ }
962
+
963
+ int
964
+ french_to_rd(int year, int month, int day)
965
+ {
966
+ return 654414
967
+ + (365 * (year - 1))
968
+ #ifndef PAPER
969
+ + (((year < 20)) && (year > 0) ?
970
+ #else
971
+ + ((year < 20) ?
972
+ #endif
973
+ (quotient(year, 4)) :
974
+ (quotient(year - 1, 4)
975
+ - quotient(year - 1, 100)
976
+ + quotient(year - 1, 400)
977
+ - quotient(year - 1, 4000)))
978
+ + (30 * (month - 1))
979
+ + day;
980
+ }
981
+
982
+ void
983
+ rd_to_french(int date, int *ryear, int *rmonth, int *rday)
984
+ {
985
+ int approx, year, month, day;
986
+ int sumres1, sumres2;
987
+
988
+ #ifdef PAPER
989
+ if (date < 654415) {
990
+ if (rmonth)
991
+ *rmonth = 0;
992
+ if (rday)
993
+ *rday = 0;
994
+ if (ryear)
995
+ *ryear = 0;
996
+ return;
997
+ }
998
+ #endif
999
+ #ifndef PAPER
1000
+ approx = approximate(date - 654414, 366);
1001
+ #else
1002
+ approx = quotient(date - 654414, 366);
1003
+ #endif
1004
+ {
1005
+ int temp, y;
1006
+ for (temp = 0, y = approx;
1007
+ (date >= french_to_rd(1 + y, 1, 1));
1008
+ temp = temp + 1, y++)
1009
+ ;
1010
+ sumres1 = temp;
1011
+ }
1012
+ year = approx
1013
+ + sumres1;
1014
+ {
1015
+ int temp, m;
1016
+ for (temp = 0, m = 1;
1017
+ (date > french_to_rd
1018
+ (year, m, french_last_day_of_month(year, m)));
1019
+ temp = temp + 1, m++)
1020
+ ;
1021
+ sumres2 = temp;
1022
+ }
1023
+ month = 1
1024
+ + sumres2;
1025
+ day = date - (french_to_rd(year, month, 1) - 1);
1026
+ if (rmonth)
1027
+ *rmonth = month;
1028
+ if (rday)
1029
+ *rday = day;
1030
+ if (ryear)
1031
+ *ryear = year;
1032
+ }
1033
+
1034
+ #undef quotient
1035
+ #define quotient(m, n) (floor(((double)(m)) / ((double)(n))))
1036
+ #undef mod
1037
+ #define mod(m, n) f_mod(m, n)
1038
+ static double
1039
+ f_mod(double m, double n)
1040
+ {
1041
+ double x;
1042
+
1043
+ x = fmod(m, n);
1044
+ if ((n < 0) ? (x > 0) : (x < 0))
1045
+ x += n;
1046
+ return x;
1047
+ }
1048
+ #undef oddp
1049
+ #define oddp(n) (((int)(n)) % 2)
1050
+
1051
+ #define solar_sidereal_year (365 + 279457.0 / 1080000)
1052
+ #define solar_month (solar_sidereal_year / 12)
1053
+ #define lunar_sidereal_month (27 + 4644439.0 / 14438334)
1054
+ #define lunar_synodic_month (29 + 7087771.0 / 13358334)
1055
+
1056
+ double
1057
+ solar_longitude(double days)
1058
+ {
1059
+ return mod(days / solar_sidereal_year, 1) * 360;
1060
+ }
1061
+
1062
+ double
1063
+ zodiac(double days)
1064
+ {
1065
+ return 1 + quotient(solar_longitude(days), 30);
1066
+ }
1067
+
1068
+ void
1069
+ rd_to_old_hindu_solar(int date, int *ryear, int *rmonth, int *rday)
1070
+ {
1071
+ double hdate;
1072
+ int year, month, day;
1073
+
1074
+ hdate = date + 1132959 + 1.0 / 4;
1075
+ year = quotient(hdate, solar_sidereal_year);
1076
+ month = zodiac(hdate);
1077
+ day = 1 + floor(mod(hdate, solar_month));
1078
+ if (rmonth)
1079
+ *rmonth = month;
1080
+ if (rday)
1081
+ *rday = day;
1082
+ if (ryear)
1083
+ *ryear = year;
1084
+ }
1085
+
1086
+ int
1087
+ old_hindu_solar_to_rd(int year, int month, int day)
1088
+ {
1089
+ return floor((year * solar_sidereal_year)
1090
+ + ((month - 1) * solar_month)
1091
+ + day - 1.0 / 4
1092
+ - 1132959);
1093
+ }
1094
+
1095
+ double
1096
+ lunar_longitude(double days)
1097
+ {
1098
+ return mod(days / lunar_sidereal_month, 1) * 360;
1099
+ }
1100
+
1101
+ double
1102
+ lunar_phase(double days)
1103
+ {
1104
+ return 1
1105
+ + quotient
1106
+ (mod(lunar_longitude(days) - solar_longitude(days),
1107
+ 360),
1108
+ 12);
1109
+ }
1110
+
1111
+ double
1112
+ new_moon(double days)
1113
+ {
1114
+ return days - mod(days, lunar_synodic_month);
1115
+ }
1116
+
1117
+ void
1118
+ rd_to_old_hindu_lunar
1119
+ (int date, int *ryear, int *rmonth, int *rleapmonth, int *rday)
1120
+ {
1121
+ double hdate, sunrise, last_new_moon, next_new_moon, next_month;
1122
+ int day, month, leapmonth, year;
1123
+
1124
+ hdate = date + 1132959;
1125
+ sunrise = hdate + 1.0 / 4;
1126
+ last_new_moon = new_moon(sunrise);
1127
+ next_new_moon = last_new_moon + lunar_synodic_month;
1128
+ day = lunar_phase(sunrise);
1129
+ month = adjusted_mod(1 + zodiac (last_new_moon), 12);
1130
+ leapmonth = zodiac(last_new_moon) == zodiac (next_new_moon);
1131
+ next_month = next_new_moon + (leapmonth ? lunar_synodic_month : 0);
1132
+ year = quotient(next_month, solar_sidereal_year);
1133
+ if (rmonth)
1134
+ *rmonth = month;
1135
+ if (rleapmonth)
1136
+ *rleapmonth = leapmonth;
1137
+ if (rday)
1138
+ *rday = day;
1139
+ if (ryear)
1140
+ *ryear = year;
1141
+ }
1142
+
1143
+ int
1144
+ old_hindu_lunar_precedes
1145
+ (int year1, int month1, int leap1, int day1,
1146
+ int year2, int month2, int leap2, int day2)
1147
+ {
1148
+ return ((year1 < year2) ||
1149
+ ((year1 == year2) &&
1150
+ ((month1 < month2) ||
1151
+ ((month1 == month2) &&
1152
+ ((leap1 && !leap2) ||
1153
+ ((leap1 == leap2) &&
1154
+ (day1 < day2)))))));
1155
+ }
1156
+
1157
+ int
1158
+ old_hindu_lunar_to_rd(int year, int month, int leapmonth, int day)
1159
+ {
1160
+ int years, months, approx, try,
1161
+ month1, leapmonth1, day1, year1;
1162
+ int sumres;
1163
+
1164
+ years = year;
1165
+ months = month - 2;
1166
+ approx = floor(years * solar_sidereal_year)
1167
+ + floor(months * lunar_synodic_month)
1168
+ - 1132959;
1169
+ {
1170
+ int temp, i;
1171
+ for (temp = 0, i = approx;
1172
+ (rd_to_old_hindu_lunar
1173
+ (i, &year1, &month1, &leapmonth1, &day1),
1174
+ old_hindu_lunar_precedes
1175
+ (year1, month1, leapmonth1, day1,
1176
+ year, month, leapmonth, day));
1177
+ temp = temp + 1, i++)
1178
+ ;
1179
+ sumres = temp;
1180
+ }
1181
+ try = approx
1182
+ + sumres;
1183
+ rd_to_old_hindu_lunar(try, &year, &month1, &leapmonth1, &day1);
1184
+ if (month1 == month &&
1185
+ leapmonth1 == leapmonth &&
1186
+ day1 == day &&
1187
+ year1 == year)
1188
+ return try;
1189
+ return 0;
1190
+ }
1191
+
1192
+
1193
+ /*
1194
+ Local Variables:
1195
+ c-basic-offset: 2
1196
+ End:
1197
+ */