// ldb_test().

// General includes.
#include "cl_sysdep.h"

// Specification.
#include "cln/integer.h"


// Implementation.

#include "cln/integer.h"
#include "cl_I.h"
#include "cl_I_byte.h"

namespace cln {

cl_boolean ldb_test (const cl_I& n, const cl_byte& b)
{
      // Methode:
      // (ldb-test (byte s p) n)
      // Falls s=0: =0.
      // Falls s>0:
      //   l:=(integer-length n)
      //   Falls l <= p : Falls n>=0, =0, denn Bits p+s-1..p sind =0.
      //                  Falls n<0, /=0, denn Bits p+s-1..p sind =1.
      //   Falls p < l :
      //     Falls p+s>l, /=0, denn bei n>=0 ist Bit l-1 =1,
      //                       und bei n<0 sind Bits p+s-1..l =1.
      //     Falls p+s<=l,
      //       extrahiere die Bits p,...,p+s-1 von n und teste sie.
      var uintL s = b.size;
      var uintL p = b.position;
      if (s==0) return cl_false;
      var uintL l = integer_length(n); // l = (integer-length n)
      if (l<=p)
        // l<=p
        if (!minusp(n))
          return cl_false; // n>=0
          else
          return cl_true; // n<0
        else
        // l>p
        { var uintL ps = p+s;
          if (ps>l) // p+s>l ?
            return cl_true;
          // Bits p,...,q-1 mit q = min(p+s,l) = p+s extrahieren und testen:
          return ldb_extract_test(n,p,ps);
        }
}

}  // namespace cln
