]> Dogcows Code - chaz/vimcoder/blobdiff - src/com/dogcows/Editor.java
improved C++ driver template
[chaz/vimcoder] / src / com / dogcows / Editor.java
index dda5481fe2971f2173044d0758b8fdf887900adc..ddb7ccfe69043010dac3787b77a3bb15297efc4d 100644 (file)
@@ -7,8 +7,7 @@ import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 import com.topcoder.client.contestant.ProblemComponentModel;
 import com.topcoder.shared.language.Language;
@@ -24,7 +23,6 @@ public class Editor
 {
     private String  id;
     private String  name;
-    
     private File    sourceFile;
     private File    directory;
     
@@ -44,8 +42,8 @@ public class Editor
                   Language language,
                   Renderer renderer) throws IOException
     {
-        this.id     = String.valueOf(component.getProblem().getProblemID());
-        this.name   = component.getClassName();
+        this.id = String.valueOf(component.getProblem().getProblemID());
+        this.name = component.getClassName();
         
         File topDir = new File(System.getProperty("user.home"), ".vimcoder");
         if (!topDir.isDirectory())
@@ -63,13 +61,18 @@ public class Editor
         String ext  = languageExtension.get(lang);
         
         HashMap<String,String> terms = new HashMap<String,String>();
-        terms.put("RETURNTYPE", component.getReturnType().getDescriptor(language));
-        terms.put("CLASSNAME",  component.getClassName());
+        terms.put("RETURNTYPE", component.getReturnType().getDescriptor(language).replaceAll("\\s+", ""));
+        terms.put("CLASSNAME",  name);
         terms.put("METHODNAME", component.getMethodName());
         terms.put("METHODPARAMS", getMethodParams(component.getParamTypes(),
                                                   component.getParamNames(),
                                                   language));
-        terms.put("METHODPARAMNAMES", Utilities.join(component.getParamNames(), ", "));
+        terms.put("METHODPARAMNAMES", Utility.join(component.getParamNames(), ", "));
+        terms.put("METHODPARAMSTREAMIN", Utility.join(component.getParamNames(), " >> "));
+        terms.put("METHODPARAMSTREAMOUT", Utility.join(component.getParamNames(), " << "));
+        terms.put("METHODPARAMDECLARES", getMethodParamDeclarations(component.getParamTypes(),
+                                                                    component.getParamNames(),
+                                                                    language));
         
         File problemFile = new File(directory, "Problem.html");
         if (!problemFile.canRead())
@@ -85,36 +88,41 @@ public class Editor
             writer.close();
         }
         
