/*************************************************************************
*	"mktags.cci"  : 関数の定義位置を見つけ出す
*************************************************************************/

char	_mktags_mode;
char	*_mktags_fp;

#define	_MKTAGS_MODE	_mktags_mode
#define	_MKTAGS_FP		_mktags_fp

#define	_MKTAGS_PTN		"^[A-Za-z_].*[ \\t]*[\\*A-Za-z_].*(.*)\\|^#[ \\t]*define[ \\t]*[A-Za-z_].*(.*)"

/*	ファイル出力	*/
int		_mktags_main_file(char *fn)
{
	char		*fp;
	char		buf[512], tmp[128];
	int			ret, pos, len, ln, ch, ec;
	char		*reptn;

	sprintf( tmp,"---------- %s ----------\r\n", fn );
	if ( (reptn = RePtnAlloc(_MKTAGS_PTN,0)) == NULL )
		return (ERR);
	DCN_puts( DCNPTR, tmp );
	fputs( tmp, _MKTAGS_FP );
	if ( (fp = FM_fopen(fn,"rb")) == NULL )
	{	RePtnFree( reptn );
		return (ERR);
	}
	ret = 0;
	ln = 0;
	while ( fgets(buf,512,fp) != NULL )
	{
		++ln;
		if ( RePtnMatch2( reptn, buf, &pos, &len) > 0 && pos == 0 )
		{	/* match */
			sprintf( tmp, "%-14s %d: ", fn, ln );
			fputs( tmp, _MKTAGS_FP);
			fputs( buf, _MKTAGS_FP);
		}
		if ( getkey(&ec) == '\x1B' || (ec&0xFF14) == KA_CANCEL )
		{	DCN_puts( DCNPTR, "<<<BREAK>>>\r\n" );
			ret = 1;
			break;
		}
	}
	FM_fclose(fp);
	RePtnFree( reptn );
	return (ret);
}

/*	画面表示	*/
int		_mktags_main_scn(char *fn)
{
	char		*fp;
	char		buf[512], tmp[128];
	int			ret, pos, len, ln, ch, ec;
	char		*reptn;

	sprintf( tmp,"---------- %s ----------\r\n", fn );
	if ( (reptn = RePtnAlloc(_MKTAGS_PTN,0)) == NULL )
		return (ERR);
	DCN_puts(DCNPTR,tmp);
	if ( (fp = FM_fopen(fn,"rb")) == NULL )
	{	RePtnFree( reptn );
		return (ERR);
	}
	ret = 0;
	ln = 0;
	while ( fgets(buf,512,fp) != NULL )
	{	++ln;
		if ( RePtnMatch2( reptn, buf, &pos, &len) > 0 && pos == 0 )
		{	/* match */
			sprintf( tmp, "%-14s %d: ", fn, ln );
			DCN_puts(DCNPTR, tmp);
			DCN_puts(DCNPTR, buf);
		}
		if ( getkey(&ec) == '\x1B' || (ec&0xFF14) == KA_CANCEL )
		{	DCN_puts(DCNPTR, "<<<BREAK>>>\r\n");
			ret = 1;
			break;
		}
	}
	FM_fclose(fp);
	RePtnFree( reptn );

	return (ret);
}

int		_mktags_extract( char *wild )
{
	char	buf[64];
	int		ret, cnt;

#if	0
	sprintf( buf, "[wild:%s]\r\n", wild );
	DCN_puts(DCNPTR, buf);
#endif

	cnt = 0;
	ret = FM_findfirst( wild, 0, buf );
	while ( ret == 0 )
	{
		++cnt;
#ifdef	_TAROPYON_SYSTEM
		if ( FS_cmpfnam( buf, "newhewin.cci")  )
		{	/* "newhewin.cci" は処理しない	*/
#endif
			if ( _MKTAGS_MODE )
				ret = _mktags_main_file( buf );
			else
				ret = _mktags_main_scn( buf );
#ifdef	_TAROPYON_SYSTEM
		}
#endif
		if ( ret > 0 )
			break;	/* 中断	*/
		ret = FM_findnext( buf );
	}
	return (cnt > 0 ? NORMAL : ERR);
}

int		MkTags( int argc, char **argv)
{
	int		i;
	char	*s;

	if ( _MKTAGS_MODE )
	{	if ( (_MKTAGS_FP = FM_fopen("tags","wb")) == NULL )
			return (ERR);
	}
	for ( i = 1; i < argc; ++i )
	{	s = argv[i];
		if ( *s == '-' || *s == '/' )
		{	/* option */
		} else
		{	_mktags_extract( s );
		}
	}
	if ( _MKTAGS_MODE )
		FM_fclose(_MKTAGS_FP);
	return (NORMAL);
}

/*************************************************************************
*	関数定義位置を表示する
*************************************************************************/

int		_dcn_searchFunction( char *dcn )
{
	int		i, ret;
	int		argc;
	char	**argv;
	char	*para;

	ret = MNU_sure ( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_LEFT,
"  　カレントディレクトリの 拡張子 .H .C .CCI ファイルから、  \n  関数定義，マクロ定義位置を探します。"
	);
	if ( ret != MENU_SURE_OK )
		return (ERR);

	_MKTAGS_MODE = 0;
	DCNPTR = dcn;
	DCN_puts(DCNPTR,"\r\n");

	para = "mktags *.h *.c *.cci";
	argc = FS_argSet(para,&argv);
	if ( argc > 0 )
	{	MkTags( argc, argv );
		FS_argClear( argc, argv );
	}
	return	(DCNCMD_PROMPT);
}


/*************************************************************************
*	"tags" ファイルを作成
*************************************************************************/

int		_dcn_mktags( char *dcn )
{
	int		i, ret;
	int		argc;
	char	**argv;
	char	*para;

	ret = MNU_sure ( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
	    C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_LEFT,
"  　カレントディレクトリの 拡張子 .H .C .CCI ファイルから、  \n  \x22tags\x22ファイルを作成します。"
	);
	if ( ret != MENU_SURE_OK )
		return (ERR);

	_MKTAGS_MODE = 1;
	DCNPTR = dcn;
	DCN_puts(DCNPTR,"\r\n");

	para = "mktags *.h *.c *.cci";
	argc = FS_argSet(para,&argv);
	if ( argc > 0 )
	{	MkTags( argc, argv );
		FS_argClear( argc, argv );
	}
	return	(DCNCMD_PROMPT);
}

#undef	_MKTAGS_MODE
#undef	_MKTAGS_FP
#undef	_MKTAGS_PTN
