-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
+package org.simantics.graph.compiler.internal.parsing;
+
+import java.io.InputStream;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+
+import org.simantics.databoard.util.StreamUtil;
+
+public class SourceSplitter {
+
+ public static class SplitPoint {
+ public final int characterId;
+ public final int lineId;
+
+ public SplitPoint(int characterId, int lineId) {
+ this.characterId = characterId;
+ this.lineId = lineId;
+ }
+ }
+
+ public static ArrayList<SplitPoint> split(String source, int minSplit) {
+ int length = source.length();
+ int inPar = 0;
+ int lineId = 0;
+ int lastSplit = 0;
+ ArrayList<SplitPoint> result = new ArrayList<SplitPoint>();
+ result.add(new SplitPoint(0, 0));
+ loop: for(int i=0;i<length;++i) {
+ char c = source.charAt(i);
+
+ switch(c) {
+ case '/':
+ ++i;
+ c = source.charAt(i);
+ if(c == '/') {
+ do {
+ ++i;
+ if(i == length)
+ break loop;
+ } while(source.charAt(i) != '\n');
+ --i;
+ }
+ else if(c == '*') {
+ ++i;
+ if(source.charAt(i) == '\n')
+ ++lineId;
+ do {
+ ++i;
+ if(i >= length)
+ break loop;
+ c = source.charAt(i);
+ if(c == '\n')
+ ++lineId;
+ } while(c != '/' || source.charAt(i-1) != '*');
+ }
+ break;
+ case '<':
+ ++i;
+ c = source.charAt(i);
+ if(c != 'h') {
+ if(c == '\n')
+ ++lineId;
+ break;
+ }
+ do {
+ ++i;
+ if(i == length)
+ break loop;
+ c = source.charAt(i);
+ if(c == '\n') {
+ ++lineId;
+ break;
+ }
+ } while(c != '>');
+ break;
+ case '"':
+ ++i;
+ if(i == length)
+ break loop;
+ c = source.charAt(i);
+ if(c == '"') {
+ ++i;
+ if(i == length)
+ break loop;
+ c = source.charAt(i);
+ if(c == '"') {
+ while(true) {
+ ++i;
+ if(i >= length)
+ break;
+ c = source.charAt(i);
+ if(c == '\n')
+ ++lineId;
+ else if(c == '"' && i < length-2 && source.charAt(i+1) == '"' && source.charAt(i+2) == '"') {
+ i+=2;
+ break;
+ }
+ }
+ }
+ else
+ --i;
+ }
+ else {
+ while(true) {
+ ++i;
+ if(i >= length)
+ break;
+ c = source.charAt(i);
+ if(c == '"')
+ break;
+ else if(c == '\\')
+ ++i;
+ else if(c == '\n') {
+ ++lineId;
+ break;
+ }
+ }
+ }
+ break;
+ case '[':
+ case '{':
+ case '(':
+ ++inPar;
+ break;
+ case ']':
+ case '}':
+ case ')':
+ --inPar;
+ break;
+ case '\n':
+ ++lineId;
+ ++i;
+ if(i == length)
+ break;
+ c = source.charAt(i);
+ if(c == '\r') {
+ ++i;
+ if(i == length)
+ break;
+ c = source.charAt(i);
+ }
+ if(c == '\n') {
+ --i;
+ break;
+ }
+ /*System.out.println();
+ System.out.print(lineId + "# ");
+ System.out.print(c);
+ */
+ if(i > lastSplit + minSplit && inPar == 0 && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {
+ result.add(new SplitPoint(i, lineId));
+ lastSplit = i;
+ }
+ else
+ --i;
+ break;
+ case '\r':
+ break;
+ default:
+ //System.out.print(c);
+ }
+ }
+ result.add(new SplitPoint(length, lineId));
+ return result;
+ }
+
+ public static void main(String[] args) throws Exception {
+ InputStream stream = SourceSplitter.class.getResourceAsStream("Layer0Deprecated.pgraph");
+ String source = StreamUtil.readString(stream, Charset.forName("UTF-8"));
+ stream.close();
+
+ ArrayList<SplitPoint> sps = split(source, 1000);
+ for(int i=1;i<sps.size();++i) {
+ SplitPoint begin = sps.get(i-1);
+ SplitPoint end = sps.get(i);
+ System.out.println("-- " + begin.lineId + ":" + end.lineId);
+ System.out.print(source.subSequence(begin.characterId, end.characterId));
+ }
+ }
+
+}