⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 farsi.c

📁 VIM文本编辑器
💻 C
📖 第 1 页 / 共 3 页
字号:
/* vi:set ts=8 sts=4 sw=4:
 *
 * VIM - Vi IMproved	by Bram Moolenaar
 *
 * Do ":help uganda"  in Vim to read copying and usage conditions.
 * Do ":help credits" in Vim to see a list of people who contributed.
 */

/*
 * farsi.c: functions for Farsi language
 *
 * Included by main.c, when FKMAP is defined.
 */

static int toF_Xor_X_ __ARGS((int c));
static int F_is_TyE __ARGS((int c));
static int F_is_TyC_TyD __ARGS((int c));
static int F_is_TyB_TyC_TyD __ARGS((int src, int offset));
static int toF_TyB __ARGS((int c));
static void put_curr_and_l_to_X __ARGS((int c));
static void put_and_redo __ARGS((int c));
static void chg_c_toX_orX __ARGS((void));
static void chg_c_to_X_orX_ __ARGS((void));
static void chg_c_to_X_or_X __ARGS((void));
static void chg_l_to_X_orX_ __ARGS((void));
static void chg_l_toXor_X __ARGS((void));
static void chg_r_to_Xor_X_ __ARGS((void));
static int toF_leading __ARGS((int c));
static int toF_Rjoin __ARGS((int c));
static int canF_Ljoin __ARGS((int c));
static int canF_Rjoin __ARGS((int c));
static int F_isterm __ARGS((int c));
static int toF_ending __ARGS((int c));
static void lrswapbuf __ARGS((char_u *buf, int len));

/*
** Convert the given Farsi character into a _X or _X_ type
*/
    static int
toF_Xor_X_(c)
    int	c;
{
    int tempc;

    switch (c)
    {
	case BE:
		return _BE;
	case PE:
		return _PE;
	case TE:
		return _TE;
	case SE:
		return _SE;
	case JIM:
		return _JIM;
	case CHE:
		return _CHE;
	case HE_J:
		return _HE_J;
	case XE:
		return _XE;
	case SIN:
		return _SIN;
	case SHIN:
		return _SHIN;
	case SAD:
		return _SAD;
	case ZAD:
		return _ZAD;
	case AYN:
		return _AYN;
	case AYN_:
		return _AYN_;
	case GHAYN:
		return _GHAYN;
	case GHAYN_:
		return _GHAYN_;
	case FE:
		return _FE;
	case GHAF:
		return _GHAF;
	case KAF:
		return _KAF;
	case GAF:
		return _GAF;
	case LAM:
		return _LAM;
	case MIM:
		return _MIM;
	case NOON:
		return _NOON;
	case YE:
	case YE_:
		return _YE;
	case YEE:
	case YEE_:
		return _YEE;
	case IE:
	case IE_:
		return _IE;
	case F_HE:
		tempc = _HE;

		if (p_ri && (curwin->w_cursor.col+1 < STRLEN(ml_get_curline())))
		{
		    inc_cursor();

		    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
			tempc = _HE_;

		    dec_cursor();
		}
		if (!p_ri && STRLEN(ml_get_curline()))
		{
		    dec_cursor();

		    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
			tempc = _HE_;

		    inc_cursor();
		}

		return tempc;
    }
    return 0;
}

/*
** Convert the given Farsi character into Farsi capital character .
*/
    int
