collocatordb: add c api
diff --git a/Makefile b/Makefile
index 30684bc..895e252 100644
--- a/Makefile
+++ b/Makefile
@@ -17,6 +17,9 @@
 testcdb: testcdb.cc collocatordb.h collocatordb.o Makefile
 	$(CXX) $(CXXFLAGS) -L. -L/usr/local/lib $@.cc -o$@ collocatordb.o -lrocksdb $(PLATFORM_LDFLAGS) $(PLATFORM_CXXFLAGS) $(EXEC_LDFLAGS)
 
+c_testcdb: c_testcdb.c collocatordb.h collocatordb.o Makefile
+	$(CC) $(CFLAGS) -L. -L/usr/local/lib $@.c -o$@ collocatordb.o -lstdc++ -lm -lrocksdb $(PLATFORM_LDFLAGS) $(PLATFORM_CXXFLAGS) $(EXEC_LDFLAGS)
+
 collocatordb: collocatordb.cc Makefile
 	$(CXX) $(CXXFLAGS) -L/usr/local/lib $@.cc -o$@ -lrocksdb $(PLATFORM_LDFLAGS) $(PLATFORM_CXXFLAGS) $(EXEC_LDFLAGS)
 
diff --git a/c_testcdb.c b/c_testcdb.c
new file mode 100644
index 0000000..34f05ec
--- /dev/null
+++ b/c_testcdb.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include "collocatordb.h"
+
+int main() {
+	COLLOCATORS *cdb = open_collocators("/tmp/test2");
+	inc_collocators(cdb, 2000, 2000, 4);
+	inc_collocators(cdb, 2000, 2001, 4);
+	inc_collocators(cdb, 2000, 2002, 4);
+	dump_collocators(cdb, 2000, 0, 0);
+	return 0;
+}
diff --git a/collocatordb.cc b/collocatordb.cc
index cfc5969..d4745fd 100644
--- a/collocatordb.cc
+++ b/collocatordb.cc
@@ -18,6 +18,7 @@
 #include "rocksdb/utilities/db_ttl.h"
 #include "merge_operators.h"
 
+
 #define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100)
 #define encodeCollocation(w1, w2, dist) (((uint64_t)dist << 56) | ((uint64_t)w2 << 24) | w1)
 #define W1(key) (uint64_t)(key & 0xffffff)
@@ -180,7 +181,7 @@
 
   public:
     Collocators(const char *db_name);
-
+		
     ~Collocators();
 
     // public interface of Collocators.
@@ -262,6 +263,7 @@
     }
 
     virtual void inc(const uint32_t w1, const uint32_t w2, const uint8_t dist);
+    void dump(uint32_t w1, uint32_t w2, int8_t dist);
 
    
     // mapped to a rocksdb Merge operation
@@ -332,8 +334,34 @@
     return cit;
   }
 
+	void rocksdb::Collocators::dump(uint32_t w1, uint32_t w2, int8_t dist) {
+    auto it = std::unique_ptr<CollocatorIterator>(SeekIterator(w1, w2, dist));
+    for (; it->isValid(); it->Next()) {
+      uint64_t value = it->intValue();
+      uint64_t key = it->intKey();
+      std::cout << "w1:" << W1(key) << ", w2:" << W2(key) << ", dist:" << (int32_t) DIST(key) << " - count:" << value << std::endl;
+    }
+    std::cout << "ready dumping\n";
+  }
+
   rocksdb::Slice rocksdb::CollocatorIterator::key() const { return base_iterator_->key(); }
   rocksdb::Slice rocksdb::CollocatorIterator::value() const { return base_iterator_->value(); }
   rocksdb::Status rocksdb::CollocatorIterator::status() const { return base_iterator_->status(); }
 
 };
+
+typedef rocksdb::Collocators COLLOCATORS;
+
+extern "C" {
+	COLLOCATORS *open_collocators(char *dbname) {
+		return new rocksdb::Collocators(dbname);
+	}
+	
+	void inc_collocators(COLLOCATORS *db, uint32_t w1, uint32_t w2, int8_t dist) {
+		db->inc(w1, w2, dist);
+	}
+
+	void dump_collocators(COLLOCATORS *db, uint32_t w1, uint32_t w2, int8_t dist) {
+		db->dump(w1, w2, dist);
+	}
+}
diff --git a/collocatordb.h b/collocatordb.h
index 72ab00d..3aea4bd 100644
--- a/collocatordb.h
+++ b/collocatordb.h
@@ -1,12 +1,8 @@
+#ifdef __cplusplus
 #include <typeinfo>
-#include <stdint.h>
-#include "rocksdb/cache.h"
-#include "rocksdb/comparator.h"
 #include "rocksdb/db.h"
-#include "rocksdb/env.h"
-#include <rocksdb/merge_operator.h>
-#include "rocksdb/utilities/db_ttl.h"
-#include "merge_operators.h"
+#endif
+#include <stdint.h>
 
 #define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100)
 #define encodeCollocation(w1, w2, dist) (((uint64_t)dist << 56) | ((uint64_t)w2 << 24) | w1)
@@ -14,6 +10,7 @@
 #define W2(key) (uint64_t)((key >> 24) & 0xffffff)
 #define DIST(key) (int8_t)((uint64_t)((key >> 56) & 0xff))
 
+#ifdef __cplusplus
 namespace rocksdb {
     class CollocatorIterator : public Iterator  {
     public:
@@ -27,12 +24,25 @@
         uint64_t intKey();
     };
     
-    class Collocators {
-    public:
+		extern "C" {
+			class Collocators {
+			public:
         Collocators(const char *db_name);
         ~Collocators();
         void inc(const uint32_t w1, const uint32_t w2, const uint8_t dist);
+        void dump(const uint32_t w1, const uint32_t w2, const uint8_t dist);
         CollocatorIterator* SeekIterator(uint64_t w1, uint64_t w2, int8_t dist);
-    };
-    
+			};
+			
+		}
 }
+
+typedef rocksdb::Collocators COLLOCATORS;
+
+#else
+typedef struct COLLOCATORS COLLOCATORS;
+#endif
+
+extern COLLOCATORS *open_collocators(char *s);
+extern void inc_collocators(COLLOCATORS *db, uint64_t w1, uint64_t w2, int8_t dist);
+extern void dump_collocators(COLLOCATORS *db, uint32_t w1, uint32_t w2, int8_t dist);