To: vim_dev@googlegroups.com Subject: Patch 7.4.1981 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.1981 Problem: No testing for Farsi code. Solution: Add a minimal test. Clean up Farsi code. Files: src/farsi.c, src/Makefile, src/charset.c, src/normal.c, src/proto/main.pro, src/testdir/Make_all.mak, src/testdir/test_farsi.vim *** ../vim-7.4.1980/src/farsi.c 2016-02-24 12:57:46.460114833 +0100 --- src/farsi.c 2016-07-02 18:23:43.154215729 +0200 *************** *** 35,41 **** static void lrswapbuf(char_u *buf, int len); /* ! ** Convert the given Farsi character into a _X or _X_ type */ static int toF_Xor_X_(int c) --- 35,41 ---- static void lrswapbuf(char_u *buf, int len); /* ! * Convert the given Farsi character into a _X or _X_ type */ static int toF_Xor_X_(int c) *************** *** 44,104 **** 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; --- 44,78 ---- 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; *************** *** 128,213 **** } /* ! ** Convert the given Farsi character into Farsi capital character . */ ! 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 _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(int src, int offset) --- 102,159 ---- } /* ! * Convert the given Farsi character into Farsi capital character. */ ! 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 _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(int src, int offset) *************** *** 258,264 **** } /* ! ** Is the Farsi character one of the terminating only type. */ static int F_is_TyE(int c) --- 204,210 ---- } /* ! * Is the Farsi character one of the terminating only type. */ static int F_is_TyE(int c) *************** *** 281,287 **** } /* ! ** Is the Farsi character one of the none leading type. */ static int F_is_TyC_TyD(int c) --- 227,233 ---- } /* ! * Is the Farsi character one of the none leading type. */ static int F_is_TyC_TyD(int c) *************** *** 305,311 **** } /* ! ** Convert a none leading Farsi char into a leading type. */ static int toF_TyB(int c) --- 251,257 ---- } /* ! * Convert a none leading Farsi char into a leading type. */ static int toF_TyB(int c) *************** *** 313,319 **** 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; --- 259,265 ---- 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; *************** *** 328,334 **** } /* ! ** Overwrite the current redo and cursor characters + left adjust */ static void put_curr_and_l_to_X(int c) --- 274,280 ---- } /* ! * Overwrite the current redo and cursor characters + left adjust. */ static void put_curr_and_l_to_X(int c) *************** *** 373,379 **** } /* ! ** Change the char. under the cursor to a X_ or X type */ static void chg_c_toX_orX(void) --- 319,325 ---- } /* ! * Change the char. under the cursor to a X_ or X type */ static void chg_c_toX_orX(void) *************** *** 497,503 **** } /* ! ** Change the char. under the cursor to a _X_ or X_ type */ static void --- 443,449 ---- } /* ! * Change the char. under the cursor to a _X_ or X_ type */ static void *************** *** 549,555 **** } /* ! ** Change the char. under the cursor to a _X_ or _X type */ static void chg_c_to_X_or_X (void) --- 495,501 ---- } /* ! * Change the char. under the cursor to a _X_ or _X type */ static void chg_c_to_X_or_X (void) *************** *** 580,589 **** } /* ! ** Change the character left to the cursor to a _X_ or X_ type */ static void ! chg_l_to_X_orX_ (void) { int tempc; --- 526,535 ---- } /* ! * Change the character left to the cursor to a _X_ or X_ type */ static void ! chg_l_to_X_orX_(void) { int tempc; *************** *** 648,654 **** } /* ! ** Change the character left to the cursor to a X or _X type */ static void --- 594,600 ---- } /* ! * Change the character left to the cursor to a X or _X type */ static void *************** *** 717,723 **** } /* ! ** Change the character right to the cursor to a _X or _X_ type */ static void --- 663,669 ---- } /* ! * Change the character right to the cursor to a _X or _X_ type */ static void *************** *** 742,748 **** } /* ! ** Map Farsi keyboard when in fkmap mode. */ int --- 688,694 ---- } /* ! * Map Farsi keyboard when in fkmap mode. */ int *************** *** 899,906 **** 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. */ dec_cursor(); --- 845,852 ---- 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. */ dec_cursor(); *************** *** 914,921 **** inc_cursor(); } ! if (!p_ri) ! if (!curwin->w_cursor.col) { switch (c) { --- 860,866 ---- inc_cursor(); } ! if (!p_ri && !curwin->w_cursor.col) { switch (c) { *************** *** 1154,1196 **** case 'a': tempc = _SHIN; ! break; case 'A': tempc = WAW_H; ! break; case 'b': tempc = ZAL; ! break; case 'c': tempc = ZE; ! break; case 'C': tempc = JE; ! break; case 'd': tempc = _YE; ! break; case 'D': tempc = _YEE; ! break; case 'e': tempc = _SE; ! break; case 'f': tempc = _BE; ! break; case 'g': tempc = _LAM; ! 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 (); } if (!p_ri) --- 1099,1140 ---- case 'a': tempc = _SHIN; ! break; case 'A': tempc = WAW_H; ! break; case 'b': tempc = ZAL; ! break; case 'c': tempc = ZE; ! break; case 'C': tempc = JE; ! break; case 'd': tempc = _YE; ! break; case 'D': tempc = _YEE; ! break; case 'e': tempc = _SE; ! break; case 'f': tempc = _BE; ! break; case 'g': tempc = _LAM; ! 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 (); } if (!p_ri) *************** *** 1204,1219 **** { chg_c_toX_orX (); chg_l_toXor_X (); ! tempc = ALEF_U_H; } else ! if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) ! { ! tempc = ALEF_U_H_; ! chg_l_toXor_X (); ! } ! else ! tempc = ALEF_U_H; if (!p_ri) inc_cursor(); --- 1148,1162 ---- { chg_c_toX_orX (); chg_l_toXor_X (); ! tempc = ALEF_U_H; ! } ! else if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) ! { ! tempc = ALEF_U_H_; ! chg_l_toXor_X (); } else ! tempc = ALEF_U_H; if (!p_ri) inc_cursor(); *************** *** 1249,1259 **** { if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) { ! tempc = ALEF_; chg_l_toXor_X (); } else ! tempc = ALEF; } if (!p_ri) --- 1192,1202 ---- { if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) { ! tempc = ALEF_; chg_l_toXor_X (); } else ! tempc = ALEF; } if (!p_ri) *************** *** 1261,1268 **** return tempc; case 'i': ! if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) ! { if (!p_ri && !F_is_TyE(tempc)) chg_c_to_X_orX_ (); if (p_ri) --- 1204,1211 ---- return tempc; case 'i': ! 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,1285 **** dec_cursor(); if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) ! tempc = _HE_; else ! tempc = _HE; if (!p_ri) inc_cursor(); --- 1220,1228 ---- dec_cursor(); if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) ! tempc = _HE_; else ! tempc = _HE; if (!p_ri) inc_cursor(); *************** *** 1289,1295 **** break; case 'J': if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) ! { if (p_ri) chg_c_to_X_or_X (); --- 1232,1238 ---- break; case 'J': if (!curwin->w_cursor.col && STRLEN(ml_get_curline())) ! { if (p_ri) chg_c_to_X_or_X (); *************** *** 1304,1314 **** if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) { ! tempc = TEE_; chg_l_toXor_X (); } else ! tempc = TEE; if (!p_ri) inc_cursor(); --- 1247,1257 ---- if (F_is_TyB_TyC_TyD(SRC_EDT, AT_CURSOR)) { ! tempc = TEE_; chg_l_toXor_X (); } else ! tempc = TEE; if (!p_ri) inc_cursor(); *************** *** 1385,1391 **** 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) --- 1328,1334 ---- 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,1440 **** 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) --- 1377,1383 ---- 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,1467 **** } /* ! ** Convert a none leading Farsi char into a leading type. */ static int toF_leading(int c) --- 1404,1410 ---- } /* ! * Convert a none leading Farsi char into a leading type. */ static int toF_leading(int c) *************** *** 1515,1521 **** } /* ! ** Convert a given Farsi char into right joining type. */ static int toF_Rjoin(int c) --- 1458,1464 ---- } /* ! * Convert a given Farsi char into right joining type. */ static int toF_Rjoin(int c) *************** *** 1571,1577 **** } /* ! ** Can a given Farsi character join via its left edj. */ static int canF_Ljoin(int c) --- 1514,1520 ---- } /* ! * Can a given Farsi character join via its left edj. */ static int canF_Ljoin(int c) *************** *** 1645,1651 **** } /* ! ** Can a given Farsi character join via its right edj. */ static int canF_Rjoin(int c) --- 1588,1594 ---- } /* ! * Can a given Farsi character join via its right edj. */ static int canF_Rjoin(int c) *************** *** 1673,1679 **** } /* ! ** is a given Farsi character a terminating type. */ static int F_isterm(int c) --- 1616,1622 ---- } /* ! * is a given Farsi character a terminating type. */ static int F_isterm(int c) *************** *** 1700,1785 **** } /* ! ** 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 _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 _HE: ! case _HE_: ! return F_HE; } return c; } /* ! ** Convert the Farsi 3342 standard into Farsi VIM. */ ! void conv_to_pvim(void) { char_u *ptr; --- 1643,1696 ---- } /* ! * 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 _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 _HE: ! case _HE_: return F_HE; } return c; } /* ! * Convert the Farsi 3342 standard into Farsi VIM. */ ! static void conv_to_pvim(void) { char_u *ptr; *************** *** 1791,1797 **** llen = (int)STRLEN(ptr); ! for ( i = 0; i < llen-1; i++) { if (canF_Ljoin(ptr[i]) && canF_Rjoin(ptr[i+1])) { --- 1702,1708 ---- llen = (int)STRLEN(ptr); ! for (i = 0; i < llen-1; i++) { if (canF_Ljoin(ptr[i]) && canF_Rjoin(ptr[i+1])) { *************** *** 1817,1824 **** * 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"); /* Assume the screen has been messed up: clear it and redraw. */ redraw_later(CLEAR); --- 1728,1735 ---- * Following lines contains Farsi encoded character. */ ! 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,1834 **** /* * Convert the Farsi VIM into Farsi 3342 standard. */ ! void conv_to_pstd(void) { char_u *ptr; --- 1739,1745 ---- /* * Convert the Farsi VIM into Farsi 3342 standard. */ ! static void conv_to_pstd(void) { char_u *ptr; *************** *** 1837,1856 **** /* * Following line contains Farsi encoded character. */ ! ! do_cmdline_cmd((char_u *)"%s/\232/\202\231/g"); 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++) ! { ptr[i] = toF_TyA(ptr[i]); - - } } /* Assume the screen has been messed up: clear it and redraw. */ --- 1748,1762 ---- /* * Following line contains Farsi encoded character. */ ! 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++) ptr[i] = toF_TyA(ptr[i]); } /* Assume the screen has been messed up: clear it and redraw. */ *************** *** 2148,2154 **** case 'f': return _BE; case 'g': return _LAM; case 'G': ! if (cmd_gchar(AT_CURSOR) == _LAM ) { cmd_pchar(LAM, AT_CURSOR); return ALEF_U_H; --- 2054,2060 ---- case 'f': return _BE; case 'g': return _LAM; case 'G': ! if (cmd_gchar(AT_CURSOR) == _LAM) { cmd_pchar(LAM, AT_CURSOR); return ALEF_U_H; *************** *** 2159,2165 **** else return ALEF_U_H; case 'h': ! if (cmd_gchar(AT_CURSOR) == _LAM ) { cmd_pchar(LA, AT_CURSOR); redrawcmdline(); --- 2065,2071 ---- else return ALEF_U_H; case 'h': ! if (cmd_gchar(AT_CURSOR) == _LAM) { cmd_pchar(LA, AT_CURSOR); redrawcmdline(); *************** *** 2215,2223 **** case ',': return WAW; case '[': return _JIM; case ']': return _CHE; ! } ! return c; } /* --- 2121,2129 ---- case ',': return WAW; case '[': return _JIM; case ']': return _CHE; ! } ! return c; } /* *************** *** 2226,2232 **** int F_isalpha(int c) { ! return (( c >= TEE_ && c <= _YE) || (c >= ALEF_A && c <= YE) || (c >= _IE && c <= YE_)); } --- 2132,2138 ---- int F_isalpha(int c) { ! return ((c >= TEE_ && c <= _YE) || (c >= ALEF_A && c <= YE) || (c >= _IE && c <= YE_)); } *************** *** 2246,2290 **** int F_ischar(int c) { ! return (c >= TEE_ && c <= YE_); } void ! farsi_fkey( ! cmdarg_T *cap) { ! int c = cap->cmdchar; ! ! if (c == K_F8) { ! if (p_altkeymap) { ! 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(""); ! } ! ! 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(); ! } } } --- 2152,2191 ---- int F_ischar(int c) { ! return (c >= TEE_ && c <= YE_); } void ! farsi_f8(cmdarg_T *cap UNUSED) { ! if (p_altkeymap) { ! 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(""); } + + 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(); } } *** ../vim-7.4.1980/src/Makefile 2016-07-01 17:17:13.266267111 +0200 --- src/Makefile 2016-07-02 16:16:27.500260457 +0200 *************** *** 2022,2027 **** --- 2022,2028 ---- test_expand_dllpath \ test_expr \ test_expr_utf8 \ + test_farsi \ test_feedkeys \ test_file_perm \ test_fnamemodify \ *** ../vim-7.4.1980/src/charset.c 2016-07-01 18:16:47.481936426 +0200 --- src/charset.c 2016-07-02 17:50:51.966663931 +0200 *************** *** 571,577 **** (c >= ' ' && c <= '~') #endif #ifdef FEAT_FKMAP ! || F_ischar(c) #endif )) || (c < 256 && vim_isprintc_strict(c))) { --- 571,577 ---- (c >= ' ' && c <= '~') #endif #ifdef FEAT_FKMAP ! || (p_altkeymap && F_ischar(c)) #endif )) || (c < 256 && vim_isprintc_strict(c))) { *** ../vim-7.4.1980/src/normal.c 2016-06-15 22:03:41.873190446 +0200 --- src/normal.c 2016-07-02 16:32:36.750205583 +0200 *************** *** 414,421 **** {K_TABMENU, nv_tabmenu, 0, 0}, #endif #ifdef FEAT_FKMAP ! {K_F8, farsi_fkey, 0, 0}, ! {K_F9, farsi_fkey, 0, 0}, #endif #ifdef FEAT_NETBEANS_INTG {K_F21, nv_nbcmd, NV_NCH_ALW, 0}, --- 414,421 ---- {K_TABMENU, nv_tabmenu, 0, 0}, #endif #ifdef FEAT_FKMAP ! {K_F8, farsi_f8, 0, 0}, ! {K_F9, farsi_f9, 0, 0}, #endif #ifdef FEAT_NETBEANS_INTG {K_F21, nv_nbcmd, NV_NCH_ALW, 0}, *** ../vim-7.4.1980/src/proto/main.pro 2016-01-19 13:21:55.841334333 +0100 --- src/proto/main.pro 2016-07-02 16:56:18.969682675 +0200 *************** *** 10,19 **** void server_to_input_buf(char_u *str); char_u *eval_client_expr_to_string(char_u *expr); char_u *serverConvert(char_u *client_enc, char_u *data, char_u **tofree); - int toF_TyA(int c); int fkmap(int c); - void conv_to_pvim(void); - void conv_to_pstd(void); char_u *lrswap(char_u *ibuf); char_u *lrFswap(char_u *cmdbuf, int len); char_u *lrF_sub(char_u *ibuf); --- 10,16 ---- *************** *** 21,26 **** int F_isalpha(int c); int F_isdigit(int c); int F_ischar(int c); ! void farsi_fkey(cmdarg_T *cap); int arabic_shape(int c, int *ccp, int *c1p, int prev_c, int prev_c1, int next_c); /* vim: set ft=c : */ --- 18,24 ---- int F_isalpha(int c); int F_isdigit(int c); int F_ischar(int c); ! void farsi_f8(cmdarg_T *cap); ! void farsi_f9(cmdarg_T *cap); int arabic_shape(int c, int *ccp, int *c1p, int prev_c, int prev_c1, int next_c); /* vim: set ft=c : */ *** ../vim-7.4.1980/src/testdir/Make_all.mak 2016-07-01 17:17:13.298266645 +0200 --- src/testdir/Make_all.mak 2016-07-02 16:16:21.496347484 +0200 *************** *** 168,173 **** --- 168,174 ---- test_cdo.res \ test_channel.res \ test_cmdline.res \ + test_farsi.res \ test_hardcopy.res \ test_history.res \ test_increment.res \ *** ../vim-7.4.1980/src/testdir/test_farsi.vim 2016-07-02 18:24:23.585631957 +0200 --- src/testdir/test_farsi.vim 2016-07-02 18:05:28.710019868 +0200 *************** *** 0 **** --- 1,84 ---- + " Simplistic testing of Farsi mode. + + if !has('farsi') + finish + endif + " Farsi uses a single byte encoding. + set enc=latin1 + + func Test_farsi_toggle() + new + + set altkeymap + call assert_equal(0, &fkmap) + call assert_equal(0, &rl) + call feedkeys("\", 'x') + call assert_equal(1, &fkmap) + call assert_equal(1, &rl) + call feedkeys("\", 'x') + call assert_equal(0, &fkmap) + call assert_equal(0, &rl) + + set rl + " conversion from Farsi 3342 to Farsi VIM. + call setline(1, join(map(range(0x80, 0xff), 'nr2char(v:val)'), '')) + call feedkeys("\", 'x') + let exp = [0xfc, 0xf8, 0xc1, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + \ 0xc8, 0xc9, 0xca, 0xd0, 0xd1, 0xd2, 0xd3, 0xd6, + \ 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, 0xd8, 0xd9, 0xda, + \ 0xdb, 0xdc, 0xdc, 0xc1, 0xdd, 0xde, 0xe0, 0xe0, + \ 0xe1, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, + \ 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, + \ 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + \ 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, + \ 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, + \ 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, + \ 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, + \ 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, + \ 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, + \ 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xfb, 0xfb, 0xfe, + \ 0xfe, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, + \ 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xe1, + \ ] + call assert_equal(join(map(exp, 'nr2char(v:val)'), ''), getline(1)) + + " conversion from Farsi VIM to Farsi 3342. + call setline(1, join(map(range(0x80, 0xff), 'nr2char(v:val)'), '')) + call feedkeys("\", 'x') + let exp = [0xfc, 0xf8, 0xc1, 0x83, 0x84, 0x85, 0x86, 0x87, + \ 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x90, + \ 0x90, 0x90, 0x92, 0x93, 0x93, 0x95, 0x96, 0x97, + \ 0x98, 0xdc, 0x9a, 0x9b, 0x9c, 0x9e, 0x9e, 0xff, + \ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + \ 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + \ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + \ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + \ 0xc0, 0xc1, 0xc2, 0x83, 0x84, 0x85, 0x86, 0x87, + \ 0x88, 0x89, 0x8a, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + \ 0x8b, 0x8c, 0x8d, 0x8e, 0xd4, 0xd5, 0x90, 0x93, + \ 0x95, 0x96, 0x97, 0x98, 0x99, 0x9b, 0x9c, 0xdf, + \ 0x9d, 0xff, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + \ 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xec, 0xee, 0xef, + \ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + \ 0xf8, 0xf9, 0xfa, 0xec, 0x80, 0xfd, 0xee, 0xff, + \ ] + call assert_equal(join(map(exp, 'nr2char(v:val)'), ''), getline(1)) + + bwipe! + endfunc + + func Test_farsi_map() + new + + set altkeymap + set rl + " RHS of mapping is reversed. + imap xyz abc + call feedkeys("axyz\", 'tx') + call assert_equal('cba', getline(1)) + + set norl + iunmap xyz + set noaltkeymap + bwipe! + endfunc *** ../vim-7.4.1980/src/version.c 2016-07-02 15:41:41.586523202 +0200 --- src/version.c 2016-07-02 16:15:58.908674888 +0200 *************** *** 760,761 **** --- 760,763 ---- { /* Add new patch number below this line */ + /**/ + 1981, /**/ -- hundred-and-one symptoms of being an internet addict: 179. You wonder why your household garbage can doesn't have an "empty recycle bin" button. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///