toF_TyA(c)
    int	c ;
{
    switch (c)
    {
	case ALEF_:
		return ALEF;
	case ALEF_U_H_:
		return ALEF_U_H;
	case _BE:
		return BE;
	case _PE:
		return PE;
	case _TE:
		return TE;
	case _SE:
		return SE;
	case _JIM:
		return JIM;
	case _CHE:
		return CHE;
	case _HE_J:
		return HE_J;
	case _XE:
		return XE;
	case _SIN:
		return SIN;
	case _SHIN:
		return SHIN;
	case _SAD:
		return SAD;
	case _ZAD:
		return ZAD;
	case _AYN:
	case AYN_:
	case _AYN_:
		return AYN;
	case _GHAYN:
	case GHAYN_:
	case _GHAYN_:
		return GHAYN;
	case _FE:
		return FE;
	case _GHAF:
		return GHAF;
/* I am not sure what it is !!!	    case _KAF_H: */
	case _KAF:
		return KAF;
	case _GAF:
		return GAF;
	case _LAM:
		return LAM;
	case _MIM:
		return MIM;
	case _NOON:
		return NOON;
	case _YE:
	case YE_:
		return YE;
	case _YEE:
	case YEE_:
		return YEE;
	case TEE_:
		return TEE;
	case _IE:
	case IE_:
		return IE;
	case _HE:
	case _HE_:
		return F_HE;
    }
    return c;
}

/*
** Is the character under the cursor+offset in the given buffer a join type.
** That is a character that is combined with the others.
** Note: the offset is used only for command line buffer.
*/
    static int
F_is_TyB_TyC_TyD(src, offset)
    int	    src,    offset;
{
int	c;

    if ( src == SRC_EDT)
	c = gchar_cursor();
    else
	c = cmd_gchar(AT_CURSOR+offset);

    switch (c)
    {
	case _LAM:
	case _BE:
	case _PE:
	case _TE:
	case _SE:
	case _JIM:
	case _CHE:
	case _HE_J:
	case _XE:
	case _SIN:
	case _SHIN:
	case _SAD:
	case _ZAD:
	case _TA:
	case _ZA:
	case _AYN:
	case _AYN_:
	case _GHAYN:
	case _GHAYN_:
	case _FE:
	case _GHAF:
	case _KAF:
	case _KAF_H:
	case _GAF:
	case _MIM:
	case _NOON:
	case _YE:
	case _YEE:
	case _IE:
	case _HE_:
	case _HE:
		return TRUE;
    }
    return FALSE;
}

/*
** Is the Farsi character one of the terminating only type.
*/
    static int
F_is_TyE(c)
    int	    c;
{
    switch (c)
    {
	case ALEF_A:
	case ALEF_D_H:
	case DAL:
	case ZAL:
	case RE:
	case ZE:
	case JE:
	case WAW:
	case WAW_H:
	case HAMZE:
		return TRUE;
    }
    return FALSE;
}

/*
** Is the Farsi character one of the none leading type.
*/
    static int
F_is_TyC_TyD(c)
    int	    c;
{
    switch (c)
    {
	case ALEF_:
	case ALEF_U_H_:
	case _AYN_:
	case AYN_:
	case _GHAYN_:
	case GHAYN_:
	case _HE_:
	case YE_:
	case IE_:
	case TEE_:
	case YEE_:
		return TRUE;
    }
    return FALSE;
}

/*
** Convert a none leading Farsi char into a leading type.
*/
    static int
toF_TyB(c)
    int	    c;
{
    switch (c)
    {
	case ALEF_:	return ALEF;
	case ALEF_U_H_:	    return ALEF_U_H;
	case _AYN_:	return _AYN;
	case AYN_:	return AYN;	/* exception - there are many of them */
	case _GHAYN_:	return _GHAYN;
	case GHAYN_:	return GHAYN;	/* exception - there are many of them */
	case _HE_:	return _HE;
	case YE_:	return YE;
	case IE_:	return IE;
	case TEE_:	return TEE;
	case YEE_:	return YEE;
    }
    return c;
}

/*
** Overwrite the current redo and cursor characters + left adjust
*/
    static void
put_curr_and_l_to_X(c)
    int		  c;
{
    int	tempc;

    if (curwin->w_p_rl && p_ri)
	return;

    if ( (curwin->w_cursor.col < STRLEN(ml_get_curline())))
    {
	if ((p_ri && curwin->w_cursor.col) || !p_ri)
	{
	    if (p_ri)
		dec_cursor();
	    else
		inc_cursor();

	    if (F_is_TyC_TyD((tempc = gchar_cursor())))
	    {
		pchar_cursor(toF_TyB(tempc));
		AppendCharToRedobuff(K_BS);
		AppendCharToRedobuff(tempc);
	    }

	    if (p_ri)
		inc_cursor();
	    else
		dec_cursor();
	}
    }

    put_and_redo(c);
}

    static void
