Completed support for generating C code.
[repair.git] / Repair / RepairCompiler / MCC / IR / RelationQuantifier.java
index 7281d2e4086ea7c6bc0a320874c48f4f0d61c897..858f338636f4fe07a158ef8c998f8373699b37fa 100755 (executable)
@@ -10,7 +10,11 @@ public class RelationQuantifier extends Quantifier {
     public RelationQuantifier() {}
 
     public void setRelation(RelationDescriptor rd) {
-        relation = rd; 
+        relation = rd;
+    }
+
+    public RelationDescriptor getRelation() {
+       return relation;
     }
 
     public void setTuple(VarDescriptor x, VarDescriptor y) {
@@ -29,27 +33,56 @@ public class RelationQuantifier extends Quantifier {
     }
 
     public void generate_open(CodeWriter writer) {
-        writer.outputline("for (SimpleIterator* " + x.getSafeSymbol() + "_iterator = " + relation.getSafeSymbol() + "_hash->iterator(); " + x.getSafeSymbol() + "_iterator->hasNext(); )");
+       writer.addDeclaration("struct SimpleIterator",x.getSafeSymbol()+"_iterator");
+        writer.outputline("for (SimpleHashiterator("+relation.getSafeSymbol()+"_hash, &"+x.getSafeSymbol()+"_iterator); hasNext(&"+x.getSafeSymbol()+"_iterator); )");
+        writer.startblock();
+        writer.addDeclaration(y.getType().getGenerateType().toString(), y.getSafeSymbol());        
+       writer.outputline(y.getSafeSymbol() + " = (" + y.getType().getGenerateType() + ") next(&"+x.getSafeSymbol()+"_iterator);");
+        // #ATTN#: key is called second because next() forwards ptr and key does not!
+        writer.addDeclaration(x.getType().getGenerateType().toString(), x.getSafeSymbol());        
+       writer.outputline(x.getSafeSymbol() + " = (" + x.getType().getGenerateType() + ") key(&"+x.getSafeSymbol()+"_iterator);");
+    }
+
+    public void generate_open(CodeWriter writer, String type,int number, String left,String right) {
+       VarDescriptor tmp=VarDescriptor.makeNew("flag");
+        writer.addDeclaration("struct SimpleIterator", x.getSafeSymbol() + "_iterator");
+        writer.outputline("SimpleHashiterator("+relation.getSafeSymbol()+"_hash,& "+x.getSafeSymbol()+"_iterator);");
+       writer.addDeclaration("int",tmp.getSafeSymbol());
+       writer.outputline(tmp.getSafeSymbol()+"=0;");
+       writer.outputline("if ("+type+"=="+number+")");
+       writer.outputline(tmp.getSafeSymbol()+"=1;");
+
+       writer.outputline("while("+tmp.getSafeSymbol()+"||(("+type+"!="+number+")&& hasNext(&"+x.getSafeSymbol()+"_iterator)))");
         writer.startblock();
-        writer.outputline(y.getType().getSafeSymbol() + " " + y.getSafeSymbol() + " = (" + y.getType().getSafeSymbol() + ") " + x.getSafeSymbol() + "_iterator->next();");        
-        // #ATTN#: key is called second because next() forwards ptr and key does not! 
-        writer.outputline(x.getType().getSafeSymbol() + " " + x.getSafeSymbol() + " = (" + x.getType().getSafeSymbol() + ") " + x.getSafeSymbol() + "_iterator->key();");
+        writer.addDeclaration(x.getType().getGenerateType().toString(), x.getSafeSymbol());
+        writer.addDeclaration(y.getType().getGenerateType().toString(), y.getSafeSymbol());
+       writer.outputline("if ("+type+"=="+number+")");
+       writer.startblock();
+       writer.outputline(tmp.getSafeSymbol()+"=0;");
+        writer.outputline(x.getSafeSymbol() + " = (" + x.getType().getGenerateType() + ") " + left + ";");
+        writer.outputline(y.getSafeSymbol() + " = (" + y.getType().getGenerateType() + ") " + right + ";");
+       writer.endblock();
+       writer.outputline("else");
+       writer.startblock();
+        writer.outputline(y.getSafeSymbol() + " = (" + y.getType().getGenerateType() + ") next(&"+x.getSafeSymbol()+"_iterator);");
+        writer.outputline(x.getSafeSymbol() + " = (" + x.getType().getGenerateType() + ") key(&"+x.getSafeSymbol()+"_iterator);");
+       writer.endblock();
     }
 
-    public int generate_worklistload(CodeWriter writer, int offset) {        
+    public int generate_worklistload(CodeWriter writer, int offset) {
         String varx = x.getSafeSymbol();
         String vary = y.getSafeSymbol();
-        writer.outputline("int " + varx + " = wi->word" + offset + "; // r1"); 
-        writer.outputline("int " + vary + " = wi->word" + (offset + 1) + "; //r2"); 
-        return offset + 2;       
+        writer.outputline("int " + varx + " = wi->word" + offset + "; /* r1*/");
+        writer.outputline("int " + vary + " = wi->word" + (offset + 1) + "; /*r2*/");
+        return offset + 2;
     }
 
-    public int generate_workliststore(CodeWriter writer, int offset) {        
+    public int generate_workliststore(CodeWriter writer, int offset) {
         String varx = x.getSafeSymbol();
         String vary = y.getSafeSymbol();
-        writer.outputline("wi->word" + offset + " = " + varx + "; // r1");
-        writer.outputline("wi->word" + (offset+1) + " = " + vary + "; // r2");
-        return offset + 2;       
+        writer.outputline("wi->word" + offset + " = " + varx + "; /* r1*/");
+        writer.outputline("wi->word" + (offset+1) + " = " + vary + "; /* r2*/");
+        return offset + 2;
     }