--- /dev/null
+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