Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
 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);
        }
Ejemplo n.º 10
0
 private static bool Connects_to_left(Charstruct a) => a.Numshapes > 2;