static void Copycstostring(StringBuilder str, Charstruct s, int level) { /* s is a shaped charstruct; i is the index into the string */ if (s.basechar == 0) { return; } str.Append(s.basechar); s.lignum--; if (s.mark1 != 0) { if ((level & ar_novowel) == 0) { str.Append(s.mark1); s.lignum--; } else { s.lignum--; } } if (s.vowel != 0) { if ((level & ar_novowel) == 0) { str.Append(s.vowel); s.lignum--; } else /* vowel elimination */ { s.lignum--; } } }
static int Ligature(char newchar, Charstruct oldchar) { /* 0 == no ligature possible; 1 == vowel; 2 == two chars; 3 == Lam+Alef */ int retval = 0; if (oldchar.basechar == 0) return 0; if (IsVowel(newchar)) { retval = 1; if ((oldchar.vowel != 0) && (newchar != SHADDA)) { retval = 2; /* we eliminate the old vowel .. */ } switch (newchar) { case SHADDA: if (oldchar.mark1 == 0) { oldchar.mark1 = SHADDA; } else { return 0; /* no ligature possible */ } break; case HAMZABELOW: switch (oldchar.basechar) { case ALEF: oldchar.basechar = ALEFHAMZABELOW; retval = 2; break; case LAM_ALEF: oldchar.basechar = LAM_ALEFHAMZABELOW; retval = 2; break; default: oldchar.mark1 = HAMZABELOW; break; } break; case HAMZAABOVE: switch (oldchar.basechar) { case ALEF: oldchar.basechar = ALEFHAMZA; retval = 2; break; case LAM_ALEF: oldchar.basechar = LAM_ALEFHAMZA; retval = 2; break; case WAW: oldchar.basechar = WAWHAMZA; retval = 2; break; case YEH: case ALEFMAKSURA: case FARSIYEH: oldchar.basechar = YEHHAMZA; retval = 2; break; default: /* whatever sense this may make .. */ oldchar.mark1 = HAMZAABOVE; break; } break; case MADDA: switch (oldchar.basechar) { case ALEF: oldchar.basechar = ALEFMADDA; retval = 2; break; } break; default: oldchar.vowel = newchar; break; } if (retval == 1) { oldchar.lignum++; } return retval; } if (oldchar.vowel != 0) { /* if we already joined a vowel, we can't join a Hamza */ return 0; } switch (oldchar.basechar) { case LAM: switch (newchar) { case ALEF: oldchar.basechar = LAM_ALEF; oldchar.numshapes = 2; retval = 3; break; case ALEFHAMZA: oldchar.basechar = LAM_ALEFHAMZA; oldchar.numshapes = 2; retval = 3; break; case ALEFHAMZABELOW: oldchar.basechar = LAM_ALEFHAMZABELOW; oldchar.numshapes = 2; retval = 3; break; case ALEFMADDA: oldchar.basechar = LAM_ALEFMADDA; oldchar.numshapes = 2; retval = 3; break; } break; case (char)0: oldchar.basechar = newchar; oldchar.numshapes = Shapecount(newchar); retval = 1; break; } return retval; }
static void Copycstostring(StringBuilder str, Charstruct s, int level) { /* s is a shaped charstruct; i is the index into the string */ if (s.basechar == 0) return; str.Append(s.basechar); s.lignum--; if (s.mark1 != 0) { if ((level & ar_novowel) == 0) { str.Append(s.mark1); s.lignum--; } else { s.lignum--; } } if (s.vowel != 0) { if ((level & ar_novowel) == 0) { str.Append(s.vowel); s.lignum--; } else { /* vowel elimination */ s.lignum--; } } }
static bool Connects_to_left(Charstruct a) { return a.numshapes > 2; }
internal static void Shape(char[] text, StringBuilder str, int level) { /* string is assumed to be empty and big enough. * text is the original text. * This routine does the basic arabic reshaping. * *len the number of non-null characters. * * Note: We have to unshape each character first! */ int join; int which; char nextletter; int p = 0; /* initialize for output */ Charstruct oldchar = new Charstruct(); Charstruct curchar = new Charstruct(); while (p < text.Length) { nextletter = text[p++]; //nextletter = unshape (nextletter); join = Ligature(nextletter, curchar); if (join == 0) { /* shape curchar */ int nc = Shapecount(nextletter); //(*len)++; if (nc == 1) { which = 0; /* final or isolated */ } else { which = 2; /* medial or initial */ } if (Connects_to_left(oldchar)) { which++; } which = which % (curchar.numshapes); curchar.basechar = Charshape(curchar.basechar, which); /* get rid of oldchar */ Copycstostring(str, oldchar, level); oldchar = curchar; /* new values in oldchar */ /* init new curchar */ curchar = new Charstruct(); curchar.basechar = nextletter; curchar.numshapes = nc; curchar.lignum++; // (*len) += unligature (&curchar, level); } else if (join == 1) { } // else // { // (*len) += unligature (&curchar, level); // } // p = g_utf8_next_char (p); } /* Handle last char */ if (Connects_to_left(oldchar)) which = 1; else which = 0; which = which % (curchar.numshapes); curchar.basechar = Charshape(curchar.basechar, which); /* get rid of oldchar */ Copycstostring(str, oldchar, level); Copycstostring(str, curchar, level); }
static int Ligature(char newchar, Charstruct oldchar) { /* 0 == no ligature possible; 1 == vowel; 2 == two chars; 3 == Lam+Alef */ int retval = 0; if (oldchar.basechar == 0) { return(0); } if (IsVowel(newchar)) { retval = 1; if ((oldchar.vowel != 0) && (newchar != SHADDA)) { retval = 2; /* we eliminate the old vowel .. */ } switch (newchar) { case SHADDA: if (oldchar.mark1 == 0) { oldchar.mark1 = SHADDA; } else { return(0); /* no ligature possible */ } break; case HAMZABELOW: switch (oldchar.basechar) { case ALEF: oldchar.basechar = ALEFHAMZABELOW; retval = 2; break; case LAM_ALEF: oldchar.basechar = LAM_ALEFHAMZABELOW; retval = 2; break; default: oldchar.mark1 = HAMZABELOW; break; } break; case HAMZAABOVE: switch (oldchar.basechar) { case ALEF: oldchar.basechar = ALEFHAMZA; retval = 2; break; case LAM_ALEF: oldchar.basechar = LAM_ALEFHAMZA; retval = 2; break; case WAW: oldchar.basechar = WAWHAMZA; retval = 2; break; case YEH: case ALEFMAKSURA: case FARSIYEH: oldchar.basechar = YEHHAMZA; retval = 2; break; default: /* whatever sense this may make .. */ oldchar.mark1 = HAMZAABOVE; break; } break; case MADDA: switch (oldchar.basechar) { case ALEF: oldchar.basechar = ALEFMADDA; retval = 2; break; } break; default: oldchar.vowel = newchar; break; } if (retval == 1) { oldchar.lignum++; } return(retval); } if (oldchar.vowel != 0) /* if we already joined a vowel, we can't join a Hamza */ { return(0); } switch (oldchar.basechar) { case LAM: switch (newchar) { case ALEF: oldchar.basechar = LAM_ALEF; oldchar.numshapes = 2; retval = 3; break; case ALEFHAMZA: oldchar.basechar = LAM_ALEFHAMZA; oldchar.numshapes = 2; retval = 3; break; case ALEFHAMZABELOW: oldchar.basechar = LAM_ALEFHAMZABELOW; oldchar.numshapes = 2; retval = 3; break; case ALEFMADDA: oldchar.basechar = LAM_ALEFMADDA; oldchar.numshapes = 2; retval = 3; break; } break; case (char)0: oldchar.basechar = newchar; oldchar.numshapes = Shapecount(newchar); retval = 1; break; } return(retval); }
internal static void Shape(char[] text, StringBuilder str, int level) { /* string is assumed to be empty and big enough. * text is the original text. * This routine does the basic arabic reshaping. * *len the number of non-null characters. * * Note: We have to unshape each character first! */ int join; int which; char nextletter; int p = 0; /* initialize for output */ Charstruct oldchar = new Charstruct(); Charstruct curchar = new Charstruct(); while (p < text.Length) { nextletter = text[p++]; //nextletter = unshape (nextletter); join = Ligature(nextletter, curchar); if (join == 0) /* shape curchar */ { int nc = Shapecount(nextletter); //(*len)++; if (nc == 1) { which = 0; /* final or isolated */ } else { which = 2; /* medial or initial */ } if (Connects_to_left(oldchar)) { which++; } which = which % (curchar.numshapes); curchar.basechar = Charshape(curchar.basechar, which); /* get rid of oldchar */ Copycstostring(str, oldchar, level); oldchar = curchar; /* new values in oldchar */ /* init new curchar */ curchar = new Charstruct(); curchar.basechar = nextletter; curchar.numshapes = nc; curchar.lignum++; // (*len) += unligature (&curchar, level); } else if (join == 1) { } // else // { // (*len) += unligature (&curchar, level); // } // p = g_utf8_next_char (p); } /* Handle last char */ if (Connects_to_left(oldchar)) { which = 1; } else { which = 0; } which = which % (curchar.numshapes); curchar.basechar = Charshape(curchar.basechar, which); /* get rid of oldchar */ Copycstostring(str, oldchar, level); Copycstostring(str, curchar, level); }
static bool Connects_to_left(Charstruct a) { return(a.numshapes > 2); }
static int ligature(char newchar, Charstruct oldchar) { /* 0 == no ligature possible; 1 == vowel; 2 == two chars; 3 == Lam+Alef */ int retval = 0; if (oldchar.Basechar == 0) { return(0); } if (isVowel(newchar)) { retval = 1; if ((oldchar.Vowel != 0) && (newchar != Shadda)) { retval = 2; /* we eliminate the old vowel .. */ } switch (newchar) { case Shadda: if (oldchar.Mark1 == 0) { oldchar.Mark1 = Shadda; } else { return(0); /* no ligature possible */ } break; case Hamzabelow: switch (oldchar.Basechar) { case Alef: oldchar.Basechar = Alefhamzabelow; retval = 2; break; case LamAlef: oldchar.Basechar = LamAlefhamzabelow; retval = 2; break; default: oldchar.Mark1 = Hamzabelow; break; } break; case Hamzaabove: switch (oldchar.Basechar) { case Alef: oldchar.Basechar = Alefhamza; retval = 2; break; case LamAlef: oldchar.Basechar = LamAlefhamza; retval = 2; break; case Waw: oldchar.Basechar = Wawhamza; retval = 2; break; case Yeh: case Alefmaksura: case Farsiyeh: oldchar.Basechar = Yehhamza; retval = 2; break; default: /* whatever sense this may make .. */ oldchar.Mark1 = Hamzaabove; break; } break; case Madda: switch (oldchar.Basechar) { case Alef: oldchar.Basechar = Alefmadda; retval = 2; break; } break; default: oldchar.Vowel = newchar; break; } if (retval == 1) { oldchar.Lignum++; } return(retval); } if (oldchar.Vowel != 0) { /* if we already joined a vowel, we can't join a Hamza */ return(0); } switch (oldchar.Basechar) { case Lam: switch (newchar) { case Alef: oldchar.Basechar = LamAlef; oldchar.Numshapes = 2; retval = 3; break; case Alefhamza: oldchar.Basechar = LamAlefhamza; oldchar.Numshapes = 2; retval = 3; break; case Alefhamzabelow: oldchar.Basechar = LamAlefhamzabelow; oldchar.Numshapes = 2; retval = 3; break; case Alefmadda: oldchar.Basechar = LamAlefmadda; oldchar.Numshapes = 2; retval = 3; break; } break; case (char)0: oldchar.Basechar = newchar; oldchar.Numshapes = shapecount(newchar); retval = 1; break; } return(retval); }
private static bool Connects_to_left(Charstruct a) => a.Numshapes > 2;