ruby-calendrical 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,99 @@
1
+ /*
2
+ calendrical.h: Written by Tadayoshi Funaba 1997-2000,2014
3
+
4
+ This code is in the public domain, but any use of it
5
+ should publically acknowledge its source.
6
+
7
+ $Id: calendrical.h,v 1.6 2014-04-08 19:27:31+09 tadf Exp $
8
+ */
9
+
10
+ #if !defined(__GNUC__) \
11
+ || !( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6))
12
+ #undef __attribute__
13
+ #define __attribute__(x)
14
+ #endif
15
+
16
+ extern int gregorian_leap_year(int year) __attribute__ ((const));
17
+ extern int gregorian_last_day_of_month(int year, int month) __attribute__ ((const));
18
+ extern int gregorian_to_rd(int year, int month, int day) __attribute__ ((const));
19
+ extern void rd_to_gregorian(int date, int *ryear, int *rmonth, int *rday);
20
+ extern int kday_on_or_before(int date, int k) __attribute__ ((const));
21
+ extern int iso_to_rd(int year, int week, int day) __attribute__ ((const));
22
+ extern void rd_to_iso(int date, int *ryear, int *rweek, int *rday);
23
+ extern int julian_leap_year(int year) __attribute__ ((const));
24
+ extern int julian_last_day_of_month(int year, int month) __attribute__ ((const));
25
+ extern int julian_to_rd(int year, int month, int day) __attribute__ ((const));
26
+ extern void rd_to_julian(int date, int *ryear, int *rmonth, int *rday);
27
+ extern int islamic_leap_year(int year) __attribute__ ((const));
28
+ extern int islamic_last_day_of_month(int year, int month) __attribute__ ((const));
29
+ extern int islamic_to_rd(int year, int month, int day) __attribute__ ((const));
30
+ extern void rd_to_islamic(int date, int *ryear, int *rmonth, int *rday);
31
+ extern int hebrew_leap_year(int year) __attribute__ ((const));
32
+ extern int hebrew_last_month_of_year(int year) __attribute__ ((const));
33
+ extern int hebrew_last_day_of_month(int year, int month) __attribute__ ((const));
34
+ extern int hebrew_calendar_elapsed_days(int year) __attribute__ ((const));
35
+ extern int hebrew_days_in_year(int year) __attribute__ ((const));
36
+ extern int long_heshvan(int year) __attribute__ ((const));
37
+ extern int short_kislev(int year) __attribute__ ((const));
38
+ extern int hebrew_to_rd(int year, int month, int day) __attribute__ ((const));
39
+ extern void rd_to_hebrew(int date, int *ryear, int *rmonth, int *rday);
40
+ #if !defined(PLUTO) && !defined(MODULE)
41
+ extern int independence_day(int year) __attribute__ ((const));
42
+ #endif
43
+ #ifndef PLUTO
44
+ extern int nth_kday(int year, int month, int n, int k) __attribute__ ((const));
45
+ #endif
46
+ #if !defined(PLUTO) && !defined(MODULE)
47
+ extern int labor_day(int year) __attribute__ ((const));
48
+ extern int memorial_day(int year) __attribute__ ((const));
49
+ extern int daylight_savings_start(int year) __attribute__ ((const));
50
+ extern int daylight_savings_end(int year) __attribute__ ((const));
51
+ extern int christmas(int year) __attribute__ ((const));
52
+ extern int advent(int year) __attribute__ ((const));
53
+ extern int epiphany(int year) __attribute__ ((const));
54
+ extern int eastern_orthodox_christmas(int year) __attribute__ ((const));
55
+ #endif /* not PLUTO and not MODULE */
56
+ extern int nicaean_rule_easter(int year) __attribute__ ((const));
57
+ extern int easter(int year) __attribute__ ((const));
58
+ #if !defined(PLUTO) && !defined(MODULE)
59
+ extern int pentecost(int year) __attribute__ ((const));
60
+ extern void islamic_date(int year, int month, int day, int date[3]);
61
+ extern void mulad_al_nabi(int year, int date[3]);
62
+ extern int yom_kippur(int year) __attribute__ ((const));
63
+ extern int passover(int year) __attribute__ ((const));
64
+ extern int purim(int year) __attribute__ ((const));
65
+ extern int ta_anit_esther(int year) __attribute__ ((const));
66
+ extern int tisha_b_av(int year) __attribute__ ((const));
67
+ extern int hebrew_birthday(int birth_year, int birth_month, int birth_day, int year) __attribute__ ((const));
68
+ extern int yahrzeit(int death_year, int death_month, int death_day, int year) __attribute__ ((const));
69
+ #endif /* not PLUTO and not MODULE */
70
+ extern int mayan_long_count_to_rd(int baktun, int katun, int tun, int uinal, int kin) __attribute__ ((const));
71
+ extern void rd_to_mayan_long_count(int date, int *rbaktun, int *rkatun, int *rtun, int *ruinal, int *rkin);
72
+ extern void rd_to_mayan_haab(int date, int *rmonth, int *rday);
73
+ extern int mayan_haab_difference(int month1, int day1, int month2, int day2) __attribute__ ((const));
74
+ extern int mayan_haab_on_or_before(int haab_month, int haab_day, int date) __attribute__ ((const));
75
+ extern void rd_to_mayan_tzolkin(int date, int *rname, int *rnumber);
76
+ extern int mayan_tzolkin_difference(int name1, int number1, int name2, int number2) __attribute__ ((const));
77
+ extern int mayan_tzolkin_on_or_before(int name, int number, int date) __attribute__ ((const));
78
+ extern int mayan_haab_tzolkin_on_or_before(int month, int day, int name, int number, int date) __attribute__ ((const));
79
+ extern int french_leap_year(int year) __attribute__ ((const));
80
+ extern int french_last_day_of_month(int year, int month) __attribute__ ((const));
81
+ extern int french_to_rd(int year, int month, int day) __attribute__ ((const));
82
+ extern void rd_to_french(int date, int *ryear, int *rmonth, int *rday);
83
+ extern double solar_longitude(double days) __attribute__ ((const));
84
+ extern double zodiac(double days) __attribute__ ((const));
85
+ extern void rd_to_old_hindu_solar(int date, int *ryear, int *rmonth, int *rday);
86
+ extern int old_hindu_solar_to_rd(int year, int month, int day) __attribute__ ((const));
87
+ extern double lunar_longitude(double days) __attribute__ ((const));
88
+ extern double lunar_phase(double days) __attribute__ ((const));
89
+ extern double new_moon(double days) __attribute__ ((const));
90
+ extern void rd_to_old_hindu_lunar(int date, int *ryear, int *rmonth, int *rleapmonth, int *rday);
91
+ extern int old_hindu_lunar_precedes(int year1, int month1, int leap1, int day1, int year2, int month2, int leap2, int day2) __attribute__ ((const));
92
+ extern int old_hindu_lunar_to_rd(int year, int month, int leapmonth, int day) __attribute__ ((const));
93
+
94
+
95
+ /*
96
+ Local Variables:
97
+ c-basic-offset: 2
98
+ End:
99
+ */
@@ -0,0 +1,802 @@
1
+ /*
2
+ calendrical2.c (beta): Written by Tadayoshi Funaba 1997,1999-2002,2014
3
+
4
+ This code is in the public domain, but any use of it
5
+ should publically acknowledge its source.
6
+
7
+ $Id: calendrical2.c,v 1.10 2014-04-27 09:42:02+09 tadf Exp $
8
+ */
9
+
10
+ #define MODULE
11
+
12
+ #ifndef NULL
13
+ #define NULL 0
14
+ #endif
15
+
16
+ #include <stdlib.h>
17
+ #include <math.h>
18
+ #include "calendrical.h"
19
+ #include "calendrical2.h"
20
+
21
+ static div_t
22
+ divmod(int m, int n)
23
+ {
24
+ div_t d;
25
+
26
+ d = div(m, n);
27
+ if ((m < 0) != (n < 0) && d.rem != 0) {
28
+ d.quot -= 1;
29
+ d.rem += n;
30
+ }
31
+ return d;
32
+ }
33
+
34
+ #undef quotient
35
+ #define quotient(m, n) i_quotient(m, n)
36
+ static int
37
+ i_quotient(int m, int n)
38
+ {
39
+ return divmod(m, n).quot;
40
+ }
41
+ #undef mod
42
+ #define mod(m, n) i_mod(m, n)
43
+ static int
44
+ i_mod(int m, int n)
45
+ {
46
+ return divmod(m, n).rem;
47
+ }
48
+ #undef oddp
49
+ #define oddp(n) ((n) % 2)
50
+
51
+ static int
52
+ approximate(int x, int y)
53
+ {
54
+ return quotient(x, (x < 0) ? (y - 1) : y);
55
+ }
56
+
57
+ int
58
+ world_leap_year(int year)
59
+ {
60
+ return
61
+ mod(year, 4) == 0 &&
62
+ !(mod(year, 400) == 100 ||
63
+ mod(year, 400) == 200 ||
64
+ mod(year, 400) == 300);
65
+ }
66
+
67
+ int
68
+ world_last_day_of_month(int year, int month)
69
+ {
70
+ if (month == 6 && world_leap_year(year))
71
+ return 31;
72
+ switch (month) {
73
+ case 1: return 31;
74
+ case 2: return 30;
75
+ case 3: return 30;
76
+ case 4: return 31;
77
+ case 5: return 30;
78
+ case 6: return 30;
79
+ case 7: return 31;
80
+ case 8: return 30;
81
+ case 9: return 30;
82
+ case 10: return 31;
83
+ case 11: return 30;
84
+ case 12: return 31;
85
+ default: return 0;
86
+ }
87
+ }
88
+
89
+ int
90
+ world_to_rd(int year, int month, int day)
91
+ {
92
+ int sumres;
93
+
94
+ {
95
+ int temp, m;
96
+ for (temp = 0, m = 1;
97
+ (m < month);
98
+ temp = temp + world_last_day_of_month(year, m), m++)
99
+ ;
100
+ sumres = temp;
101
+ }
102
+ return day
103
+ + sumres
104
+ + (365 * (year - 1))
105
+ + quotient(year - 1, 4)
106
+ - quotient(year - 1, 100)
107
+ + quotient(year - 1, 400);
108
+ }
109
+
110
+ void
111
+ rd_to_world(int date, int *ryear, int *rmonth, int *rday)
112
+ {
113
+ int approx, month, day, year;
114
+ int sumres1, sumres2;
115
+
116
+ approx = approximate(date, 366);
117
+ {
118
+ int temp, y;
119
+ for (temp = 0, y = approx;
120
+ (date >= world_to_rd(1 + y, 1, 1));
121
+ temp = temp + 1, y++)
122
+ ;
123
+ sumres1 = temp;
124
+ }
125
+ year = approx
126
+ + sumres1;
127
+ {
128
+ int temp, m;
129
+ for (temp = 0, m = 1;
130
+ (date > world_to_rd
131
+ (year, m, world_last_day_of_month(year, m)));
132
+ temp = temp + 1, m++)
133
+ ;
134
+ sumres2 = temp;
135
+ }
136
+ month = 1
137
+ + sumres2;
138
+ day = date
139
+ - (world_to_rd(year, month, 1) - 1);
140
+ if (rmonth)
141
+ *rmonth = month;
142
+ if (rday)
143
+ *rday = day;
144
+ if (ryear)
145
+ *ryear = year;
146
+ }
147
+
148
+ int
149
+ rd_to_world_day_of_week(int date)
150
+ {
151
+ int month, day, year;
152
+
153
+ rd_to_world(date, &year, &month, &day);
154
+ if (month == 12 && day == 31)
155
+ return 7;
156
+ else if (month == 6 && day == 31)
157
+ return 8;
158
+ else
159
+ switch ((month - 1) % 3) {
160
+ case 0: return (day - 1) % 7;
161
+ case 1: return (day + 2) % 7;
162
+ case 2: return (day + 4) % 7;
163
+ }
164
+ /*NOTREACHED*/
165
+ return -1;
166
+ }
167
+
168
+ int
169
+ coptic_leap_year(int year)
170
+ {
171
+ return mod(year, 4) == 3;
172
+ }
173
+
174
+ int
175
+ coptic_last_day_of_month(int year, int month)
176
+ {
177
+ if (month == 13 && coptic_leap_year(year))
178
+ return 6;
179
+ switch (month) {
180
+ case 1: return 30;
181
+ case 2: return 30;
182
+ case 3: return 30;
183
+ case 4: return 30;
184
+ case 5: return 30;
185
+ case 6: return 30;
186
+ case 7: return 30;
187
+ case 8: return 30;
188
+ case 9: return 30;
189
+ case 10: return 30;
190
+ case 11: return 30;
191
+ case 12: return 30;
192
+ case 13: return 5;
193
+ default: return 0;
194
+ }
195
+ }
196
+
197
+ #define EPOCH_COPTIC 103605
198
+ #define BEFORE_COPTIC (103605 - 1)
199
+
200
+ int
201
+ coptic_to_rd(int year, int month, int day)
202
+ {
203
+ int sumres;
204
+
205
+ {
206
+ int temp, m;
207
+ for (temp = 0, m = 1;
208
+ (m < month);
209
+ temp = temp + coptic_last_day_of_month(year, m), m++)
210
+ ;
211
+ sumres = temp;
212
+ }
213
+ return day
214
+ + sumres
215
+ + (365 * (year - 1))
216
+ + quotient(year, 4)
217
+ + BEFORE_COPTIC;
218
+ }
219
+
220
+ void
221
+ rd_to_coptic(int date, int *ryear, int *rmonth, int *rday)
222
+ {
223
+ int approx, month, day, year;
224
+ int sumres1, sumres2;
225
+
226
+ approx = approximate(date - BEFORE_COPTIC, 366);
227
+ {
228
+ int temp, y;
229
+ for (temp = 0, y = approx;
230
+ (date >= coptic_to_rd(1 + y, 1, 1));
231
+ temp = temp + 1, y++)
232
+ ;
233
+ sumres1 = temp;
234
+ }
235
+ year = approx
236
+ + sumres1;
237
+ {
238
+ int temp, m;
239
+ for (temp = 0, m = 1;
240
+ (date > coptic_to_rd
241
+ (year, m, coptic_last_day_of_month(year, m)));
242
+ temp = temp + 1, m++)
243
+ ;
244
+ sumres2 = temp;
245
+ }
246
+ month = 1
247
+ + sumres2;
248
+ day = date - (coptic_to_rd(year, month, 1) - 1);
249
+ if (rmonth)
250
+ *rmonth = month;
251
+ if (rday)
252
+ *rday = day;
253
+ if (ryear)
254
+ *ryear = year;
255
+ }
256
+
257
+ int
258
+ ethiopian_leap_year(int year)
259
+ {
260
+ return coptic_leap_year(year);
261
+ }
262
+
263
+ int
264
+ ethiopian_last_day_of_month(int year, int month)
265
+ {
266
+ return coptic_last_day_of_month(year, month);
267
+ }
268
+
269
+ #define EPOCH_ETHIOPIAN 2796
270
+ #define BEFORE_ETHIOPIAN (2796 - 1)
271
+
272
+ int
273
+ ethiopian_to_rd(int year, int month, int day)
274
+ {
275
+ return
276
+ coptic_to_rd(year, month, day) - (EPOCH_COPTIC - EPOCH_ETHIOPIAN);
277
+ }
278
+
279
+ void
280
+ rd_to_ethiopian(int date, int *ryear, int *rmonth, int *rday)
281
+ {
282
+ rd_to_coptic
283
+ (date + (EPOCH_COPTIC - EPOCH_ETHIOPIAN),
284
+ ryear, rmonth, rday);
285
+ }
286
+
287
+ int
288
+ jalali_leap_year(int year)
289
+ {
290
+ return mod(29 + (8 * year), 33) < 8;
291
+ }
292
+
293
+ int
294
+ jalali_last_day_of_month(int year, int month)
295
+ {
296
+ if (month == 12 && jalali_leap_year(year))
297
+ return 30;
298
+ switch (month) {
299
+ case 1: return 31;
300
+ case 2: return 31;
301
+ case 3: return 31;
302
+ case 4: return 31;
303
+ case 5: return 31;
304
+ case 6: return 31;
305
+ case 7: return 30;
306
+ case 8: return 30;
307
+ case 9: return 30;
308
+ case 10: return 30;
309
+ case 11: return 30;
310
+ case 12: return 29;
311
+ default: return 0;
312
+ }
313
+ }
314
+
315
+ #define BEFORE_JALALI (226895 - 1)
316
+
317
+ int
318
+ jalali_to_rd(int year, int month, int day)
319
+ {
320
+ int sumres;
321
+
322
+ {
323
+ int temp, m;
324
+ for (temp = 0, m = 1;
325
+ (m < month);
326
+ temp = temp + jalali_last_day_of_month(year, m), m++)
327
+ ;
328
+ sumres = temp;
329
+ }
330
+ return day
331
+ + sumres
332
+ + (365 * (year - 1))
333
+ + quotient(21 + (8 * year), 33)
334
+ + BEFORE_JALALI;
335
+ }
336
+
337
+ void
338
+ rd_to_jalali(int date, int *ryear, int *rmonth, int *rday)
339
+ {
340
+ int approx, month, day, year;
341
+ int sumres1, sumres2;
342
+
343
+ approx = approximate(date - BEFORE_JALALI, 366);
344
+ {
345
+ int temp, y;
346
+ for (temp = 0, y = approx;
347
+ (date >= jalali_to_rd(1 + y, 1, 1));
348
+ temp = temp + 1, y++)
349
+ ;
350
+ sumres1 = temp;
351
+ }
352
+ year = approx
353
+ + sumres1;
354
+ {
355
+ int temp, m;
356
+ for (temp = 0, m = 1;
357
+ (date > jalali_to_rd
358
+ (year, m, jalali_last_day_of_month(year, m)));
359
+ temp = temp + 1, m++)
360
+ ;
361
+ sumres2 = temp;
362
+ }
363
+ month = 1
364
+ + sumres2;
365
+ day = date - (jalali_to_rd(year, month, 1) - 1);
366
+ if (rmonth)
367
+ *rmonth = month;
368
+ if (rday)
369
+ *rday = day;
370
+ if (ryear)
371
+ *ryear = year;
372
+ }
373
+
374
+ int
375
+ bahai_leap_year(int year)
376
+ {
377
+ return gregorian_leap_year(year + 1844);
378
+ }
379
+
380
+ int
381
+ bahai_last_day_of_month(int year, int month)
382
+ {
383
+ if (month == 19) {
384
+ if (bahai_leap_year(year))
385
+ return 5;
386
+ else
387
+ return 4;
388
+ }
389
+ return 19;
390
+ }
391
+
392
+ #define BEFORE_BAHAI (673222 - 1)
393
+
394
+ int
395
+ bahai_to_rd(int year, int month, int day)
396
+ {
397
+ int sumres;
398
+
399
+ {
400
+ int temp, m;
401
+ for (temp = 0, m = 1;
402
+ (m < month);
403
+ temp = temp + bahai_last_day_of_month(year, m), m++)
404
+ ;
405
+ sumres = temp;
406
+ }
407
+ return day
408
+ + sumres
409
+ + gregorian_to_rd(year + 1843, 3, 20);
410
+ }
411
+
412
+ void
413
+ rd_to_bahai(int date, int *ryear, int *rmonth, int *rday)
414
+ {
415
+ int approx, month, day, year;
416
+ int sumres1, sumres2;
417
+
418
+ approx = approximate(date - BEFORE_BAHAI, 366);
419
+ {
420
+ int temp, y;
421
+ for (temp = 0, y = approx;
422
+ (date >= bahai_to_rd(1 + y, 1, 1));
423
+ temp = temp + 1, y++)
424
+ ;
425
+ sumres1 = temp;
426
+ }
427
+ year = approx
428
+ + sumres1;
429
+ {
430
+ int temp, m;
431
+ for (temp = 0, m = 1;
432
+ (date > bahai_to_rd
433
+ (year, m, bahai_last_day_of_month(year, m)));
434
+ temp = temp + 1, m++)
435
+ ;
436
+ sumres2 = temp;
437
+ }
438
+ month = 1
439
+ + sumres2;
440
+ day = date - (bahai_to_rd(year, month, 1) - 1);
441
+ if (rmonth)
442
+ *rmonth = month;
443
+ if (rday)
444
+ *rday = day;
445
+ if (ryear)
446
+ *ryear = year;
447
+ }
448
+
449
+ void
450
+ bahai_year_to_vahid(int year, int *rkull, int *rvahid, int *ryear)
451
+ {
452
+ int r;
453
+ *rkull = quotient(year - 1, 361) + 1;
454
+ r = mod(year - 1, 361);
455
+ *rvahid = quotient(r, 19) + 1;
456
+ *ryear = mod(r, 19) + 1;
457
+ }
458
+
459
+ int
460
+ bahai_vahid_to_year(int kull, int vahid, int year)
461
+ {
462
+ return (kull - 1) * 361 + (vahid - 1) * 19 + year;
463
+ }
464
+
465
+ int
466
+ indian_national_leap_year(int year)
467
+ {
468
+ return gregorian_leap_year(year + 78);
469
+ }
470
+
471
+ int
472
+ indian_national_last_day_of_month(int year, int month)
473
+ {
474
+ if (month == 1 && indian_national_leap_year(year))
475
+ return 31;
476
+ switch (month) {
477
+ case 1: return 30;
478
+ case 2: return 31;
479
+ case 3: return 31;
480
+ case 4: return 31;
481
+ case 5: return 31;
482
+ case 6: return 31;
483
+ case 7: return 30;
484
+ case 8: return 30;
485
+ case 9: return 30;
486
+ case 10: return 30;
487
+ case 11: return 30;
488
+ case 12: return 30;
489
+ default: return 0;
490
+ }
491
+ }
492
+
493
+ int
494
+ indian_national_to_rd(int year, int month, int day)
495
+ {
496
+ int sumres;
497
+
498
+ {
499
+ int temp, m;
500
+ for (temp = 0, m = 1;
501
+ (m < month);
502
+ temp = temp + indian_national_last_day_of_month(year, m), m++)
503
+ ;
504
+ sumres = temp;
505
+ }
506
+ return day
507
+ + sumres
508
+ + gregorian_to_rd(year + 78, 1, 1) + 79;
509
+ }
510
+
511
+ #define BEFORE_INDIAN_NATIONAL (28205 - 1)
512
+
513
+ void
514
+ rd_to_indian_national(int date, int *ryear, int *rmonth, int *rday)
515
+ {
516
+ int approx, month, day, year;
517
+ int sumres1, sumres2;
518
+
519
+ approx = approximate(date - BEFORE_INDIAN_NATIONAL, 366);
520
+ {
521
+ int temp, y;
522
+ for (temp = -1, y = approx;
523
+ (date >= indian_national_to_rd(y, 1, 1));
524
+ temp = temp + 1, y++)
525
+ ;
526
+ sumres1 = temp;
527
+ }
528
+ year = approx
529
+ + sumres1;
530
+ {
531
+ int temp, m;
532
+ for (temp = 0, m = 1;
533
+ (date > indian_national_to_rd
534
+ (year, m, indian_national_last_day_of_month(year, m)));
535
+ temp = temp + 1, m++)
536
+ ;
537
+ sumres2 = temp;
538
+ }
539
+ month = 1
540
+ + sumres2;
541
+ day = date - (indian_national_to_rd(year, month, 1) - 1);
542
+ if (rmonth)
543
+ *rmonth = month;
544
+ if (rday)
545
+ *rday = day;
546
+ if (ryear)
547
+ *ryear = year;
548
+ }
549
+
550
+ int
551
+ bengali_leap_year(int year)
552
+ {
553
+ return gregorian_leap_year(year + 594);
554
+ }
555
+
556
+ int
557
+ bengali_last_day_of_month(int year, int month)
558
+ {
559
+ if (month == 11 && bengali_leap_year(year))
560
+ return 31;
561
+ switch (month) {
562
+ case 1: return 31;
563
+ case 2: return 31;
564
+ case 3: return 31;
565
+ case 4: return 31;
566
+ case 5: return 31;
567
+ case 6: return 30;
568
+ case 7: return 30;
569
+ case 8: return 30;
570
+ case 9: return 30;
571
+ case 10: return 30;
572
+ case 11: return 30;
573
+ case 12: return 30;
574
+ default: return 0;
575
+ }
576
+ }
577
+
578
+ int
579
+ bengali_to_rd(int year, int month, int day)
580
+ {
581
+ int sumres;
582
+
583
+ {
584
+ int temp, m;
585
+ for (temp = 0, m = 1;
586
+ (m < month);
587
+ temp = temp + bengali_last_day_of_month(year, m), m++)
588
+ ;
589
+ sumres = temp;
590
+ }
591
+ return day
592
+ + sumres
593
+ + gregorian_to_rd(year + 593, 4, 13);
594
+ }
595
+
596
+ #define BEFORE_BENGALI (216693 - 1)
597
+
598
+ void
599
+ rd_to_bengali(int date, int *ryear, int *rmonth, int *rday)
600
+ {
601
+ int approx, month, day, year;
602
+ int sumres1, sumres2;
603
+
604
+ approx = approximate(date - BEFORE_BENGALI, 366);
605
+ {
606
+ int temp, y;
607
+ for (temp = 0, y = approx;
608
+ (date >= bengali_to_rd(1 + y, 1, 1));
609
+ temp = temp + 1, y++)
610
+ ;
611
+ sumres1 = temp;
612
+ }
613
+ year = approx
614
+ + sumres1;
615
+ {
616
+ int temp, m;
617
+ for (temp = 0, m = 1;
618
+ (date > bengali_to_rd
619
+ (year, m, bengali_last_day_of_month(year, m)));
620
+ temp = temp + 1, m++)
621
+ ;
622
+ sumres2 = temp;
623
+ }
624
+ month = 1
625
+ + sumres2;
626
+ day = date - (bengali_to_rd(year, month, 1) - 1);
627
+ if (rmonth)
628
+ *rmonth = month;
629
+ if (rday)
630
+ *rday = day;
631
+ if (ryear)
632
+ *ryear = year;
633
+ }
634
+
635
+ int
636
+ nanakshahi_leap_year(int year)
637
+ {
638
+ return gregorian_leap_year(year + 1469);
639
+ }
640
+
641
+ int
642
+ nanakshahi_last_day_of_month(int year, int month)
643
+ {
644
+ if (month == 12 && nanakshahi_leap_year(year))
645
+ return 31;
646
+ switch (month) {
647
+ case 1: return 31;
648
+ case 2: return 31;
649
+ case 3: return 31;
650
+ case 4: return 31;
651
+ case 5: return 31;
652
+ case 6: return 30;
653
+ case 7: return 30;
654
+ case 8: return 30;
655
+ case 9: return 30;
656
+ case 10: return 30;
657
+ case 11: return 30;
658
+ case 12: return 30;
659
+ default: return 0;
660
+ }
661
+ }
662
+
663
+ int
664
+ nanakshahi_to_rd(int year, int month, int day)
665
+ {
666
+ int sumres;
667
+
668
+ {
669
+ int temp, m;
670
+ for (temp = 0, m = 1;
671
+ (m < month);
672
+ temp = temp + nanakshahi_last_day_of_month(year, m), m++)
673
+ ;
674
+ sumres = temp;
675
+ }
676
+ return day
677
+ + sumres
678
+ + gregorian_to_rd(year + 1468, 3, 13);
679
+ }
680
+
681
+ #define BEFORE_NANAKSHAHI (536258 - 1)
682
+
683
+ void
684
+ rd_to_nanakshahi(int date, int *ryear, int *rmonth, int *rday)
685
+ {
686
+ int approx, month, day, year;
687
+ int sumres1, sumres2;
688
+
689
+ approx = approximate(date - BEFORE_NANAKSHAHI, 366);
690
+ {
691
+ int temp, y;
692
+ for (temp = 0, y = approx;
693
+ (date >= nanakshahi_to_rd(1 + y, 1, 1));
694
+ temp = temp + 1, y++)
695
+ ;
696
+ sumres1 = temp;
697
+ }
698
+ year = approx
699
+ + sumres1;
700
+ {
701
+ int temp, m;
702
+ for (temp = 0, m = 1;
703
+ (date > nanakshahi_to_rd
704
+ (year, m, nanakshahi_last_day_of_month(year, m)));
705
+ temp = temp + 1, m++)
706
+ ;
707
+ sumres2 = temp;
708
+ }
709
+ month = 1
710
+ + sumres2;
711
+ day = date - (nanakshahi_to_rd(year, month, 1) - 1);
712
+ if (rmonth)
713
+ *rmonth = month;
714
+ if (rday)
715
+ *rday = day;
716
+ if (ryear)
717
+ *ryear = year;
718
+ }
719
+
720
+ #ifndef PLUTO
721
+ int
722
+ ordinal_to_rd(int year, int day)
723
+ {
724
+ return gregorian_to_rd(year, 1, 1) + day - 1;
725
+ }
726
+
727
+ void
728
+ rd_to_ordinal(int date, int *ryear, int *rday)
729
+ {
730
+ int month, day, year, date2;
731
+
732
+ rd_to_gregorian(date, &year, &month, &day);
733
+ date2 = gregorian_to_rd(year, 1, 1);
734
+ if (rday)
735
+ *rday = date - date2 + 1;
736
+ if (ryear)
737
+ *ryear = year;
738
+ }
739
+ #endif
740
+
741
+ int
742
+ jd_to_rd(int date) /* chronological */
743
+ {
744
+ return date - 1721425;
745
+ }
746
+
747
+ int
748
+ rd_to_jd(int date) /* chronological */
749
+ {
750
+ return date + 1721425;
751
+ }
752
+
753
+ #ifndef PLUTO
754
+ int
755
+ mjd_to_rd(int date) /* chronological */
756
+ {
757
+ return date + 678576;
758
+ }
759
+
760
+ int
761
+ rd_to_mjd(int date) /* chronological */
762
+ {
763
+ return date - 678576;
764
+ }
765
+
766
+ int
767
+ mjd_to_jd(int date) /* chronological */
768
+ {
769
+ return date + 2400001;
770
+ }
771
+
772
+ int
773
+ jd_to_mjd(int date) /* chronological */
774
+ {
775
+ return date - 2400001;
776
+ }
777
+
778
+ int
779
+ ld_to_rd(int date)
780
+ {
781
+ return date + 577735;
782
+ }
783
+
784
+ int
785
+ rd_to_ld(int date)
786
+ {
787
+ return date - 577735;
788
+ }
789
+
790
+ int
791
+ rd_to_day_of_week(int date)
792
+ {
793
+ return mod(date, 7);
794
+ }
795
+ #endif /* not PLUTO */
796
+
797
+
798
+ /*
799
+ Local Variables:
800
+ c-basic-offset: 2
801
+ End:
802
+ */