/*

ファイルのタイムスタンプを変更する

CHGTIME Version 1.00a
Copyright (c) 1994 Delmonta

*/

#include<stdio.h>
#include<stdlib.h>
#include<dos.h>

#define	NODATA	0xffff

typedef	enum {FALSE=0,TRUE}	bool;
unsigned short	Date=NODATA,Time=NODATA;

static	bool	option(char *str)
{
	if	(str[1]=='h' || str[1]=='H' || str[1]=='?')
	{
		printf("\nCHGTIME [-D年/月/日] [-T時:分[:秒]] ファイル名\n");
		exit(0);
	}
	else if	(str[1]=='d' || str[1]=='D')
	{
		int	year,mon,day;

		if	(sscanf(str+2,"%d/%d/%d",&year,&mon,&day)<3)
			return FALSE;

		if	(year>=1980)	year -= 1980;	/* 西暦4桁での指定 */
		else if	(year<80)	year +=   20;	/* 2000〜2079年    */
		else			year -=   80;	/* 1980〜1999年    */

		if	(year<0 || 128<=year)	return FALSE;
		if	(mon<=0 || 12<mon)	return FALSE;
		if	(day<=0 || 31<day)	return FALSE;

		Date = (year<<9) + (mon<<5) + day;
	}
	else if	(str[1]=='t' || str[1]=='T')
	{
		int	hour,min,sec=0;

		if	(sscanf(str+2,"%d:%d:%d",&hour,&min,&sec)<2)
				return FALSE;

		if	(hour<0 || 24<=hour)	return FALSE;
		if	(min <0 || 60<=min)	return FALSE;
		if	(sec <0 || 60<=sec)	return FALSE;

		Time = (hour<<11) + (min<<5) + (sec>>1);
	}
	else
		return FALSE;

	return TRUE;
}

int	main(int argc,char **argv)
{
	union	REGS	regs;

	while	(--argc)
	{
		argv++;

		if	(argv[0][0]=='-')
		{
			if	(option(argv[0])==FALSE)
			{
				printf("不正なオプションです : %s\n",argv[0]);
				exit(-1);
			}
		}
		else
		{
			FILE	*fp;

			if	(access(argv[0],2))
			{
				printf("ファイルが存在しないか、書き込み禁止です : %s\n",argv[0]);
				continue;
			}

			printf("%s\n",argv[0]);

			fp = fopen(argv[0],"r+b");

			regs.x.ax = 0x5700;
			regs.x.bx = fileno(fp);
			intdos(&regs,&regs);

			regs.x.ax = 0x5701;
			regs.x.bx = fileno(fp);

			if	(Time != NODATA)	regs.x.cx = Time;
			if	(Date != NODATA)	regs.x.dx = Date;

			intdos(&regs,&regs);

			fclose(fp);
		}
	}
	exit(0);
}
