To: vim_dev@googlegroups.com Subject: Patch 8.0.0391 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0391 Problem: Arabic support is verbose and not well tested. Solution: Simplify the code. Add more tests. Files: src/arabic.c, src/testdir/test_arabic.vim *** ../vim-8.0.0390/src/arabic.c 2016-08-29 22:39:44.000000000 +0200 --- src/arabic.c 2017-03-01 13:22:50.649978477 +0100 *************** *** 200,325 **** static int chg_c_a2s(int cur_c) { - int tempc; - switch (cur_c) { ! case a_HAMZA: ! tempc = a_s_HAMZA; ! break; ! case a_ALEF_MADDA: ! tempc = a_s_ALEF_MADDA; ! break; ! case a_ALEF_HAMZA_ABOVE: ! tempc = a_s_ALEF_HAMZA_ABOVE; ! break; ! case a_WAW_HAMZA: ! tempc = a_s_WAW_HAMZA; ! break; ! case a_ALEF_HAMZA_BELOW: ! tempc = a_s_ALEF_HAMZA_BELOW; ! break; ! case a_YEH_HAMZA: ! tempc = a_s_YEH_HAMZA; ! break; ! case a_ALEF: ! tempc = a_s_ALEF; ! break; ! case a_TEH_MARBUTA: ! tempc = a_s_TEH_MARBUTA; ! break; ! case a_DAL: ! tempc = a_s_DAL; ! break; ! case a_THAL: ! tempc = a_s_THAL; ! break; ! case a_REH: ! tempc = a_s_REH; ! break; ! case a_ZAIN: ! tempc = a_s_ZAIN; ! break; ! case a_TATWEEL: /* exceptions */ ! tempc = cur_c; ! break; ! case a_WAW: ! tempc = a_s_WAW; ! break; ! case a_ALEF_MAKSURA: ! tempc = a_s_ALEF_MAKSURA; ! break; ! case a_BEH: ! tempc = a_s_BEH; ! break; ! case a_TEH: ! tempc = a_s_TEH; ! break; ! case a_THEH: ! tempc = a_s_THEH; ! break; ! case a_JEEM: ! tempc = a_s_JEEM; ! break; ! case a_HAH: ! tempc = a_s_HAH; ! break; ! case a_KHAH: ! tempc = a_s_KHAH; ! break; ! case a_SEEN: ! tempc = a_s_SEEN; ! break; ! case a_SHEEN: ! tempc = a_s_SHEEN; ! break; ! case a_SAD: ! tempc = a_s_SAD; ! break; ! case a_DAD: ! tempc = a_s_DAD; ! break; ! case a_TAH: ! tempc = a_s_TAH; ! break; ! case a_ZAH: ! tempc = a_s_ZAH; ! break; ! case a_AIN: ! tempc = a_s_AIN; ! break; ! case a_GHAIN: ! tempc = a_s_GHAIN; ! break; ! case a_FEH: ! tempc = a_s_FEH; ! break; ! case a_QAF: ! tempc = a_s_QAF; ! break; ! case a_KAF: ! tempc = a_s_KAF; ! break; ! case a_LAM: ! tempc = a_s_LAM; ! break; ! case a_MEEM: ! tempc = a_s_MEEM; ! break; ! case a_NOON: ! tempc = a_s_NOON; ! break; ! case a_HEH: ! tempc = a_s_HEH; ! break; ! case a_YEH: ! tempc = a_s_YEH; ! break; ! default: ! tempc = 0; } ! return tempc; } --- 200,247 ---- static int chg_c_a2s(int cur_c) { switch (cur_c) { ! case a_HAMZA: return a_s_HAMZA; ! case a_ALEF_MADDA: return a_s_ALEF_MADDA; ! case a_ALEF_HAMZA_ABOVE: return a_s_ALEF_HAMZA_ABOVE; ! case a_WAW_HAMZA: return a_s_WAW_HAMZA; ! case a_ALEF_HAMZA_BELOW: return a_s_ALEF_HAMZA_BELOW; ! case a_YEH_HAMZA: return a_s_YEH_HAMZA; ! case a_ALEF: return a_s_ALEF; ! case a_TEH_MARBUTA: return a_s_TEH_MARBUTA; ! case a_DAL: return a_s_DAL; ! case a_THAL: return a_s_THAL; ! case a_REH: return a_s_REH; ! case a_ZAIN: return a_s_ZAIN; ! case a_TATWEEL: return cur_c; /* exceptions */ ! case a_WAW: return a_s_WAW; ! case a_ALEF_MAKSURA: return a_s_ALEF_MAKSURA; ! case a_BEH: return a_s_BEH; ! case a_TEH: return a_s_TEH; ! case a_THEH: return a_s_THEH; ! case a_JEEM: return a_s_JEEM; ! case a_HAH: return a_s_HAH; ! case a_KHAH: return a_s_KHAH; ! case a_SEEN: return a_s_SEEN; ! case a_SHEEN: return a_s_SHEEN; ! case a_SAD: return a_s_SAD; ! case a_DAD: return a_s_DAD; ! case a_TAH: return a_s_TAH; ! case a_ZAH: return a_s_ZAH; ! case a_AIN: return a_s_AIN; ! case a_GHAIN: return a_s_GHAIN; ! case a_FEH: return a_s_FEH; ! case a_QAF: return a_s_QAF; ! case a_KAF: return a_s_KAF; ! case a_LAM: return a_s_LAM; ! case a_MEEM: return a_s_MEEM; ! case a_NOON: return a_s_NOON; ! case a_HEH: return a_s_HEH; ! case a_YEH: return a_s_YEH; } ! return 0; } *************** *** 329,454 **** static int chg_c_a2i(int cur_c) { - int tempc; - switch (cur_c) { ! case a_YEH_HAMZA: ! tempc = a_i_YEH_HAMZA; ! break; case a_HAMZA: /* exceptions */ ! tempc = a_s_HAMZA; ! break; case a_ALEF_MADDA: /* exceptions */ ! tempc = a_s_ALEF_MADDA; ! break; case a_ALEF_HAMZA_ABOVE: /* exceptions */ ! tempc = a_s_ALEF_HAMZA_ABOVE; ! break; case a_WAW_HAMZA: /* exceptions */ ! tempc = a_s_WAW_HAMZA; ! break; case a_ALEF_HAMZA_BELOW: /* exceptions */ ! tempc = a_s_ALEF_HAMZA_BELOW; ! break; case a_ALEF: /* exceptions */ ! tempc = a_s_ALEF; ! break; case a_TEH_MARBUTA: /* exceptions */ ! tempc = a_s_TEH_MARBUTA; ! break; case a_DAL: /* exceptions */ ! tempc = a_s_DAL; ! break; case a_THAL: /* exceptions */ ! tempc = a_s_THAL; ! break; case a_REH: /* exceptions */ ! tempc = a_s_REH; ! break; case a_ZAIN: /* exceptions */ ! tempc = a_s_ZAIN; ! break; case a_TATWEEL: /* exceptions */ ! tempc = cur_c; ! break; case a_WAW: /* exceptions */ ! tempc = a_s_WAW; ! break; case a_ALEF_MAKSURA: /* exceptions */ ! tempc = a_s_ALEF_MAKSURA; ! break; ! case a_BEH: ! tempc = a_i_BEH; ! break; ! case a_TEH: ! tempc = a_i_TEH; ! break; ! case a_THEH: ! tempc = a_i_THEH; ! break; ! case a_JEEM: ! tempc = a_i_JEEM; ! break; ! case a_HAH: ! tempc = a_i_HAH; ! break; ! case a_KHAH: ! tempc = a_i_KHAH; ! break; ! case a_SEEN: ! tempc = a_i_SEEN; ! break; ! case a_SHEEN: ! tempc = a_i_SHEEN; ! break; ! case a_SAD: ! tempc = a_i_SAD; ! break; ! case a_DAD: ! tempc = a_i_DAD; ! break; ! case a_TAH: ! tempc = a_i_TAH; ! break; ! case a_ZAH: ! tempc = a_i_ZAH; ! break; ! case a_AIN: ! tempc = a_i_AIN; ! break; ! case a_GHAIN: ! tempc = a_i_GHAIN; ! break; ! case a_FEH: ! tempc = a_i_FEH; ! break; ! case a_QAF: ! tempc = a_i_QAF; ! break; ! case a_KAF: ! tempc = a_i_KAF; ! break; ! case a_LAM: ! tempc = a_i_LAM; ! break; ! case a_MEEM: ! tempc = a_i_MEEM; ! break; ! case a_NOON: ! tempc = a_i_NOON; ! break; ! case a_HEH: ! tempc = a_i_HEH; ! break; ! case a_YEH: ! tempc = a_i_YEH; ! break; ! default: ! tempc = 0; } ! return tempc; } --- 251,312 ---- static int chg_c_a2i(int cur_c) { switch (cur_c) { ! case a_YEH_HAMZA: return a_i_YEH_HAMZA; case a_HAMZA: /* exceptions */ ! return a_s_HAMZA; case a_ALEF_MADDA: /* exceptions */ ! return a_s_ALEF_MADDA; case a_ALEF_HAMZA_ABOVE: /* exceptions */ ! return a_s_ALEF_HAMZA_ABOVE; case a_WAW_HAMZA: /* exceptions */ ! return a_s_WAW_HAMZA; case a_ALEF_HAMZA_BELOW: /* exceptions */ ! return a_s_ALEF_HAMZA_BELOW; case a_ALEF: /* exceptions */ ! return a_s_ALEF; case a_TEH_MARBUTA: /* exceptions */ ! return a_s_TEH_MARBUTA; case a_DAL: /* exceptions */ ! return a_s_DAL; case a_THAL: /* exceptions */ ! return a_s_THAL; case a_REH: /* exceptions */ ! return a_s_REH; case a_ZAIN: /* exceptions */ ! return a_s_ZAIN; case a_TATWEEL: /* exceptions */ ! return cur_c; case a_WAW: /* exceptions */ ! return a_s_WAW; case a_ALEF_MAKSURA: /* exceptions */ ! return a_s_ALEF_MAKSURA; ! case a_BEH: return a_i_BEH; ! case a_TEH: return a_i_TEH; ! case a_THEH: return a_i_THEH; ! case a_JEEM: return a_i_JEEM; ! case a_HAH: return a_i_HAH; ! case a_KHAH: return a_i_KHAH; ! case a_SEEN: return a_i_SEEN; ! case a_SHEEN: return a_i_SHEEN; ! case a_SAD: return a_i_SAD; ! case a_DAD: return a_i_DAD; ! case a_TAH: return a_i_TAH; ! case a_ZAH: return a_i_ZAH; ! case a_AIN: return a_i_AIN; ! case a_GHAIN: return a_i_GHAIN; ! case a_FEH: return a_i_FEH; ! case a_QAF: return a_i_QAF; ! case a_KAF: return a_i_KAF; ! case a_LAM: return a_i_LAM; ! case a_MEEM: return a_i_MEEM; ! case a_NOON: return a_i_NOON; ! case a_HEH: return a_i_HEH; ! case a_YEH: return a_i_YEH; } ! return 0; } *************** *** 458,583 **** static int chg_c_a2m(int cur_c) { - int tempc; - switch (cur_c) { ! case a_HAMZA: /* exception */ ! tempc = a_s_HAMZA; ! break; ! case a_ALEF_MADDA: /* exception */ ! tempc = a_f_ALEF_MADDA; ! break; ! case a_ALEF_HAMZA_ABOVE: /* exception */ ! tempc = a_f_ALEF_HAMZA_ABOVE; ! break; ! case a_WAW_HAMZA: /* exception */ ! tempc = a_f_WAW_HAMZA; ! break; ! case a_ALEF_HAMZA_BELOW: /* exception */ ! tempc = a_f_ALEF_HAMZA_BELOW; ! break; ! case a_YEH_HAMZA: ! tempc = a_m_YEH_HAMZA; ! break; ! case a_ALEF: /* exception */ ! tempc = a_f_ALEF; ! break; ! case a_BEH: ! tempc = a_m_BEH; ! break; ! case a_TEH_MARBUTA: /* exception */ ! tempc = a_f_TEH_MARBUTA; ! break; ! case a_TEH: ! tempc = a_m_TEH; ! break; ! case a_THEH: ! tempc = a_m_THEH; ! break; ! case a_JEEM: ! tempc = a_m_JEEM; ! break; ! case a_HAH: ! tempc = a_m_HAH; ! break; ! case a_KHAH: ! tempc = a_m_KHAH; ! break; ! case a_DAL: /* exception */ ! tempc = a_f_DAL; ! break; ! case a_THAL: /* exception */ ! tempc = a_f_THAL; ! break; ! case a_REH: /* exception */ ! tempc = a_f_REH; ! break; ! case a_ZAIN: /* exception */ ! tempc = a_f_ZAIN; ! break; ! case a_SEEN: ! tempc = a_m_SEEN; ! break; ! case a_SHEEN: ! tempc = a_m_SHEEN; ! break; ! case a_SAD: ! tempc = a_m_SAD; ! break; ! case a_DAD: ! tempc = a_m_DAD; ! break; ! case a_TAH: ! tempc = a_m_TAH; ! break; ! case a_ZAH: ! tempc = a_m_ZAH; ! break; ! case a_AIN: ! tempc = a_m_AIN; ! break; ! case a_GHAIN: ! tempc = a_m_GHAIN; ! break; ! case a_TATWEEL: /* exception */ ! tempc = cur_c; ! break; ! case a_FEH: ! tempc = a_m_FEH; ! break; ! case a_QAF: ! tempc = a_m_QAF; ! break; ! case a_KAF: ! tempc = a_m_KAF; ! break; ! case a_LAM: ! tempc = a_m_LAM; ! break; ! case a_MEEM: ! tempc = a_m_MEEM; ! break; ! case a_NOON: ! tempc = a_m_NOON; ! break; ! case a_HEH: ! tempc = a_m_HEH; ! break; ! case a_WAW: /* exception */ ! tempc = a_f_WAW; ! break; ! case a_ALEF_MAKSURA: /* exception */ ! tempc = a_f_ALEF_MAKSURA; ! break; ! case a_YEH: ! tempc = a_m_YEH; ! break; ! default: ! tempc = 0; } ! return tempc; } --- 316,363 ---- static int chg_c_a2m(int cur_c) { switch (cur_c) { ! case a_HAMZA: return a_s_HAMZA; /* exception */ ! case a_ALEF_MADDA: return a_f_ALEF_MADDA; /* exception */ ! case a_ALEF_HAMZA_ABOVE: return a_f_ALEF_HAMZA_ABOVE; /* exception */ ! case a_WAW_HAMZA: return a_f_WAW_HAMZA; /* exception */ ! case a_ALEF_HAMZA_BELOW: return a_f_ALEF_HAMZA_BELOW; /* exception */ ! case a_YEH_HAMZA: return a_m_YEH_HAMZA; ! case a_ALEF: return a_f_ALEF; /* exception */ ! case a_BEH: return a_m_BEH; ! case a_TEH_MARBUTA: return a_f_TEH_MARBUTA; /* exception */ ! case a_TEH: return a_m_TEH; ! case a_THEH: return a_m_THEH; ! case a_JEEM: return a_m_JEEM; ! case a_HAH: return a_m_HAH; ! case a_KHAH: return a_m_KHAH; ! case a_DAL: return a_f_DAL; /* exception */ ! case a_THAL: return a_f_THAL; /* exception */ ! case a_REH: return a_f_REH; /* exception */ ! case a_ZAIN: return a_f_ZAIN; /* exception */ ! case a_SEEN: return a_m_SEEN; ! case a_SHEEN: return a_m_SHEEN; ! case a_SAD: return a_m_SAD; ! case a_DAD: return a_m_DAD; ! case a_TAH: return a_m_TAH; ! case a_ZAH: return a_m_ZAH; ! case a_AIN: return a_m_AIN; ! case a_GHAIN: return a_m_GHAIN; ! case a_TATWEEL: return cur_c; /* exception */ ! case a_FEH: return a_m_FEH; ! case a_QAF: return a_m_QAF; ! case a_KAF: return a_m_KAF; ! case a_LAM: return a_m_LAM; ! case a_MEEM: return a_m_MEEM; ! case a_NOON: return a_m_NOON; ! case a_HEH: return a_m_HEH; ! case a_WAW: return a_f_WAW; /* exception */ ! case a_ALEF_MAKSURA: return a_f_ALEF_MAKSURA; /* exception */ ! case a_YEH: return a_m_YEH; } ! return 0; } *** ../vim-8.0.0390/src/testdir/test_arabic.vim 2017-02-28 22:51:08.468606327 +0100 --- src/testdir/test_arabic.vim 2017-03-01 14:01:20.219098602 +0100 *************** *** 97,128 **** bwipe! endfunc let s:a_YEH_HAMZA = "\u0626" ! let s:a_i_YEH_HAMZA = "\ufe8b" ! let s:a_HAMZA = "\u0621" ! let s:a_s_HAMZA = "\ufe80" ! let s:a_ALEF_MADDA = "\u0622" ! let s:a_s_ALEF_MADDA = "\ufe81" ! let s:a_ALEF_HAMZA_ABOVE = "\u0623" ! let s:a_s_ALEF_HAMZA_ABOVE = "\ufe83" ! let s:a_GHAIN = "\u063a" ! let s:a_f_GHAIN = "\ufece" let s:a_s_GHAIN = "\ufecd" func Test_shape_initial() new set arabicshape ! " Shaping arabic {testchar} non-arabic Uses chg_c_a2i(). " pair[0] = testchar, pair[1] = next-result, pair[2] = current-result for pair in [[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_i_YEH_HAMZA], \ [s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA], \ [s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_s_ALEF_MADDA], \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_ABOVE], \ ] call setline(1, s:a_GHAIN . pair[0] . ' ') call assert_equal([pair[1] . pair[2] . ' '], ScreenLines(1, 3)) --- 97,361 ---- bwipe! endfunc + " Values from src/arabic.h (not all used yet) + let s:a_COMMA = "\u060C" + let s:a_SEMICOLON = "\u061B" + let s:a_QUESTION = "\u061F" + let s:a_HAMZA = "\u0621" + let s:a_ALEF_MADDA = "\u0622" + let s:a_ALEF_HAMZA_ABOVE = "\u0623" + let s:a_WAW_HAMZA = "\u0624" + let s:a_ALEF_HAMZA_BELOW = "\u0625" let s:a_YEH_HAMZA = "\u0626" ! let s:a_ALEF = "\u0627" ! let s:a_BEH = "\u0628" ! let s:a_TEH_MARBUTA = "\u0629" ! let s:a_TEH = "\u062a" ! let s:a_THEH = "\u062b" ! let s:a_JEEM = "\u062c" ! let s:a_HAH = "\u062d" ! let s:a_KHAH = "\u062e" ! let s:a_DAL = "\u062f" ! let s:a_THAL = "\u0630" ! let s:a_REH = "\u0631" ! let s:a_ZAIN = "\u0632" ! let s:a_SEEN = "\u0633" ! let s:a_SHEEN = "\u0634" ! let s:a_SAD = "\u0635" ! let s:a_DAD = "\u0636" ! let s:a_TAH = "\u0637" ! let s:a_ZAH = "\u0638" ! let s:a_AIN = "\u0639" ! let s:a_GHAIN = "\u063a" ! let s:a_TATWEEL = "\u0640" ! let s:a_FEH = "\u0641" ! let s:a_QAF = "\u0642" ! let s:a_KAF = "\u0643" ! let s:a_LAM = "\u0644" ! let s:a_MEEM = "\u0645" ! let s:a_NOON = "\u0646" ! let s:a_HEH = "\u0647" ! let s:a_WAW = "\u0648" ! let s:a_ALEF_MAKSURA = "\u0649" ! let s:a_YEH = "\u064a" ! let s:a_FATHATAN = "\u064b" ! let s:a_DAMMATAN = "\u064c" ! let s:a_KASRATAN = "\u064d" ! let s:a_FATHA = "\u064e" ! let s:a_DAMMA = "\u064f" ! let s:a_KASRA = "\u0650" ! let s:a_SHADDA = "\u0651" ! let s:a_SUKUN = "\u0652" ! let s:a_MADDA_ABOVE = "\u0653" ! let s:a_HAMZA_ABOVE = "\u0654" ! let s:a_HAMZA_BELOW = "\u0655" ! let s:a_ZERO = "\u0660" ! let s:a_ONE = "\u0661" ! let s:a_TWO = "\u0662" ! let s:a_THREE = "\u0663" ! let s:a_FOUR = "\u0664" ! let s:a_FIVE = "\u0665" ! let s:a_SIX = "\u0666" ! let s:a_SEVEN = "\u0667" ! let s:a_EIGHT = "\u0668" ! let s:a_NINE = "\u0669" ! let s:a_PERCENT = "\u066a" ! let s:a_DECIMAL = "\u066b" ! let s:a_THOUSANDS = "\u066c" ! let s:a_STAR = "\u066d" ! let s:a_MINI_ALEF = "\u0670" ! let s:a_s_FATHATAN = "\ufe70" ! let s:a_m_TATWEEL_FATHATAN = "\ufe71" ! let s:a_s_DAMMATAN = "\ufe72" ! ! let s:a_s_KASRATAN = "\ufe74" ! ! let s:a_s_FATHA = "\ufe76" ! let s:a_m_FATHA = "\ufe77" ! let s:a_s_DAMMA = "\ufe78" ! let s:a_m_DAMMA = "\ufe79" ! let s:a_s_KASRA = "\ufe7a" ! let s:a_m_KASRA = "\ufe7b" ! let s:a_s_SHADDA = "\ufe7c" ! let s:a_m_SHADDA = "\ufe7d" ! let s:a_s_SUKUN = "\ufe7e" ! let s:a_m_SUKUN = "\ufe7f" ! ! let s:a_s_HAMZA = "\ufe80" ! let s:a_s_ALEF_MADDA = "\ufe81" ! let s:a_f_ALEF_MADDA = "\ufe82" ! let s:a_s_ALEF_HAMZA_ABOVE = "\ufe83" ! let s:a_f_ALEF_HAMZA_ABOVE = "\ufe84" ! let s:a_s_WAW_HAMZA = "\ufe85" ! let s:a_f_WAW_HAMZA = "\ufe86" ! let s:a_s_ALEF_HAMZA_BELOW = "\ufe87" ! let s:a_f_ALEF_HAMZA_BELOW = "\ufe88" ! let s:a_s_YEH_HAMZA = "\ufe89" ! let s:a_f_YEH_HAMZA = "\ufe8a" ! let s:a_i_YEH_HAMZA = "\ufe8b" ! let s:a_m_YEH_HAMZA = "\ufe8c" ! let s:a_s_ALEF = "\ufe8d" ! let s:a_f_ALEF = "\ufe8e" ! let s:a_s_BEH = "\ufe8f" ! let s:a_f_BEH = "\ufe90" ! let s:a_i_BEH = "\ufe91" ! let s:a_m_BEH = "\ufe92" ! let s:a_s_TEH_MARBUTA = "\ufe93" ! let s:a_f_TEH_MARBUTA = "\ufe94" ! let s:a_s_TEH = "\ufe95" ! let s:a_f_TEH = "\ufe96" ! let s:a_i_TEH = "\ufe97" ! let s:a_m_TEH = "\ufe98" ! let s:a_s_THEH = "\ufe99" ! let s:a_f_THEH = "\ufe9a" ! let s:a_i_THEH = "\ufe9b" ! let s:a_m_THEH = "\ufe9c" ! let s:a_s_JEEM = "\ufe9d" ! let s:a_f_JEEM = "\ufe9e" ! let s:a_i_JEEM = "\ufe9f" ! let s:a_m_JEEM = "\ufea0" ! let s:a_s_HAH = "\ufea1" ! let s:a_f_HAH = "\ufea2" ! let s:a_i_HAH = "\ufea3" ! let s:a_m_HAH = "\ufea4" ! let s:a_s_KHAH = "\ufea5" ! let s:a_f_KHAH = "\ufea6" ! let s:a_i_KHAH = "\ufea7" ! let s:a_m_KHAH = "\ufea8" ! let s:a_s_DAL = "\ufea9" ! let s:a_f_DAL = "\ufeaa" ! let s:a_s_THAL = "\ufeab" ! let s:a_f_THAL = "\ufeac" ! let s:a_s_REH = "\ufead" ! let s:a_f_REH = "\ufeae" ! let s:a_s_ZAIN = "\ufeaf" ! let s:a_f_ZAIN = "\ufeb0" ! let s:a_s_SEEN = "\ufeb1" ! let s:a_f_SEEN = "\ufeb2" ! let s:a_i_SEEN = "\ufeb3" ! let s:a_m_SEEN = "\ufeb4" ! let s:a_s_SHEEN = "\ufeb5" ! let s:a_f_SHEEN = "\ufeb6" ! let s:a_i_SHEEN = "\ufeb7" ! let s:a_m_SHEEN = "\ufeb8" ! let s:a_s_SAD = "\ufeb9" ! let s:a_f_SAD = "\ufeba" ! let s:a_i_SAD = "\ufebb" ! let s:a_m_SAD = "\ufebc" ! let s:a_s_DAD = "\ufebd" ! let s:a_f_DAD = "\ufebe" ! let s:a_i_DAD = "\ufebf" ! let s:a_m_DAD = "\ufec0" ! let s:a_s_TAH = "\ufec1" ! let s:a_f_TAH = "\ufec2" ! let s:a_i_TAH = "\ufec3" ! let s:a_m_TAH = "\ufec4" ! let s:a_s_ZAH = "\ufec5" ! let s:a_f_ZAH = "\ufec6" ! let s:a_i_ZAH = "\ufec7" ! let s:a_m_ZAH = "\ufec8" ! let s:a_s_AIN = "\ufec9" ! let s:a_f_AIN = "\ufeca" ! let s:a_i_AIN = "\ufecb" ! let s:a_m_AIN = "\ufecc" let s:a_s_GHAIN = "\ufecd" + let s:a_f_GHAIN = "\ufece" + let s:a_i_GHAIN = "\ufecf" + let s:a_m_GHAIN = "\ufed0" + let s:a_s_FEH = "\ufed1" + let s:a_f_FEH = "\ufed2" + let s:a_i_FEH = "\ufed3" + let s:a_m_FEH = "\ufed4" + let s:a_s_QAF = "\ufed5" + let s:a_f_QAF = "\ufed6" + let s:a_i_QAF = "\ufed7" + let s:a_m_QAF = "\ufed8" + let s:a_s_KAF = "\ufed9" + let s:a_f_KAF = "\ufeda" + let s:a_i_KAF = "\ufedb" + let s:a_m_KAF = "\ufedc" + let s:a_s_LAM = "\ufedd" + let s:a_f_LAM = "\ufede" + let s:a_i_LAM = "\ufedf" + let s:a_m_LAM = "\ufee0" + let s:a_s_MEEM = "\ufee1" + let s:a_f_MEEM = "\ufee2" + let s:a_i_MEEM = "\ufee3" + let s:a_m_MEEM = "\ufee4" + let s:a_s_NOON = "\ufee5" + let s:a_f_NOON = "\ufee6" + let s:a_i_NOON = "\ufee7" + let s:a_m_NOON = "\ufee8" + let s:a_s_HEH = "\ufee9" + let s:a_f_HEH = "\ufeea" + let s:a_i_HEH = "\ufeeb" + let s:a_m_HEH = "\ufeec" + let s:a_s_WAW = "\ufeed" + let s:a_f_WAW = "\ufeee" + let s:a_s_ALEF_MAKSURA = "\ufeef" + let s:a_f_ALEF_MAKSURA = "\ufef0" + let s:a_s_YEH = "\ufef1" + let s:a_f_YEH = "\ufef2" + let s:a_i_YEH = "\ufef3" + let s:a_m_YEH = "\ufef4" + let s:a_s_LAM_ALEF_MADDA_ABOVE = "\ufef5" + let s:a_f_LAM_ALEF_MADDA_ABOVE = "\ufef6" + let s:a_s_LAM_ALEF_HAMZA_ABOVE = "\ufef7" + let s:a_f_LAM_ALEF_HAMZA_ABOVE = "\ufef8" + let s:a_s_LAM_ALEF_HAMZA_BELOW = "\ufef9" + let s:a_f_LAM_ALEF_HAMZA_BELOW = "\ufefa" + let s:a_s_LAM_ALEF = "\ufefb" + let s:a_f_LAM_ALEF = "\ufefc" + + let s:a_BYTE_ORDER_MARK = "\ufeff" func Test_shape_initial() new set arabicshape ! " Shaping arabic {testchar} non-arabic Tests chg_c_a2i(). " pair[0] = testchar, pair[1] = next-result, pair[2] = current-result for pair in [[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_i_YEH_HAMZA], \ [s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA], \ [s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_s_ALEF_MADDA], \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_ABOVE], + \ [s:a_WAW_HAMZA, s:a_s_GHAIN, s:a_s_WAW_HAMZA], + \ [s:a_ALEF_HAMZA_BELOW, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_BELOW], + \ [s:a_ALEF, s:a_s_GHAIN, s:a_s_ALEF], + \ [s:a_TEH_MARBUTA, s:a_s_GHAIN, s:a_s_TEH_MARBUTA], + \ [s:a_DAL, s:a_s_GHAIN, s:a_s_DAL], + \ [s:a_THAL, s:a_s_GHAIN, s:a_s_THAL], + \ [s:a_REH, s:a_s_GHAIN, s:a_s_REH], + \ [s:a_ZAIN, s:a_s_GHAIN, s:a_s_ZAIN], + \ [s:a_TATWEEL, s:a_f_GHAIN, s:a_TATWEEL], + \ [s:a_WAW, s:a_s_GHAIN, s:a_s_WAW], + \ [s:a_ALEF_MAKSURA, s:a_s_GHAIN, s:a_s_ALEF_MAKSURA], + \ [s:a_BEH, s:a_f_GHAIN, s:a_i_BEH], + \ [s:a_TEH, s:a_f_GHAIN, s:a_i_TEH], + \ [s:a_THEH, s:a_f_GHAIN, s:a_i_THEH], + \ [s:a_JEEM, s:a_f_GHAIN, s:a_i_JEEM], + \ [s:a_HAH, s:a_f_GHAIN, s:a_i_HAH], + \ [s:a_KHAH, s:a_f_GHAIN, s:a_i_KHAH], + \ [s:a_SEEN, s:a_f_GHAIN, s:a_i_SEEN], + \ [s:a_SHEEN, s:a_f_GHAIN, s:a_i_SHEEN], + \ [s:a_SAD, s:a_f_GHAIN, s:a_i_SAD], + \ [s:a_DAD, s:a_f_GHAIN, s:a_i_DAD], + \ [s:a_TAH, s:a_f_GHAIN, s:a_i_TAH], + \ [s:a_ZAH, s:a_f_GHAIN, s:a_i_ZAH], + \ [s:a_AIN, s:a_f_GHAIN, s:a_i_AIN], + \ [s:a_GHAIN, s:a_f_GHAIN, s:a_i_GHAIN], + \ [s:a_FEH, s:a_f_GHAIN, s:a_i_FEH], + \ [s:a_QAF, s:a_f_GHAIN, s:a_i_QAF], + \ [s:a_KAF, s:a_f_GHAIN, s:a_i_KAF], + \ [s:a_LAM, s:a_f_GHAIN, s:a_i_LAM], + \ [s:a_MEEM, s:a_f_GHAIN, s:a_i_MEEM], + \ [s:a_NOON, s:a_f_GHAIN, s:a_i_NOON], + \ [s:a_HEH, s:a_f_GHAIN, s:a_i_HEH], + \ [s:a_YEH, s:a_f_GHAIN, s:a_i_YEH], \ ] call setline(1, s:a_GHAIN . pair[0] . ' ') call assert_equal([pair[1] . pair[2] . ' '], ScreenLines(1, 3)) *************** *** 131,133 **** --- 364,472 ---- set arabicshape& bwipe! endfunc + + func Test_shape_isolated() + new + set arabicshape + + " Shaping non-arabic {testchar} non-arabic Tests chg_c_a2s(). + " pair[0] = testchar, pair[1] = current-result + for pair in [[s:a_HAMZA, s:a_s_HAMZA], + \ [s:a_ALEF_MADDA, s:a_s_ALEF_MADDA], + \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_ALEF_HAMZA_ABOVE], + \ [s:a_WAW_HAMZA, s:a_s_WAW_HAMZA], + \ [s:a_ALEF_HAMZA_BELOW, s:a_s_ALEF_HAMZA_BELOW], + \ [s:a_YEH_HAMZA, s:a_s_YEH_HAMZA], + \ [s:a_ALEF, s:a_s_ALEF], + \ [s:a_TEH_MARBUTA, s:a_s_TEH_MARBUTA], + \ [s:a_DAL, s:a_s_DAL], + \ [s:a_THAL, s:a_s_THAL], + \ [s:a_REH, s:a_s_REH], + \ [s:a_ZAIN, s:a_s_ZAIN], + \ [s:a_TATWEEL, s:a_TATWEEL], + \ [s:a_WAW, s:a_s_WAW], + \ [s:a_ALEF_MAKSURA, s:a_s_ALEF_MAKSURA], + \ [s:a_BEH, s:a_s_BEH], + \ [s:a_TEH, s:a_s_TEH], + \ [s:a_THEH, s:a_s_THEH], + \ [s:a_JEEM, s:a_s_JEEM], + \ [s:a_HAH, s:a_s_HAH], + \ [s:a_KHAH, s:a_s_KHAH], + \ [s:a_SEEN, s:a_s_SEEN], + \ [s:a_SHEEN, s:a_s_SHEEN], + \ [s:a_SAD, s:a_s_SAD], + \ [s:a_DAD, s:a_s_DAD], + \ [s:a_TAH, s:a_s_TAH], + \ [s:a_ZAH, s:a_s_ZAH], + \ [s:a_AIN, s:a_s_AIN], + \ [s:a_GHAIN, s:a_s_GHAIN], + \ [s:a_FEH, s:a_s_FEH], + \ [s:a_QAF, s:a_s_QAF], + \ [s:a_KAF, s:a_s_KAF], + \ [s:a_LAM, s:a_s_LAM], + \ [s:a_MEEM, s:a_s_MEEM], + \ [s:a_NOON, s:a_s_NOON], + \ [s:a_HEH, s:a_s_HEH], + \ [s:a_YEH, s:a_s_YEH], + \ ] + call setline(1, ' ' . pair[0] . ' ') + call assert_equal([' ' . pair[1] . ' '], ScreenLines(1, 3)) + endfor + + set arabicshape& + bwipe! + endfunc + + func Test_shape_medial() + new + set arabicshape + + " Shaping arabic {testchar} arabic Tests chg_c_a2m(). + " pair[0] = testchar, pair[1] = next-result, pair[2] = current-result, + " pair[3] = previous-result + for pair in [[s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA, s:a_s_BEH], + \[s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_f_ALEF_MADDA, s:a_i_BEH], + \[s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_f_ALEF_HAMZA_ABOVE, s:a_i_BEH], + \[s:a_WAW_HAMZA, s:a_s_GHAIN, s:a_f_WAW_HAMZA, s:a_i_BEH], + \[s:a_ALEF_HAMZA_BELOW, s:a_s_GHAIN, s:a_f_ALEF_HAMZA_BELOW, s:a_i_BEH], + \[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_m_YEH_HAMZA, s:a_i_BEH], + \[s:a_ALEF, s:a_s_GHAIN, s:a_f_ALEF, s:a_i_BEH], + \[s:a_BEH, s:a_f_GHAIN, s:a_m_BEH, s:a_i_BEH], + \[s:a_TEH_MARBUTA, s:a_s_GHAIN, s:a_f_TEH_MARBUTA, s:a_i_BEH], + \[s:a_TEH, s:a_f_GHAIN, s:a_m_TEH, s:a_i_BEH], + \[s:a_THEH, s:a_f_GHAIN, s:a_m_THEH, s:a_i_BEH], + \[s:a_JEEM, s:a_f_GHAIN, s:a_m_JEEM, s:a_i_BEH], + \[s:a_HAH, s:a_f_GHAIN, s:a_m_HAH, s:a_i_BEH], + \[s:a_KHAH, s:a_f_GHAIN, s:a_m_KHAH, s:a_i_BEH], + \[s:a_DAL, s:a_s_GHAIN, s:a_f_DAL, s:a_i_BEH], + \[s:a_THAL, s:a_s_GHAIN, s:a_f_THAL, s:a_i_BEH], + \[s:a_REH, s:a_s_GHAIN, s:a_f_REH, s:a_i_BEH], + \[s:a_ZAIN, s:a_s_GHAIN, s:a_f_ZAIN, s:a_i_BEH], + \[s:a_SEEN, s:a_f_GHAIN, s:a_m_SEEN, s:a_i_BEH], + \[s:a_SHEEN, s:a_f_GHAIN, s:a_m_SHEEN, s:a_i_BEH], + \[s:a_SAD, s:a_f_GHAIN, s:a_m_SAD, s:a_i_BEH], + \[s:a_DAD, s:a_f_GHAIN, s:a_m_DAD, s:a_i_BEH], + \[s:a_TAH, s:a_f_GHAIN, s:a_m_TAH, s:a_i_BEH], + \[s:a_ZAH, s:a_f_GHAIN, s:a_m_ZAH, s:a_i_BEH], + \[s:a_AIN, s:a_f_GHAIN, s:a_m_AIN, s:a_i_BEH], + \[s:a_GHAIN, s:a_f_GHAIN, s:a_m_GHAIN, s:a_i_BEH], + \[s:a_TATWEEL, s:a_f_GHAIN, s:a_TATWEEL, s:a_i_BEH], + \[s:a_FEH, s:a_f_GHAIN, s:a_m_FEH, s:a_i_BEH], + \[s:a_QAF, s:a_f_GHAIN, s:a_m_QAF, s:a_i_BEH], + \[s:a_KAF, s:a_f_GHAIN, s:a_m_KAF, s:a_i_BEH], + \[s:a_LAM, s:a_f_GHAIN, s:a_m_LAM, s:a_i_BEH], + \[s:a_MEEM, s:a_f_GHAIN, s:a_m_MEEM, s:a_i_BEH], + \[s:a_NOON, s:a_f_GHAIN, s:a_m_NOON, s:a_i_BEH], + \[s:a_HEH, s:a_f_GHAIN, s:a_m_HEH, s:a_i_BEH], + \[s:a_WAW, s:a_s_GHAIN, s:a_f_WAW, s:a_i_BEH], + \[s:a_ALEF_MAKSURA, s:a_s_GHAIN, s:a_f_ALEF_MAKSURA, s:a_i_BEH], + \[s:a_YEH, s:a_f_GHAIN, s:a_m_YEH, s:a_i_BEH], + \ ] + call setline(1, s:a_GHAIN . pair[0] . s:a_BEH) + call assert_equal([pair[1] . pair[2] . pair[3]], ScreenLines(1, 3)) + endfor + + set arabicshape& + bwipe! + endfunc + *** ../vim-8.0.0390/src/version.c 2017-03-01 12:29:03.578834362 +0100 --- src/version.c 2017-03-01 12:49:11.731006864 +0100 *************** *** 766,767 **** --- 766,769 ---- { /* Add new patch number below this line */ + /**/ + 391, /**/ -- hundred-and-one symptoms of being an internet addict: 32. You don't know what sex three of your closest friends are, because they have neutral nicknames and you never bothered to ask. /// 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 /// /// 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 ///