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.
@@ -0,0 +1,72 @@
1
+ /*
2
+ calendrical2.h (beta): Written by Tadayoshi Funaba 1997,1999,2000,2002,2007,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.h,v 1.8 2014-04-27 09:42:02+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 world_leap_year(int year) __attribute__ ((const));
17
+ extern int world_last_day_of_month(int year, int month) __attribute__ ((const));
18
+ extern int world_to_rd(int year, int month, int day) __attribute__ ((const));
19
+ extern void rd_to_world(int date, int *ryear, int *rmonth, int *rday);
20
+ extern int rd_to_world_day_of_week(int date) __attribute__ ((const));
21
+ extern int coptic_leap_year(int year) __attribute__ ((const));
22
+ extern int coptic_last_day_of_month(int year, int month) __attribute__ ((const));
23
+ extern int coptic_to_rd(int year, int month, int day) __attribute__ ((const));
24
+ extern void rd_to_coptic(int date, int *ryear, int *rmonth, int *rday);
25
+ extern int ethiopian_leap_year(int year) __attribute__ ((const));
26
+ extern int ethiopian_last_day_of_month(int year, int month) __attribute__ ((const));
27
+ extern int ethiopian_to_rd(int year, int month, int day) __attribute__ ((const));
28
+ extern void rd_to_ethiopian(int date, int *ryear, int *rmonth, int *rday);
29
+ extern int jalali_leap_year(int year) __attribute__ ((const));
30
+ extern int jalali_last_day_of_month(int year, int month) __attribute__ ((const));
31
+ extern int jalali_to_rd(int year, int month, int day) __attribute__ ((const));
32
+ extern void rd_to_jalali(int date, int *ryear, int *rmonth, int *rday);
33
+ extern int bahai_leap_year(int year) __attribute__ ((const));
34
+ extern int bahai_last_day_of_month(int year, int month) __attribute__ ((const));
35
+ extern int bahai_to_rd(int year, int month, int day) __attribute__ ((const));
36
+ extern void rd_to_bahai(int date, int *ryear, int *rmonth, int *rday);
37
+ extern void bahai_year_to_vahid(int year, int *rkull, int *rvahid, int *ryear);
38
+ extern int bahai_vahid_to_year(int kull, int vahid, int year) __attribute__ ((const));
39
+ extern int indian_national_leap_year(int year) __attribute__ ((const));
40
+ extern int indian_national_last_day_of_month(int year, int month) __attribute__ ((const));
41
+ extern int indian_national_to_rd(int year, int month, int day) __attribute__ ((const));
42
+ extern void rd_to_indian_national(int date, int *ryear, int *rmonth, int *rday);
43
+ extern int bengali_leap_year(int year) __attribute__ ((const));
44
+ extern int bengali_last_day_of_month(int year, int month) __attribute__ ((const));
45
+ extern int bengali_to_rd(int year, int month, int day) __attribute__ ((const));
46
+ extern void rd_to_bengali(int date, int *ryear, int *rmonth, int *rday);
47
+ extern int nanakshahi_leap_year(int year) __attribute__ ((const));
48
+ extern int nanakshahi_last_day_of_month(int year, int month) __attribute__ ((const));
49
+ extern int nanakshahi_to_rd(int year, int month, int day) __attribute__ ((const));
50
+ extern void rd_to_nanakshahi(int date, int *ryear, int *rmonth, int *rday);
51
+ #ifndef PLUTO
52
+ extern int ordinal_to_rd(int year, int day) __attribute__ ((const));
53
+ extern void rd_to_ordinal(int date, int *ryear, int *rday);
54
+ #endif
55
+ extern int jd_to_rd(int date) __attribute__ ((const));
56
+ extern int rd_to_jd(int date) __attribute__ ((const));
57
+ #ifndef PLUTO
58
+ extern int mjd_to_rd(int date) __attribute__ ((const));
59
+ extern int rd_to_mjd(int date) __attribute__ ((const));
60
+ extern int jd_to_mjd(int date) __attribute__ ((const));
61
+ extern int mjd_to_jd(int date) __attribute__ ((const));
62
+ extern int ld_to_rd(int date) __attribute__ ((const));
63
+ extern int rd_to_ld(int date) __attribute__ ((const));
64
+ extern int rd_to_day_of_week(int date) __attribute__ ((const));
65
+ #endif /* not PLUTO */
66
+
67
+
68
+ /*
69
+ Local Variables:
70
+ c-basic-offset: 2
71
+ End:
72
+ */
@@ -0,0 +1,1796 @@
1
+ /*
2
+ calendricalmodule.c: Copyright (C) 1997-2002,2007,2014 Tadayoshi Funaba All rights reserved
3
+ $Id: calendricalmodule.c,v 1.16 2014-04-27 09:42:19+09 tadf Exp $
4
+ */
5
+
6
+ #include "ruby.h"
7
+ #ifdef HAVE_RUBY_ENCODING_H
8
+ #include "ruby/encoding.h"
9
+ #endif
10
+ #include "calendrical.h"
11
+ #include "calendrical2.h"
12
+ #include "qref.h"
13
+
14
+ #define INT2BOOL(x) ((x) ? Qtrue : Qfalse)
15
+ #define BOOL2INT(x) (RTEST(x) ? 1 : 0)
16
+
17
+ #define CHECK_RANGE(v, m) \
18
+ { \
19
+ if ((v) < (m)) \
20
+ rb_raise(rb_eArgError, "out of range"); \
21
+ }
22
+
23
+ #define CHECK_DOMAIN(v, m) \
24
+ { \
25
+ if ((v) < (m)) \
26
+ rb_raise(rb_eArgError, "out of domain");\
27
+ }
28
+
29
+ #define CHECK_DOMAIN2(v, m, n) \
30
+ { \
31
+ if ((v) < (m) || (v) > (n)) \
32
+ rb_raise(rb_eArgError, "out of domain");\
33
+ }
34
+
35
+ static VALUE
36
+ calendrical_gregorian_leap_year(VALUE obj, VALUE y)
37
+ {
38
+ int iy, l;
39
+
40
+ iy = NUM2INT(y);
41
+ l = gregorian_leap_year(iy);
42
+ return INT2BOOL(l);
43
+ }
44
+
45
+ static VALUE
46
+ calendrical_gregorian_last_day_of_month(VALUE obj, VALUE y, VALUE m)
47
+ {
48
+ int iy, im, md;
49
+
50
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
51
+ iy = NUM2INT(y);
52
+ md = gregorian_last_day_of_month(iy, im);
53
+ return INT2NUM(md);
54
+ }
55
+
56
+ static VALUE
57
+ calendrical_gregorian_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
58
+ {
59
+ int iy, im, imd, a, iy2, im2, imd2;
60
+
61
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
62
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 31);
63
+ iy = NUM2INT(y);
64
+ a = gregorian_to_rd(iy, im, imd);
65
+ rd_to_gregorian(a, &iy2, &im2, &imd2);
66
+ if (im != im2 || imd != imd2 || iy != iy2)
67
+ rb_raise(rb_eArgError, "invalid date");
68
+ return INT2NUM(a);
69
+ }
70
+
71
+ static VALUE
72
+ calendrical_rd_to_gregorian(VALUE obj, VALUE a)
73
+ {
74
+ int ia, y, m, md;
75
+
76
+ ia = NUM2INT(a);
77
+ rd_to_gregorian(ia, &y, &m, &md);
78
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
79
+ }
80
+
81
+ static VALUE
82
+ calendrical_kday_on_or_before(VALUE obj, VALUE a, VALUE k)
83
+ {
84
+ int ia, ik, b;
85
+
86
+ ia = NUM2INT(a);
87
+ ik = NUM2INT(k); CHECK_DOMAIN2(ik, 0, 6);
88
+ b = kday_on_or_before(ia, NUM2INT(k));
89
+ return INT2NUM(b);
90
+ }
91
+
92
+ static VALUE
93
+ calendrical_iso_to_rd(VALUE obj, VALUE y, VALUE w, VALUE wd)
94
+ {
95
+ int iy, iw, iwd, a, iy2, iw2, iwd2;
96
+
97
+ iw = NUM2INT(w); CHECK_DOMAIN2(iw, 1, 53);
98
+ iwd = NUM2INT(wd); CHECK_DOMAIN2(iwd, 1, 7);
99
+ iy = NUM2INT(y);
100
+ a = iso_to_rd(iy, iw, iwd);
101
+ rd_to_iso(a, &iy2, &iw2, &iwd2);
102
+ if (iw != iw2 || iwd != iwd2 || iy != iy2)
103
+ rb_raise(rb_eArgError, "invalid date");
104
+ return INT2NUM(a);
105
+ }
106
+
107
+ static VALUE
108
+ calendrical_rd_to_iso(VALUE obj, VALUE a)
109
+ {
110
+ int ia, y, w, wd;
111
+
112
+ ia = NUM2INT(a);
113
+ rd_to_iso(ia, &y, &w, &wd);
114
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(w), INT2NUM(wd));
115
+ }
116
+
117
+ static VALUE
118
+ calendrical_julian_leap_year(VALUE obj, VALUE y)
119
+ {
120
+ int iy, l;
121
+
122
+ iy = NUM2INT(y);
123
+ l = julian_leap_year(iy);
124
+ return INT2BOOL(l);
125
+ }
126
+
127
+ static VALUE
128
+ calendrical_julian_last_day_of_month(VALUE obj, VALUE y, VALUE m)
129
+ {
130
+ int iy, im, md;
131
+
132
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
133
+ iy = NUM2INT(y);
134
+ md = julian_last_day_of_month(iy, im);
135
+ return INT2NUM(md);
136
+ }
137
+
138
+ static VALUE
139
+ calendrical_julian_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
140
+ {
141
+ int iy, im, imd, a, iy2, im2, imd2;
142
+
143
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
144
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 31);
145
+ iy = NUM2INT(y);
146
+ a = julian_to_rd(iy, im, imd);
147
+ rd_to_julian(a, &iy2, &im2, &imd2);
148
+ if (im != im2 || imd != imd2 || iy != iy2)
149
+ rb_raise(rb_eArgError, "invalid date");
150
+ return INT2NUM(a);
151
+ }
152
+
153
+ static VALUE
154
+ calendrical_rd_to_julian(VALUE obj, VALUE a)
155
+ {
156
+ int ia, y, m, md;
157
+
158
+ ia = NUM2INT(a);
159
+ rd_to_julian(ia, &y, &m, &md);
160
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
161
+ }
162
+
163
+ static VALUE
164
+ calendrical_islamic_leap_year(VALUE obj, VALUE y)
165
+ {
166
+ int iy, l;
167
+
168
+ iy = NUM2INT(y);
169
+ l = islamic_leap_year(iy);
170
+ return INT2BOOL(l);
171
+ }
172
+
173
+ static VALUE
174
+ calendrical_islamic_last_day_of_month(VALUE obj, VALUE y, VALUE m)
175
+ {
176
+ int iy, im, md;
177
+
178
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
179
+ iy = NUM2INT(y);
180
+ md = islamic_last_day_of_month(iy, im);
181
+ return INT2NUM(md);
182
+ }
183
+
184
+ static VALUE
185
+ calendrical_islamic_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
186
+ {
187
+ int iy, im, imd, a, iy2, im2, imd2;
188
+
189
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
190
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 30);
191
+ iy = NUM2INT(y);
192
+ a = islamic_to_rd(iy, im, imd);
193
+ rd_to_islamic(a, &iy2, &im2, &imd2);
194
+ if (im != im2 || imd != imd2 || iy != iy2)
195
+ rb_raise(rb_eArgError, "invalid date");
196
+ return INT2NUM(a);
197
+ }
198
+
199
+ static VALUE
200
+ calendrical_rd_to_islamic(VALUE obj, VALUE a)
201
+ {
202
+ int ia, y, m, md;
203
+
204
+ ia = NUM2INT(a);
205
+ rd_to_islamic(ia, &y, &m, &md);
206
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
207
+ }
208
+
209
+ static VALUE
210
+ calendrical_hebrew_leap_year(VALUE obj, VALUE y)
211
+ {
212
+ int iy, l;
213
+
214
+ iy = NUM2INT(y);
215
+ l = hebrew_leap_year(iy);
216
+ return INT2BOOL(l);
217
+ }
218
+
219
+ static VALUE
220
+ calendrical_hebrew_last_month_of_year(VALUE obj, VALUE y)
221
+ {
222
+ int iy, m;
223
+
224
+ iy = NUM2INT(y);
225
+ m = hebrew_last_month_of_year(iy);
226
+ return INT2NUM(m);
227
+ }
228
+
229
+ static VALUE
230
+ calendrical_hebrew_last_day_of_month(VALUE obj, VALUE y, VALUE m)
231
+ {
232
+ int iy, im, md;
233
+
234
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 13);
235
+ iy = NUM2INT(y);
236
+ md = hebrew_last_day_of_month(iy, im);
237
+ return INT2NUM(md);
238
+ }
239
+
240
+ static VALUE
241
+ calendrical_hebrew_calendar_elapsed_days(VALUE obj, VALUE y)
242
+ {
243
+ int iy, d;
244
+
245
+ iy = NUM2INT(y);
246
+ d = hebrew_calendar_elapsed_days(iy);
247
+ return INT2NUM(d);
248
+ }
249
+
250
+ static VALUE
251
+ calendrical_hebrew_days_in_year(VALUE obj, VALUE y)
252
+ {
253
+ int iy, d;
254
+
255
+ iy = NUM2INT(y);
256
+ d = hebrew_days_in_year(iy);
257
+ return INT2NUM(d);
258
+ }
259
+
260
+ static VALUE
261
+ calendrical_long_heshvan(VALUE obj, VALUE y)
262
+ {
263
+ int iy, l;
264
+
265
+ iy = NUM2INT(y);
266
+ l = long_heshvan(iy);
267
+ return INT2BOOL(l);
268
+ }
269
+
270
+ static VALUE
271
+ calendrical_short_kislev(VALUE obj, VALUE y)
272
+ {
273
+ int iy, s;
274
+
275
+ iy = NUM2INT(y);
276
+ s = short_kislev(iy);
277
+ return INT2BOOL(s);
278
+ }
279
+
280
+ static VALUE
281
+ calendrical_hebrew_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
282
+ {
283
+ int iy, im, imd, a, iy2, im2, imd2;
284
+
285
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 13);
286
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 30);
287
+ iy = NUM2INT(y);
288
+ a = hebrew_to_rd(iy, im, imd);
289
+ rd_to_hebrew(a, &iy2, &im2, &imd2);
290
+ if (im != im2 || imd != imd2 || iy != iy2)
291
+ rb_raise(rb_eArgError, "invalid date");
292
+ return INT2NUM(a);
293
+ }
294
+
295
+ static VALUE
296
+ calendrical_rd_to_hebrew(VALUE obj, VALUE a)
297
+ {
298
+ int ia, y, m, md;
299
+
300
+ ia = NUM2INT(a);
301
+ rd_to_hebrew(ia, &y, &m, &md);
302
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
303
+ }
304
+
305
+ static VALUE
306
+ calendrical_nth_kday(VALUE obj, VALUE y, VALUE m, VALUE n, VALUE k)
307
+ {
308
+ int iy, im, in, ik, b;
309
+
310
+ in = NUM2INT(n);
311
+ if (in < -5 || in == 0 || in > 5)
312
+ rb_raise(rb_eArgError, "out of range");
313
+ ik = NUM2INT(k); CHECK_DOMAIN2(ik, 0, 6);
314
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
315
+ iy = NUM2INT(y);
316
+ b = nth_kday(iy, im, in, ik);
317
+ return INT2NUM(b);
318
+ }
319
+
320
+ static VALUE
321
+ calendrical_nicaean_rule_easter(VALUE obj, VALUE y)
322
+ {
323
+ int iy, a;
324
+
325
+ iy = NUM2INT(y);
326
+ a = nicaean_rule_easter(iy);
327
+ return INT2NUM(a);
328
+ }
329
+
330
+ static VALUE
331
+ calendrical_easter(VALUE obj, VALUE y)
332
+ {
333
+ int iy, a;
334
+
335
+ iy = NUM2INT(y);
336
+ a = easter(iy);
337
+ return INT2NUM(a);
338
+ }
339
+
340
+ static VALUE
341
+ calendrical_mayan_long_count_to_rd
342
+ (VALUE obj, VALUE bt, VALUE kt, VALUE t, VALUE u, VALUE k)
343
+ {
344
+ int ibt, ikt, it, iu, ik, a, ibt2, ikt2, it2, iu2, ik2;
345
+
346
+ ibt = NUM2INT(bt);
347
+ ikt = NUM2INT(kt); CHECK_DOMAIN2(ikt, 0, 19);
348
+ it = NUM2INT(t); CHECK_DOMAIN2(it, 0, 19);
349
+ iu = NUM2INT(u); CHECK_DOMAIN2(iu, 0, 17);
350
+ ik = NUM2INT(k); CHECK_DOMAIN2(ik, 0, 19);
351
+ a = mayan_long_count_to_rd(ibt, ikt, it, iu, ik);
352
+ rd_to_mayan_long_count(a, &ibt2, &ikt2, &it2, &iu2, &ik2);
353
+ if (ibt != ibt2 || ikt != ikt2 || it != it2 || iu != iu2 || ik != ik2)
354
+ rb_raise(rb_eArgError, "invalid date");
355
+ return INT2NUM(a);
356
+ }
357
+
358
+ static VALUE
359
+ calendrical_rd_to_mayan_long_count(VALUE obj, VALUE a)
360
+ {
361
+ int ia, bt, kt, t, u, k;
362
+
363
+ ia = NUM2INT(a);
364
+ rd_to_mayan_long_count(ia, &bt, &kt, &t, &u, &k);
365
+ return rb_ary_new3
366
+ (5, INT2NUM(bt), INT2NUM(kt), INT2NUM(t), INT2NUM(u), INT2NUM(k));
367
+ }
368
+
369
+ static VALUE
370
+ calendrical_rd_to_mayan_haab(VALUE obj, VALUE a)
371
+ {
372
+ int ia, md, m;
373
+
374
+ ia = NUM2INT(a);
375
+ rd_to_mayan_haab(ia, &m, &md);
376
+ return rb_ary_new3(2, INT2NUM(m), INT2NUM(md));
377
+ }
378
+
379
+ static VALUE
380
+ calendrical_mayan_haab_difference
381
+ (VALUE obj, VALUE m1, VALUE md1, VALUE m2, VALUE md2)
382
+ {
383
+ int imd1, im1, imd2, im2, d;
384
+
385
+ im1 = NUM2INT(m1); CHECK_DOMAIN2(im1, 1, 19);
386
+ imd1 = NUM2INT(md1); CHECK_DOMAIN2(imd1, 0, (im1 == 19) ? 4 : 19);
387
+ im2 = NUM2INT(m2); CHECK_DOMAIN2(im2, 1, 19);
388
+ imd2 = NUM2INT(md2); CHECK_DOMAIN2(imd2, 0, (im2 == 19) ? 4 : 19);
389
+ d = mayan_haab_difference(im1, imd1, im2, imd2);
390
+ return INT2NUM(d);
391
+ }
392
+
393
+ static VALUE
394
+ calendrical_mayan_haab_on_or_before(VALUE obj, VALUE m, VALUE md, VALUE a)
395
+ {
396
+ int imd, im, ia, d;
397
+
398
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 19);
399
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 0, (im == 19) ? 4 : 19);
400
+ ia = NUM2INT(a);
401
+ d = mayan_haab_on_or_before(im, imd, ia);
402
+ return INT2NUM(d);
403
+ }
404
+
405
+ static VALUE
406
+ calendrical_rd_to_mayan_tzolkin(VALUE obj, VALUE a)
407
+ {
408
+ int ia, nu, na;
409
+
410
+ ia = NUM2INT(a);
411
+ rd_to_mayan_tzolkin(ia, &na, &nu);
412
+ return rb_ary_new3(2, INT2NUM(na), INT2NUM(nu));
413
+ }
414
+
415
+ static VALUE
416
+ calendrical_mayan_tzolkin_difference
417
+ (VALUE obj, VALUE na1, VALUE nu1, VALUE na2, VALUE nu2)
418
+ {
419
+ int inu1, ina1, inu2, ina2, d;
420
+
421
+ inu1 = NUM2INT(nu1); CHECK_DOMAIN2(inu1, 1, 13);
422
+ ina1 = NUM2INT(na1); CHECK_DOMAIN2(ina1, 1, 20);
423
+ inu2 = NUM2INT(nu2); CHECK_DOMAIN2(inu2, 1, 13);
424
+ ina2 = NUM2INT(na2); CHECK_DOMAIN2(ina2, 1, 20);
425
+ d = mayan_tzolkin_difference(ina1, inu1, ina2, inu2);
426
+ return INT2NUM(d);
427
+ }
428
+
429
+ static VALUE
430
+ calendrical_mayan_tzolkin_on_or_before(VALUE obj, VALUE na, VALUE nu, VALUE a)
431
+ {
432
+ int inu, ina, ia, d;
433
+
434
+ inu = NUM2INT(nu); CHECK_DOMAIN2(inu, 1, 13);
435
+ ina = NUM2INT(na); CHECK_DOMAIN2(ina, 1, 20);
436
+ ia = NUM2INT(a);
437
+ d = mayan_tzolkin_on_or_before(ina, inu, ia);
438
+ return INT2NUM(d);
439
+ }
440
+
441
+ static VALUE
442
+ calendrical_mayan_haab_tzolkin_on_or_before
443
+ (VALUE obj, VALUE m, VALUE md, VALUE na, VALUE nu, VALUE a)
444
+ {
445
+ int imd, im, inu, ina, ia, d;
446
+
447
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 0, 19);
448
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 19);
449
+ inu = NUM2INT(nu); CHECK_DOMAIN2(inu, 1, 13);
450
+ ina = NUM2INT(na); CHECK_DOMAIN2(ina, 1, 20);
451
+ ia = NUM2INT(a);
452
+ d = mayan_haab_tzolkin_on_or_before(im, imd, ina, inu, ia);
453
+ return INT2NUM(d);
454
+ }
455
+
456
+ static VALUE
457
+ calendrical_french_leap_year(VALUE obj, VALUE y)
458
+ {
459
+ int iy, l;
460
+
461
+ iy = NUM2INT(y);
462
+ l = french_leap_year(iy);
463
+ return INT2BOOL(l);
464
+ }
465
+
466
+ static VALUE
467
+ calendrical_french_last_day_of_month(VALUE obj, VALUE y, VALUE m)
468
+ {
469
+ int iy, im, md;
470
+
471
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 13);
472
+ iy = NUM2INT(y);
473
+ md = french_last_day_of_month(iy, im);
474
+ return INT2NUM(md);
475
+ }
476
+
477
+ static VALUE
478
+ calendrical_french_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
479
+ {
480
+ int iy, im, imd, a, iy2, im2, imd2;
481
+
482
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 13);
483
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 30);
484
+ iy = NUM2INT(y);
485
+ a = french_to_rd(iy, im, imd);
486
+ rd_to_french(a, &iy2, &im2, &imd2);
487
+ if (im != im2 || imd != imd2 || iy != iy2)
488
+ rb_raise(rb_eArgError, "invalid date");
489
+ return INT2NUM(a);
490
+ }
491
+
492
+ static VALUE
493
+ calendrical_rd_to_french(VALUE obj, VALUE a)
494
+ {
495
+ int ia, y, m, md;
496
+
497
+ ia = NUM2INT(a);
498
+ rd_to_french(ia, &y, &m, &md);
499
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
500
+ }
501
+
502
+ static double
503
+ getfloat(VALUE x)
504
+ {
505
+ if (TYPE(x) == T_FLOAT)
506
+ #ifndef RFLOAT_VALUE
507
+ return RFLOAT(x)->value;
508
+ #else
509
+ return RFLOAT_VALUE(x);
510
+ #endif
511
+ return (double)NUM2INT(x);
512
+ }
513
+
514
+ static VALUE
515
+ calendrical_solar_longitude(VALUE obj, VALUE d)
516
+ {
517
+ double l;
518
+
519
+ l = solar_longitude(getfloat(d));
520
+ return rb_float_new(l);
521
+ }
522
+
523
+ static VALUE
524
+ calendrical_zodiac(VALUE obj, VALUE d)
525
+ {
526
+ double l;
527
+
528
+ l = zodiac(getfloat(d));
529
+ return rb_float_new(l);
530
+ }
531
+
532
+ static VALUE
533
+ calendrical_rd_to_old_hindu_solar(VALUE obj, VALUE a)
534
+ {
535
+ int ia, y, m, md;
536
+
537
+ ia = NUM2INT(a);
538
+ rd_to_old_hindu_solar(ia, &y, &m, &md);
539
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
540
+ }
541
+
542
+ static VALUE
543
+ calendrical_old_hindu_solar_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
544
+ {
545
+ int iy, im, imd, a, iy2, im2, imd2;
546
+
547
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
548
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 31);
549
+ iy = NUM2INT(y);
550
+ a = old_hindu_solar_to_rd(iy, im, imd);
551
+ rd_to_old_hindu_solar(a, &iy2, &im2, &imd2);
552
+ if (im != im2 || imd != imd2 || iy != iy2)
553
+ rb_raise(rb_eArgError, "invalid date");
554
+ return INT2NUM(a);
555
+ }
556
+
557
+ static VALUE
558
+ calendrical_lunar_longitude(VALUE obj, VALUE d)
559
+ {
560
+ double l;
561
+
562
+ l = lunar_longitude(getfloat(d));
563
+ return rb_float_new(l);
564
+ }
565
+
566
+ static VALUE
567
+ calendrical_lunar_phase(VALUE obj, VALUE d)
568
+ {
569
+ double p;
570
+
571
+ p = lunar_phase(getfloat(d));
572
+ return rb_float_new(p);
573
+ }
574
+
575
+ static VALUE
576
+ calendrical_new_moon(VALUE obj, VALUE d)
577
+ {
578
+ double n;
579
+
580
+ n = new_moon(getfloat(d));
581
+ return rb_float_new(n);
582
+ }
583
+
584
+ static VALUE
585
+ calendrical_rd_to_old_hindu_lunar(VALUE obj, VALUE a)
586
+ {
587
+ int ia, y, m, l, md;
588
+
589
+ ia = NUM2INT(a);
590
+ rd_to_old_hindu_lunar(ia, &y, &m, &l, &md);
591
+ return rb_ary_new3(4, INT2NUM(y), INT2NUM(m), INT2BOOL(l), INT2NUM(md));
592
+ }
593
+
594
+ static VALUE
595
+ calendrical_old_hindu_lunar_precedes
596
+ (VALUE obj,
597
+ VALUE y1, VALUE m1, VALUE l1, VALUE md1,
598
+ VALUE y2, VALUE m2, VALUE l2, VALUE md2)
599
+ {
600
+ int iy1, im1, il1, imd1, iy2, im2, il2, imd2, d;
601
+
602
+ im1 = NUM2INT(m1); CHECK_DOMAIN2(im1, 1, 12);
603
+ il1 = BOOL2INT(l1);
604
+ imd1 = NUM2INT(md1); CHECK_DOMAIN2(imd1, 1, 30);
605
+ iy1 = NUM2INT(y1);
606
+ im2 = NUM2INT(m2); CHECK_DOMAIN2(im2, 1, 12);
607
+ il2 = BOOL2INT(l2);
608
+ imd2 = NUM2INT(md2); CHECK_DOMAIN2(imd2, 1, 30);
609
+ iy2 = NUM2INT(y2);
610
+ d = old_hindu_lunar_precedes(iy1, im1, il1, imd1, iy2, im2, il2, imd2);
611
+ return INT2BOOL(d);
612
+ }
613
+
614
+ static VALUE
615
+ calendrical_old_hindu_lunar_to_rd
616
+ (VALUE obj, VALUE y, VALUE m, VALUE l, VALUE md)
617
+ {
618
+ int iy, im, il, imd, a, iy2, im2, il2, imd2;
619
+
620
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
621
+ il = BOOL2INT(l);
622
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 30);
623
+ iy = NUM2INT(y);
624
+ a = old_hindu_lunar_to_rd(iy, im, il, imd);
625
+ rd_to_old_hindu_lunar(a, &iy2, &im2, &il2, &imd2);
626
+ if (im != im2 || il != il2 || imd != imd2 || iy != iy2)
627
+ rb_raise(rb_eArgError, "invalid date");
628
+ return INT2NUM(a);
629
+ }
630
+
631
+ static VALUE
632
+ calendrical_world_leap_year(VALUE obj, VALUE y)
633
+ {
634
+ int iy, l;
635
+
636
+ iy = NUM2INT(y);
637
+ l = world_leap_year(iy);
638
+ return INT2BOOL(l);
639
+ }
640
+
641
+ static VALUE
642
+ calendrical_world_last_day_of_month(VALUE obj, VALUE y, VALUE m)
643
+ {
644
+ int iy, im, md;
645
+
646
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
647
+ iy = NUM2INT(y);
648
+ md = world_last_day_of_month(iy, im);
649
+ return INT2NUM(md);
650
+ }
651
+
652
+ static VALUE
653
+ calendrical_world_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
654
+ {
655
+ int iy, im, imd, a, iy2, im2, imd2;
656
+
657
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
658
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 31);
659
+ iy = NUM2INT(y);
660
+ a = world_to_rd(iy, im, imd);
661
+ rd_to_world(a, &iy2, &im2, &imd2);
662
+ if (im != im2 || imd != imd2 || iy != iy2)
663
+ rb_raise(rb_eArgError, "invalid date");
664
+ return INT2NUM(a);
665
+ }
666
+
667
+ static VALUE
668
+ calendrical_rd_to_world(VALUE obj, VALUE a)
669
+ {
670
+ int ia, y, m, md;
671
+
672
+ ia = NUM2INT(a);
673
+ rd_to_world(ia, &y, &m, &md);
674
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
675
+ }
676
+
677
+ static VALUE
678
+ calendrical_rd_to_world_day_of_week(VALUE obj, VALUE a)
679
+ {
680
+ int ia, w;
681
+
682
+ ia = NUM2INT(a);
683
+ w = rd_to_world_day_of_week(ia);
684
+ return INT2NUM(w);
685
+ }
686
+
687
+ static VALUE
688
+ calendrical_coptic_leap_year(VALUE obj, VALUE y)
689
+ {
690
+ int iy, l;
691
+
692
+ iy = NUM2INT(y);
693
+ l = coptic_leap_year(iy);
694
+ return INT2BOOL(l);
695
+ }
696
+
697
+ static VALUE
698
+ calendrical_coptic_last_day_of_month(VALUE obj, VALUE y, VALUE m)
699
+ {
700
+ int iy, im, md;
701
+
702
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 13);
703
+ iy = NUM2INT(y);
704
+ md = coptic_last_day_of_month(iy, im);
705
+ return INT2NUM(md);
706
+ }
707
+
708
+ static VALUE
709
+ calendrical_coptic_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
710
+ {
711
+ int iy, im, imd, a, iy2, im2, imd2;
712
+
713
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 13);
714
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 30);
715
+ iy = NUM2INT(y);
716
+ a = coptic_to_rd(iy, im, imd);
717
+ rd_to_coptic(a, &iy2, &im2, &imd2);
718
+ if (im != im2 || imd != imd2 || iy != iy2)
719
+ rb_raise(rb_eArgError, "invalid date");
720
+ return INT2NUM(a);
721
+ }
722
+
723
+ static VALUE
724
+ calendrical_rd_to_coptic(VALUE obj, VALUE a)
725
+ {
726
+ int ia, y, m, md;
727
+
728
+ ia = NUM2INT(a);
729
+ rd_to_coptic(ia, &y, &m, &md);
730
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
731
+ }
732
+
733
+ static VALUE
734
+ calendrical_ethiopian_leap_year(VALUE obj, VALUE y)
735
+ {
736
+ int iy, l;
737
+
738
+ iy = NUM2INT(y);
739
+ l = ethiopian_leap_year(iy);
740
+ return INT2BOOL(l);
741
+ }
742
+
743
+ static VALUE
744
+ calendrical_ethiopian_last_day_of_month(VALUE obj, VALUE y, VALUE m)
745
+ {
746
+ int iy, im, md;
747
+
748
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 13);
749
+ iy = NUM2INT(y);
750
+ md = ethiopian_last_day_of_month(iy, im);
751
+ return INT2NUM(md);
752
+ }
753
+
754
+ static VALUE
755
+ calendrical_ethiopian_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
756
+ {
757
+ int iy, im, imd, a, iy2, im2, imd2;
758
+
759
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 13);
760
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 30);
761
+ iy = NUM2INT(y);
762
+ a = ethiopian_to_rd(iy, im, imd);
763
+ rd_to_ethiopian(a, &iy2, &im2, &imd2);
764
+ if (im != im2 || imd != imd2 || iy != iy2)
765
+ rb_raise(rb_eArgError, "invalid date");
766
+ return INT2NUM(a);
767
+ }
768
+
769
+ static VALUE
770
+ calendrical_rd_to_ethiopian(VALUE obj, VALUE a)
771
+ {
772
+ int ia, y, m, md;
773
+
774
+ ia = NUM2INT(a);
775
+ rd_to_ethiopian(ia, &y, &m, &md);
776
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
777
+ }
778
+
779
+ static VALUE
780
+ calendrical_jalali_leap_year(VALUE obj, VALUE y)
781
+ {
782
+ int iy, l;
783
+
784
+ iy = NUM2INT(y);
785
+ l = jalali_leap_year(iy);
786
+ return INT2BOOL(l);
787
+ }
788
+
789
+ static VALUE
790
+ calendrical_jalali_last_day_of_month(VALUE obj, VALUE y, VALUE m)
791
+ {
792
+ int iy, im, md;
793
+
794
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
795
+ iy = NUM2INT(y);
796
+ md = jalali_last_day_of_month(iy, im);
797
+ return INT2NUM(md);
798
+ }
799
+
800
+ static VALUE
801
+ calendrical_jalali_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
802
+ {
803
+ int iy, im, imd, a, iy2, im2, imd2;
804
+
805
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
806
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 31);
807
+ iy = NUM2INT(y);
808
+ a = jalali_to_rd(iy, im, imd);
809
+ rd_to_jalali(a, &iy2, &im2, &imd2);
810
+ if (im != im2 || imd != imd2 || iy != iy2)
811
+ rb_raise(rb_eArgError, "invalid date");
812
+ return INT2NUM(a);
813
+ }
814
+
815
+ static VALUE
816
+ calendrical_rd_to_jalali(VALUE obj, VALUE a)
817
+ {
818
+ int ia, y, m, md;
819
+
820
+ ia = NUM2INT(a);
821
+ rd_to_jalali(ia, &y, &m, &md);
822
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
823
+ }
824
+
825
+ static VALUE
826
+ calendrical_bahai_leap_year(VALUE obj, VALUE y)
827
+ {
828
+ int iy, l;
829
+
830
+ iy = NUM2INT(y);
831
+ l = bahai_leap_year(iy);
832
+ return INT2BOOL(l);
833
+ }
834
+
835
+ static VALUE
836
+ calendrical_bahai_last_day_of_month(VALUE obj, VALUE y, VALUE m)
837
+ {
838
+ int iy, im, md;
839
+
840
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 20);
841
+ iy = NUM2INT(y);
842
+ md = bahai_last_day_of_month(iy, im);
843
+ return INT2NUM(md);
844
+ }
845
+
846
+ static VALUE
847
+ calendrical_bahai_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
848
+ {
849
+ int iy, im, imd, a, iy2, im2, imd2;
850
+
851
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 20);
852
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 19);
853
+ iy = NUM2INT(y);
854
+ a = bahai_to_rd(iy, im, imd);
855
+ rd_to_bahai(a, &iy2, &im2, &imd2);
856
+ if (im != im2 || imd != imd2 || iy != iy2)
857
+ rb_raise(rb_eArgError, "invalid date");
858
+ return INT2NUM(a);
859
+ }
860
+
861
+ static VALUE
862
+ calendrical_rd_to_bahai(VALUE obj, VALUE a)
863
+ {
864
+ int ia, y, m, md;
865
+
866
+ ia = NUM2INT(a);
867
+ rd_to_bahai(ia, &y, &m, &md);
868
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
869
+ }
870
+
871
+ static VALUE
872
+ calendrical_bahai_year_to_vahid(VALUE obj, VALUE y)
873
+ {
874
+ int iy, k, v, iy2;
875
+
876
+ iy = NUM2INT(y);
877
+ bahai_year_to_vahid(iy, &k, &v, &iy2);
878
+ return rb_ary_new3(3, INT2NUM(k), INT2NUM(v), INT2NUM(iy2));
879
+ }
880
+
881
+ static VALUE
882
+ calendrical_bahai_vahid_to_year(VALUE obj, VALUE k, VALUE v, VALUE y)
883
+ {
884
+ int ik, iv, iy, iy2;
885
+
886
+ ik = NUM2INT(k);
887
+ iv = NUM2INT(v); CHECK_DOMAIN2(iv, 1, 19);
888
+ iy = NUM2INT(y); CHECK_DOMAIN2(iy, 1, 19);
889
+ iy2 = bahai_vahid_to_year(ik, iv, iy);
890
+ return INT2NUM(iy2);
891
+ }
892
+
893
+ static VALUE
894
+ calendrical_indian_national_leap_year(VALUE obj, VALUE y)
895
+ {
896
+ int iy, l;
897
+
898
+ iy = NUM2INT(y);
899
+ l = indian_national_leap_year(iy);
900
+ return INT2BOOL(l);
901
+ }
902
+
903
+ static VALUE
904
+ calendrical_indian_national_last_day_of_month(VALUE obj, VALUE y, VALUE m)
905
+ {
906
+ int iy, im, md;
907
+
908
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
909
+ iy = NUM2INT(y);
910
+ md = indian_national_last_day_of_month(iy, im);
911
+ return INT2NUM(md);
912
+ }
913
+
914
+ static VALUE
915
+ calendrical_indian_national_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
916
+ {
917
+ int iy, im, imd, a, iy2, im2, imd2;
918
+
919
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
920
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 31);
921
+ iy = NUM2INT(y);
922
+ a = indian_national_to_rd(iy, im, imd);
923
+ rd_to_indian_national(a, &iy2, &im2, &imd2);
924
+ if (im != im2 || imd != imd2 || iy != iy2)
925
+ rb_raise(rb_eArgError, "invalid date");
926
+ return INT2NUM(a);
927
+ }
928
+
929
+ static VALUE
930
+ calendrical_rd_to_indian_national(VALUE obj, VALUE a)
931
+ {
932
+ int ia, y, m, md;
933
+
934
+ ia = NUM2INT(a);
935
+ rd_to_indian_national(ia, &y, &m, &md);
936
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
937
+ }
938
+
939
+ static VALUE
940
+ calendrical_bengali_leap_year(VALUE obj, VALUE y)
941
+ {
942
+ int iy, l;
943
+
944
+ iy = NUM2INT(y);
945
+ l = bengali_leap_year(iy);
946
+ return INT2BOOL(l);
947
+ }
948
+
949
+ static VALUE
950
+ calendrical_bengali_last_day_of_month(VALUE obj, VALUE y, VALUE m)
951
+ {
952
+ int iy, im, md;
953
+
954
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
955
+ iy = NUM2INT(y);
956
+ md = bengali_last_day_of_month(iy, im);
957
+ return INT2NUM(md);
958
+ }
959
+
960
+ static VALUE
961
+ calendrical_bengali_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
962
+ {
963
+ int iy, im, imd, a, iy2, im2, imd2;
964
+
965
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
966
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 31);
967
+ iy = NUM2INT(y);
968
+ a = bengali_to_rd(iy, im, imd);
969
+ rd_to_bengali(a, &iy2, &im2, &imd2);
970
+ if (im != im2 || imd != imd2 || iy != iy2)
971
+ rb_raise(rb_eArgError, "invalid date");
972
+ return INT2NUM(a);
973
+ }
974
+
975
+ static VALUE
976
+ calendrical_rd_to_bengali(VALUE obj, VALUE a)
977
+ {
978
+ int ia, y, m, md;
979
+
980
+ ia = NUM2INT(a);
981
+ rd_to_bengali(ia, &y, &m, &md);
982
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
983
+ }
984
+
985
+ static VALUE
986
+ calendrical_nanakshahi_leap_year(VALUE obj, VALUE y)
987
+ {
988
+ int iy, l;
989
+
990
+ iy = NUM2INT(y);
991
+ l = nanakshahi_leap_year(iy);
992
+ return INT2BOOL(l);
993
+ }
994
+
995
+ static VALUE
996
+ calendrical_nanakshahi_last_day_of_month(VALUE obj, VALUE y, VALUE m)
997
+ {
998
+ int iy, im, md;
999
+
1000
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
1001
+ iy = NUM2INT(y);
1002
+ md = nanakshahi_last_day_of_month(iy, im);
1003
+ return INT2NUM(md);
1004
+ }
1005
+
1006
+ static VALUE
1007
+ calendrical_nanakshahi_to_rd(VALUE obj, VALUE y, VALUE m, VALUE md)
1008
+ {
1009
+ int iy, im, imd, a, iy2, im2, imd2;
1010
+
1011
+ im = NUM2INT(m); CHECK_DOMAIN2(im, 1, 12);
1012
+ imd = NUM2INT(md); CHECK_DOMAIN2(imd, 1, 31);
1013
+ iy = NUM2INT(y);
1014
+ a = nanakshahi_to_rd(iy, im, imd);
1015
+ rd_to_nanakshahi(a, &iy2, &im2, &imd2);
1016
+ if (im != im2 || imd != imd2 || iy != iy2)
1017
+ rb_raise(rb_eArgError, "invalid date");
1018
+ return INT2NUM(a);
1019
+ }
1020
+
1021
+ static VALUE
1022
+ calendrical_rd_to_nanakshahi(VALUE obj, VALUE a)
1023
+ {
1024
+ int ia, y, m, md;
1025
+
1026
+ ia = NUM2INT(a);
1027
+ rd_to_nanakshahi(ia, &y, &m, &md);
1028
+ return rb_ary_new3(3, INT2NUM(y), INT2NUM(m), INT2NUM(md));
1029
+ }
1030
+
1031
+ static VALUE
1032
+ calendrical_ordinal_to_rd(VALUE obj, VALUE y, VALUE yd)
1033
+ {
1034
+ int iy, iyd, a, iy2, iyd2;
1035
+
1036
+ iyd = NUM2INT(yd); CHECK_DOMAIN2(iyd, 1, 366);
1037
+ iy = NUM2INT(y);
1038
+ a = ordinal_to_rd(iy, iyd);
1039
+ rd_to_ordinal(a, &iy2, &iyd2);
1040
+ if (iyd != iyd2 || iy != iy2)
1041
+ rb_raise(rb_eArgError, "invalid date");
1042
+ return INT2NUM(a);
1043
+ }
1044
+
1045
+ static VALUE
1046
+ calendrical_rd_to_ordinal(VALUE obj, VALUE a)
1047
+ {
1048
+ int ia, y, yd;
1049
+
1050
+ ia = NUM2INT(a);
1051
+ rd_to_ordinal(ia, &y, &yd);
1052
+ return rb_ary_new3(2, INT2NUM(y), INT2NUM(yd));
1053
+ }
1054
+
1055
+ static VALUE
1056
+ calendrical_jd_to_rd(VALUE obj, VALUE j)
1057
+ {
1058
+ int ij, a;
1059
+
1060
+ ij = NUM2INT(j);
1061
+ a = jd_to_rd(ij);
1062
+ return INT2NUM(a);
1063
+ }
1064
+
1065
+ static VALUE
1066
+ calendrical_rd_to_jd(VALUE obj, VALUE a)
1067
+ {
1068
+ int ia, j;
1069
+
1070
+ ia = NUM2INT(a);
1071
+ j = rd_to_jd(ia);
1072
+ return INT2NUM(j);
1073
+ }
1074
+
1075
+ static VALUE
1076
+ calendrical_mjd_to_rd(VALUE obj, VALUE m)
1077
+ {
1078
+ int im, a;
1079
+
1080
+ im = NUM2INT(m);
1081
+ a = mjd_to_rd(im);
1082
+ return INT2NUM(a);
1083
+ }
1084
+
1085
+ static VALUE
1086
+ calendrical_rd_to_mjd(VALUE obj, VALUE a)
1087
+ {
1088
+ int ia, m;
1089
+
1090
+ ia = NUM2INT(a);
1091
+ m = rd_to_mjd(ia);
1092
+ return INT2NUM(m);
1093
+ }
1094
+
1095
+ static VALUE
1096
+ calendrical_mjd_to_jd(VALUE obj, VALUE m)
1097
+ {
1098
+ int im, j;
1099
+
1100
+ im = NUM2INT(m);
1101
+ j = mjd_to_jd(im);
1102
+ return INT2NUM(j);
1103
+
1104
+ }
1105
+
1106
+ static VALUE
1107
+ calendrical_jd_to_mjd(VALUE obj, VALUE j)
1108
+ {
1109
+ int ij, m;
1110
+
1111
+ ij = NUM2INT(j);
1112
+ m = jd_to_mjd(ij);
1113
+ return INT2NUM(m);
1114
+ }
1115
+
1116
+ static VALUE
1117
+ calendrical_ld_to_rd(VALUE obj, VALUE l)
1118
+ {
1119
+ int il, a;
1120
+
1121
+ il = NUM2INT(l);
1122
+ a = ld_to_rd(il);
1123
+ return INT2NUM(a);
1124
+ }
1125
+
1126
+ static VALUE
1127
+ calendrical_rd_to_ld(VALUE obj, VALUE a)
1128
+ {
1129
+ int ia, l;
1130
+
1131
+ ia = NUM2INT(a);
1132
+ l = rd_to_ld(ia);
1133
+ return INT2NUM(l);
1134
+ }
1135
+
1136
+ static VALUE
1137
+ calendrical_rd_to_day_of_week(VALUE obj, VALUE a)
1138
+ {
1139
+ int ia, w;
1140
+
1141
+ ia = NUM2INT(a);
1142
+ w = rd_to_day_of_week(ia);
1143
+ return INT2NUM(w);
1144
+ }
1145
+
1146
+ static VALUE
1147
+ calendrical_kyureki_to_rd(VALUE obj, VALUE y, VALUE m, VALUE l, VALUE md)
1148
+ {
1149
+ int j, a;
1150
+ QDATE q, q2;
1151
+
1152
+ q.j = 0;
1153
+ q.y = NUM2INT(y);
1154
+ q.yd = 0;
1155
+ q.m = NUM2INT(m); CHECK_DOMAIN2(q.m, 1, 12);
1156
+ q.md = NUM2INT(md); CHECK_DOMAIN2(q.md, 1, 30);
1157
+ q.wd = 0;
1158
+ q.leap = BOOL2INT(l);
1159
+ j = rqref(&q);
1160
+ if (j == 0)
1161
+ rb_raise(rb_eArgError, "invalid date");
1162
+ a = jd_to_rd(j);
1163
+ qref(j, &q2);
1164
+ if (q.y != q2.y || q.m != q2.m || q.md != q2.md || q.leap != q2.leap)
1165
+ rb_raise(rb_eArgError, "invalid date");
1166
+ return INT2NUM(a);
1167
+ }
1168
+
1169
+ static VALUE
1170
+ calendrical_rd_to_kyureki(VALUE obj, VALUE a)
1171
+ {
1172
+ int ia, j;
1173
+ QDATE q;
1174
+
1175
+ ia = NUM2INT(a); CHECK_DOMAIN2(ia, 162193, 767009);
1176
+ j = rd_to_jd(ia);
1177
+ qref(j, &q);
1178
+ if (q.j == 0)
1179
+ rb_raise(rb_eArgError, "invalid date");
1180
+ return rb_ary_new3
1181
+ (4, INT2NUM(q.y), INT2NUM(q.m), INT2BOOL(q.leap), INT2NUM(q.md));
1182
+ }
1183
+
1184
+ static VALUE
1185
+ calendrical_rd_to_kyureki_day_of_week(VALUE obj, VALUE a)
1186
+ {
1187
+ int ia, j;
1188
+ QDATE q;
1189
+
1190
+ ia = NUM2INT(a);
1191
+ j = rd_to_jd(ia);
1192
+ qref(j, &q);
1193
+ if (q.j == 0)
1194
+ rb_raise(rb_eArgError, "invalid date");
1195
+ return INT2NUM(q.wd);
1196
+ }
1197
+
1198
+ static VALUE
1199
+ mk_ary_of_str(long len, const char *a[])
1200
+ {
1201
+ VALUE o;
1202
+ long i;
1203
+
1204
+ o = rb_ary_new2(len);
1205
+ for (i = 0; i < len; i++) {
1206
+ VALUE e;
1207
+
1208
+ if (!a[i])
1209
+ e = Qnil;
1210
+ else {
1211
+ e = rb_str_new2(a[i]);
1212
+ #ifdef HAVE_RUBY_ENCODING_H
1213
+ rb_enc_associate(e, rb_utf8_encoding());
1214
+ ENC_CODERANGE_CLEAR(e);
1215
+ #endif
1216
+ rb_obj_freeze(e);
1217
+ }
1218
+ rb_ary_push(o, e);
1219
+ }
1220
+ rb_obj_freeze(o);
1221
+ return o;
1222
+ }
1223
+
1224
+ static const char *day_names[] = {
1225
+ "Sunday", "Monday", "Tuesday",
1226
+ "Wednesday", "Thursday",
1227
+ "Friday", "Saturday"
1228
+ };
1229
+
1230
+ static const char *month_names[] = {
1231
+ "*", "January", "February", "March",
1232
+ "April", "May", "June", "July",
1233
+ "August", "September", "October",
1234
+ "November", "December"
1235
+ };
1236
+
1237
+ static const char *islamic_day_names[] = {
1238
+ "al-Aḥad", "al-Ithnayn",
1239
+ "ath-Thalaathaaʼ", "al-Arba‘aa’",
1240
+ "al-Khamīs", "al-Jumu‘ah", "as-Sabt"
1241
+ };
1242
+
1243
+ static const char *islamic_month_names[] = {
1244
+ "*", "Muḥarram", "Ṣafar",
1245
+ "Rabīʿ I", "Rabīʿ II",
1246
+ "Jumādā I", "Jumādā II",
1247
+ "Rajab", "Shaʿbān",
1248
+ "Ramaḍān", "Shawwāl",
1249
+ "Dhū al-Qaʿda", "Dhū al-Ḥijja"
1250
+ };
1251
+
1252
+ static const char *hebrew_day_names[] = {
1253
+ "Yom Rishon", "Yom Sheni", "Yom Shlishi",
1254
+ "Yom Reviʻi", "Yom Chamishi",
1255
+ "Yom Shishi", "Yom Shabbat"
1256
+ };
1257
+
1258
+ static const char *hebrew_common_year_month_names[] = {
1259
+ "*", "Nisan", "Iyyar",
1260
+ "Sivan", "Tammuz", "Av",
1261
+ "Elul", "Tishri", "Heshvan",
1262
+ "Kislev", "Teveth", "Shevat",
1263
+ "Adar", "*"
1264
+ };
1265
+
1266
+ static const char *hebrew_leap_year_month_names[] = {
1267
+ "*", "Nisan", "Iyyar",
1268
+ "Sivan", "Tammuz", "Av",
1269
+ "Elul", "Tishri", "Heshvan",
1270
+ "Kislev", "Teveth", "Shevat",
1271
+ "Adar I", "Adar II"
1272
+ };
1273
+
1274
+ static const char *mayan_haab_month_names[] = {
1275
+ "*", "Pop", "Wo'",
1276
+ "Sip", "Sotz'", "Sek",
1277
+ "Xul", "Yaxk'in'", "Mol",
1278
+ "Ch'en", "Yax", "Sak'",
1279
+ "Keh", "Mak", "K'ank'in",
1280
+ "Muwan'", "Pax", "K'ayab",
1281
+ "Kumk'u", "Wayeb'"
1282
+ };
1283
+
1284
+ static const char *mayan_tzolkin_month_names[] = {
1285
+ "*", "Imix'", "Ik'",
1286
+ "Ak'b'al", "K'an", "Chikchan",
1287
+ "Kimi", "Manik'", "Lamat",
1288
+ "Muluk", "Ok", "Chuwen",
1289
+ "Eb'", "B'en", "Ix",
1290
+ "Men", "K'ib'", "Kab'an",
1291
+ "Etz'nab'", "Kawak", "Ajaw"
1292
+ };
1293
+
1294
+ static const char *french_day_names[] = {
1295
+ "Primidi", "Doudi",
1296
+ "Tridi", "Quartidi",
1297
+ "Quintidi", "Sextidi",
1298
+ "Septidi", "Octidi",
1299
+ "Nonidi", "Décadi"
1300
+ };
1301
+
1302
+ static const char *french_sansculottides_names[] = {
1303
+ "Vertu", "Génie",
1304
+ "Labour", "Raison",
1305
+ "Récompenses", "Révolution",
1306
+ "*", "*", "*", "*"
1307
+ };
1308
+
1309
+ static const char *french_month_names[] = {
1310
+ "*", "Vendémiaire",
1311
+ "Brumaire", "Frimaire",
1312
+ "Nivôse", "Pluviôse",
1313
+ "Ventôse", "Germinal",
1314
+ "Floréal", "Prairial",
1315
+ "Messidor", "Thermidor",
1316
+ "Fructidor", "(Sansculottides)"
1317
+ };
1318
+
1319
+ static const char *old_hindu_solar_month_names[] = {
1320
+ "*", "Meṣa", "Vṛṣabha",
1321
+ "Mithuna", "Karkaṭa", "Siṃha",
1322
+ "Kanyā", "Tulā", "Vṛścik‌‌‌a",
1323
+ "Dhanu", "Makara", "Kumbha",
1324
+ "Mīna"
1325
+ };
1326
+
1327
+ static const char *old_hindu_lunar_month_names[] = {
1328
+ "*", "Chaitra", "Vaiśākha",
1329
+ "Jyaiṣṭha", "Āṣāḍha",
1330
+ "Śrāvaṇa", "Bhādrapada",
1331
+ "Āśvina", "Kārtika",
1332
+ "Mārgaśīrṣa", "Pauṣa",
1333
+ "Māgha", "Phālguna"
1334
+ };
1335
+
1336
+ static const char *world_day_names[] = {
1337
+ "Sunday", "Monday", "Tuesday",
1338
+ "Wednesday", "Thursday",
1339
+ "Friday", "Saturday",
1340
+ "World", "Leap"
1341
+ };
1342
+
1343
+ static const char *coptic_month_names[] = {
1344
+ "*", "Tut", "Babah",
1345
+ "Hatur", "Kiyahk", "Tubah",
1346
+ "Amshir", "Baramhat",
1347
+ "Baramundah", "Bashans",
1348
+ "Ba'unah", "Abib", "Misra",
1349
+ "al-Nasi"
1350
+ };
1351
+
1352
+ static const char *ethiopian_month_names[] = {
1353
+ "*", "Mäskäräm", "Ṭəqəmt",
1354
+ "Ḫədar", "Taḫśaś'", "Ṭərr",
1355
+ "Yäkatit", "Mägabit",
1356
+ "Miyazya", "Gənbot", "Säne",
1357
+ "Ḥamle", "Nähase",
1358
+ "Ṗagʷəmen"
1359
+ };
1360
+
1361
+ static const char *jalali_month_names[] = {
1362
+ "*", "Farvardin",
1363
+ "Ordibehesht ", "Khordad",
1364
+ "Tir", "Mordad", "Shahrivar",
1365
+ "Mehr", "Aban", "Azar",
1366
+ "Dey", "Bahman", "Esfand"
1367
+ };
1368
+
1369
+ static const char *bahai_day_names[] = {
1370
+ "Jamál", "Kamál", "Fiḍál",
1371
+ "‘Idál", "Istijlál",
1372
+ "Istiqlál", "Jalál"
1373
+ };
1374
+
1375
+ static const char *bahai_month_names[] = {
1376
+ "*", "Bahá", "Jalál",
1377
+ "Jamál", "‘Aẓamat", "Núr",
1378
+ "Raḥmat", "Kalimát", "Kamál",
1379
+ "Asmá’", "‘Izzat", "Mashíyyat",
1380
+ "‘Ilm", "Qudrat", "Qawl",
1381
+ "Masá’il", "Sharaf", "Sulṭán",
1382
+ "Mulk", "Ayyám-i-Há", "‘Alá’"
1383
+ };
1384
+
1385
+ static const char *bahai_vahid_names[] = {
1386
+ "*", "Alif", "Bá’",
1387
+ "Ab", "Dál", "Báb",
1388
+ "Váv", "Abad", "Jád",
1389
+ "Bahá'", "Ḥubb", "Bahháj",
1390
+ "Javáb", "Aḥad", "Vahháb",
1391
+ "Vidád", "Badí‘", "Bahí",
1392
+ "Abhá", "Váḥid"
1393
+ };
1394
+
1395
+ static const char *indian_national_month_names[] = {
1396
+ "*", "Chaitra", "Vaishākha",
1397
+ "Jyaishtha", "Āshādha",
1398
+ "Shrāvana", "Bhādrapada",
1399
+ "Āshwin", "Kārtika",
1400
+ "Agrahayana", "Pausha",
1401
+ "Māgha", "Phālguna"
1402
+ };
1403
+
1404
+ static const char *bengali_day_names[] = {
1405
+ "Rôbibar", "Sombar",
1406
+ "Mônggôlbar", "Budhbar",
1407
+ "Brihôspôtibar", "Shukrôbar",
1408
+ "Shônibar"
1409
+ };
1410
+
1411
+ static const char *bengali_month_names[] = {
1412
+ "*", "Bôishakh", "Jyôishţhô",
1413
+ "Ashaŗh", "Shrabôn",
1414
+ "Bhadrô", "Ashbin",
1415
+ "Kartik", "Ogrôhayôn",
1416
+ "Poush", "Magh",
1417
+ "Falgun", "Chôitrô"
1418
+ };
1419
+
1420
+ static const char *nanakshahi_month_names[] = {
1421
+ "*", "Chet",
1422
+ "Vaisakh", "Jeth",
1423
+ "Harh", "Sawan",
1424
+ "Bhadon", "Assu",
1425
+ "Katak", "Maghar",
1426
+ "Poh", "Magh",
1427
+ "Phagun"
1428
+ };
1429
+
1430
+ static const char *kyureki_day_names[] = {
1431
+ "Senkachi", "Tomobiki",
1432
+ "Semmake", "Butsumetsu",
1433
+ "Taian", "Shakku"
1434
+ };
1435
+
1436
+ static const char *kyureki_month_names[] = {
1437
+ "*", "Mutsuki", "Kisaragi",
1438
+ "Yayoi", "Uzuki", "Satsuki",
1439
+ "Minazuki", "Fuzuki",
1440
+ "Hazuki", "Nagatsuki",
1441
+ "Kannazuki", "Shimotsuki",
1442
+ "Shiwasu"
1443
+ };
1444
+
1445
+ void
1446
+ Init_calendrical(void)
1447
+ {
1448
+ VALUE mod, cc_month_names;
1449
+
1450
+ mod = rb_define_module("Calendrical");
1451
+ rb_define_module_function
1452
+ (mod, "gregorian_leap_year", calendrical_gregorian_leap_year, 1);
1453
+ rb_define_module_function
1454
+ (mod, "gregorian_leap_year?", calendrical_gregorian_leap_year, 1);
1455
+ rb_define_module_function
1456
+ (mod, "gregorian_last_day_of_month",
1457
+ calendrical_gregorian_last_day_of_month, 2);
1458
+ rb_define_module_function
1459
+ (mod, "gregorian_to_rd", calendrical_gregorian_to_rd, 3);
1460
+ rb_define_module_function
1461
+ (mod, "rd_to_gregorian", calendrical_rd_to_gregorian, 1);
1462
+ rb_define_module_function
1463
+ (mod, "kday_on_or_before", calendrical_kday_on_or_before, 2);
1464
+
1465
+ rb_define_module_function
1466
+ (mod, "iso_to_rd", calendrical_iso_to_rd, 3);
1467
+ rb_define_module_function
1468
+ (mod, "rd_to_iso", calendrical_rd_to_iso, 1);
1469
+ rb_define_module_function
1470
+ (mod, "week_date_to_rd", calendrical_iso_to_rd, 3);
1471
+ rb_define_module_function
1472
+ (mod, "rd_to_week_date", calendrical_rd_to_iso, 1);
1473
+
1474
+ rb_define_module_function
1475
+ (mod, "julian_leap_year", calendrical_julian_leap_year, 1);
1476
+ rb_define_module_function
1477
+ (mod, "julian_leap_year?", calendrical_julian_leap_year, 1);
1478
+ rb_define_module_function
1479
+ (mod, "julian_last_day_of_month",
1480
+ calendrical_julian_last_day_of_month, 2);
1481
+ rb_define_module_function
1482
+ (mod, "julian_to_rd", calendrical_julian_to_rd, 3);
1483
+ rb_define_module_function
1484
+ (mod, "rd_to_julian", calendrical_rd_to_julian, 1);
1485
+
1486
+ rb_define_module_function
1487
+ (mod, "islamic_leap_year", calendrical_islamic_leap_year, 1);
1488
+ rb_define_module_function
1489
+ (mod, "islamic_leap_year?", calendrical_islamic_leap_year, 1);
1490
+ rb_define_module_function
1491
+ (mod, "islamic_last_day_of_month",
1492
+ calendrical_islamic_last_day_of_month, 2);
1493
+ rb_define_module_function
1494
+ (mod, "islamic_to_rd", calendrical_islamic_to_rd, 3);
1495
+ rb_define_module_function
1496
+ (mod, "rd_to_islamic", calendrical_rd_to_islamic, 1);
1497
+
1498
+ rb_define_module_function
1499
+ (mod, "hebrew_leap_year", calendrical_hebrew_leap_year, 1);
1500
+ rb_define_module_function
1501
+ (mod, "hebrew_leap_year?", calendrical_hebrew_leap_year, 1);
1502
+ rb_define_module_function
1503
+ (mod, "hebrew_last_month_of_year",
1504
+ calendrical_hebrew_last_month_of_year, 1);
1505
+ rb_define_module_function
1506
+ (mod, "hebrew_last_day_of_month",
1507
+ calendrical_hebrew_last_day_of_month, 2);
1508
+ rb_define_module_function
1509
+ (mod, "hebrew_calendar_elapsed_days",
1510
+ calendrical_hebrew_calendar_elapsed_days, 1);
1511
+ rb_define_module_function
1512
+ (mod, "hebrew_days_in_year", calendrical_hebrew_days_in_year, 1);
1513
+ rb_define_module_function
1514
+ (mod, "long_heshvan", calendrical_long_heshvan, 1);
1515
+ rb_define_module_function
1516
+ (mod, "long_heshvan?", calendrical_long_heshvan, 1);
1517
+ rb_define_module_function
1518
+ (mod, "short_kislev", calendrical_short_kislev, 1);
1519
+ rb_define_module_function
1520
+ (mod, "short_kislev?", calendrical_short_kislev, 1);
1521
+ rb_define_module_function
1522
+ (mod, "hebrew_to_rd", calendrical_hebrew_to_rd, 3);
1523
+ rb_define_module_function
1524
+ (mod, "rd_to_hebrew", calendrical_rd_to_hebrew, 1);
1525
+
1526
+ rb_define_module_function
1527
+ (mod, "nth_kday", calendrical_nth_kday, 4);
1528
+ rb_define_module_function
1529
+ (mod, "nicaean_rule_easter", calendrical_nicaean_rule_easter, 1);
1530
+ rb_define_module_function
1531
+ (mod, "easter", calendrical_easter, 1);
1532
+
1533
+ rb_define_module_function
1534
+ (mod, "mayan_long_count_to_rd",
1535
+ calendrical_mayan_long_count_to_rd, 5);
1536
+ rb_define_module_function
1537
+ (mod, "rd_to_mayan_long_count",
1538
+ calendrical_rd_to_mayan_long_count, 1);
1539
+ rb_define_module_function
1540
+ (mod, "rd_to_mayan_haab",
1541
+ calendrical_rd_to_mayan_haab, 1);
1542
+ rb_define_module_function
1543
+ (mod, "mayan_haab_difference", calendrical_mayan_haab_difference, 4);
1544
+ rb_define_module_function
1545
+ (mod, "mayan_haab_on_or_before", calendrical_mayan_haab_on_or_before, 3);
1546
+ rb_define_module_function
1547
+ (mod, "rd_to_mayan_tzolkin",
1548
+ calendrical_rd_to_mayan_tzolkin, 1);
1549
+ rb_define_module_function
1550
+ (mod, "mayan_tzolkin_difference",
1551
+ calendrical_mayan_tzolkin_difference, 4);
1552
+ rb_define_module_function
1553
+ (mod, "mayan_tzolkin_on_or_before",
1554
+ calendrical_mayan_tzolkin_on_or_before, 3);
1555
+ rb_define_module_function
1556
+ (mod, "mayan_haab_tzolkin_on_or_before",
1557
+ calendrical_mayan_haab_tzolkin_on_or_before, 5);
1558
+
1559
+ rb_define_module_function
1560
+ (mod, "french_leap_year", calendrical_french_leap_year, 1);
1561
+ rb_define_module_function
1562
+ (mod, "french_leap_year?", calendrical_french_leap_year, 1);
1563
+ rb_define_module_function
1564
+ (mod, "french_last_day_of_month",
1565
+ calendrical_french_last_day_of_month, 2);
1566
+ rb_define_module_function
1567
+ (mod, "french_to_rd", calendrical_french_to_rd, 3);
1568
+ rb_define_module_function
1569
+ (mod, "rd_to_french", calendrical_rd_to_french, 1);
1570
+
1571
+ rb_define_module_function
1572
+ (mod, "solar_longitude", calendrical_solar_longitude, 1);
1573
+ rb_define_module_function
1574
+ (mod, "zodiac", calendrical_zodiac, 1);
1575
+ rb_define_module_function
1576
+ (mod, "rd_to_old_hindu_solar",
1577
+ calendrical_rd_to_old_hindu_solar, 1);
1578
+ rb_define_module_function
1579
+ (mod, "old_hindu_solar_to_rd",
1580
+ calendrical_old_hindu_solar_to_rd, 3);
1581
+ rb_define_module_function
1582
+ (mod, "lunar_longitude", calendrical_lunar_longitude, 1);
1583
+ rb_define_module_function
1584
+ (mod, "lunar_phase", calendrical_lunar_phase, 1);
1585
+ rb_define_module_function
1586
+ (mod, "new_moon", calendrical_new_moon, 1);
1587
+ rb_define_module_function
1588
+ (mod, "rd_to_old_hindu_lunar",
1589
+ calendrical_rd_to_old_hindu_lunar, 1);
1590
+ rb_define_module_function
1591
+ (mod, "old_hindu_lunar_precedes",
1592
+ calendrical_old_hindu_lunar_precedes, 8);
1593
+ rb_define_module_function
1594
+ (mod, "old_hindu_lunar_to_rd",
1595
+ calendrical_old_hindu_lunar_to_rd, 4);
1596
+
1597
+ rb_define_module_function
1598
+ (mod, "world_leap_year", calendrical_world_leap_year, 1);
1599
+ rb_define_module_function
1600
+ (mod, "world_leap_year?", calendrical_world_leap_year, 1);
1601
+ rb_define_module_function
1602
+ (mod, "world_last_day_of_month", calendrical_world_last_day_of_month, 2);
1603
+ rb_define_module_function
1604
+ (mod, "world_to_rd", calendrical_world_to_rd, 3);
1605
+ rb_define_module_function
1606
+ (mod, "rd_to_world", calendrical_rd_to_world, 1);
1607
+ rb_define_module_function
1608
+ (mod, "rd_to_world_day_of_week",
1609
+ calendrical_rd_to_world_day_of_week, 1);
1610
+
1611
+ rb_define_module_function
1612
+ (mod, "coptic_leap_year", calendrical_coptic_leap_year, 1);
1613
+ rb_define_module_function
1614
+ (mod, "coptic_leap_year?", calendrical_coptic_leap_year, 1);
1615
+ rb_define_module_function
1616
+ (mod, "coptic_last_day_of_month",
1617
+ calendrical_coptic_last_day_of_month, 2);
1618
+ rb_define_module_function
1619
+ (mod, "coptic_to_rd", calendrical_coptic_to_rd, 3);
1620
+ rb_define_module_function
1621
+ (mod, "rd_to_coptic", calendrical_rd_to_coptic, 1);
1622
+
1623
+ rb_define_module_function
1624
+ (mod, "ethiopian_leap_year", calendrical_ethiopian_leap_year, 1);
1625
+ rb_define_module_function
1626
+ (mod, "ethiopian_leap_year?", calendrical_ethiopian_leap_year, 1);
1627
+ rb_define_module_function
1628
+ (mod, "ethiopian_last_day_of_month",
1629
+ calendrical_ethiopian_last_day_of_month, 2);
1630
+ rb_define_module_function
1631
+ (mod, "ethiopian_to_rd", calendrical_ethiopian_to_rd, 3);
1632
+ rb_define_module_function
1633
+ (mod, "rd_to_ethiopian", calendrical_rd_to_ethiopian, 1);
1634
+
1635
+ rb_define_module_function
1636
+ (mod, "jalali_leap_year", calendrical_jalali_leap_year, 1);
1637
+ rb_define_module_function
1638
+ (mod, "jalali_leap_year?", calendrical_jalali_leap_year, 1);
1639
+ rb_define_module_function
1640
+ (mod, "jalali_last_day_of_month",
1641
+ calendrical_jalali_last_day_of_month, 2);
1642
+ rb_define_module_function
1643
+ (mod, "jalali_to_rd", calendrical_jalali_to_rd, 3);
1644
+ rb_define_module_function
1645
+ (mod, "rd_to_jalali", calendrical_rd_to_jalali, 1);
1646
+
1647
+ rb_define_module_function
1648
+ (mod, "bahai_leap_year", calendrical_bahai_leap_year, 1);
1649
+ rb_define_module_function
1650
+ (mod, "bahai_leap_year?", calendrical_bahai_leap_year, 1);
1651
+ rb_define_module_function
1652
+ (mod, "bahai_last_day_of_month",
1653
+ calendrical_bahai_last_day_of_month, 2);
1654
+ rb_define_module_function
1655
+ (mod, "bahai_to_rd", calendrical_bahai_to_rd, 3);
1656
+ rb_define_module_function
1657
+ (mod, "rd_to_bahai", calendrical_rd_to_bahai, 1);
1658
+ rb_define_module_function
1659
+ (mod, "bahai_year_to_vahid",
1660
+ calendrical_bahai_year_to_vahid, 1);
1661
+ rb_define_module_function
1662
+ (mod, "bahai_vahid_to_year",
1663
+ calendrical_bahai_vahid_to_year, 3);
1664
+
1665
+ rb_define_module_function
1666
+ (mod, "indian_national_leap_year", calendrical_indian_national_leap_year, 1);
1667
+ rb_define_module_function
1668
+ (mod, "indian_national_leap_year?", calendrical_indian_national_leap_year, 1);
1669
+ rb_define_module_function
1670
+ (mod, "indian_national_last_day_of_month",
1671
+ calendrical_indian_national_last_day_of_month, 2);
1672
+ rb_define_module_function
1673
+ (mod, "indian_national_to_rd", calendrical_indian_national_to_rd, 3);
1674
+ rb_define_module_function
1675
+ (mod, "rd_to_indian_national", calendrical_rd_to_indian_national, 1);
1676
+
1677
+ rb_define_module_function
1678
+ (mod, "bengali_leap_year", calendrical_bengali_leap_year, 1);
1679
+ rb_define_module_function
1680
+ (mod, "bengali_leap_year?", calendrical_bengali_leap_year, 1);
1681
+ rb_define_module_function
1682
+ (mod, "bengali_last_day_of_month",
1683
+ calendrical_bengali_last_day_of_month, 2);
1684
+ rb_define_module_function
1685
+ (mod, "bengali_to_rd", calendrical_bengali_to_rd, 3);
1686
+ rb_define_module_function
1687
+ (mod, "rd_to_bengali", calendrical_rd_to_bengali, 1);
1688
+
1689
+ rb_define_module_function
1690
+ (mod, "nanakshahi_leap_year", calendrical_nanakshahi_leap_year, 1);
1691
+ rb_define_module_function
1692
+ (mod, "nanakshahi_leap_year?", calendrical_nanakshahi_leap_year, 1);
1693
+ rb_define_module_function
1694
+ (mod, "nanakshahi_last_day_of_month",
1695
+ calendrical_nanakshahi_last_day_of_month, 2);
1696
+ rb_define_module_function
1697
+ (mod, "nanakshahi_to_rd", calendrical_nanakshahi_to_rd, 3);
1698
+ rb_define_module_function
1699
+ (mod, "rd_to_nanakshahi", calendrical_rd_to_nanakshahi, 1);
1700
+
1701
+ rb_define_module_function
1702
+ (mod, "ordinal_to_rd", calendrical_ordinal_to_rd, 2);
1703
+ rb_define_module_function
1704
+ (mod, "rd_to_ordinal", calendrical_rd_to_ordinal, 1);
1705
+
1706
+ rb_define_module_function
1707
+ (mod, "jd_to_rd", calendrical_jd_to_rd, 1);
1708
+ rb_define_module_function
1709
+ (mod, "rd_to_jd", calendrical_rd_to_jd, 1);
1710
+
1711
+ rb_define_module_function
1712
+ (mod, "mjd_to_rd", calendrical_mjd_to_rd, 1);
1713
+ rb_define_module_function
1714
+ (mod, "rd_to_mjd", calendrical_rd_to_mjd, 1);
1715
+
1716
+ rb_define_module_function
1717
+ (mod, "mjd_to_jd", calendrical_mjd_to_jd, 1);
1718
+ rb_define_module_function
1719
+ (mod, "jd_to_mjd", calendrical_jd_to_mjd, 1);
1720
+
1721
+ rb_define_module_function
1722
+ (mod, "ld_to_rd", calendrical_ld_to_rd, 1);
1723
+ rb_define_module_function
1724
+ (mod, "rd_to_ld", calendrical_rd_to_ld, 1);
1725
+
1726
+ rb_define_module_function
1727
+ (mod, "rd_to_day_of_week", calendrical_rd_to_day_of_week, 1);
1728
+
1729
+ rb_define_module_function
1730
+ (mod, "kyureki_to_rd", calendrical_kyureki_to_rd, 4);
1731
+ rb_define_module_function
1732
+ (mod, "rd_to_kyureki", calendrical_rd_to_kyureki, 1);
1733
+ rb_define_module_function
1734
+ (mod, "rd_to_kyureki_day_of_week",
1735
+ calendrical_rd_to_kyureki_day_of_week, 1);
1736
+
1737
+ rb_define_const
1738
+ (mod, "VERSION",
1739
+ rb_obj_freeze(rb_str_new2("$Revision: 1.16 $")));
1740
+
1741
+ #define const_array(a) mk_ary_of_str(sizeof a / sizeof a[0], a)
1742
+ #define def_const(n, o) rb_define_const(mod, n, o)
1743
+ #define def_const_array(n, a) def_const(n, const_array(a))
1744
+
1745
+ def_const_array("DAY_NAMES", day_names);
1746
+ cc_month_names = const_array(month_names);
1747
+ def_const("MONTH_NAMES", cc_month_names);
1748
+
1749
+ def_const_array("ISLAMIC_DAY_NAMES", islamic_day_names);
1750
+ def_const_array("ISLAMIC_MONTH_NAMES", islamic_month_names);
1751
+ def_const_array("HEBREW_DAY_NAMES", hebrew_day_names);
1752
+ def_const("HEBREW_MONTH_NAMES",
1753
+ rb_obj_freeze(rb_ary_new3(2,
1754
+ const_array(hebrew_common_year_month_names),
1755
+ const_array(hebrew_leap_year_month_names))));
1756
+
1757
+ def_const_array("MAYAN_HAAB_MONTH_NAMES", mayan_haab_month_names);
1758
+ def_const_array("MAYAN_TZOLKIN_MONTH_NAMES", mayan_tzolkin_month_names);
1759
+
1760
+ def_const_array("FRENCH_DAY_NAMES", french_day_names);
1761
+ def_const_array("FRENCH_SANSCULOTTIDES_NAMES", french_sansculottides_names);
1762
+ def_const_array("FRENCH_MONTH_NAMES", french_month_names);
1763
+
1764
+ def_const_array("OLD_HINDU_SOLAR_MONTH_NAMES", old_hindu_solar_month_names);
1765
+ def_const_array("OLD_HINDU_LUNAR_MONTH_NAMES", old_hindu_lunar_month_names);
1766
+
1767
+ def_const_array("WORLD_DAY_NAMES", world_day_names);
1768
+
1769
+ def_const_array("COPTIC_MONTH_NAMES", coptic_month_names);
1770
+ def_const_array("ETHIOPIAN_MONTH_NAMES", ethiopian_month_names);
1771
+ def_const_array("JALALI_MONTH_NAMES", jalali_month_names);
1772
+
1773
+ def_const_array("BAHAI_DAY_NAMES", bahai_day_names);
1774
+ def_const_array("BAHAI_MONTH_NAMES", bahai_month_names);
1775
+ def_const_array("BAHAI_VAHID_NAMES", bahai_vahid_names);
1776
+
1777
+ def_const_array("INDIAN_NATIONAL_MONTH_NAMES", indian_national_month_names);
1778
+
1779
+ def_const_array("BENGALI_DAY_NAMES", bengali_day_names);
1780
+ def_const_array("BENGALI_MONTH_NAMES", bengali_month_names);
1781
+
1782
+ def_const_array("NANAKSHAHI_MONTH_NAMES", nanakshahi_month_names);
1783
+
1784
+ def_const_array("KYUREKI_DAY_NAMES", kyureki_day_names);
1785
+ def_const_array("KYUREKI_MONTH_NAMES", kyureki_month_names);
1786
+
1787
+ def_const("GREGORIAN_MONTH_NAMES", cc_month_names);
1788
+ def_const("JULIAN_MONTH_NAMES", cc_month_names);
1789
+ def_const("WORLD_MONTH_NAMES", cc_month_names);
1790
+ }
1791
+
1792
+ /*
1793
+ Local variables:
1794
+ c-file-style: "ruby"
1795
+ End:
1796
+ */