-        sourceFile = new File(directory, terms.get("CLASSNAME") + "." + ext);
+        sourceFile = new File(directory, name + "." + ext);
         if (!sourceFile.canRead())
         {
-            String text = Utilities.expandTemplate(Utilities.readResource(lang + "Template"),
+            String text = Utility.expandTemplate(Utility.readResource(lang + "Template"),
                                          terms);
             FileWriter writer = new FileWriter(sourceFile);
             writer.write(text);
             writer.close();
         }
 
-        File driverFile = new File(directory, "driver" + "." + ext);
-        if (!driverFile.canRead())
+        File testcaseFile = new File(directory, "testcases.txt");
+        if (!testcaseFile.canRead())
         {
-            StringBuilder testCases = new StringBuilder();
+            StringBuilder text = new StringBuilder();
             if (component.hasTestCases())
             {
-                HashMap<String,String> testTerms = new HashMap<String,String>();
-                testTerms.putAll(terms);
-                String template = Utilities.readResource(lang + "Test");
                 for (TestCase testCase : component.getTestCases())
                 {
-                    testTerms.put("TESTOUTPUT", "\"" + Utilities.quote(testCase.getOutput()) + "\"");
-                    testTerms.put("TESTINPUTS", Utilities.join(testCase.getInput(), ", "));
-                    testCases.append(Utilities.expandTemplate(template, testTerms));
+                    text.append(testCase.getOutput() + System.getProperty("line.separator"));
+                    for (String input : testCase.getInput())
+                    {
+                        text.append(input + System.getProperty("line.separator"));
+                    }
                 }
             }
-            terms.put("TESTCASES", testCases.toString());
-            
-            String text = Utilities.expandTemplate(Utilities.readResource(lang + "Driver"),
-                                         terms);
+            FileWriter writer = new FileWriter(testcaseFile);
+            writer.write(text.toString());
+            writer.close();
+        }
+        
+        File driverFile = new File(directory, "driver." + ext);
+        if (!driverFile.canRead())
+        {
+            String text = Utility.expandTemplate(Utility.readResource(lang + "Driver"),
+                                                 terms);
             FileWriter writer = new FileWriter(driverFile);
             writer.write(text);
             writer.close();
@@ -122,15 +130,15 @@ public class Editor
         
         File makeFile = new File(directory, "Makefile");
         {
-            String text = Utilities.expandTemplate(Utilities.readResource(lang + "Makefile"),
+            String text = Utility.expandTemplate(Utility.readResource(lang + "Makefile"),
                                          terms);
             FileWriter writer = new FileWriter(makeFile);
             writer.write(text);
             writer.close();
         }
     }
-    
-    public void setSource(String source) throws IOException
+
+    public void setSource(String source) throws Exception
     {
         FileWriter writer = new FileWriter(new File(directory, name));
         writer.write(source);
@@ -140,40 +148,63 @@ public class Editor
 
     public String getSource() throws IOException
     {
-        return Utilities.readFile(sourceFile) + "\n// Edited by " + VimCoder.version + "\n// " + VimCoder.website + "\n\n";
+        return Utility.readFile(sourceFile) + "\n// Edited by " + VimCoder.version + "\n// " + VimCoder.website + "\n\n";
     }
     
     
-    private boolean doVimCommand(String command, String argument)
+    private void doVimCommand(String command, String argument) throws Exception
     {
         String[] arguments = {argument};
-        return doVimCommand(command, arguments);
+        doVimCommand(command, arguments);
     }
     
-    private boolean doVimCommand(String command, String[] arguments)
+    private void doVimCommand(String command, String[] arguments) throws Exception
     {
-        try
+        String[] exec = {"gvim", "--servername", "VimCoder" + id,
+                         command};
+        exec = Utility.concat(exec, arguments);
+        Process child = Runtime.getRuntime().exec(exec, null, directory);
+        
+        long expire = System.currentTimeMillis() + 500;
+        while (System.currentTimeMillis() < expire)
         {
-            String[] exec = {"gvim", "--servername", "VimCoder" + id,
-                             command};
-            exec = Utilities.concat(exec, arguments);
-            Runtime.getRuntime().exec(exec, null, directory);
+            try
+            {
+                int exitCode = child.exitValue();
+                if (exitCode != 0) throw new Exception("Vim process returned exit code " + exitCode + ".");
+                break;
+            }
+            catch (IllegalThreadStateException exception)
+            {
+            }
+            Thread.yield();
         }
-        catch (IOException exception)
+    }
+    
+    private String getMethodParams(DataType[] types,
+                                   String[] names,
+                                   Language language)
+    {
+        StringBuilder text = new StringBuilder();
+        
+        text.append(types[0].getDescriptor(language).replaceAll("\\s+", "") + " " + names[0]);
+        for (int i = 1; i < names.length; ++i)
         {
-            System.out.println("Failed to launch external vim process.  :-(");
+            text.append(", " + types[i].getDescriptor(language).replaceAll("\\s+", "") + " " + names[i]);
         }
-        return false;
+        
+        return text.toString();
     }
     
-    private String getMethodParams(DataType[] types, String[] names, Language language)
+    private String getMethodParamDeclarations (DataType[] types,
+                                               String[] names,
+                                               Language language)
     {
         StringBuilder text = new StringBuilder();
         
-        text.append(types[0].getDescriptor(language) + " " + names[0]);
-        for (int i = 1; i < names.length; ++i)
+        for (int i = 0; i < names.length; ++i)
         {
-            text.append(", " + types[i].getDescriptor(language) + " " + names[i]);
+            text.append(types[i].getDescriptor(language).replaceAll("\\s+", "") + "\t" + names[i] + ";" + System.getProperty("line.separator"));
         }
         
         return text.toString();
This page took 0.027534 seconds and 4 git commands to generate.