/*************************************************************************
*	テンプレート機能
*************************************************************************/


char	*_tdpTmp = NULL;	/* テンプレート管理用ワーク	*/

int		_tdpTmpData_open()
{
	char	tmp[256];

	if ( _tdpTmp == NULL )
	{
		if ( (_tdpTmp = AMAC_allocWork(0)) == NULL )
			return (ERR);
		sprintf( tmp,"%s%s", AplGetStartPath(), "tdptmp.tbl" );
		AMAC_load( _tdpTmp, tmp );
	}
	return (NORMAL);
}

/*************************************************************************
*	テンプレート機能
*************************************************************************/

int		TxdUsr_template( char *txd )
{
	char	word[256], tmp[4];
	int		ch, len;
	int		autoIndent;
	size_t	curLnL, curOfs, lnL;
	char	*s;

	if ( _tdpTmpData_open() )
		return (ERR);
	if ( TxdGet_selFlag(txd) != 0 )		/* 選択中なら処理しない	*/
		return (0);

	/* 現在カーソル位置を保存	----------------------------------------*/
	curLnL = TxdGet_curPosLnL(txd);
	if ( (curOfs = TxdGet_curPosOfs(txd)) == 0 )
		return (NORMAL);

	TXD_cmdJump( txd, TXD_PREVWORD );	/* １ワード戻る	*/
	if ( TxdGet_curPosLnL(txd) < curLnL )
		TXD_cmdJump( txd, TXD_CUR_RIGHT );
	if ( (ch = TXD_getch(txd)) < 0 || (isalpha(ch) == 0 && ch != '_') )
	{
		TXD_jumpPos( txd, curLnL, curOfs );
		return (NORMAL);
	}

	len = 0;
	while( len < 255 )
	{
		ch = TXD_getch(txd);
		TXD_cmdJump( txd, TXD_CUR_RIGHT );
		if ( isalpha(ch) || ch == '_' )
		{
			word[len++] = ch;
		} else
			break;
	}
	word[len] = '\0';
	TXD_jumpPos( txd, curLnL, curOfs );
	if ( len == 0 )
		return (NORMAL);

	if ( (s = AMAC_getName( _tdpTmp, word )) == NULL )
		return (NORMAL);	/* 登録データなし	*/

	/* オートインデント状態の保存／設定	--------------------------------*/
	autoIndent = TxdGet_autoIndent(txd);
	TxdSet_autoIndent(txd,TRUE);

	while ( *s )
	{
		ch = (*s) & 0xFF;
		++s;
		switch ( ch )
		{
			case '\x02':				/* 行頭に	*/
				TXD_cmdJump( txd, TXD_TOPOFLINE );
				break;
			case '\x06':				/* 行末に	*/
				TXD_cmdJump( txd, TXD_LASTOFLINE );
				break;
			case '\x08':				/* BS		*/
				TXD_cmdJump( txd, TXD_BS );
				break;
			case '\n':					/* 改行	*/
				TXD_cmdJump( txd, TXD_CR );
				break;
			case '\x0B':				/* ホーム位置	*/
				TXD_jumpPos( txd, curLnL, curOfs );
				break;
			case '\x1C':				/* カーソル右	*/
				TXD_cmdJump( txd, TXD_CUR_RIGHT );
				break;
			case '\x1D':				/* カーソル左	*/
				TXD_cmdJump( txd, TXD_CUR_LEFT );
				break;
			case '\x1E':				/* カーソル上	*/
				TXD_cmdJump( txd, TXD_CUR_UP );
				break;
			case '\x1F':				/* カーソル下	*/
				TXD_cmdJump( txd, TXD_CUR_DOWN );
				break;
			case '\x7F':				/* １文字削除	*/
				TXD_cmdJump( txd, TXD_DEL_CHAR );
				break;

			default:
				if ( iskanji(ch) && iskanji2(*s) )
				{	/* 全角	*/
					tmp[0] = ch;
					tmp[1] = *s;	++s;
					tmp[2] = '\0';
					TXD_setBuf( txd, 0, 2, tmp );
				} else
				{
					tmp[0] = ch;
					tmp[1] = '\0';
					TXD_setBuf( txd, 0, 1, tmp );
				}
				break;
		}
	} /* end of while() */
	TxdSet_autoIndent(txd,autoIndent);
	return (NORMAL);
}
