// Lucene version compatibility level 4.8.1
/*

Copyright (c) 2001, Dr Martin Porter
Copyright (c) 2002, Richard Boulton
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
    * this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
    * notice, this list of conditions and the following disclaimer in the
    * documentation and/or other materials provided with the distribution.
    * Neither the name of the copyright holders nor the names of its contributors
    * may be used to endorse or promote products derived from this software
    * without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 */

namespace Lucene.Net.Tartarus.Snowball.Ext
{
    /// <summary>
    /// This class was automatically generated by a Snowball to Java compiler
    /// It implements the stemming algorithm defined by a snowball script.
    /// </summary>
    public class IrishStemmer : SnowballProgram
    {
        // LUCENENET specific: Factored out methodObject by using Func<bool> instead of Reflection

        private readonly static Among[] a_0 = {
                    new Among ( "b'", -1, 4 ),
                    new Among ( "bh", -1, 14 ),
                    new Among ( "bhf", 1, 9 ),
                    new Among ( "bp", -1, 11 ),
                    new Among ( "ch", -1, 15 ),
                    new Among ( "d'", -1, 2 ),
                    new Among ( "d'fh", 5, 3 ),
                    new Among ( "dh", -1, 16 ),
                    new Among ( "dt", -1, 13 ),
                    new Among ( "fh", -1, 17 ),
                    new Among ( "gc", -1, 7 ),
                    new Among ( "gh", -1, 18 ),
                    new Among ( "h-", -1, 1 ),
                    new Among ( "m'", -1, 4 ),
                    new Among ( "mb", -1, 6 ),
                    new Among ( "mh", -1, 19 ),
                    new Among ( "n-", -1, 1 ),
                    new Among ( "nd", -1, 8 ),
                    new Among ( "ng", -1, 10 ),
                    new Among ( "ph", -1, 20 ),
                    new Among ( "sh", -1, 5 ),
                    new Among ( "t-", -1, 1 ),
                    new Among ( "th", -1, 21 ),
                    new Among ( "ts", -1, 12 )
                };

        private readonly static Among[] a_1 = {
                    new Among ( "\u00EDochta", -1, 1 ),
                    new Among ( "a\u00EDochta", 0, 1 ),
                    new Among ( "ire", -1, 2 ),
                    new Among ( "aire", 2, 2 ),
                    new Among ( "abh", -1, 1 ),
                    new Among ( "eabh", 4, 1 ),
                    new Among ( "ibh", -1, 1 ),
                    new Among ( "aibh", 6, 1 ),
                    new Among ( "amh", -1, 1 ),
                    new Among ( "eamh", 8, 1 ),
                    new Among ( "imh", -1, 1 ),
                    new Among ( "aimh", 10, 1 ),
                    new Among ( "\u00EDocht", -1, 1 ),
                    new Among ( "a\u00EDocht", 12, 1 ),
                    new Among ( "ir\u00ED", -1, 2 ),
                    new Among ( "air\u00ED", 14, 2 )
                };

        private readonly static Among[] a_2 = {
                    new Among ( "\u00F3ideacha", -1, 6 ),
                    new Among ( "patacha", -1, 5 ),
                    new Among ( "achta", -1, 1 ),
                    new Among ( "arcachta", 2, 2 ),
                    new Among ( "eachta", 2, 1 ),
                    new Among ( "grafa\u00EDochta", -1, 4 ),
                    new Among ( "paite", -1, 5 ),
                    new Among ( "ach", -1, 1 ),
                    new Among ( "each", 7, 1 ),
                    new Among ( "\u00F3ideach", 8, 6 ),
                    new Among ( "gineach", 8, 3 ),
                    new Among ( "patach", 7, 5 ),
                    new Among ( "grafa\u00EDoch", -1, 4 ),
                    new Among ( "pataigh", -1, 5 ),
                    new Among ( "\u00F3idigh", -1, 6 ),
                    new Among ( "acht\u00FAil", -1, 1 ),
                    new Among ( "eacht\u00FAil", 15, 1 ),
                    new Among ( "gineas", -1, 3 ),
                    new Among ( "ginis", -1, 3 ),
                    new Among ( "acht", -1, 1 ),
                    new Among ( "arcacht", 19, 2 ),
                    new Among ( "eacht", 19, 1 ),
                    new Among ( "grafa\u00EDocht", -1, 4 ),
                    new Among ( "arcachta\u00ED", -1, 2 ),
                    new Among ( "grafa\u00EDochta\u00ED", -1, 4 )
                };

        private readonly static Among[] a_3 = {
                    new Among ( "imid", -1, 1 ),
                    new Among ( "aimid", 0, 1 ),
                    new Among ( "\u00EDmid", -1, 1 ),
                    new Among ( "a\u00EDmid", 2, 1 ),
                    new Among ( "adh", -1, 2 ),
                    new Among ( "eadh", 4, 2 ),
                    new Among ( "faidh", -1, 1 ),
                    new Among ( "fidh", -1, 1 ),
                    new Among ( "\u00E1il", -1, 2 ),
                    new Among ( "ain", -1, 2 ),
                    new Among ( "tear", -1, 2 ),
                    new Among ( "tar", -1, 2 )
                };

