2312 lines · 36.7 KB · C
RawDownload
/* 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. * See README.txt for an overview of the Vim source code. */ /* * farsi.c: functions for Farsi language * * Included by main.c, when FEAT_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 inttoF_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 .*/    inttoF_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 intF_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 intF_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 intF_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 inttoF_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 voidput_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 voidput_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 voidchg_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;    }

Lines 1–500 of 2312.