ruby-calendrical 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+ */