        private static readonly char[] g_v = { (char)17, (char)65, (char)16, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)0, (char)1, (char)17, (char)4, (char)2 };

        private int I_p2;
        private int I_p1;
        private int I_pV;

        private void copy_from(IrishStemmer other)
        {
            I_p2 = other.I_p2;
            I_p1 = other.I_p1;
            I_pV = other.I_pV;
            base.CopyFrom(other);
        }

        private bool r_mark_regions()
        {
            int v_1;
            int v_3;
            // (, line 28
            I_pV = m_limit;
            I_p1 = m_limit;
            I_p2 = m_limit;
            // do, line 34
            v_1 = m_cursor;
            do
            {
                // (, line 34
                // gopast, line 35
                while (true)
                {
                    do
                    {
                        if (!(InGrouping(g_v, 97, 250)))
                        {
                            goto lab2;
                        }
                        goto golab1;
                    } while (false);
                    lab2:
                    if (m_cursor >= m_limit)
                    {
                        goto lab0;
                    }
                    m_cursor++;
                }
                golab1:
                // setmark pV, line 35
                I_pV = m_cursor;
            } while (false);
            lab0:
            m_cursor = v_1;
            // do, line 37
            v_3 = m_cursor;
            do
            {
                // (, line 37
                // gopast, line 38
                while (true)
                {
                    do
                    {
                        if (!(InGrouping(g_v, 97, 250)))
                        {
                            goto lab5;
                        }
                        goto golab4;
                    } while (false);
                    lab5:
                    if (m_cursor >= m_limit)
                    {
                        goto lab3;
                    }
                    m_cursor++;
                }
                golab4:
                // gopast, line 38
                while (true)
                {
                    do
                    {
                        if (!(OutGrouping(g_v, 97, 250)))
                        {
                            goto lab7;
                        }
                        goto golab6;
                    } while (false);
                    lab7:
                    if (m_cursor >= m_limit)
                    {
                        goto lab3;
                    }
                    m_cursor++;
                }
                golab6:
                // setmark p1, line 38
                I_p1 = m_cursor;
                // gopast, line 39
                while (true)
                {
                    do
                    {
                        if (!(InGrouping(g_v, 97, 250)))
                        {
                            goto lab9;
                        }
                        goto golab8;
                    } while (false);
                    lab9:
                    if (m_cursor >= m_limit)
                    {
                        goto lab3;
                    }
                    m_cursor++;
                }
                golab8:
                // gopast, line 39
                while (true)
                {
                    do
                    {
                        if (!(OutGrouping(g_v, 97, 250)))
                        {
                            goto lab11;
                        }
                        goto golab10;
                    } while (false);
                    lab11:
                    if (m_cursor >= m_limit)
                    {
                        goto lab3;
                    }
                    m_cursor++;
                }
                golab10:
                // setmark p2, line 39
                I_p2 = m_cursor;
            } while (false);
            lab3:
            m_cursor = v_3;
            return true;
        }

