1 /*
2 * rekichu.c -- ����ľ����Ȭ�ɡ�����
3 *
4 * Copyright (C) 1997,1999 by Yoshifumi Mori
5 *
6 * tab:4
7 */
8
9 #include "cdefs.h"
10 #include "extern.h"
11
12 char *rekichu_f_string;
13 char *rekichu_kadan_f_string;
14
15 static unsigned char reki_bitmap[(MAX_REKICHU + 7) / 8];
16 static unsigned char kadan_bitmap[(MAX_REKICHU_KADAN + 7) / 8];
17
18 static const char setu_sekkitbl[12] = { 19, 21, 23, 1, 3, 5, 7, 9, 11, 13, 15, 17 };
19
20 static void kadan(int setuyy, int setumm, long *jdn, void (*outfunc)(const char *msg, ...));
21
22 /*
23 * ����ľ�����
24 */
calc_12choku(int year,int month,int day,long jdn)25 const char *calc_12choku(int year, int month, int day, long jdn)
26 {
27 static const char *choku[12] = {
28 "��", "��", "��", "ʿ", "��", "��",
29 "��", "��", "��", "Ǽ", "��", "��"
30 };
31 long jd;
32 int setumm, t;
33
34 jd = GetSekkiJulianDay(year, setu_sekkitbl[month - 1]);
35 if (jd == 0L) {
36 return (NULL);
37 }
38
39 if (jdn >= jd) {
40 setumm = calendar.month - 1;
41 } else {
42 setumm = calendar.month - 2;
43 }
44 if (setumm < 1) {
45 setumm += 12;
46 }
47
48 t = (int)((jdn + 2L) % 12L) - ((setumm + 1) % 12);
49 while (t < 0) {
50 t += 12;
51 }
52
53 return (choku[t % 12]);
54 }
55
56 /*
57 * ��Ȭ�ɤ����
58 */
calc_28syuku(long julianday)59 const char *calc_28syuku(long julianday)
60 {
61 static const char *syuku[28] = {
62 "��", "ж", "�Ƥ�", "˼", "��", "��", "̧",
63 "��", "��", "��", "��", "��", "��", "��",
64 "��", "Ϭ", "��", "��", "ɭ", "�", "��",
65 "��", "��", "��", "��", "ĥ", "��", "��"
66 };
67
68 return (syuku[(int)((julianday + 12L) % 28L)]);
69 }
70
71 /*
72 * ������
73 */
74 static
kadan(int setuyy,int setumm,long * jdn,void (* outfunc)(const char * msg,...))75 void kadan(int setuyy, int setumm, long *jdn, void (*outfunc)(const char *msg, ...))
76 {
77 static const char kamiyosinichi[33] = {
78 1, 3, 5, 6, 8, 9, 13, 15, 18, 20, 21, 24, 27, 30, 32, 33,
79 35, 36, 37, 39, 41, 42, 43, 44, 45, 47, 48, 51, 54, 55, 56, 57, 59
80 };
81 static const char daimyounichi[25] = {
82 5, 6, 7, 8, 9, 13, 15, 18, 20, 23, 28, 31,
83 38, 40, 41, 42, 43, 45, 46, 47, 52, 54, 55, 56, 57
84 };
85 long jd;
86 int i;
87
88 if (setumm != 0) {
89 static const char kurobi[12] = { 10, 4, 11, 5, 0, 6, 1, 7, 2, 8, 3, 9 };
90 static const char jyusinichi[12] = { 9, 5, 1, 9, 5, 1, 9, 5, 1, 9, 5, 1 };
91 static const char kikonichi[12] = { 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 };
92 static const char fukunichi[12][2] = {
93 { 0, 6 }, { 1, 7 }, { 4, 5 }, { 2, 8 }, { 3, 9 }, { 4, 5 },
94 { 0, 6 }, { 1, 7 }, { 4, 5 }, { 2, 8 }, { 3, 9 }, { 4, 5 },
95 };
96 static const char oumounichi[12] = { 6, 13, 20, 7, 15, 23, 8, 17, 26, 9, 19, 29 };
97 static const char bosounichi[12][4] = {
98 { 0, 11, 0, 11 }, { 0, 11, 0, 11 }, { 5, 6, 5, 6 }, { 2, 3, 2, 3 },
99 { 2, 3, 2, 3 }, { 5, 6, 5, 6 }, { 1, 4, 7, 10 }, { 1, 4, 7, 10 },
100 { 5, 6, 5, 6 }, { 8, 4, 8, 4 }, { 8, 4, 8, 4 }, { 5, 6, 5, 6 },
101 };
102 static const char tukitokunichi[12] = { 2, 0, 8, 6, 2, 0, 8, 6, 2, 0, 8, 6 };
103
104 if (calendar.dt == kurobi[setumm - 1] && CHKBIT(0, kadan_bitmap) != 0) {
105 (*outfunc)("������");
106 }
107 if (calendar.dt == jyusinichi[setumm - 1] && CHKBIT(1, kadan_bitmap) != 0) {
108 (*outfunc)("������");
109 }
110 if (calendar.dt == kikonichi[setumm - 1] && CHKBIT(3, kadan_bitmap) != 0) {
111 (*outfunc)("������");
112 }
113 if (calendar.de == fukunichi[setumm - 1][0] ||
114 calendar.de == fukunichi[setumm - 1][1]) {
115 if (CHKBIT(6, kadan_bitmap) != 0) {
116 (*outfunc)("����");
117 }
118 }
119
120 #if 1 /* ��� */
121 #define MM (setumm - 1)
122 if (setumm != 0) {
123 #else /* ���(����) */
124 #define MM (calendar.lc_month - 1)
125 if (calendar.lc_valid == TRUE) {
126 #endif
127 static const char chiiminichi[12] = { 1, 7, 2, 8, 3, 9, 4, 10, 5, 11, 6, 0 };
128 static const char tenkanichi[12] = { 0, 3, 6, 9, 0, 3, 6, 9, 0, 3, 6, 9 };
129 static const char jikanichi[12] = { 5, 6, 7, 8, 9, 10, 11, 0, 1, 2, 3, 4 };
130
131 if (calendar.dt == chiiminichi[MM] && CHKBIT(4, kadan_bitmap) != 0) {
132 (*outfunc)("�����");
133 }
134 if (calendar.dt == tenkanichi[MM] && CHKBIT(7, kadan_bitmap) != 0) {
135 (*outfunc)("ŷ����");
136 }
137 if (calendar.dt == jikanichi[MM] && CHKBIT(8, kadan_bitmap) != 0) {
138 (*outfunc)("�ϲ���");
139 }
140 }
141
142 i = setuyy;
143 if (setumm == 12) {
144 i++;
145 }
146 jd = GetSekkiJulianDay(i, setu_sekkitbl[setumm % 12]);
147 if ((jd + oumounichi[setumm - 1]) == calendar.julian_day && CHKBIT(14, kadan_bitmap) != 0) {
148 (*outfunc)("��˴��");
149 }
150 if (calendar.dt == bosounichi[setumm - 1][0] ||
151 calendar.dt == bosounichi[setumm - 1][1] ||
152 calendar.dt == bosounichi[setumm - 1][2] ||
153 calendar.dt == bosounichi[setumm - 1][3]) {
154 if (CHKBIT(20, kadan_bitmap) != 0) {
155 (*outfunc)("������");
156 }
157 }
158 if (calendar.de == tukitokunichi[setumm - 1] && CHKBIT(21, kadan_bitmap) != 0) {
159 (*outfunc)("������");
160 }
161 }
162
163 if (calendar.dt == 5 || calendar.dt == 11) {
164 /* ̦����, ����� */
165 if (CHKBIT(5, kadan_bitmap) != 0) {
166 (*outfunc)("����");
167 }
168 }
169 i = FALSE;
170 if (calendar.eto == 14 &&
171 (jdn[3] <= calendar.julian_day && calendar.julian_day < jdn[0])) {
172 i = TRUE; /* Ω�ա�Ω�� ���� */
173 }
174 if (calendar.eto == 30 &&
175 (jdn[0] <= calendar.julian_day && calendar.julian_day < jdn[1])) {
176 i = TRUE; /* Ω�ơ�Ω�� �ø� */
177 }
178 if (calendar.eto == 44 &&
179 (jdn[1] <= calendar.julian_day && calendar.julian_day < jdn[2])) {
180 i = TRUE; /* Ω����Ω�� �꿽 */
181 }
182 if (calendar.eto == 0 &&
183 (jdn[2] <= calendar.julian_day || calendar.julian_day < jdn[3])) {
184 i = TRUE; /* Ω�ߡ�Ω�� �û� */
185 }
186 if (i != FALSE && CHKBIT(15, kadan_bitmap) != 0) {
187 (*outfunc)("ŷ����");
188 }
189 for (i = 0; i < sizeof(kamiyosinichi); i++) {
190 if (calendar.eto == kamiyosinichi[i]) {
191 if (CHKBIT(16, kadan_bitmap) != 0) {
192 (*outfunc)("������");
193 }
194 break;
195 }
196 }
197 for (i = 0; i < sizeof(daimyounichi); i++) {
198 if (calendar.eto == daimyounichi[i]) {
199 if (CHKBIT(17, kadan_bitmap) != 0) {
200 (*outfunc)("������");
201 }
202 break;
203 }
204 }
205 if ((int)((calendar.julian_day + 12L) % 28L) == 22 && CHKBIT(18, kadan_bitmap) != 0) {
206 (*outfunc)("������"); /* ��Ȭ�� �� */
207 }
208 if (calendar.eto <= 4 ||
209 (calendar.eto >= 15 && calendar.eto <= 19) ||
210 (calendar.eto >= 45 && calendar.eto <= 49)) {
211 /* �û�, ����, ʺ��, ����, ��ä */
212 /* �ʱ�, ��ä, ��̦, �Ѹ�, �̤ */
213 /* ����, ����, �ɰ�, �ѻ�, ⣱� */
214 if (CHKBIT(19, kadan_bitmap) != 0) {
215 (*outfunc)("ŷ����");
216 }
217 }
218
219 if (calendar.lc_valid == TRUE) {
220 #if 1
221 static const char kuenichix[13] = {
222 0, 2, 5, 17, 27, 29, 34, 37, 40, 51, 63, 66, 70
223 };
224 static const char kuenichit[] = {
225 27, 50, /* 1- 2 */
226 15, 51, 57, /* 2- 3 */
227 0, 1, 2, 3, 4, 8, 16, 20, 32, 40, 44, 56, /* 3-12 */
228 4, 7, 19, 31, 35, 42, 43, 54, 55, 59, /* 4-10 */
229 42, 54, /* 5- 2 */
230 5, 42, 43, 53, 55, /* 6- 5 */
231 21, 40, 56, /* 7- 3 */
232 45, 51, 57, /* 8- 3 */
233 10, 27, 28, 29, 30, 31, 32, 33, 34, 46, 50, /* 9-11 */
234 1, 5, 13, 24, 25, 34, 35, 37, 48, 49, 53, 59, /* 10-12 */
235 24, 42, 48, /* 11- 3 */
236 24, 43, 48, 59, /* 12- 4 */
237 };
238 #else
239 static const char kuenichix[13] = {
240 0, 3, 6, 19, 31, 34, 41, 44, 47, 62, 74, 77, 82
241 };
242 static const char kuenichit[] = {
243 27, 50, 47, /* 1- 3 */
244 15, 51, 57, /* 2- 3 */
245 0, 1, 2, 3, 4, 8, 16, 20, 32, 40, 44, 56, 59, /* 3-13 */
246 4, 7, 19, 31, 35, 42, 43, 54, 55, 59, 5, 53, /* 4-12 */
247 42, 54, 48, /* 5- 3 */
248 5, 42, 43, 53, 55, 49, 54, /* 6- 7 */
249 21, 40, 56, /* 7- 3 */
250 45, 51, 57, /* 8- 3 */
251 10, 27, 28, 29, 30, 31, 32, 33, 34, 46, 50, 2, 14, 26, 38, /* 9-15 */
252 1, 5, 13, 24, 25, 34, 35, 37, 48, 49, 53, 59, /* 10-12 */
253 24, 42, 48, /* 11- 3 */
254 24, 43, 48, 59, 49, /* 12- 5 */
255 };
256 #endif
257 static const char saigejiki[12] = { 13, 26, 3, 28, 53, 42, 43, 56, 33, 22, 47, 36 };
258 const struct kansi_t *k;
259
260 for (i = kuenichix[calendar.lc_month - 1]; i < kuenichix[calendar.lc_month]; i++) {
261 if (calendar.eto == kuenichit[i]) {
262 if (CHKBIT(13, kadan_bitmap) != 0) {
263 (*outfunc)("������");
264 }
265 break;
266 }
267 }
268 k = kansi(calendar.lc_year, calendar.lc_month, calendar.julian_day);
269 if (calendar.eto == saigejiki[k->yt] && CHKBIT(12, kadan_bitmap) != 0) {
270 (*outfunc)("���");
271 }
272 }
273 }
274
275 /*
276 * ���ᵤ�����ᡢ�����λ��С�ɽ�����ե饰����
277 */
278 void rekichu(unsigned char *evflag, void (*outfunc)(const char *msg, ...))
279 {
280 const char *p, *q, *s;
281 int i, j;
282 int setumm, setuyy;
283 long jd, jdn[4];
284
285 memset(reki_bitmap, '\xFF', sizeof(reki_bitmap));
286 if (rekichu_f_string != NULL) {
287 p = rekichu_f_string;
288 for (i = 0; *p != '\0' && i < MAX_REKICHU; i++, p++) {
289 if (*p != '1') {
290 CLRBIT(i, reki_bitmap);
291 }
292 }
293 }
294
295 memset(kadan_bitmap, '\xFF', sizeof(kadan_bitmap));
296 if (rekichu_kadan_f_string != NULL) {
297 p = rekichu_kadan_f_string;
298 for (i = 0; *p != '\0' && i < MAX_REKICHU_KADAN; i++, p++) {
299 if (*p != '1') {
300 CLRBIT(i, kadan_bitmap);
301 }
302 }
303 }
304
305 p = GetSekkiName(calendar.year, calendar.month, calendar.day, &i);
306 if (p != NULL) {
307 if (i >= 0 && i <= 23) {
308 SETBIT(i, evflag);
309 if (CHKBIT(0, reki_bitmap) != 0) {
310 (*outfunc)(p); /* ���ᵤ */
311 }
312 } else if (i == 24) {
313 if (CHKBIT(5, reki_bitmap) != 0) {
314 (*outfunc)(p); /* ���� */
315 }
316 } else if (i == 25) {
317 if (CHKBIT(6, reki_bitmap) != 0) {
318 (*outfunc)(p); /* Ⱦ���� */
319 }
320 }
321 }
322
323 if (calendar.month == 3 || calendar.month == 9) {
324 GetSB(calendar.year, &i, &j);
325 if (calendar.month == 9) {
326 i = j;
327 }
328 p = NULL;
329 q = "";
330 switch (calendar.day - i) {
331 case -3:
332 q = "������";
333 /* no break */
334 case -2:
335 case -1:
336 case 0:
337 case 1:
338 case 2:
339 higan:;
340 p = "���%s";
341 break;
342 case 3:
343 q = "������";
344 goto higan;
345 }
346 if (p != NULL && CHKBIT(2, reki_bitmap) != 0) {
347 (*outfunc)(p, q);
348 }
349
350 if (calendar.month == 3) {
351 i = 30;
352 } else {
353 i = 31;
354 }
355 if (calendar.julian_day == GetSekkiJulianDay(calendar.year, i)) {
356 SETBIT(38, evflag); /* ���� */
357 if (CHKBIT(3, reki_bitmap) != 0) {
358 (*outfunc)("����"); /* ����� */
359 }
360 }
361 }
362
363 for (i = 0; i < 4; i++) {
364 jd = calendar.julian_day - GetSekkiJulianDay(calendar.year, i + 26);
365 if (jd >= 0L && jd <= 17L) {
366 static const char *kisetu = "�ղƽ���";
367
368 s = &kisetu[i * 2];
369 p = "%-.2s������%s";
370 q = "";
371 switch ((int)jd) {
372 case 0:
373 q = "����";
374 break;
375 case 17:
376 q = "����";
377 break;
378 }
379 SETBIT(34 + i, evflag);
380 if (CHKBIT(4, reki_bitmap) != 0) {
381 (*outfunc)(p, s, q);
382 }
383 if (i == 1 && calendar.dt == 1) {
384 if (jd < 12L) {
385 p = "���Ѥα�����";
386 } else {
387 p = "���Ѥ���α�";
388 }
389 if (CHKBIT(4, reki_bitmap) != 0) {
390 (*outfunc)(p);
391 }
392 }
393 }
394
395 jdn[i] = GetSekkiJulianDay(calendar.year, i * 6 + 3);
396 if (i == 3) {
397 static const short rissyun_diff[] = { -1, 87, 209, 219 };
398 static const char *zatsusetu[] = {
399 "��ʬ", "Ȭ��Ȭ��", "��ɴ����", "��ɴ����"
400 };
401
402 for (j = 0; j < sizeof(rissyun_diff) / sizeof(int); j++) {
403 if (calendar.julian_day == (jdn[3] + rissyun_diff[j])) {
404 SETBIT(24 + j, evflag);
405 if (CHKBIT(j + 7, reki_bitmap) != 0) {
406 (*outfunc)(zatsusetu[j]);
407 }
408 }
409 }
410 }
411 }
412
413 if (calendar.month == 2 && calendar.dt == 6) {
414 if (calendar.day <= 12) {
415 SETBIT(28, evflag); /* ��� */
416 } else if (calendar.day <= 24) {
417 SETBIT(29, evflag); /* ��θ� */
418 } else {
419 SETBIT(30, evflag); /* ���θ� */
420 }
421 }
422
423 if (calendar.month == 11 && calendar.dt == 9) {
424 if (calendar.day <= 12) {
425 SETBIT(31, evflag); /* ����� */
426 } else if (calendar.day <= 24) {
427 SETBIT(32, evflag); /* ����� */
428 } else {
429 SETBIT(33, evflag); /* ������ */
430 }
431 }
432
433 if (calendar.de == 6 &&
434 (calendar.month == 7 || calendar.month == 8)) { /* ������ */
435 p = NULL;
436 jd = GetSekkiJulianDay(calendar.year, 6); /* �ƻ� */
437 if ((jd + 20L) <= calendar.julian_day && calendar.julian_day <= (jd + 29L)) {
438 p = "����";
439 }
440 if ((jd + 30L) <= calendar.julian_day && calendar.julian_day <= (jd + 39L)) {
441 p = "����";
442 }
443 jd = GetSekkiJulianDay(calendar.year, 9); /* �� */
444 if (jd <= calendar.julian_day && calendar.julian_day <= (jd + 9L)) {
445 p = "����";
446 }
447 if (p != NULL && CHKBIT(16, reki_bitmap) != 0) {
448 (*outfunc)(p); /* ���� */
449 }
450 }
451
452 jd = GetSekkiJulianDay(calendar.year, setu_sekkitbl[calendar.month - 1]);
453 if (jd != 0L) {
454 if (calendar.julian_day >= jd) {
455 setumm = calendar.month - 1;
456 } else {
457 setumm = calendar.month - 2;
458 }
459 setuyy = calendar.year;
460 if (setumm < 1) {
461 setumm += 12;
462 setuyy--;
463 }
464 } else {
465 setuyy = 0;
466 setumm = 0;
467 }
468
469 if (setumm != 0) {
470 static const char sanrinbo[12] = { 11, 2, 6, 11, 2, 6, 11, 2, 6, 11, 2, 6 };
471 static const char manbaibi[12][2] = {
472 { 1, 6 }, { 9, 2 }, { 0, 3 }, { 3, 4 }, { 5, 6 }, { 9, 6 },
473 { 7, 0 }, { 3, 8 }, { 9, 6 }, { 9, 10 }, { 11, 0 }, { 3, 0 },
474 };
475
476 if (calendar.dt == sanrinbo[setumm - 1] && CHKBIT(15, reki_bitmap) != 0) {
477 (*outfunc)("����˴");
478 }
479 if (calendar.dt == manbaibi[setumm - 1][0] ||
480 calendar.dt == manbaibi[setumm - 1][1]) {
481 if (CHKBIT(17, reki_bitmap) != 0) {
482 (*outfunc)("�������");
483 }
484 }
485 }
486
487 if (calendar.lc_valid == TRUE) {
488 static const char fujyoujyu[12] = { 3, 2, 1, 4, 5, 6, 3, 2, 1, 4, 5, 6 };
489
490 j = fujyoujyu[calendar.lc_month - 1];
491 if (calendar.lc_day == j || calendar.lc_day == j + 8 ||
492 calendar.lc_day == j + 16 || calendar.lc_day == j + 24) {
493 if (CHKBIT(13, reki_bitmap) != 0) {
494 (*outfunc)("��������");
495 }
496 }
497 }
498
499 if (calendar.eto == 48 || calendar.eto == 50 || calendar.eto == 51 ||
500 calendar.eto == 53 || calendar.eto == 55 || calendar.eto == 56 ||
501 calendar.eto == 57 || calendar.eto == 59) {
502 /* �ѻ�, ����, ����, ��̦, ��̤, ����, ����, ⣰� */
503 q = "";
504 if (calendar.eto == 48) {
505 q = "�Ϥ�";
506 }
507 if (calendar.eto == 59) {
508 q = "����";
509 }
510 if (CHKBIT(11, reki_bitmap) != 0) {
511 (*outfunc)("Ȭ��%s", q);
512 }
513 }
514 if (calendar.eto >= 20 && calendar.eto <= 29) {
515 q = "";
516 if (calendar.eto == 20) {
517 q = "����";
518 }
519 if (CHKBIT(12, reki_bitmap) != 0) {
520 (*outfunc)("������%s", q); /* �ÿ� ���� �̦ (ʺ��:22, �ʱ�:25�ϴ��������ޤޤ��) */
521 }
522 }
523 if (calendar.eto >= 29 && calendar.eto <= 44) {
524 q = "";
525 if (calendar.eto == 29) {
526 q = "����";
527 }
528 if (CHKBIT(14, reki_bitmap) != 0) {
529 (*outfunc)("ŷ��ŷ��%s", q); /* �̦ ���� �꿽 */
530 }
531 }
532 if (calendar.eto >= 6 && calendar.eto <= 12) {
533 if (CHKBIT(18, reki_bitmap) != 0) {
534 (*outfunc)("������"); /* ���� ���� ʺ�� */
535 }
536 }
537 if (calendar.eto >= 14 && calendar.eto <= 20) {
538 if (CHKBIT(18, reki_bitmap) != 0) {
539 (*outfunc)("������" ); /* ���� ���� �ÿ� */
540 }
541 }
542
543 if (calendar.eto == 56 && CHKBIT(19, reki_bitmap) != 0) {
544 (*outfunc)("��������"); /* ���� */
545 }
546 if (calendar.eto == 0 && CHKBIT(19, reki_bitmap) != 0) {
547 (*outfunc)("�ûҤ���"); /* �û� */
548 }
549 if (calendar.eto == 5 && CHKBIT(19, reki_bitmap) != 0) {
550 (*outfunc)("��̦����"); /* ��̦ */
551 }
552
553 if (CHKBIT(1, reki_bitmap) != 0) {
554 kadan(setuyy, setumm, jdn, outfunc);
555 }
556 }
557