/* ディスク回りのお便利ルーチン集 */

#include	<stdio.h>
#include	<string.h>
#include	<dos.h>
#include	<ctype.h>


/* マクロとか */
#define	iskanji(c)	( (((c)>0x80)&&((c)<0xa0)) || (((c)>0xdf)&&((c)<0xfd)) )
#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);



/* staticグローバル変数 */
static	union REGS		r;
static	struct SREGS	sr;



/* はじまりはじまり〜 */

/* ドライブの空き容量を返す */
/* 0ならカレント,1ならAドライブ,2ならBドライブ... */
int		DSK_dskf(char drv)
{
	int		ret;
	
	r.h.ah=0x36;
	r.h.dl=drv;
	_intdos(&r,&r);
	
	ret=r.x.ax*r.x.bx*r.x.cx;
	
	return(ret);
}




/* ファイル名の拡張子を得る */
void	DSK_getExtName(char *fname,char *extName)
{
	char	*p;
	int		i;
	
	p=fname+strlen(fname)-1;
	
	while( (*p!='\\') && (*p!='.') && (p!=fname) )
		p--;
	
	if ( (*p=='\\') || (p==fname) )
	{
		extName[0]=0;
		return;
	}
	else
	{
		i=0;	p++;
		while( (*p!=0) && (i<3) )
		{
			extName[i]=*p;
			i++;	p++;
		}
		return;
	}
}




/* ファイル名の拡張子を変える */
void	DSK_changeExtName(char *fname,char *ext)
{
	char	*p;
	int		len;
	
	len=strlen(fname);
	p=fname+len-1;
	
	while( (*p!='\\') && (*p!='.') && (p!=fname) )
		p--;
	
	if (*p=='.')
	{
		*(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])) && (!iskanji(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])) && (!iskanji(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);
}