        private bool r_initial_morph()
        {
            int among_var;
            // (, line 43
            // [, line 44
            m_bra = m_cursor;
            // substring, line 44
            among_var = FindAmong(a_0, 24);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 44
            m_ket = m_cursor;
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 46
                    // delete, line 46
                    SliceDel();
                    break;
                case 2:
                    // (, line 50
                    // delete, line 50
                    SliceDel();
                    break;
                case 3:
                    // (, line 52
                    // <-, line 52
                    SliceFrom("f");
                    break;
                case 4:
                    // (, line 55
                    // delete, line 55
                    SliceDel();
                    break;
                case 5:
                    // (, line 58
                    // <-, line 58
                    SliceFrom("s");
                    break;
                case 6:
                    // (, line 61
                    // <-, line 61
                    SliceFrom("b");
                    break;
                case 7:
                    // (, line 63
                    // <-, line 63
                    SliceFrom("c");
                    break;
                case 8:
                    // (, line 65
                    // <-, line 65
                    SliceFrom("d");
                    break;
                case 9:
                    // (, line 67
                    // <-, line 67
                    SliceFrom("f");
                    break;
                case 10:
                    // (, line 69
                    // <-, line 69
                    SliceFrom("g");
                    break;
                case 11:
                    // (, line 71
                    // <-, line 71
                    SliceFrom("p");
                    break;
                case 12:
                    // (, line 73
                    // <-, line 73
                    SliceFrom("s");
                    break;
                case 13:
                    // (, line 75
                    // <-, line 75
                    SliceFrom("t");
                    break;
                case 14:
                    // (, line 79
                    // <-, line 79
                    SliceFrom("b");
                    break;
                case 15:
                    // (, line 81
                    // <-, line 81
                    SliceFrom("c");
                    break;
                case 16:
                    // (, line 83
                    // <-, line 83
                    SliceFrom("d");
                    break;
                case 17:
                    // (, line 85
                    // <-, line 85
                    SliceFrom("f");
                    break;
                case 18:
                    // (, line 87
                    // <-, line 87
                    SliceFrom("g");
                    break;
                case 19:
                    // (, line 89
                    // <-, line 89
                    SliceFrom("m");
                    break;
                case 20:
                    // (, line 91
                    // <-, line 91
                    SliceFrom("p");
                    break;
                case 21:
                    // (, line 93
                    // <-, line 93
                    SliceFrom("t");
                    break;
            }
            return true;
        }

        private bool r_RV()
        {
            if (!(I_pV <= m_cursor))
            {
                return false;
            }
            return true;
        }

        private bool r_R1()
        {
            if (!(I_p1 <= m_cursor))
            {
                return false;
            }
            return true;
        }

        private bool r_R2()
        {
            if (!(I_p2 <= m_cursor))
            {
                return false;
            }
            return true;
        }

        private bool r_noun_sfx()
        {
            int among_var;
            // (, line 103
            // [, line 104
            m_ket = m_cursor;
            // substring, line 104
            among_var = FindAmongB(a_1, 16);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 104
            m_bra = m_cursor;
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 108
                    // call R1, line 108
                    if (!r_R1())
                    {
                        return false;
                    }
                    // delete, line 108
                    SliceDel();
                    break;
                case 2:
                    // (, line 110
                    // call R2, line 110
                    if (!r_R2())
                    {
                        return false;
                    }
                    // delete, line 110
                    SliceDel();
                    break;
            }
            return true;
        }

        private bool r_deriv()
        {
            int among_var;
            // (, line 113
            // [, line 114
            m_ket = m_cursor;
            // substring, line 114
            among_var = FindAmongB(a_2, 25);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 114
            m_bra = m_cursor;
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 116
                    // call R2, line 116
                    if (!r_R2())
                    {
                        return false;
                    }
                    // delete, line 116
                    SliceDel();
                    break;
                case 2:
                    // (, line 118
                    // <-, line 118
                    SliceFrom("arc");
                    break;
                case 3:
                    // (, line 120
                    // <-, line 120
                    SliceFrom("gin");
                    break;
                case 4:
                    // (, line 122
                    // <-, line 122
                    SliceFrom("graf");
                    break;
                case 5:
                    // (, line 124
                    // <-, line 124
                    SliceFrom("paite");
                    break;
                case 6:
                    // (, line 126
                    // <-, line 126
                    SliceFrom("\u00F3id");
                    break;
            }
            return true;
        }

        private bool r_verb_sfx()
        {
            int among_var;
            // (, line 129
            // [, line 130
            m_ket = m_cursor;
            // substring, line 130
            among_var = FindAmongB(a_3, 12);
            if (among_var == 0)
            {
                return false;
            }
            // ], line 130
            m_bra = m_cursor;
            switch (among_var)
            {
                case 0:
                    return false;
                case 1:
                    // (, line 133
                    // call RV, line 133
                    if (!r_RV())
                    {
                        return false;
                    }
                    // delete, line 133
                    SliceDel();
                    break;
                case 2:
                    // (, line 138
                    // call R1, line 138
                    if (!r_R1())
                    {
                        return false;
                    }
                    // delete, line 138
                    SliceDel();
                    break;
            }
            return true;
        }


        public override bool Stem()
        {
            int v_1;
            int v_2;
            int v_3;
            int v_4;
            int v_5;
            // (, line 143
            // do, line 144
            v_1 = m_cursor;
            do
            {
                // call initial_morph, line 144
                if (!r_initial_morph())
                {
                    goto lab0;
                }
            } while (false);
            lab0:
            m_cursor = v_1;
            // do, line 145
            v_2 = m_cursor;
            do
            {
                // call mark_regions, line 145
                if (!r_mark_regions())
                {
                    goto lab1;
                }
            } while (false);
            lab1:
            m_cursor = v_2;
            // backwards, line 146
            m_limit_backward = m_cursor; m_cursor = m_limit;
            // (, line 146
            // do, line 147
            v_3 = m_limit - m_cursor;
            do
            {
                // call noun_sfx, line 147
                if (!r_noun_sfx())
                {
                    goto lab2;
                }
            } while (false);
            lab2:
            m_cursor = m_limit - v_3;
            // do, line 148
            v_4 = m_limit - m_cursor;
            do
            {
                // call deriv, line 148
                if (!r_deriv())
                {
                    goto lab3;
                }
            } while (false);
            lab3:
            m_cursor = m_limit - v_4;
            // do, line 149
            v_5 = m_limit - m_cursor;
            do
            {
                // call verb_sfx, line 149
                if (!r_verb_sfx())
                {
                    goto lab4;
                }
            } while (false);
            lab4:
            m_cursor = m_limit - v_5;
            m_cursor = m_limit_backward; return true;
        }

        public override bool Equals(object o)
        {
            return o is IrishStemmer;
        }

        public override int GetHashCode()
        {
            return this.GetType().FullName.GetHashCode();
        }
    }
}