put_and_redo(c)
    int c;
{
    pchar_cursor(c);
    AppendCharToRedobuff(K_BS);
    AppendCharToRedobuff(c);
}

/*
** Change the char. under the cursor to a X_ or X type
*/
    static void
chg_c_toX_orX()
{
    int	tempc, curc;

    switch ((curc = gchar_cursor()))
    {
	case _BE:
		tempc = BE;
		break;
	case _PE:
		tempc = PE;
		break;
	case _TE:
		tempc = TE;
		break;
	case _SE:
		tempc = SE;
		break;
	case _JIM:
		tempc = JIM;
		break;
	case _CHE:
		tempc = CHE;
		break;
	case _HE_J:
		tempc = HE_J;
		break;
	case _XE:
		tempc = XE;
		break;
	case _SIN:
		tempc = SIN;
		break;
	case _SHIN:
		tempc = SHIN;
		break;
	case _SAD:
		tempc = SAD;
		break;
	case _ZAD:
		tempc = ZAD;
		break;
	case _FE:
		tempc = FE;
		break;
	case _GHAF:
		tempc = GHAF;
		break;
	case _KAF_H:
	case _KAF:
		tempc = KAF;
		break;
	case _GAF:
		tempc = GAF;
		break;
	case _AYN:
		tempc = AYN;
		break;
	case _AYN_:
		tempc = AYN_;
		break;
	case _GHAYN:
		tempc = GHAYN;
		break;
	case _GHAYN_:
		tempc = GHAYN_;
		break;
	case _LAM:
		tempc = LAM;
		break;
	case _MIM:
		tempc = MIM;
		break;
	case _NOON:
		tempc = NOON;
		break;
	case _HE:
	case _HE_:
		tempc = F_HE;
		break;
	case _YE:
	case _IE:
	case _YEE:
		if (p_ri)
		{
		    inc_cursor();
		    if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
			    tempc = (curc == _YE ? YE_ :
			    (curc == _IE ? IE_ : YEE_));
		    else
			    tempc = (curc == _YE ? YE :
			    (curc == _IE ? IE : YEE));
		    dec_cursor();
		}
		else
		{
		    if (curwin->w_cursor.col)
		    {
			dec_cursor();
			if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR))
				tempc = (curc == _YE ? YE_ :
				(curc == _IE ? IE_ : YEE_));
			else
				tempc = (curc == _YE ? YE :
				(curc == _IE ? IE : YEE));
			inc_cursor();
		    }
		    else
			    tempc = (curc == _YE ? YE :
			    (curc == _IE ? IE : YEE));
		}
		break;
	default:
		tempc = 0;
    }

    if (tempc)
	put_and_redo(tempc);
}

/*
** Change the char. under the cursor to a _X_ or X_ type
*/

    static void
chg_c_to_X_orX_()
{
    int	tempc;

    switch (gchar_cursor())
    {
	case ALEF:
		tempc = ALEF_;
		break;
	case ALEF_U_H:
		tempc = ALEF_U_H_;
		break;
	case _AYN:
		tempc = _AYN_;
		break;
	case AYN:
		tempc = AYN_;
		break;
	case _GHAYN:
		tempc = _GHAYN_;
		break;
	case GHAYN:
		tempc = GHAYN_;
		break;
	case _HE:
		tempc = _HE_;
		break;
	case YE:
		tempc = YE_;
		break;
	case IE:
		tempc = IE_;
		break;
	case TEE:
		tempc = TEE_;
		break;
	case YEE:
		tempc = YEE_;
		break;
	default:
		tempc = 0;
    }

    if (tempc)
	put_and_redo(tempc);
}

/*
** Change the char. under the cursor to a _X_ or _X type
*/
    static void
