]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/parsing/SourceSplitter.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graph.compiler / src / org / simantics / graph / compiler / internal / parsing / SourceSplitter.java
diff --git a/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/parsing/SourceSplitter.java b/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/parsing/SourceSplitter.java
new file mode 100644 (file)
index 0000000..3f00c5b
--- /dev/null
@@ -0,0 +1,181 @@
+package org.simantics.graph.compiler.internal.parsing;\r
+\r
+import java.io.InputStream;\r
+import java.nio.charset.Charset;\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.databoard.util.StreamUtil;\r
+\r
+public class SourceSplitter {\r
+       \r
+       public static class SplitPoint {\r
+               public final int characterId;\r
+               public final int lineId;\r
+               \r
+               public SplitPoint(int characterId, int lineId) {\r
+                       this.characterId = characterId;\r
+                       this.lineId = lineId;\r
+               }\r
+       }\r
+       \r
+       public static ArrayList<SplitPoint> split(String source, int minSplit) {\r
+               int length = source.length();\r
+               int inPar = 0;\r
+               int lineId = 0;\r
+               int lastSplit = 0;\r
+               ArrayList<SplitPoint> result = new ArrayList<SplitPoint>();\r
+               result.add(new SplitPoint(0, 0));\r
+               loop: for(int i=0;i<length;++i) {\r
+                       char c = source.charAt(i);\r
+\r
+                       switch(c) {\r
+                       case '/':\r
+                               ++i;\r
+                               c = source.charAt(i);\r
+                               if(c == '/') {\r
+                                       do {\r
+                                               ++i;\r
+                                               if(i == length)\r
+                                                       break loop;\r
+                                       } while(source.charAt(i) != '\n');\r
+                                       --i;\r
+                               }\r
+                               else if(c == '*') {\r
+                                       ++i;\r
+                                       if(source.charAt(i) == '\n')\r
+                                               ++lineId;\r
+                                       do {\r
+                                               ++i;\r
+                                               if(i >= length)\r
+                                                       break loop;\r
+                                               c = source.charAt(i);\r
+                                               if(c == '\n')\r
+                                                       ++lineId;\r
+                                       } while(c != '/' || source.charAt(i-1) != '*');\r
+                               }\r
+                               break;\r
+                       case '<':\r
+                               ++i;\r
+                               c = source.charAt(i);\r
+                               if(c != 'h') {\r
+                                       if(c == '\n')\r
+                                               ++lineId;\r
+                                       break;\r
+                               }\r
+                               do {\r
+                                       ++i;\r
+                                       if(i == length)\r
+                                               break loop;\r
+                                       c = source.charAt(i);\r
+                                       if(c == '\n') {\r
+                                               ++lineId;\r
+                                               break;\r
+                                       }\r
+                               } while(c != '>');\r
+                               break;\r
+                       case '"':\r
+                               ++i;\r
+                               if(i == length)\r
+                                       break loop;\r
+                               c = source.charAt(i);\r
+                               if(c == '"') {\r
+                                       ++i;\r
+                                       if(i == length)\r
+                                               break loop;\r
+                                       c = source.charAt(i);\r
+                                       if(c == '"') {\r
+                                               while(true) {\r
+                                                       ++i;\r
+                                                       if(i >= length)\r
+                                                               break;\r
+                                                       c = source.charAt(i);\r
+                                                       if(c == '\n')\r
+                                                               ++lineId;\r
+                                                       else if(c == '"' && i < length-2 && source.charAt(i+1) == '"' && source.charAt(i+2) == '"') {\r
+                                                               i+=2;\r
+                                                               break;                  \r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       else\r
+                                               --i;\r
+                               }\r
+                               else {\r
+                                       while(true) {\r
+                                               ++i;\r
+                                               if(i >= length)\r
+                                                       break;\r
+                                               c = source.charAt(i);\r
+                                               if(c == '"')\r
+                                                       break;\r
+                                               else if(c == '\\')\r
+                                                       ++i;                    \r
+                                               else if(c == '\n') {\r
+                                                       ++lineId;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               break;\r
+                       case '[':\r
+                       case '{':\r
+                       case '(':\r
+                               ++inPar;\r
+                               break;\r
+                       case ']':\r
+                       case '}':\r
+                       case ')':\r
+                               --inPar;\r
+                               break;\r
+                       case '\n':\r
+                               ++lineId;\r
+                               ++i;\r
+                               if(i == length)\r
+                                       break;\r
+                               c = source.charAt(i);\r
+                               if(c == '\r') {\r
+                                       ++i;\r
+                                       if(i == length)\r
+                                               break;\r
+                                       c = source.charAt(i);\r
+                               }\r
+                               if(c == '\n') {\r
+                                       --i;\r
+                                       break;\r
+                               }\r
+                               /*System.out.println();\r
+                               System.out.print(lineId + "# ");\r
+                               System.out.print(c);\r
+                               */\r
+                               if(i > lastSplit + minSplit && inPar == 0 && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {\r
+                                       result.add(new SplitPoint(i, lineId));\r
+                                       lastSplit = i;\r
+                               }\r
+                               else\r
+                                       --i;\r
+                               break;\r
+                       case '\r':\r
+                               break;\r
+                       default:\r
+                               //System.out.print(c);\r
+                       }\r
+               }\r
+               result.add(new SplitPoint(length, lineId));\r
+               return result;\r
+       }\r
+       \r
+       public static void main(String[] args) throws Exception {               \r
+               InputStream stream = SourceSplitter.class.getResourceAsStream("Layer0Deprecated.pgraph");\r
+               String source = StreamUtil.readString(stream, Charset.forName("UTF-8"));\r
+               stream.close();\r
+               \r
+               ArrayList<SplitPoint> sps = split(source, 1000); \r
+               for(int i=1;i<sps.size();++i) {\r
+                       SplitPoint begin = sps.get(i-1);\r
+                       SplitPoint end = sps.get(i);\r
+                       System.out.println("-- " + begin.lineId + ":" + end.lineId);\r
+                       System.out.print(source.subSequence(begin.characterId, end.characterId));\r
+               }\r
+       }\r
+       \r
+}\r