Mercurial > vim
diff src/farsi.c @ 9399:43b8570abbec v7.4.1981
commit https://github.com/vim/vim/commit/ee2615af64fdcee87d8e4b13b65356e77fbd969b
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jul 2 18:25:34 2016 +0200
patch 7.4.1981
Problem: No testing for Farsi code.
Solution: Add a minimal test. Clean up Farsi code.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 02 Jul 2016 18:30:05 +0200 |
parents | d7e1526ae1b9 |
children | 9b048dced116 |
line wrap: on
line diff
--- a/src/farsi.c +++ b/src/farsi.c @@ -35,7 +35,7 @@ static int toF_ending(int c); static void lrswapbuf(char_u *buf, int len); /* -** Convert the given Farsi character into a _X or _X_ type + * Convert the given Farsi character into a _X or _X_ type */ static int toF_Xor_X_(int c) @@ -44,61 +44,35 @@ toF_Xor_X_(int c) 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 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 YE_: return _YE; case YEE: - case YEE_: - return _YEE; + case YEE_: return _YEE; case IE: - case IE_: - return _IE; + case IE_: return _IE; case F_HE: tempc = _HE; @@ -128,86 +102,58 @@ toF_Xor_X_(int c) } /* -** Convert the given Farsi character into Farsi capital character . + * Convert the given Farsi character into Farsi capital character. */ - int -toF_TyA(int c ) + static int +toF_TyA(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 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 _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 _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 YE_: return YE; case _YEE: - case YEE_: - return YEE; - case TEE_: - return TEE; + case YEE_: return YEE; + case TEE_: return TEE; case _IE: - case IE_: - return IE; + case IE_: return IE; case _HE: - case _HE_: - return F_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. + * 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(int src, int offset) @@ -258,7 +204,7 @@ F_is_TyB_TyC_TyD(int src, int offset) } /* -** Is the Farsi character one of the terminating only type. + * Is the Farsi character one of the terminating only type. */ static int F_is_TyE(int c) @@ -281,7 +227,7 @@ F_is_TyE(int c) } /* -** Is the Farsi character one of the none leading type. + * Is the Farsi character one of the none leading type. */ static int F_is_TyC_TyD(int c) @@ -305,7 +251,7 @@ F_is_TyC_TyD(int c) } /* -** Convert a none leading Farsi char into a leading type. + * Convert a none leading Farsi char into a leading type. */ static int toF_TyB(int c) @@ -313,7 +259,7 @@ toF_TyB(int c) switch (c) { case ALEF_: return ALEF; - case ALEF_U_H_: return ALEF_U_H; + 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; @@ -328,7 +274,7 @@ toF_TyB(int c) } /* -** Overwrite the current redo and cursor characters + left adjust + * Overwrite the current redo and cursor characters + left adjust. */ static void put_curr_and_l_to_X(int c) @@ -373,7 +319,7 @@ put_and_redo(int c) } /* -** Change the char. under the cursor to a X_ or X type + * Change the char. under the cursor to a X_ or X type */ static void chg_c_toX_orX(void) @@ -497,7 +443,7 @@ chg_c_toX_orX(void) } /* -** Change the char. under the cursor to a _X_ or X_ type + * Change the char. under the cursor to a _X_ or X_ type */ static void @@ -549,7 +495,7 @@ chg_c_to_X_orX_(void) } /* -** Change the char. under the cursor to a _X_ or _X type + * Change the char. under the cursor to a _X_ or _X type */ static void chg_c_to_X_or_X (void) @@ -580,10 +526,10 @@ chg_c_to_X_or_X (void) } /* -** Change the character left to the cursor to a _X_ or X_ type + * Change the character left to the cursor to a _X_ or X_ type */ static void -chg_l_to_X_orX_ (void) +chg_l_to_X_orX_(void) { int tempc; @@ -648,7 +594,7 @@ chg_l_to_X_orX_ (void) } /* -** Change the character left to the cursor to a X or _X type + * Change the character left to the cursor to a X or _X type */ static void @@ -717,7 +663,7 @@ chg_l_toXor_X (void) } /* -** Change the character right to the cursor to a _X or _X_ type + * Change the character right to the cursor to a _X or _X_ type */ static void @@ -742,7 +688,7 @@ chg_r_to_Xor_X_(void) } /* -** Map Farsi keyboard when in fkmap mode. + * Map Farsi keyboard when in fkmap mode. */ int @@ -899,8 +845,8 @@ fkmap(int c) if (p_ri && c == NL && curwin->w_cursor.col) { /* - ** If the char before the cursor is _X_ or X_ do not change - ** the one under the cursor with X type. + * If the char before the cursor is _X_ or X_ do not change + * the one under the cursor with X type. */ dec_cursor(); @@ -914,8 +860,7 @@ fkmap(int c) inc_cursor(); } - if (!p_ri) - if (!curwin->w_cursor.col) + if (!p_ri && !curwin->w_cursor.col) { switch (c) { @@ -1154,43 +1099,42 @@ fkmap(int c) case 'a': tempc = _SHIN; - break; + break; case 'A': tempc = WAW_H; - break; + break; case 'b': tempc = ZAL; - break; + break; case 'c': tempc = ZE; - break; + break; case 'C': tempc = JE; - break; + break; case 'd': tempc = _YE; - break; + break; case 'D': tempc = _YEE; - break; + break; case 'e': tempc = _SE; - break; + break; case 'f': tempc = _BE; - break; + break; case 'g': tempc = _LAM; - break; + break; case 'G': if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) - { + { if (gchar_cursor() == _LAM) chg_c_toX_orX (); - else - if (p_ri) - chg_c_to_X_or_X (); + else if (p_ri) + chg_c_to_X_or_X (); } if (!p_ri) @@ -1204,16 +1148,15 @@ fkmap(int c) { chg_c_toX_orX (); chg_l_toXor_X (); - tempc = ALEF_U_H; + tempc = ALEF_U_H; + } + else if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) + { + tempc = ALEF_U_H_; + chg_l_toXor_X (); } else - if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) - { - tempc = ALEF_U_H_; - chg_l_toXor_X (); - } - else - tempc = ALEF_U_H; + tempc = ALEF_U_H; if (!p_ri) inc_cursor(); @@ -1249,11 +1192,11 @@ fkmap(int c) { if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) { - tempc = ALEF_; + tempc = ALEF_; chg_l_toXor_X (); } else - tempc = ALEF; + tempc = ALEF; } if (!p_ri) @@ -1261,8 +1204,8 @@ fkmap(int c) return tempc; case 'i': - if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) - { + if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) + { if (!p_ri && !F_is_TyE(tempc)) chg_c_to_X_orX_ (); if (p_ri) @@ -1277,9 +1220,9 @@ fkmap(int c) dec_cursor(); if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) - tempc = _HE_; + tempc = _HE_; else - tempc = _HE; + tempc = _HE; if (!p_ri) inc_cursor(); @@ -1289,7 +1232,7 @@ fkmap(int c) break; case 'J': if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) - { + { if (p_ri) chg_c_to_X_or_X (); @@ -1304,11 +1247,11 @@ fkmap(int c) if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) { - tempc = TEE_; + tempc = TEE_; chg_l_toXor_X (); } else - tempc = TEE; + tempc = TEE; if (!p_ri) inc_cursor(); @@ -1385,7 +1328,7 @@ fkmap(int c) break; case 'y': if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) - { + { if (!p_ri && !F_is_TyE(tempc)) chg_c_to_X_orX_ (); if (p_ri) @@ -1434,7 +1377,7 @@ fkmap(int c) if ((F_isalpha(tempc) || F_isdigit(tempc))) { if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) - { + { if (!p_ri && !F_is_TyE(tempc)) chg_c_to_X_orX_ (); if (p_ri) @@ -1461,7 +1404,7 @@ fkmap(int c) } /* -** Convert a none leading Farsi char into a leading type. + * Convert a none leading Farsi char into a leading type. */ static int toF_leading(int c) @@ -1515,7 +1458,7 @@ toF_leading(int c) } /* -** Convert a given Farsi char into right joining type. + * Convert a given Farsi char into right joining type. */ static int toF_Rjoin(int c) @@ -1571,7 +1514,7 @@ toF_Rjoin(int c) } /* -** Can a given Farsi character join via its left edj. + * Can a given Farsi character join via its left edj. */ static int canF_Ljoin(int c) @@ -1645,7 +1588,7 @@ canF_Ljoin(int c) } /* -** Can a given Farsi character join via its right edj. + * Can a given Farsi character join via its right edj. */ static int canF_Rjoin(int c) @@ -1673,7 +1616,7 @@ canF_Rjoin(int c) } /* -** is a given Farsi character a terminating type. + * is a given Farsi character a terminating type. */ static int F_isterm(int c) @@ -1700,86 +1643,54 @@ F_isterm(int c) } /* -** Convert the given Farsi character into a ending type . + * Convert the given Farsi character into a ending type . */ static int toF_ending(int c) { - 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 _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_H: - case _KAF: - return KAF; - case _GAF: - return GAF; - case _LAM: - return LAM; - case _MIM: - return MIM; - case _NOON: - return NOON; - case _YE: - return YE_; - case YE_: - return YE; - case _YEE: - return YEE_; - case YEE_: - return YEE; - case TEE: - return TEE_; - case _IE: - return IE_; - case IE_: - return IE; + case _KAF: return KAF; + case _GAF: return GAF; + case _LAM: return LAM; + case _MIM: return MIM; + case _NOON: return NOON; + case _YE: return YE_; + case YE_: return YE; + case _YEE: return YEE_; + case YEE_: return YEE; + case TEE: return TEE_; + case _IE: return IE_; + case IE_: return IE; case _HE: - case _HE_: - return F_HE; + case _HE_: return F_HE; } return c; } /* -** Convert the Farsi 3342 standard into Farsi VIM. + * Convert the Farsi 3342 standard into Farsi VIM. */ - void + static void conv_to_pvim(void) { char_u *ptr; @@ -1791,7 +1702,7 @@ conv_to_pvim(void) llen = (int)STRLEN(ptr); - for ( i = 0; i < llen-1; i++) + for (i = 0; i < llen-1; i++) { if (canF_Ljoin(ptr[i]) && canF_Rjoin(ptr[i+1])) { @@ -1817,8 +1728,8 @@ conv_to_pvim(void) * Following lines contains Farsi encoded character. */ - do_cmdline_cmd((char_u *)"%s/\202\231/\232/g"); - do_cmdline_cmd((char_u *)"%s/\201\231/\370\334/g"); + do_cmdline_cmd((char_u *)"%s/\202\231/\232/ge"); + do_cmdline_cmd((char_u *)"%s/\201\231/\370\334/ge"); /* Assume the screen has been messed up: clear it and redraw. */ redraw_later(CLEAR); @@ -1828,7 +1739,7 @@ conv_to_pvim(void) /* * Convert the Farsi VIM into Farsi 3342 standard. */ - void + static void conv_to_pstd(void) { char_u *ptr; @@ -1837,20 +1748,15 @@ conv_to_pstd(void) /* * Following line contains Farsi encoded character. */ - - do_cmdline_cmd((char_u *)"%s/\232/\202\231/g"); + do_cmdline_cmd((char_u *)"%s/\232/\202\231/ge"); for (lnum = 1; lnum <= curbuf->b_ml.ml_line_count; ++lnum) { ptr = ml_get((linenr_T)lnum); - llen = (int)STRLEN(ptr); - for ( i = 0; i < llen; i++) - { + for (i = 0; i < llen; i++) ptr[i] = toF_TyA(ptr[i]); - - } } /* Assume the screen has been messed up: clear it and redraw. */ @@ -2148,7 +2054,7 @@ cmdl_fkmap(int c) case 'f': return _BE; case 'g': return _LAM; case 'G': - if (cmd_gchar(AT_CURSOR) == _LAM ) + if (cmd_gchar(AT_CURSOR) == _LAM) { cmd_pchar(LAM, AT_CURSOR); return ALEF_U_H; @@ -2159,7 +2065,7 @@ cmdl_fkmap(int c) else return ALEF_U_H; case 'h': - if (cmd_gchar(AT_CURSOR) == _LAM ) + if (cmd_gchar(AT_CURSOR) == _LAM) { cmd_pchar(LA, AT_CURSOR); redrawcmdline(); @@ -2215,9 +2121,9 @@ cmdl_fkmap(int c) case ',': return WAW; case '[': return _JIM; case ']': return _CHE; - } + } - return c; + return c; } /* @@ -2226,7 +2132,7 @@ cmdl_fkmap(int c) int F_isalpha(int c) { - return (( c >= TEE_ && c <= _YE) + return ((c >= TEE_ && c <= _YE) || (c >= ALEF_A && c <= YE) || (c >= _IE && c <= YE_)); } @@ -2246,45 +2152,40 @@ F_isdigit(int c) int F_ischar(int c) { - return (c >= TEE_ && c <= YE_); + return (c >= TEE_ && c <= YE_); } void -farsi_fkey( - cmdarg_T *cap) +farsi_f8(cmdarg_T *cap UNUSED) { - int c = cap->cmdchar; - - if (c == K_F8) + if (p_altkeymap) { - if (p_altkeymap) + if (curwin->w_farsi & W_R_L) { - if (curwin->w_farsi & W_R_L) - { - p_fkmap = 0; - do_cmdline_cmd((char_u *)"set norl"); - MSG(""); - } - else - { - p_fkmap = 1; - do_cmdline_cmd((char_u *)"set rl"); - MSG(""); - } + p_fkmap = 0; + do_cmdline_cmd((char_u *)"set norl"); + MSG(""); + } + else + { + p_fkmap = 1; + do_cmdline_cmd((char_u *)"set rl"); + MSG(""); + } - curwin->w_farsi = curwin->w_farsi ^ W_R_L; - } - } - - if (c == K_F9) - { - if (p_altkeymap && curwin->w_p_rl) - { - curwin->w_farsi = curwin->w_farsi ^ W_CONV; - if (curwin->w_farsi & W_CONV) - conv_to_pvim(); - else - conv_to_pstd(); - } + curwin->w_farsi = curwin->w_farsi ^ W_R_L; } } + + void +farsi_f9(cmdarg_T *cap UNUSED) +{ + if (p_altkeymap && curwin->w_p_rl) + { + curwin->w_farsi = curwin->w_farsi ^ W_CONV; + if (curwin->w_farsi & W_CONV) + conv_to_pvim(); + else + conv_to_pstd(); + } +}