Loading ...
Sorry, an error occurred while loading the content.

[PATCH] simplify arabic.c and add farsi support

Expand Messages
  • Ali Gholami Rudi
    MAJOR CHANGES: * Replace switch statements for obtaining different shapes of Arabic letters with a struct achar array; this removes a lot and makes adding new
    Message 1 of 1 , Jun 23, 2009
    • 0 Attachment
      MAJOR CHANGES:

      * Replace switch statements for obtaining different shapes of Arabic
      letters with a struct achar array; this removes a lot and makes adding
      new letters easier
      * Added Farsi letters to achars array
      * Removed arabic.h and moved ARABIC_CHAR macro to macros.h

      I've written an external test program to check if everything is working
      as before for Arabic shaping (it is attached to this mail). It performs
      shaping on the "input" file which can contain any Arabic text. The
      shaping is tried once using the old arabic.[hc] and once using the new
      arabic.c and finally the results are compared. Anyway, since I don't
      use Arabic much, I'd urge arabic.c users to give this patch a try to
      give it more testing.
      ---
      Filelist | 1 -
      src/arabic.c | 1169 +++++++++------------------------------------------------
      src/arabic.h | 258 -------------
      src/globals.h | 7 -
      src/macros.h | 2 +
      src/mbyte.c | 30 --
      6 files changed, 186 insertions(+), 1281 deletions(-)

      diff --git a/Filelist b/Filelist
      index 6b52edb..476472d 100644
      --- a/Filelist
      +++ b/Filelist
      @@ -5,7 +5,6 @@
      SRC_ALL = \
      src/README.txt \
      src/arabic.c \
      - src/arabic.h \
      src/ascii.h \
      src/buffer.c \
      src/charset.c \
      diff --git a/src/arabic.c b/src/arabic.c
      index 8c1f64c..4d85b43 100644
      --- a/src/arabic.c
      +++ b/src/arabic.c
      @@ -15,917 +15,144 @@
      * --
      *
      * Author: Nadim Shaikli & Isam Bayazidi
      + * Farsi support and restructuring to make adding new
      + * letters easier by Ali Gholami Rudi
      *
      */

      -static int A_is_a __ARGS((int cur_c));
      -static int A_is_s __ARGS((int cur_c));
      -static int A_is_f __ARGS((int cur_c));
      -static int chg_c_a2s __ARGS((int cur_c));
      -static int chg_c_a2i __ARGS((int cur_c));
      -static int chg_c_a2m __ARGS((int cur_c));
      -static int chg_c_a2f __ARGS((int cur_c));
      -static int chg_c_i2m __ARGS((int cur_c));
      -static int chg_c_f2m __ARGS((int cur_c));
      +/*
      + * Sorted list of unicode Arabic characters. Each entry holds the
      + * presentation forms of a letter.
      + *
      + * Arabic characters are categorized into following types:
      + *
      + * Isolated - iso-8859-6 form
      + * Initial - unicode form-B start
      + * Medial - unicode form-B middle
      + * Final - unicode form-B final
      + * Stand-Alone - unicode form-B isolated
      + *
      + * The fields in the struct represent:
      + *
      + * s -> isolated
      + * i -> initial
      + * m -> medial
      + * f -> final
      + *
      + */
      +static struct achar {
      + unsigned c;
      + unsigned s;
      + unsigned i;
      + unsigned m;
      + unsigned f;
      +} achars[] = {
      + {0x0621, 0xfe80}, /* a_HAMZA */
      + {0x0622, 0xfe81, 0, 0, 0xfe82}, /* a_ALEF_MADDA */
      + {0x0623, 0xfe83, 0, 0, 0xfe84}, /* a_ALEF_HAMZA_ABOVE */
      + {0x0624, 0xfe85, 0, 0, 0xfe86}, /* a_WAW_HAMZA */
      + {0x0625, 0xfe87, 0, 0, 0xfe88}, /* a_ALEF_HAMZA_BELOW */
      + {0x0626, 0xfe89, 0xfe8b, 0xfe8c, 0xfe8a}, /* a_YEH_HAMZA */
      + {0x0627, 0xfe8d, 0, 0, 0xfe8e}, /* a_ALEF */
      + {0x0628, 0xfe8f, 0xfe91, 0xfe92, 0xfe90}, /* a_BEH */
      + {0x0629, 0xfe93, 0, 0, 0xfe94}, /* a_TEH_MARBUTA */
      + {0x062a, 0xfe95, 0xfe97, 0xfe98, 0xfe96}, /* a_TEH */
      + {0x062b, 0xfe99, 0xfe9b, 0xfe9c, 0xfe9a}, /* a_THEH */
      + {0x062c, 0xfe9d, 0xfe9f, 0xfea0, 0xfe9e}, /* a_JEEM */
      + {0x062d, 0xfea1, 0xfea3, 0xfea4, 0xfea2}, /* a_HAH */
      + {0x062e, 0xfea5, 0xfea7, 0xfea8, 0xfea6}, /* a_KHAH */
      + {0x062f, 0xfea9, 0, 0, 0xfeaa}, /* a_DAL */
      + {0x0630, 0xfeab, 0, 0, 0xfeac}, /* a_THAL */
      + {0x0631, 0xfead, 0, 0, 0xfeae}, /* a_REH */
      + {0x0632, 0xfeaf, 0, 0, 0xfeb0}, /* a_ZAIN */
      + {0x0633, 0xfeb1, 0xfeb3, 0xfeb4, 0xfeb2}, /* a_SEEN */
      + {0x0634, 0xfeb5, 0xfeb7, 0xfeb8, 0xfeb6}, /* a_SHEEN */
      + {0x0635, 0xfeb9, 0xfebb, 0xfebc, 0xfeba}, /* a_SAD */
      + {0x0636, 0xfebd, 0xfebf, 0xfec0, 0xfebe}, /* a_DAD */
      + {0x0637, 0xfec1, 0xfec3, 0xfec4, 0xfec2}, /* a_TAH */
      + {0x0638, 0xfec5, 0xfec7, 0xfec8, 0xfec6}, /* a_ZAH */
      + {0x0639, 0xfec9, 0xfecb, 0xfecc, 0xfeca}, /* a_AIN */
      + {0x063a, 0xfecd, 0xfecf, 0xfed0, 0xfece}, /* a_GHAIN */
      + {0x0640}, /* a_TATWEEL */
      + {0x0641, 0xfed1, 0xfed3, 0xfed4, 0xfed2}, /* a_FEH */
      + {0x0642, 0xfed5, 0xfed7, 0xfed8, 0xfed6}, /* a_QAF */
      + {0x0643, 0xfed9, 0xfedb, 0xfedc, 0xfeda}, /* a_KAF */
      + {0x0644, 0xfedd, 0xfedf, 0xfee0, 0xfede}, /* a_LAM */
      + {0x0645, 0xfee1, 0xfee3, 0xfee4, 0xfee2}, /* a_MEEM */
      + {0x0646, 0xfee5, 0xfee7, 0xfee8, 0xfee6}, /* a_NOON */
      + {0x0647, 0xfee9, 0xfeeb, 0xfeec, 0xfeea}, /* a_HEH */
      + {0x0648, 0xfeed, 0, 0, 0xfeee}, /* a_WAW */
      + {0x0649, 0xfeef, 0, 0, 0xfef0}, /* a_ALEF_MAKSURA */
      + {0x064a, 0xfef1, 0xfef3, 0xfef4, 0xfef2}, /* a_YEH */
      + {0x064b, 0xfe70}, /* a_FATHATAN */
      + {0x064c, 0xfe72}, /* a_DAMMATAN */
      + {0x064d, 0xfe74}, /* a_KASRATAN */
      + {0x064e, 0xfe76, 0, 0xfe77, 0}, /* a_FATHA */
      + {0x064f, 0xfe78, 0, 0xfe79, 0}, /* a_DAMMA */
      + {0x0650, 0xfe7a, 0, 0xfe7b, 0}, /* a_KASRA */
      + {0x0651, 0xfe7c, 0, 0xfe7c, 0}, /* a_SHADDA */
      + {0x0652, 0xfe7e, 0, 0xfe7f, 0}, /* a_SUKUN */
      + {0x0653}, /* a_MADDA_ABOVE */
      + {0x0654}, /* a_HAMZA_ABOVE */
      + {0x0655}, /* a_HAMZA_BELOW */
      + {0x067e, 0xfb56, 0xfb58, 0xfb59, 0xfb57}, /* a_PEH */
      + {0x0686, 0xfb7a, 0xfb7c, 0xfb7d, 0xfb7b}, /* a_TCHEH */
      + {0x0698, 0xfb8a, 0, 0, 0xfb8b}, /* a_JEH */
      + {0x06a9, 0xfb8e, 0xfb90, 0xfb91, 0xfb8f}, /* a_FKAF */
      + {0x06af, 0xfb92, 0xfb94, 0xfb95, 0xfb93}, /* a_GAF */
      + {0x06cc, 0xfbfc, 0xfbfe, 0xfbff, 0xfbfd}, /* a_FYEH */
      +};
      +
      +/* these values are hardcoded in functions */
      +#define a_HAMZA 0x0621
      +#define a_ALEF_MADDA 0x0622
      +#define a_ALEF_HAMZA_ABOVE 0x0623
      +#define a_ALEF_HAMZA_BELOW 0x0625
      +#define a_ALEF 0x0627
      +#define a_LAM 0x0644
      +
      +#define a_s_LAM_ALEF_MADDA_ABOVE 0xfef5
      +#define a_f_LAM_ALEF_MADDA_ABOVE 0xfef6
      +#define a_s_LAM_ALEF_HAMZA_ABOVE 0xfef7
      +#define a_f_LAM_ALEF_HAMZA_ABOVE 0xfef8
      +#define a_s_LAM_ALEF_HAMZA_BELOW 0xfef9
      +#define a_f_LAM_ALEF_HAMZA_BELOW 0xfefa
      +#define a_s_LAM_ALEF 0xfefb
      +#define a_f_LAM_ALEF 0xfefc
      +
      +#define a_BYTE_ORDER_MARK 0xfeff
      +
      +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
      +
      static int chg_c_laa2i __ARGS((int hid_c));
      static int chg_c_laa2f __ARGS((int hid_c));
      -static int half_shape __ARGS((int c));
      -static int A_firstc_laa __ARGS((int c1, int c));
      -static int A_is_harakat __ARGS((int c));
      static int A_is_iso __ARGS((int c));
      -static int A_is_formb __ARGS((int c));
      static int A_is_ok __ARGS((int c));
      static int A_is_valid __ARGS((int c));
      -static int A_is_special __ARGS((int c));
      -
      -
      -/*
      - * Returns True if c is an ISO-8859-6 shaped ARABIC letter (user entered)
      - */
      - static int
      -A_is_a(cur_c)
      - int cur_c;
      -{
      - switch (cur_c)
      - {
      - case a_HAMZA:
      - case a_ALEF_MADDA:
      - case a_ALEF_HAMZA_ABOVE:
      - case a_WAW_HAMZA:
      - case a_ALEF_HAMZA_BELOW:
      - case a_YEH_HAMZA:
      - case a_ALEF:
      - case a_BEH:
      - case a_TEH_MARBUTA:
      - case a_TEH:
      - case a_THEH:
      - case a_JEEM:
      - case a_HAH:
      - case a_KHAH:
      - case a_DAL:
      - case a_THAL:
      - case a_REH:
      - case a_ZAIN:
      - case a_SEEN:
      - case a_SHEEN:
      - case a_SAD:
      - case a_DAD:
      - case a_TAH:
      - case a_ZAH:
      - case a_AIN:
      - case a_GHAIN:
      - case a_TATWEEL:
      - case a_FEH:
      - case a_QAF:
      - case a_KAF:
      - case a_LAM:
      - case a_MEEM:
      - case a_NOON:
      - case a_HEH:
      - case a_WAW:
      - case a_ALEF_MAKSURA:
      - case a_YEH:
      - return TRUE;
      - }
      -
      - return FALSE;
      -}
      -
      -
      -/*
      - * Returns True if c is an Isolated Form-B ARABIC letter
      - */
      - static int
      -A_is_s(cur_c)
      - int cur_c;
      -{
      - switch (cur_c)
      - {
      - case a_s_HAMZA:
      - case a_s_ALEF_MADDA:
      - case a_s_ALEF_HAMZA_ABOVE:
      - case a_s_WAW_HAMZA:
      - case a_s_ALEF_HAMZA_BELOW:
      - case a_s_YEH_HAMZA:
      - case a_s_ALEF:
      - case a_s_BEH:
      - case a_s_TEH_MARBUTA:
      - case a_s_TEH:
      - case a_s_THEH:
      - case a_s_JEEM:
      - case a_s_HAH:
      - case a_s_KHAH:
      - case a_s_DAL:
      - case a_s_THAL:
      - case a_s_REH:
      - case a_s_ZAIN:
      - case a_s_SEEN:
      - case a_s_SHEEN:
      - case a_s_SAD:
      - case a_s_DAD:
      - case a_s_TAH:
      - case a_s_ZAH:
      - case a_s_AIN:
      - case a_s_GHAIN:
      - case a_s_FEH:
      - case a_s_QAF:
      - case a_s_KAF:
      - case a_s_LAM:
      - case a_s_MEEM:
      - case a_s_NOON:
      - case a_s_HEH:
      - case a_s_WAW:
      - case a_s_ALEF_MAKSURA:
      - case a_s_YEH:
      - return TRUE;
      - }
      -
      - return FALSE;
      -}
      -
      -
      -/*
      - * Returns True if c is a Final shape of an ARABIC letter
      - */
      - static int
      -A_is_f(cur_c)
      - int cur_c;
      -{
      - switch (cur_c)
      - {
      - case a_f_ALEF_MADDA:
      - case a_f_ALEF_HAMZA_ABOVE:
      - case a_f_WAW_HAMZA:
      - case a_f_ALEF_HAMZA_BELOW:
      - case a_f_YEH_HAMZA:
      - case a_f_ALEF:
      - case a_f_BEH:
      - case a_f_TEH_MARBUTA:
      - case a_f_TEH:
      - case a_f_THEH:
      - case a_f_JEEM:
      - case a_f_HAH:
      - case a_f_KHAH:
      - case a_f_DAL:
      - case a_f_THAL:
      - case a_f_REH:
      - case a_f_ZAIN:
      - case a_f_SEEN:
      - case a_f_SHEEN:
      - case a_f_SAD:
      - case a_f_DAD:
      - case a_f_TAH:
      - case a_f_ZAH:
      - case a_f_AIN:
      - case a_f_GHAIN:
      - case a_f_FEH:
      - case a_f_QAF:
      - case a_f_KAF:
      - case a_f_LAM:
      - case a_f_MEEM:
      - case a_f_NOON:
      - case a_f_HEH:
      - case a_f_WAW:
      - case a_f_ALEF_MAKSURA:
      - case a_f_YEH:
      - case a_f_LAM_ALEF_MADDA_ABOVE:
      - case a_f_LAM_ALEF_HAMZA_ABOVE:
      - case a_f_LAM_ALEF_HAMZA_BELOW:
      - case a_f_LAM_ALEF:
      - return TRUE;
      - }
      - return FALSE;
      -}
      -
      -
      -/*
      - * Change shape - from ISO-8859-6/Isolated to Form-B Isolated
      - */
      - static int
      -chg_c_a2s(cur_c)
      - 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;
      -}
      -

      /*
      - * Change shape - from ISO-8859-6/Isolated to Initial
      + * Find the struct achar pointer to the given arabic char
      */
      - static int
      -chg_c_a2i(cur_c)
      - 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;
      -}
      -
      -
      -/*
      - * Change shape - from ISO-8859-6/Isolated to Medial
      - */
      - static int
      -chg_c_a2m(cur_c)
      - 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;
      -}
      -
      -
      -/*
      - * Change shape - from ISO-8859-6/Isolated to final
      - */
      - static int
      -chg_c_a2f(cur_c)
      - int cur_c;
      -{
      - int tempc;
      -
      - /* NOTE: these encodings need to be accounted for
      -
      - a_f_ALEF_MADDA;
      - a_f_ALEF_HAMZA_ABOVE;
      - a_f_ALEF_HAMZA_BELOW;
      - a_f_LAM_ALEF_MADDA_ABOVE;
      - a_f_LAM_ALEF_HAMZA_ABOVE;
      - a_f_LAM_ALEF_HAMZA_BELOW;
      - */
      -
      - switch (cur_c)
      - {
      - case a_HAMZA: /* exception */
      - tempc = a_s_HAMZA;
      - break;
      - case a_ALEF_MADDA:
      - tempc = a_f_ALEF_MADDA;
      - break;
      - case a_ALEF_HAMZA_ABOVE:
      - tempc = a_f_ALEF_HAMZA_ABOVE;
      - break;
      - case a_WAW_HAMZA:
      - tempc = a_f_WAW_HAMZA;
      - break;
      - case a_ALEF_HAMZA_BELOW:
      - tempc = a_f_ALEF_HAMZA_BELOW;
      - break;
      - case a_YEH_HAMZA:
      - tempc = a_f_YEH_HAMZA;
      - break;
      - case a_ALEF:
      - tempc = a_f_ALEF;
      - break;
      - case a_BEH:
      - tempc = a_f_BEH;
      - break;
      - case a_TEH_MARBUTA:
      - tempc = a_f_TEH_MARBUTA;
      - break;
      - case a_TEH:
      - tempc = a_f_TEH;
      - break;
      - case a_THEH:
      - tempc = a_f_THEH;
      - break;
      - case a_JEEM:
      - tempc = a_f_JEEM;
      - break;
      - case a_HAH:
      - tempc = a_f_HAH;
      - break;
      - case a_KHAH:
      - tempc = a_f_KHAH;
      - break;
      - case a_DAL:
      - tempc = a_f_DAL;
      - break;
      - case a_THAL:
      - tempc = a_f_THAL;
      - break;
      - case a_REH:
      - tempc = a_f_REH;
      - break;
      - case a_ZAIN:
      - tempc = a_f_ZAIN;
      - break;
      - case a_SEEN:
      - tempc = a_f_SEEN;
      - break;
      - case a_SHEEN:
      - tempc = a_f_SHEEN;
      - break;
      - case a_SAD:
      - tempc = a_f_SAD;
      - break;
      - case a_DAD:
      - tempc = a_f_DAD;
      - break;
      - case a_TAH:
      - tempc = a_f_TAH;
      - break;
      - case a_ZAH:
      - tempc = a_f_ZAH;
      - break;
      - case a_AIN:
      - tempc = a_f_AIN;
      - break;
      - case a_GHAIN:
      - tempc = a_f_GHAIN;
      - break;
      - case a_TATWEEL: /* exception */
      - tempc = cur_c;
      - break;
      - case a_FEH:
      - tempc = a_f_FEH;
      - break;
      - case a_QAF:
      - tempc = a_f_QAF;
      - break;
      - case a_KAF:
      - tempc = a_f_KAF;
      - break;
      - case a_LAM:
      - tempc = a_f_LAM;
      - break;
      - case a_MEEM:
      - tempc = a_f_MEEM;
      - break;
      - case a_NOON:
      - tempc = a_f_NOON;
      - break;
      - case a_HEH:
      - tempc = a_f_HEH;
      - break;
      - case a_WAW:
      - tempc = a_f_WAW;
      - break;
      - case a_ALEF_MAKSURA:
      - tempc = a_f_ALEF_MAKSURA;
      - break;
      - case a_YEH:
      - tempc = a_f_YEH;
      - break;
      - default:
      - tempc = 0;
      - }
      -
      - return tempc;
      -}
      -
      -
      -/*
      - * Change shape - from Initial to Medial
      - */
      - static int
      -chg_c_i2m(cur_c)
      - int cur_c;
      -{
      - int tempc;
      -
      - switch (cur_c)
      - {
      - case a_i_YEH_HAMZA:
      - tempc = a_m_YEH_HAMZA;
      - break;
      - case a_i_BEH:
      - tempc = a_m_BEH;
      - break;
      - case a_i_TEH:
      - tempc = a_m_TEH;
      - break;
      - case a_i_THEH:
      - tempc = a_m_THEH;
      - break;
      - case a_i_JEEM:
      - tempc = a_m_JEEM;
      - break;
      - case a_i_HAH:
      - tempc = a_m_HAH;
      - break;
      - case a_i_KHAH:
      - tempc = a_m_KHAH;
      - break;
      - case a_i_SEEN:
      - tempc = a_m_SEEN;
      - break;
      - case a_i_SHEEN:
      - tempc = a_m_SHEEN;
      - break;
      - case a_i_SAD:
      - tempc = a_m_SAD;
      - break;
      - case a_i_DAD:
      - tempc = a_m_DAD;
      - break;
      - case a_i_TAH:
      - tempc = a_m_TAH;
      - break;
      - case a_i_ZAH:
      - tempc = a_m_ZAH;
      - break;
      - case a_i_AIN:
      - tempc = a_m_AIN;
      - break;
      - case a_i_GHAIN:
      - tempc = a_m_GHAIN;
      - break;
      - case a_i_FEH:
      - tempc = a_m_FEH;
      - break;
      - case a_i_QAF:
      - tempc = a_m_QAF;
      - break;
      - case a_i_KAF:
      - tempc = a_m_KAF;
      - break;
      - case a_i_LAM:
      - tempc = a_m_LAM;
      - break;
      - case a_i_MEEM:
      - tempc = a_m_MEEM;
      - break;
      - case a_i_NOON:
      - tempc = a_m_NOON;
      - break;
      - case a_i_HEH:
      - tempc = a_m_HEH;
      - break;
      - case a_i_YEH:
      - tempc = a_m_YEH;
      - break;
      - default:
      - tempc = 0;
      - }
      -
      - return tempc;
      -}
      -
      -
      -/*
      - * Change shape - from Final to Medial
      - */
      - static int
      -chg_c_f2m(cur_c)
      - int cur_c;
      + static struct achar *
      +find_achar(c)
      + int c;
      {
      - int tempc;
      -
      - switch (cur_c)
      - {
      - /* NOTE: these encodings are multi-positional, no ?
      - case a_f_ALEF_MADDA:
      - case a_f_ALEF_HAMZA_ABOVE:
      - case a_f_ALEF_HAMZA_BELOW:
      - */
      - case a_f_YEH_HAMZA:
      - tempc = a_m_YEH_HAMZA;
      - break;
      - case a_f_WAW_HAMZA: /* exceptions */
      - case a_f_ALEF:
      - case a_f_TEH_MARBUTA:
      - case a_f_DAL:
      - case a_f_THAL:
      - case a_f_REH:
      - case a_f_ZAIN:
      - case a_f_WAW:
      - case a_f_ALEF_MAKSURA:
      - tempc = cur_c;
      - break;
      - case a_f_BEH:
      - tempc = a_m_BEH;
      - break;
      - case a_f_TEH:
      - tempc = a_m_TEH;
      - break;
      - case a_f_THEH:
      - tempc = a_m_THEH;
      - break;
      - case a_f_JEEM:
      - tempc = a_m_JEEM;
      - break;
      - case a_f_HAH:
      - tempc = a_m_HAH;
      - break;
      - case a_f_KHAH:
      - tempc = a_m_KHAH;
      - break;
      - case a_f_SEEN:
      - tempc = a_m_SEEN;
      - break;
      - case a_f_SHEEN:
      - tempc = a_m_SHEEN;
      - break;
      - case a_f_SAD:
      - tempc = a_m_SAD;
      - break;
      - case a_f_DAD:
      - tempc = a_m_DAD;
      - break;
      - case a_f_TAH:
      - tempc = a_m_TAH;
      - break;
      - case a_f_ZAH:
      - tempc = a_m_ZAH;
      - break;
      - case a_f_AIN:
      - tempc = a_m_AIN;
      - break;
      - case a_f_GHAIN:
      - tempc = a_m_GHAIN;
      - break;
      - case a_f_FEH:
      - tempc = a_m_FEH;
      - break;
      - case a_f_QAF:
      - tempc = a_m_QAF;
      - break;
      - case a_f_KAF:
      - tempc = a_m_KAF;
      - break;
      - case a_f_LAM:
      - tempc = a_m_LAM;
      - break;
      - case a_f_MEEM:
      - tempc = a_m_MEEM;
      - break;
      - case a_f_NOON:
      - tempc = a_m_NOON;
      - break;
      - case a_f_HEH:
      - tempc = a_m_HEH;
      - break;
      - case a_f_YEH:
      - tempc = a_m_YEH;
      - break;
      - /* NOTE: these encodings are multi-positional, no ?
      - case a_f_LAM_ALEF_MADDA_ABOVE:
      - case a_f_LAM_ALEF_HAMZA_ABOVE:
      - case a_f_LAM_ALEF_HAMZA_BELOW:
      - case a_f_LAM_ALEF:
      - */
      - default:
      - tempc = 0;
      + int h, m, l;
      + h = ARRAY_SIZE(achars);
      + l = 0;
      + /* using binary search to find c */
      + while (l < h) {
      + m = (h + l) / 2;
      + if (achars[m].c == c)
      + return &achars[m];
      + if (c < achars[m].c)
      + h = m;
      + else
      + l = m + 1;
      }
      -
      - return tempc;
      + return NULL;
      }

      -
      /*
      * Change shape - from Combination (2 char) to an Isolated
      */
      @@ -988,17 +215,46 @@ chg_c_laa2f(hid_c)
      }

      /*
      - * Do "half-shaping" on character "c". Return zero if no shaping.
      + * Returns whether it is possible to join the given letters
      */
      static int
      -half_shape(c)
      - int c;
      +can_join(c1, c2)
      + int c1;
      + int c2;
      +{
      + struct achar *a1 = find_achar(c1);
      + struct achar *a2 = find_achar(c2);
      + return a1 && a2 && (a1->i || a1->m) && (a2->f || a2->m);
      +}
      +
      +/*
      + * Check whether we are dealing with Arabic combining characters.
      + * Note: these are NOT really composing characters!
      + */
      + int
      +arabic_combine(one, two)
      + int one; /* first character */
      + int two; /* character just after "one" */
      +{
      + if (one == a_LAM)
      + return arabic_maycombine(two);
      + return FALSE;
      +}
      +
      +/*
      + * Check whether we are dealing with a character that could be regarded as an
      + * Arabic combining character, need to check the character before this.
      + */
      + int
      +arabic_maycombine(two)
      + int two;
      {
      - if (A_is_a(c))
      - return chg_c_a2i(c);
      - if (A_is_valid(c) && A_is_f(c))
      - return chg_c_f2m(c);
      - return 0;
      + if (p_arshape && !p_tbidi)
      + return (two == a_ALEF_MADDA
      + || two == a_ALEF_HAMZA_ABOVE
      + || two == a_ALEF_HAMZA_BELOW
      + || two == a_ALEF);
      + return FALSE;
      }

      /*
      @@ -1019,46 +275,44 @@ arabic_shape(c, ccp, c1p, prev_c, prev_c1, next_c)
      int prev_c1;
      int next_c;
      {
      - int curr_c;
      - int shape_c;
      - int curr_laa;
      - int prev_laa;
      + int curr_c;
      + int curr_laa;
      + int prev_laa;

      /* Deal only with Arabic character, pass back all others */
      if (!A_is_ok(c))
      return c;

      - /* half-shape current and previous character */
      - shape_c = half_shape(prev_c);
      -
      /* Save away current character */
      curr_c = c;

      - curr_laa = A_firstc_laa(c, *c1p);
      - prev_laa = A_firstc_laa(prev_c, prev_c1);
      + curr_laa = arabic_combine(c, *c1p);
      + prev_laa = arabic_combine(prev_c, prev_c1);

      if (curr_laa)
      {
      - if (A_is_valid(prev_c) && !A_is_f(shape_c)
      - && !A_is_s(shape_c) && !prev_laa)
      - curr_c = chg_c_laa2f(curr_laa);
      + if (A_is_valid(prev_c) && can_join(prev_c, a_LAM) && !prev_laa)
      + curr_c = chg_c_laa2f(*c1p);
      else
      - curr_c = chg_c_laa2i(curr_laa);
      + curr_c = chg_c_laa2i(*c1p);

      /* Remove the composing character */
      *c1p = 0;
      }
      - else if (!A_is_valid(prev_c) && A_is_valid(next_c))
      - curr_c = chg_c_a2i(c);
      - else if (!shape_c || A_is_f(shape_c) || A_is_s(shape_c) || prev_laa)
      - curr_c = A_is_valid(next_c) ? chg_c_a2i(c) : chg_c_a2s(c);
      - else if (A_is_valid(next_c))
      - curr_c = A_is_iso(c) ? chg_c_a2m(c) : chg_c_i2m(c);
      - else if (A_is_valid(prev_c))
      - curr_c = chg_c_a2f(c);
      else
      - curr_c = chg_c_a2s(c);
      -
      + {
      + struct achar *curr_a = find_achar(c);
      + int backward_combine = !prev_laa && can_join(prev_c, curr_c);
      + int forward_combine = can_join(curr_c, next_c);
      + if (backward_combine && forward_combine)
      + curr_c = curr_a->m;
      + if (backward_combine && !forward_combine)
      + curr_c = curr_a->f;
      + if (!backward_combine && forward_combine)
      + curr_c = curr_a->i;
      + if (!backward_combine && !forward_combine)
      + curr_c = curr_a->s;
      + }
      /* Sanity check -- curr_c should, in the future, never be 0.
      * We should, in the future, insert a fatal error here. */
      if (curr_c == NUL)
      @@ -1079,32 +333,6 @@ arabic_shape(c, ccp, c1p, prev_c, prev_c1, next_c)


      /*
      - * A_firstc_laa returns first character of LAA combination if it exists
      - */
      - static int
      -A_firstc_laa(c, c1)
      - int c; /* base character */
      - int c1; /* first composing character */
      -{
      - if (c1 != NUL && c == a_LAM && !A_is_harakat(c1))
      - return c1;
      - return 0;
      -}
      -
      -
      -/*
      - * A_is_harakat returns TRUE if 'c' is an Arabic Harakat character
      - * (harakat/tanween)
      - */
      - static int
      -A_is_harakat(c)
      - int c;
      -{
      - return (c >= a_FATHATAN && c <= a_SUKUN);
      -}
      -
      -
      -/*
      * A_is_iso returns TRUE if 'c' is an Arabic ISO-8859-6 character
      * (alphabet/number/punctuation)
      */
      @@ -1112,24 +340,7 @@ A_is_harakat(c)
      A_is_iso(c)
      int c;
      {
      - return ((c >= a_HAMZA && c <= a_GHAIN)
      - || (c >= a_TATWEEL && c <= a_HAMZA_BELOW)
      - || c == a_MINI_ALEF);
      -}
      -
      -
      -/*
      - * A_is_formb returns TRUE if 'c' is an Arabic 10646-1 FormB character
      - * (alphabet/number/punctuation)
      - */
      - static int
      -A_is_formb(c)
      - int c;
      -{
      - return ((c >= a_s_FATHATAN && c <= a_s_DAMMATAN)
      - || c == a_s_KASRATAN
      - || (c >= a_s_FATHA && c <= a_f_LAM_ALEF)
      - || c == a_BYTE_ORDER_MARK);
      + return find_achar(c) != NULL;
      }


      @@ -1140,7 +351,7 @@ A_is_formb(c)
      A_is_ok(c)
      int c;
      {
      - return (A_is_iso(c) || A_is_formb(c));
      + return (A_is_iso(c) || c == a_BYTE_ORDER_MARK);
      }


      @@ -1152,17 +363,5 @@ A_is_ok(c)
      A_is_valid(c)
      int c;
      {
      - return (A_is_ok(c) && !A_is_special(c));
      -}
      -
      -
      -/*
      - * A_is_special returns TRUE if 'c' is not a special Arabic character.
      - * Specials don't adhere to most of the rules.
      - */
      - static int
      -A_is_special(c)
      - int c;
      -{
      - return (c == a_HAMZA || c == a_s_HAMZA);
      + return (A_is_ok(c) && c != a_HAMZA);
      }
      diff --git a/src/arabic.h b/src/arabic.h
      deleted file mode 100644
      index 3a948d0..0000000
      --- a/src/arabic.h
      +++ /dev/null
      @@ -1,258 +0,0 @@
      -/* 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.
      - */
      -
      -/*
      - * Arabic characters are categorized into following types:
      - *
      - * Isolated - iso-8859-6 form char denoted with a_*
      - * Initial - unicode form-B start char denoted with a_i_*
      - * Medial - unicode form-B middle char denoted with a_m_*
      - * Final - unicode form-B final char denoted with a_f_*
      - * Stand-Alone - unicode form-B isolated char denoted with a_s_* (NOT USED)
      - *
      - * --
      - *
      - * Author: Nadim Shaikli & Isam Bayazidi
      - * - (based on Unicode)
      - *
      - */
      -
      -/*
      - * Arabic ISO-10646-1 character set definition
      - */
      -
      -/*
      - * Arabic ISO-8859-6 (subset of 10646; 0600 - 06FF)
      - */
      -#define a_COMMA 0x060C
      -#define a_SEMICOLON 0x061B
      -#define a_QUESTION 0x061F
      -#define a_HAMZA 0x0621
      -#define a_ALEF_MADDA 0x0622
      -#define a_ALEF_HAMZA_ABOVE 0x0623
      -#define a_WAW_HAMZA 0x0624
      -#define a_ALEF_HAMZA_BELOW 0x0625
      -#define a_YEH_HAMZA 0x0626
      -#define a_ALEF 0x0627
      -#define a_BEH 0x0628
      -#define a_TEH_MARBUTA 0x0629
      -#define a_TEH 0x062a
      -#define a_THEH 0x062b
      -#define a_JEEM 0x062c
      -#define a_HAH 0x062d
      -#define a_KHAH 0x062e
      -#define a_DAL 0x062f
      -#define a_THAL 0x0630
      -#define a_REH 0x0631
      -#define a_ZAIN 0x0632
      -#define a_SEEN 0x0633
      -#define a_SHEEN 0x0634
      -#define a_SAD 0x0635
      -#define a_DAD 0x0636
      -#define a_TAH 0x0637
      -#define a_ZAH 0x0638
      -#define a_AIN 0x0639
      -#define a_GHAIN 0x063a
      -#define a_TATWEEL 0x0640
      -#define a_FEH 0x0641
      -#define a_QAF 0x0642
      -#define a_KAF 0x0643
      -#define a_LAM 0x0644
      -#define a_MEEM 0x0645
      -#define a_NOON 0x0646
      -#define a_HEH 0x0647
      -#define a_WAW 0x0648
      -#define a_ALEF_MAKSURA 0x0649
      -#define a_YEH 0x064a
      -
      -#define a_FATHATAN 0x064b
      -#define a_DAMMATAN 0x064c
      -#define a_KASRATAN 0x064d
      -#define a_FATHA 0x064e
      -#define a_DAMMA 0x064f
      -#define a_KASRA 0x0650
      -#define a_SHADDA 0x0651
      -#define a_SUKUN 0x0652
      -
      -#define a_MADDA_ABOVE 0x0653
      -#define a_HAMZA_ABOVE 0x0654
      -#define a_HAMZA_BELOW 0x0655
      -
      -#define a_ZERO 0x0660
      -#define a_ONE 0x0661
      -#define a_TWO 0x0662
      -#define a_THREE 0x0663
      -#define a_FOUR 0x0664
      -#define a_FIVE 0x0665
      -#define a_SIX 0x0666
      -#define a_SEVEN 0x0667
      -#define a_EIGHT 0x0668
      -#define a_NINE 0x0669
      -#define a_PERCENT 0x066a
      -#define a_DECIMAL 0x066b
      -#define a_THOUSANDS 0x066c
      -#define a_STAR 0x066d
      -#define a_MINI_ALEF 0x0670
      -/* Rest of 8859-6 does not relate to Arabic */
      -
      -/*
      - * Arabic Presentation Form-B (subset of 10646; FE70 - FEFF)
      - *
      - * s -> isolated
      - * i -> initial
      - * m -> medial
      - * f -> final
      - *
      - */
      -#define a_s_FATHATAN 0xfe70
      -#define a_m_TATWEEL_FATHATAN 0xfe71
      -#define a_s_DAMMATAN 0xfe72
      -
      -#define a_s_KASRATAN 0xfe74
      -
      -#define a_s_FATHA 0xfe76
      -#define a_m_FATHA 0xfe77
      -#define a_s_DAMMA 0xfe78
      -#define a_m_DAMMA 0xfe79
      -#define a_s_KASRA 0xfe7a
      -#define a_m_KASRA 0xfe7b
      -#define a_s_SHADDA 0xfe7c
      -#define a_m_SHADDA 0xfe7d
      -#define a_s_SUKUN 0xfe7e
      -#define a_m_SUKUN 0xfe7f
      -
      -#define a_s_HAMZA 0xfe80
      -#define a_s_ALEF_MADDA 0xfe81
      -#define a_f_ALEF_MADDA 0xfe82
      -#define a_s_ALEF_HAMZA_ABOVE 0xfe83
      -#define a_f_ALEF_HAMZA_ABOVE 0xfe84
      -#define a_s_WAW_HAMZA 0xfe85
      -#define a_f_WAW_HAMZA 0xfe86
      -#define a_s_ALEF_HAMZA_BELOW 0xfe87
      -#define a_f_ALEF_HAMZA_BELOW 0xfe88
      -#define a_s_YEH_HAMZA 0xfe89
      -#define a_f_YEH_HAMZA 0xfe8a
      -#define a_i_YEH_HAMZA 0xfe8b
      -#define a_m_YEH_HAMZA 0xfe8c
      -#define a_s_ALEF 0xfe8d
      -#define a_f_ALEF 0xfe8e
      -#define a_s_BEH 0xfe8f
      -#define a_f_BEH 0xfe90
      -#define a_i_BEH 0xfe91
      -#define a_m_BEH 0xfe92
      -#define a_s_TEH_MARBUTA 0xfe93
      -#define a_f_TEH_MARBUTA 0xfe94
      -#define a_s_TEH 0xfe95
      -#define a_f_TEH 0xfe96
      -#define a_i_TEH 0xfe97
      -#define a_m_TEH 0xfe98
      -#define a_s_THEH 0xfe99
      -#define a_f_THEH 0xfe9a
      -#define a_i_THEH 0xfe9b
      -#define a_m_THEH 0xfe9c
      -#define a_s_JEEM 0xfe9d
      -#define a_f_JEEM 0xfe9e
      -#define a_i_JEEM 0xfe9f
      -#define a_m_JEEM 0xfea0
      -#define a_s_HAH 0xfea1
      -#define a_f_HAH 0xfea2
      -#define a_i_HAH 0xfea3
      -#define a_m_HAH 0xfea4
      -#define a_s_KHAH 0xfea5
      -#define a_f_KHAH 0xfea6
      -#define a_i_KHAH 0xfea7
      -#define a_m_KHAH 0xfea8
      -#define a_s_DAL 0xfea9
      -#define a_f_DAL 0xfeaa
      -#define a_s_THAL 0xfeab
      -#define a_f_THAL 0xfeac
      -#define a_s_REH 0xfead
      -#define a_f_REH 0xfeae
      -#define a_s_ZAIN 0xfeaf
      -#define a_f_ZAIN 0xfeb0
      -#define a_s_SEEN 0xfeb1
      -#define a_f_SEEN 0xfeb2
      -#define a_i_SEEN 0xfeb3
      -#define a_m_SEEN 0xfeb4
      -#define a_s_SHEEN 0xfeb5
      -#define a_f_SHEEN 0xfeb6
      -#define a_i_SHEEN 0xfeb7
      -#define a_m_SHEEN 0xfeb8
      -#define a_s_SAD 0xfeb9
      -#define a_f_SAD 0xfeba
      -#define a_i_SAD 0xfebb
      -#define a_m_SAD 0xfebc
      -#define a_s_DAD 0xfebd
      -#define a_f_DAD 0xfebe
      -#define a_i_DAD 0xfebf
      -#define a_m_DAD 0xfec0
      -#define a_s_TAH 0xfec1
      -#define a_f_TAH 0xfec2
      -#define a_i_TAH 0xfec3
      -#define a_m_TAH 0xfec4
      -#define a_s_ZAH 0xfec5
      -#define a_f_ZAH 0xfec6
      -#define a_i_ZAH 0xfec7
      -#define a_m_ZAH 0xfec8
      -#define a_s_AIN 0xfec9
      -#define a_f_AIN 0xfeca
      -#define a_i_AIN 0xfecb
      -#define a_m_AIN 0xfecc
      -#define a_s_GHAIN 0xfecd
      -#define a_f_GHAIN 0xfece
      -#define a_i_GHAIN 0xfecf
      -#define a_m_GHAIN 0xfed0
      -#define a_s_FEH 0xfed1
      -#define a_f_FEH 0xfed2
      -#define a_i_FEH 0xfed3
      -#define a_m_FEH 0xfed4
      -#define a_s_QAF 0xfed5
      -#define a_f_QAF 0xfed6
      -#define a_i_QAF 0xfed7
      -#define a_m_QAF 0xfed8
      -#define a_s_KAF 0xfed9
      -#define a_f_KAF 0xfeda
      -#define a_i_KAF 0xfedb
      -#define a_m_KAF 0xfedc
      -#define a_s_LAM 0xfedd
      -#define a_f_LAM 0xfede
      -#define a_i_LAM 0xfedf
      -#define a_m_LAM 0xfee0
      -#define a_s_MEEM 0xfee1
      -#define a_f_MEEM 0xfee2
      -#define a_i_MEEM 0xfee3
      -#define a_m_MEEM 0xfee4
      -#define a_s_NOON 0xfee5
      -#define a_f_NOON 0xfee6
      -#define a_i_NOON 0xfee7
      -#define a_m_NOON 0xfee8
      -#define a_s_HEH 0xfee9
      -#define a_f_HEH 0xfeea
      -#define a_i_HEH 0xfeeb
      -#define a_m_HEH 0xfeec
      -#define a_s_WAW 0xfeed
      -#define a_f_WAW 0xfeee
      -#define a_s_ALEF_MAKSURA 0xfeef
      -#define a_f_ALEF_MAKSURA 0xfef0
      -#define a_s_YEH 0xfef1
      -#define a_f_YEH 0xfef2
      -#define a_i_YEH 0xfef3
      -#define a_m_YEH 0xfef4
      -#define a_s_LAM_ALEF_MADDA_ABOVE 0xfef5
      -#define a_f_LAM_ALEF_MADDA_ABOVE 0xfef6
      -#define a_s_LAM_ALEF_HAMZA_ABOVE 0xfef7
      -#define a_f_LAM_ALEF_HAMZA_ABOVE 0xfef8
      -#define a_s_LAM_ALEF_HAMZA_BELOW 0xfef9
      -#define a_f_LAM_ALEF_HAMZA_BELOW 0xfefa
      -#define a_s_LAM_ALEF 0xfefb
      -#define a_f_LAM_ALEF 0xfefc
      -
      -#define a_BYTE_ORDER_MARK 0xfeff
      -
      -/* Range of Arabic characters that might be shaped. */
      -#define ARABIC_CHAR(c) ((c) >= a_HAMZA && (c) <= a_MINI_ALEF)
      diff --git a/src/globals.h b/src/globals.h
      index b870962..05d4819 100644
      --- a/src/globals.h
      +++ b/src/globals.h
      @@ -1572,10 +1572,3 @@ EXTERN char *ignoredp;
      #ifdef FEAT_FKMAP
      # include "farsi.h"
      #endif
      -
      -/*
      - * Optional Arabic support. Include it here, so EXTERN and INIT are defined.
      - */
      -#ifdef FEAT_ARABIC
      -# include "arabic.h"
      -#endif
      diff --git a/src/macros.h b/src/macros.h
      index 68ea6bc..661ab8e 100644
      --- a/src/macros.h
      +++ b/src/macros.h
      @@ -255,6 +255,8 @@
      #endif

      #ifdef FEAT_ARABIC
      +/* range of Arabic characters that might be shaped. */
      +# define ARABIC_CHAR(ch) (((ch) & 0xFF00) == 0x0600)
      # define UTF_COMPOSINGLIKE(p1, p2) utf_composinglike((p1), (p2))
      #else
      # define UTF_COMPOSINGLIKE(p1, p2) utf_iscomposing(utf_ptr2char(p2))
      diff --git a/src/mbyte.c b/src/mbyte.c
      index 1b8733c..0d9c459 100644
      --- a/src/mbyte.c
      +++ b/src/mbyte.c
      @@ -1450,36 +1450,6 @@ mb_cptr2char_adv(pp)

      #if defined(FEAT_ARABIC) || defined(PROTO)
      /*
      - * Check whether we are dealing with Arabic combining characters.
      - * Note: these are NOT really composing characters!
      - */
      - int
      -arabic_combine(one, two)
      - int one; /* first character */
      - int two; /* character just after "one" */
      -{
      - if (one == a_LAM)
      - return arabic_maycombine(two);
      - return FALSE;
      -}
      -
      -/*
      - * Check whether we are dealing with a character that could be regarded as an
      - * Arabic combining character, need to check the character before this.
      - */
      - int
      -arabic_maycombine(two)
      - int two;
      -{
      - if (p_arshape && !p_tbidi)
      - return (two == a_ALEF_MADDA
      - || two == a_ALEF_HAMZA_ABOVE
      - || two == a_ALEF_HAMZA_BELOW
      - || two == a_ALEF);
      - return FALSE;
      -}
      -
      -/*
      * Check if the character pointed to by "p2" is a composing character when it
      * comes after "p1". For Arabic sometimes "ab" is replaced with "c", which
      * behaves like a composing character.

      --~--~---------~--~----~------------~-------~--~----~
      You received this message from the "vim_dev" maillist.
      For more information, visit http://www.vim.org/maillist.php
      -~----------~----~----~----~------~----~------~--~---
    Your message has been successfully submitted and would be delivered to recipients shortly.