Rewrite printing function to make it faster. Now also handles
[SXSI/XMLTree.git] / bpcore.c
index acb37bf..df39e2c 100644 (file)
--- a/bpcore.c
+++ b/bpcore.c
@@ -1,11 +1,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include "bp.h"
+
 #ifndef min
- #define min(x,y) ((x)<(y)?(x):(y))
+#define min(x,y) ((x)<(y)?(x):(y))
 #endif
+
 #ifndef max
- #define max(x,y) ((x)>(y)?(x):(y))
+#define max(x,y) ((x)>(y)?(x):(y))
 #endif
 
 #define NOTFOUND -2
@@ -177,59 +179,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;
 }