Merging + fixing memory bugs
[satune.git] / src / Test / dirkreader.cc
index 60b4aee..56393fb 100644 (file)
@@ -51,34 +51,49 @@ public:
 
 typedef Hashtable<intwrapper *, OrderRec *, uintptr_t, PTRSHIFT, iw_hash_function, iw_equals> HashtableIW;
 typedef Hashtable<intwrapper *, Boolean *, uintptr_t, PTRSHIFT, iw_hash_function, iw_equals> HashtableBV;
-
+Vector<OrderRec*> * orderRecVector = NULL;
 HashtableIW * ordertable = NULL;
 HashtableBV * vartable = new HashtableBV();
 
+void cleanAndFreeOrderRecVector(){
+       for(uint i=0; i< orderRecVector->getSize(); i++){
+               delete orderRecVector->get(i);
+       }
+       orderRecVector->clear();
+}
+
 int main(int numargs, char ** argv) {
   file = new std::ifstream(argv[1]);
   char * assert = NULL;
   char * sat = NULL;
+  Vector<OrderRec*> orderRecs;
+  orderRecVector = &orderRecs;
   while(true) {
     int retval = skipahead(assertstart, satstart);
     printf("%d\n", retval);
-    if (retval == 0)
+    if (retval == 0){
       break;
+    }
     if (retval == 1) {
-      if (assert != NULL)
+      if (assert != NULL){
        free(assert);
+       assert = NULL;
+      }
       assert = readuntilend(assertend);
       printf("[%s]\n", assert);
     } else if (retval == 2) {
       if (sat != NULL) {
        free(sat);
+       sat = NULL;
        vartable->resetAndDeleteKeys();
-       ordertable->resetAndDeleteVals();
+       ordertable->reset();
+       cleanAndFreeOrderRecVector();
       } else {
        ordertable = new HashtableIW();
       }
       sat = readuntilend(satend);
       CSolver *solver = new CSolver();
+      solver->turnoffOptimizations();
       set = solver->createMutableSet(1);
       order = solver->createOrder(SATC_TOTAL, (Set *) set);
       int offset = 0;
@@ -96,8 +111,21 @@ int main(int numargs, char ** argv) {
       delete solver;
     }
   }
-  
+
+  cleanAndFreeOrderRecVector();
+  if(ordertable != NULL){
+       delete ordertable;
+  }
+  if(assert != NULL){
+       free(assert);
+  }
+  if(sat != NULL){
+       free(sat);
+  }
+  vartable->resetAndDeleteKeys();
+  delete vartable;
   file->close();
+  delete file;
 }
 
 void skipwhitespace(char * constraint, int & offset) {
@@ -160,6 +188,7 @@ void mergeVars(int32_t value1, int32_t value2) {
   if (r1 == r2) {
     if (r1 == NULL) {
       OrderRec * r = new OrderRec();
+      orderRecVector->push(r);
       r->value = value1;
       r->set = new HashsetIW();
       intwrapper * k1 = new intwrapper(v1);
@@ -197,7 +226,10 @@ int32_t checkordervar(CSolver * solver, int32_t value) {
   if (rec == NULL) {
     intwrapper * k = new intwrapper(value);
     rec = new OrderRec();
+    orderRecVector->push(rec);
     rec->value = value;
+    rec->set = new HashsetIW();
+    rec->set->add(k);
     ordertable->put(k, rec);
   }
   if (!rec->alloced) {