]> git.sesse.net Git - plocate/blobdiff - turbopfor-encode.h
Fix writing of the configuration block.
[plocate] / turbopfor-encode.h
index 532aa19d07b01faf6643f54153ac019387907d38..24e007cdc070e902bb9ea4b250b9d8bbb1d33505 100644 (file)
 
 #include "turbopfor-common.h"
 
+#include <algorithm>
 #include <assert.h>
+#ifdef HAS_ENDIAN_H
+#include <endian.h>
+#endif
 #include <limits.h>
 #include <stdint.h>
+#include <string.h>
 
 template<class Docid>
 void write_le(Docid val, void *out)
@@ -27,7 +32,7 @@ void write_le(Docid val, void *out)
        } else if constexpr (sizeof(Docid) == 2) {
                val = htole16(val);
        } else if constexpr (sizeof(Docid) == 1) {
-               val = val;
+               // No change.
        } else {
                assert(false);
        }
@@ -50,6 +55,12 @@ unsigned char *write_baseval(Docid in, unsigned char *out)
                out[1] = in & 0xff;
                out[2] = (in >> 8) & 0xff;
                return out + 3;
+       } else if (in < 0x10000000) {
+               out[0] = (in >> 24) | 0xe0;
+               out[1] = (in >> 16) & 0xff;
+               out[2] = (in >> 8) & 0xff;
+               out[3] = in & 0xff;
+               return out + 4;
        } else {
                assert(false);  // Not implemented.
        }
@@ -86,11 +97,20 @@ unsigned char *write_vb(Docid val, unsigned char *out)
 template<class Docid>
 inline unsigned num_bits(Docid x)
 {
+#ifdef __GNUC__
        if (x == 0) {
                return 0;
        } else {
                return sizeof(Docid) * CHAR_BIT - __builtin_clz(x);
        }
+#else
+       for (int i = sizeof(Docid) * CHAR_BIT; i-- > 0;) {
+               if (x & (Docid{ 1 } << i)) {
+                       return i;
+               }
+       }
+       return 0;
+#endif
 }
 
 struct BitWriter {