Completed support for generating C code.
[repair.git] / Repair / RepairCompiler / MCC / IR / ImageSetExpr.java
index ead3fce5811d91865a96b3b326b5154da08a4bd7..a6d2f1a8fb6bd82a8949362494b03bfe77bdcbc5 100755 (executable)
@@ -122,20 +122,84 @@ public class ImageSetExpr extends SetExpr {
     }
 
     public void generate_inclusion(CodeWriter writer, VarDescriptor dest, VarDescriptor element) {
-        String hash = inverse ? "_hashinv->contains(" : "_hash->contains(" ;
-        writer.outputline("int " + dest.getSafeSymbol() + " = " + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ", " + element.getSafeSymbol() + ");");
+        String hash = inverse ? "_hashinv, " : "_hash, " ;
+       if (!isimageset) {
+           writer.addDeclaration("int", dest.getSafeSymbol());
+           writer.outputline(dest.getSafeSymbol() + " = SimpleHashcontainskeydata(" + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ", " + element.getSafeSymbol() + ");");
+       } else {
+           VarDescriptor newset=VarDescriptor.makeNew("newset");
+           generate_set(writer,newset);
+           writer.addDeclaration("int", dest.getSafeSymbol());
+           writer.outputline(dest.getSafeSymbol()+"=SimpleHashcontainskey("+newset.getSafeSymbol()+","+element.getSafeSymbol()+");");
+           writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
+       }
     }
 
     public void generate_size(CodeWriter writer, VarDescriptor dest) {
         assert dest != null;
-        assert vd != null;
         assert rd != null;
-        String hash = inverse ? "_hashinv->count(" : "_hash->count(" ;
-        writer.outputline("int " + dest.getSafeSymbol() + " = " + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ");");
+       if (!isimageset) {
+           String hash = inverse ? "_hashinv, " : "_hash, " ;
+           writer.addDeclaration("int", dest.getSafeSymbol());
+           writer.outputline(dest.getSafeSymbol() + " = SimpleHashcount(" + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ");");
+       } else {
+           VarDescriptor newset=VarDescriptor.makeNew("newset");
+           generate_set(writer,newset);
+           writer.addDeclaration("int", dest.getSafeSymbol());
+           writer.outputline(dest.getSafeSymbol()+"=SimpleHashcountset("+newset.getSafeSymbol()+");");
+           writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
+       }
+    }
+
+    public void generate_leftside(CodeWriter writer, VarDescriptor dest) {
+       if (!isimageset) {
+           writer.addDeclaration(vd.getType().getGenerateType().toString(), dest.getSafeSymbol());
+           writer.outputline(dest.getSafeSymbol()+" = "+vd.getSafeSymbol()+";");
+       } else {
+           VarDescriptor iseset=VarDescriptor.makeNew("set");
+           ise.generate_set(writer,iseset);
+           writer.addDeclaration("int",dest.getSafeSymbol());
+           writer.outputline(dest.getSafeSymbol()+" = SimpleHashfirstkey("+iseset.getSafeSymbol()+");");
+           writer.outputline("freeSimpleHash("+iseset.getSafeSymbol()+");");
+       }
+    }
+
+    public void generate_set(CodeWriter writer, VarDescriptor dest) {
+       if (!isimageset) {
+           String hash = inverse ? "_hashinv, " : "_hash, " ;
+           writer.addDeclaration("struct SimpleHash *",dest.getSafeSymbol());
+           writer.outputline(dest.getSafeSymbol()+"=SimpleHashimageSet("+rd.getSafeSymbol()+hash+vd.getSafeSymbol()+");");
+       } else {
+           VarDescriptor iseset=VarDescriptor.makeNew("set");
+           ise.generate_set(writer,iseset);
+
+           VarDescriptor itvd=VarDescriptor.makeNew("iterator");
+           writer.addDeclaration("struct SimpleIterator",itvd.getSafeSymbol());
+           writer.outputline("SimpleHashiterator("+iseset.getSafeSymbol()+",&"+itvd.getSafeSymbol()+");");
+           writer.addDeclaration("struct SimpleHash *", dest.getSafeSymbol());
+           writer.outputline(dest.getSafeSymbol()+"=allocateSimpleHash(10);");
+           writer.outputline("while (hasNext(&"+itvd.getSafeSymbol()+")) {");
+
+           VarDescriptor keyvd=VarDescriptor.makeNew("key");
+
+           writer.addDeclaration("int",keyvd.getSafeSymbol());
+           writer.outputline(keyvd.getSafeSymbol()+"=next(&"+itvd.getSafeSymbol()+");");
+           String hash = inverse ? "_hashinv, " : "_hash, " ;
+           VarDescriptor newset=VarDescriptor.makeNew("newset");
+           writer.addDeclaration("struct SimpleHash *", newset.getSafeSymbol());
+           writer.outputline(newset.getSafeSymbol()+"=SimpleHashimageSet("+rd.getSafeSymbol()+hash+keyvd.getSafeSymbol()+");");
+           writer.outputline("SimpleHashaddAll("+dest.getSafeSymbol()+", "+ newset.getSafeSymbol()+");");
+           writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
+           writer.outputline("}");
+           writer.outputline("freeSimpleHash("+iseset.getSafeSymbol()+");");
+       }
     }
 
     public void prettyPrint(PrettyPrinter pp) {
-        pp.output(vd.toString());
+       if (!isimageset)
+           pp.output(vd.toString());
+       else
+           ise.prettyPrint(pp);
         pp.output(".");
         if (inverse) {
             pp.output("~");
@@ -146,5 +210,4 @@ public class ImageSetExpr extends SetExpr {
     public TypeDescriptor typecheck(SemanticAnalyzer sa) {
         throw new IRException("not supported");
     }
-
 }