/*** ACA.C  v.2.00  1994.01.23 by Jouji ***/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>

void clkadj_f(double);

main(int argc,char *argv[])
{
	char  sw,*datafile;
	int  i;
	double  er,dh,sdh;
	clock_t  sec,qsec,period,ersec;
	FILE  *fp;

	datafile = "A_CL_ADJ.DAT";
	sw = 'm';
	dh = 0;
	for(i = 1; i < argc; i++) {				/* オプションスイッチのチェック */
		if(argv[i][0] == '/') {
			sw = tolower(argv[i][1]);
		} else {
			sscanf(argv[i], "%lf", &dh);
		}
	}
	if (argc == 1) {						/* パラメータ無し*/
		sw = 'a';
	}
	if(sw == 'a' || sw == 'c' || sw == 'm') {
		fp = fopen(datafile,"r");			/* データファイルの読み込み */
		if (fp == NULL) {
			puts("Datafile cannot open !\a\n");
			exit(1);
		}
		fscanf(fp,"%ld%le%ld%le",&qsec,&er,&ersec,&sdh);
		fclose(fp);
	}
	sec = clock();
	switch(sw) {
	case 'i':								/* /i:データファイルの初期化 */
		period = 0;
		er = 0;
		ersec = sec;
		sdh = 0;
		break;
	case 'a':								/* /a:自動修正 */
		period = sec-qsec;
		dh = er*period;
		sdh += dh;
		if(dh > -1.0 && dh < 1.0) {
			fclose(fp);
			puts("内蔵時計の誤差が１秒以内のため修正しません。\n");
			exit(0);
		}
		break;
	case 'c':								/* /c:補正係数の計算 */
		period = sec-qsec;
		sdh += dh;
		er = sdh/(sec-ersec);
		sdh = 0;
		ersec = sec;
		break;
	case 'm':								/* /m:手動修正 */
		period = sec-qsec;
		sdh += dh;
		break;
	case 'o':								/* /o:修正のみ */
		clkadj_f(dh);
		exit(0);
	default:
		puts("Parameter error !\a");
		puts("Usage:ACA [/acimo] [seconds]\n");
		exit(1);
	}
	clkadj_f(dh);
	fp=fopen(datafile,"w");
	fprintf(fp,"%ld  %E  %ld  %E\n",sec,er,ersec,sdh);
	fprintf(fp,"#補正時刻  補正係数  係数計算時刻  累積補正時間\n");
	fprintf(fp,"%s",ctime(&sec));
	fprintf(fp,"period=%ld  dh=%.2f\n",period,dh);
	fclose(fp);
}

void clkadj_f(double dh)
{				/* dh:補正時間、例．+1.2:1.2秒進める、-0.4:0.4秒遅らせる */
	int i,ds,wc;
	double w;
	clock_t sec,qsec;

	if(dh == 0) return;
	ds = dh;								/* ds:整数秒の補正値 */
	w = ds-dh;
	if(w < 0) {								/* w:端数秒のウェイト値 */
		w += 1.0;
		ds++;
	}
	qsec = clock();							/* 現在時刻の取得 */
	while(qsec == (sec=clock()))
		;									/* 時刻の変わり目のチェック */
	qsec = sec;
	i = 0;
	while(qsec == (sec=clock())) {
		i++;
	}										/* i:1秒間のループ回数 */
	wc = i*w;								/* wc:w秒待つためのループ回数 */
	qsec = sec;
	sec += ds;
	for(i=0; i<wc; i++) {					/* w秒だけウェイト */
		qsec = clock();
	}
	stime(&sec);							/* 内蔵時計に時刻設定 */
	printf("内蔵時計の時間を%.2f秒修正しました。\n",dh);
}
