csvorbis.CodeBook.make_decode_tree C# (CSharp) Method

make_decode_tree() private method

private make_decode_tree ( ) : DecodeAux
return DecodeAux
        internal DecodeAux make_decode_tree()
        {
            int top=0;
            DecodeAux t=new DecodeAux();
            int[] ptr0=t.ptr0=new int[entries*2];
            int[] ptr1=t.ptr1=new int[entries*2];
            int[] codelist=make_words(c.lengthlist, c.entries);

            if(codelist==null)return(null);
            t.aux=entries*2;

            for(int i=0;i<entries;i++)
            {
                if(c.lengthlist[i]>0)
                {
                    int ptr=0;
                    int j;
                    for(j=0;j<c.lengthlist[i]-1;j++)
                    {
                        int bit=(int)(((uint)codelist[i]>>j)&1);
                        if(bit==0)
                        {
                            if(ptr0[ptr]==0)
                            {
                                ptr0[ptr]=++top;
                            }
                            ptr=ptr0[ptr];
                        }
                        else
                        {
                            if(ptr1[ptr]==0)
                            {
                                ptr1[ptr]= ++top;
                            }
                            ptr=ptr1[ptr];
                        }
                    }

                    if((((uint)codelist[i]>>j)&1)==0){ ptr0[ptr]=-i; }
                    else{ ptr1[ptr]=-i; }

                }
            }
            //free(codelist);

            t.tabn = ilog(entries)-4;

            if(t.tabn<5)t.tabn=5;
            int n = 1<<t.tabn;
            t.tab = new int[n];
            t.tabl = new int[n];
            for(int i = 0; i < n; i++)
            {
                int p = 0;
                int j=0;
                for(j = 0; j < t.tabn && (p > 0 || j == 0); j++)
                {
                    if ((i&(1<<j))!=0)
                    {
                        p = ptr1[p];
                    }
                    else
                    {
                        p = ptr0[p];
                    }
                }
                t.tab[i]=p;  // -code
                t.tabl[i]=j; // length
            }

            return(t);
        }