/* ディスク回りのお便利ルーチン集 */

#include	<stdio.h>
#include	<string.h>
#include	<dos.h>
#include	<ctype.h>


/* マクロとか */
#define	iskanji(c)	( (((c)>0x80)&&((c)<0xa0)) || (((c)>0xdf)&&((c)<0xfd)) )
#define iskanji2(c) (((0x40<=(c))&&((c)<=0x7e))||((0x80<=(c))&&((c)<=0xfc)))
#define	US	unsigned

/* プロトタイプ */
int		DSK_dskf(char drv);
void	DSK_getExtName(char *fname,char *extName);
void	DSK_changeExtName(char *fname,char *ext);
void	DSK_toupperFileName(char *fname);
void	DSK_tolowerFileName(char *fname);
char	DSK_getDrive(char *fname);
int		DSK_extcmp(char *fname,char *extName);
char*	DSK_strchr(char *str,char find);
char*	DSK_strrchr(char *str,char find);
long	DSK_fsize(FILE *fp);
void	DSK_file2path(char *fname,char *pname);
int		iskanjif(char *str,char *p);
void	iskanjil(char *str,char *list);


/* staticグローバル変数 */
static	union REGS		r;
static	struct SREGS	sr;


/* 漢字対応strchr/strchr */
char*	DSK_strchr(char *str,char find)
{
	char	*p;
	int		flag=0;
	
	p=str;
	if (*p==find)
		return(p);
	
	for (p++; *p!=0 ;p++)
	{
		if ( *p==find && !iskanjif(str,p) )
		{
			flag=1;
			break;
		}
	}
	if (flag==0)
		p=NULL;
	return(p);
}



char*	DSK_strrchr(char *str,char find)
{
	char	*p;
	int		flag=0;
	
	for (p=str+strlen(str)-1; p>str; p--)
	{
		if ( *p==find && !iskanjif(str,p) )
		{
			flag=1;
			break;
		}
	}
	if (flag==0 && *p!=find)
		p=NULL;
	return(p);
}



/* 本格iskanji(^^;) */
/* strの中の*pが漢字かどうかを返す。 */
/* 漢字なら-1,ANKなら0 を返す。*/
int		iskanjif(char *str,char *p)
{
	int		k=0;
	int		i;
	
	k= (iskanji(str[0])) ? 1 : 0;
	for (i=1;str+i<=p;i++)
	{
		switch(k)
		{
			case 0:
				k= (iskanji(str[i])) ? 1 : 0;	break;
			case 1:
				k=2;	break;
			case 2:
				k= (iskanji(str[i])) ? 1 : 0;	break;
		}
	}
	k= (k==0) ? 0 : -1;
	return(k);
}



/* 漢字かどうかを列挙した配列を作る。 */
void	iskanjil(char *str,char *list)
{
	int		k=0,l;
	int		i;
	
	k= (iskanji(str[0])) ? 1 : 0;
	list[0]= (k==0) ? 0 : -1;
	for (i=1;str[i]!=0;i++)
	{
		switch(k)
		{
			case 0:
				k= (iskanji(str[i])) ? 1 : 0;	break;
			case 1:
				k=2;	break;
			case 2:
				k= (iskanji(str[i])) ? 1 : 0;	break;
		}
		l= (k==0) ? 0 : -1;
		list[i]=l;
	}
}




/* はじまりはじまり〜 */

/* ドライブの空き容量を返す */
/* 0ならカレント,1ならAドライブ,2ならBドライブ... */
/* LSI-C 版は削除(intdos回りがちょっとだけ違う) */
int		DSK_dskf(char drv)
{
	return(0);
}




/* ファイル名の拡張子を得る */
void	DSK_getExtName(char *fname,char *extName)
{
	char	*p;
	
	p=DSK_strrchr(fname,'.');
	if (p!=NULL)
		strcpy(extName,p+1);
	else
		*extName=0;
}




/* ファイル名の拡張子を変える */
void	DSK_changeExtName(char *fname,char *ext)
{
	char	*p;
	int		len;
	
	p=DSK_strrchr(fname,'.');
	len=strlen(fname);
	if (p!=NULL)
	{
		*(p+1)=0;
		strcat(fname,ext);
	}
	else
	{
		fname[len]='.';
		fname[len+1]=0;
		strcat(fname,ext);
	}
	return;
}




/* ファイル名を大文字にする */
void	DSK_toupperFileName(char *fname)
{
	int		i,len;
	
	len=strlen(fname);
	
	if (islower(fname[0]))
		fname[0]=toupper(fname[0]);
	for (i=1;i<len;i++)
	{
		if ( (islower(fname[i])) && (!iskanjif(fname,&fname[i-1])) )
				fname[i]=toupper(fname[i]);
	}
	return;
}




/* ファイル名を小文字にする */
void	DSK_tolowerFileName(char *fname)
{
	int		i,len;
	
	len=strlen(fname);
	
	if (isupper(fname[0]))
		fname[0]=tolower(fname[0]);
	for (i=1;i<len;i++)
	{
		if ( (isupper(fname[i])) && (!iskanjif(fname,&fname[i-1])) )
			fname[i]=tolower(fname[i]);
	}
	return;
}




/* ドライブ番号をファイル名から得る */
/* DSK_dskfに渡せる形式で */
char	DSK_getDrive(char *fname)
{
	char	drv;
	char	*p;
	
	p=strstr(fname,":");
	if (p==NULL)
		return(0);
	drv=*(p-1);
	drv=tolower(drv);
	drv=drv-'a'+1;
	return(drv);
}




/* 拡張子名の比較 */
int		DSK_extcmp(char *fname,char *extName)
{
	char	e[4];
	DSK_getExtName(fname,e);
	return(strcmp(e,extName));
}




/* ファイル名からパス名を取り出す */
void	DSK_file2path(char *fname,char *pname)
{
	char	*p;
	
	strcpy(pname,fname);
	if	((p=DSK_strrchr(pname,'\\'))==NULL)
	{
		if ((p=DSK_strchr(pname,':'))==NULL)
		{
			pname[0]=0;
			return;
		}
	}
	*(p+1)=0;
	return;
}




/* ファイルのサイズを返す */
long	DSK_fsize(FILE *fp)
{
	long	p,ret;
	
	p=ftell(fp);
	fseek(fp,0,SEEK_END);
	ret=ftell(fp);
	fseek(fp,p,SEEK_SET);
	return(ret);
}


