X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=bpcore.c;h=5c8ec4a382e381997fcf21e69cfcfac0d8c4388f;hb=a75155efc2ed07c1907ef017360bd719a47f9c06;hp=18e9cc93f19e58721ca246a4c04943ae0d4fd1d0;hpb=b00a944d8d5d8baf108e8efdc32ee6dd69c4b90a;p=SXSI%2FXMLTree.git diff --git a/bpcore.c b/bpcore.c index 18e9cc9..5c8ec4a 100644 --- a/bpcore.c +++ b/bpcore.c @@ -1,6 +1,16 @@ #include #include #include "bp.h" +#include "utils.h" + + +#ifndef min +#define min(x,y) ((x)<(y)?(x):(y)) +#endif + +#ifndef max +#define max(x,y) ((x)>(y)?(x):(y)) +#endif #define NOTFOUND -2 #define CONTINUE -3 @@ -122,7 +132,7 @@ int search_SB_r(bp *b, int i, int rel) } } r = min(j,ETW); - rel -= 2*popCount[w]-r; + rel -= 2*popcount(w)-r; x <<= r; i += r; j -= r; @@ -171,59 +181,42 @@ int fwd_excess(bp *b,int s, int rel) n = b->n; B = b->B; i = s+1; -#if 1 + d = search_SB_r(b,i,rel); if (d >= NOTFOUND) return d; - i = min((SBid(i) + 1) << logSB,n); + i = min((SBid(i) + 1) << logSB, n); td = depth(b,s) + rel; d = search_MB_r(b,i,td); if (d >= NOTFOUND) return d; -#else - if (i != SBfirst(i)) { - d = search_SB_r(b,i,rel); - if (d >= NOTFOUND) return d; - } - - td = depth(b,s) + rel; - - i = SBid(i+SB-1) << logSB; - - if (i != MBfirst(i)) { - d = search_MB_r(b,i,td); - if (d >= NOTFOUND) return d; - } -#endif m_ofs = b->m_ofs; + i = MBid(s) + m_ofs; + while (i > 0) { if ((i&1) == 0) { i++; m = b->mm[i]; M = b->mM[i]; - if (m <= td && td <= M) break; - } - i >>= 1; - } - if (i == 0) return NOTFOUND; - while (i < m_ofs) { - i <<= 1; - m = b->mm[i]; - M = b->mM[i]; - if (!(m <= td && td <= M)) i++; - } - i -= m_ofs; - i <<= logMB; + if (m <= td && td <= M) { + while (i < m_ofs) { + i <<= 1; + m = b->mm[i]; + M = b->mM[i]; + if (!(m <= td && td <= M)) i++; + } + i -= m_ofs; + i <<= logMB; - d = search_MB_r(b,i,td); - if (d >= NOTFOUND) return d; - - // unexpected (bug) - printf("fwd_excess: ???\n"); - return -99; + return search_MB_r(b,i,td); + }; + } + i >>= 1; + } + return NOTFOUND; } @@ -338,7 +331,7 @@ int degree_SB(bp *b, int i, int t, int rel, int *ans, int ith) } r = min(j,ETW); - d += 2*popCount[w]-r; + d += 2*popcount(w)-r; x <<= r; i += r; j -= r; @@ -624,7 +617,7 @@ int search_SB_l(bp *b, int i, int rel) } } r = min(j,ETW); - rel += 2*popCount[w]-r; + rel += 2*popcount(w)-r; x >>= r; i -= r; j -= r; @@ -773,7 +766,7 @@ int rmq_SB(bp *b, int s, int t, int opt, int *dm) } r = min(j,ETW); - d += 2*popCount[w]-r; + d += 2*popcount(w)-r; x <<= r; i += r; j -= r;