/*****************************************************************************/
/* カレンダー表示ルーチン：休日指定 */
/*****************************************************************************/

#include <stdio.h>
#include <string.h>
#include "defines.h"
#include "amacro.h"
#include "datetime.h"

extern HOLIDAY (*_Hol)[DAYS];	/* 国民の祝日/特定日指定用 */
extern unsint  *_Whol;		/* 曜日毎休日指定 */

/*****************************************************************************/

int SetHoliday(unchar *fname)
/* 休日指定ファイル読み込み＆設定 */
{
FILE *fp;
int i,j,day,month,syear,eyear;
#define	LMAX	128
unchar line[LMAX],token[LMAX];
	/* ワーククリア */
	for (i=0;i<MONTHS;i++) { /* 国民の祝日 */
		for (j=0;j<DAYS;j++) {
			_Hol[i][j].col=_Hol[i][j].cnt=_Hol[i][j].syear
				     =_Hol[i][j].syear=_Hol[i][j].year=0;
		}
	}
	for (j=0;j<WEEKS;j++) _Whol[j]=0; /* 週毎休み */
	
	fp=fopen(fname,"rt");
	if (fp==NULL) {
		#if DEBUG
		B_PRINT("\a休日設定ファイルが見つかりません：");
		B_PRINT(fname);
		B_PRINT("\r\n");
		#endif
		return(10);
	}
	
	j=0; /* ok symbol */
	while (!read1line0(fp,line,token,LMAX)) {
	    /* MM/DD/YSYY/YEYY = 休み日付＆設定年範囲 */
	    month=deci2(token);
	    if (month<0||month>MONTHS) {
		#if DEBUG
		B_PRINT("月指定が異常です");
		#endif
		j=1;
		break;
	    }
	    day=deci2(&token[3]);
	    if (day<1||day>DAYS) {
		#if DEBUG
		B_PRINT("日指定が異常です");
		#endif
		j=2;
		break;
	    }
	    if (month!=0) { /* 曜日毎指定でない時：年範囲あり */
		if (_Hol[month-1][day-1].col) { /* 多重指定の時 */
			/* 多重の回数だけつけて終了（上限あり=4bit）*/
			if (_Hol[month-1][day-1].cnt<CLIM) {
				_Hol[month-1][day-1].cnt++;
			}
			continue;
		}
		syear=deci4(&token[6]);
		eyear=deci4(&token[11]);
		if (syear<0||syear>9999||eyear<0||eyear>9999) {
			/* 4桁のMAXは9999 */
			#if DEBUG
			B_PRINT("年範囲指定が異常です");
			#endif
			j=6;
			break;
		}
		if (eyear==0) eyear=10000;/*これ以上の年はない:以後ずっと有効*/
		if (eyear<syear) { /* 入れ換え */
			i=eyear;
			eyear=syear;
			syear=i;
		}
		_Hol[month-1][day-1].syear=syear;
		_Hol[month-1][day-1].eyear=eyear;
		/*printf("%d/%d = %d〜%d\n",month,day,syear,eyear);*/
	    }
	    
	    /* CC = 属性 */
	    if (GetToken(line,2,token," \t")==0) {
		#if DEBUG
		B_PRINT("属性指定がありません");
		#endif
		j=3;
		break;
	    }
	    if (atoi3(token,&i,0)) {
		#if DEBUG
		B_PRINT("属性指定が異常です");
		#endif
		j=4;
		break;
	    }
	    if (month==0) { /* 週毎休み */
		if (day>WEEKS) {
			#if DEBUG
			B_PRINT("曜日毎指定で曜日指定が異常です");
			#endif
			j=5;
			break;
		}
		_Whol[day-1]=(i<0? -i:i);
	    } else {
		if (i<0) {i=-i; _Hol[month-1][day-1].cnt|=BIT15;}
		_Hol[month-1][day-1].col=i;
	    }
	    /*printf("%d/%d = %d\n",month,day,i);*/
	}
	fclose(fp);
	#if DEBUG
	if (j) { /* error */
		B_PRINT("\a：");
		B_PRINT(line);
		B_PRINT("\r\n");
	}
	#endif
	return(j);
}

/*****************************************************************************/
