X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.graph.compiler%2Fsrc%2Forg%2Fsimantics%2Fgraph%2Fcompiler%2Finternal%2Fparsing%2FSourceSplitter.java;fp=bundles%2Forg.simantics.graph.compiler%2Fsrc%2Forg%2Fsimantics%2Fgraph%2Fcompiler%2Finternal%2Fparsing%2FSourceSplitter.java;h=3f00c5b47f8c27e71a0d09b9ec6abb7eaab7b277;hp=0000000000000000000000000000000000000000;hb=969bd23cab98a79ca9101af33334000879fb60c5;hpb=866dba5cd5a3929bbeae85991796acb212338a08 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 index 000000000..3f00c5b47 --- /dev/null +++ b/bundles/org.simantics.graph.compiler/src/org/simantics/graph/compiler/internal/parsing/SourceSplitter.java @@ -0,0 +1,181 @@ +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 split(String source, int minSplit) { + int length = source.length(); + int inPar = 0; + int lineId = 0; + int lastSplit = 0; + ArrayList result = new ArrayList(); + result.add(new SplitPoint(0, 0)); + loop: for(int i=0;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 sps = split(source, 1000); + for(int i=1;i