/* 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. Load more
/* 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 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; }