chg_c_to_X_or_X ()
{
    int	tempc;

    tempc = gchar_cursor();

    if (curwin->w_cursor.col+1 < STRLEN(ml_get_curline()))
    {
	inc_cursor();

	if ((tempc == F_HE) && (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)))
	{
	    tempc = _HE_;

	    dec_cursor();

	    put_and_redo(tempc);
	    return;
	}

	dec_cursor();
    }

    if ((tempc = toF_Xor_X_(tempc)))
	put_and_redo(tempc);
}

/*
** Change the character left to the cursor to a _X_ or X_ type
*/
    static void
chg_l_to_X_orX_ ()
{
    int	tempc;

    if (!curwin->w_cursor.col &&
	(curwin->w_cursor.col+1 == STRLEN(ml_get_curline())))
	return;

    if (!curwin->w_cursor.col && p_ri)
	return;

    if (p_ri)
	dec_cursor();
    else
	inc_cursor();

    switch (gchar_cursor())
    {
	case ALEF:
		tempc = ALEF_;
		break;
	case ALEF_U_H:
		tempc = ALEF_U_H_;
		break;
	case _AYN:
		tempc = _AYN_;
		break;
	case AYN:
		tempc = AYN_;
		break;
	case _GHAYN:
		tempc = _GHAYN_;
		break;
	case GHAYN:
		tempc = GHAYN_;
		break;
	case _HE:
		tempc = _HE_;
		break;
	case YE:
		tempc = YE_;
		break;
	case IE:
		tempc = IE_;
		break;
	case TEE:
		tempc = TEE_;
		break;
	case YEE:
		tempc = YEE_;
		break;
	default:
		tempc = 0;
    }

    if (tempc)
	put_and_redo(tempc);

    if (p_ri)
	inc_cursor();
    else
	dec_cursor();
}

/*
** Change the charcter left to the cursor to a X or _X type
*/

    static void
chg_l_toXor_X ()
{
    int	tempc;

    if (!curwin->w_cursor.col &&
	(curwin->w_cursor.col+1 == STRLEN(ml_get_curline())))
	return;

    if (!curwin->w_cursor.col && p_ri)
	return;

    if (p_ri)
	dec_cursor();
    else
	inc_cursor();

    switch (gchar_cursor())
    {
	case ALEF_:
		tempc = ALEF;
		break;
	case ALEF_U_H_:
		tempc = ALEF_U_H;
		break;
	case _AYN_:
		tempc = _AYN;
		break;
	case AYN_:
		tempc = AYN;
		break;
	case _GHAYN_:
		tempc = _GHAYN;
		break;
	case GHAYN_:
		tempc = GHAYN;
		break;
	case _HE_:
		tempc = _HE;
		break;
	case YE_:
		tempc = YE;
		break;
	case IE_:
		tempc = IE;
		break;
	case TEE_:
		tempc = TEE;
		break;
	case YEE_:
		tempc = YEE;
		break;
	default:
		tempc = 0;
    }

    if (tempc)
	put_and_redo(tempc);

    if (p_ri)
	inc_cursor();
    else
	dec_cursor();
}

/*
** Change the charcter right to the cursor to a _X or _X_ type
*/

    static void
chg_r_to_Xor_X_()
{
int tempc, c;

    if (curwin->w_cursor.col)
    {
	if (!p_ri)
	    dec_cursor();

	tempc = gchar_cursor();

	if ((c = toF_Xor_X_(tempc)))
	    put_and_redo(c);

	if (!p_ri)
	    inc_cursor();

    }
}

/*
** Map Farsi keyboard when in fkmap mode.
*/

    int
fkmap(c)
    int c;
{
    int		tempc;
    static int	revins;

    if (vim_isdigit(c) || ((c == '.' || c == '+' || c == '-' ||
	c == '^' || c == '%' || c == '#' || c == '=')  && revins))
    {
	if (!revins)
	{
	    if (curwin->w_cursor.col)
	    {
		if (!p_ri)
		    dec_cursor();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -