]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.graph.compiler.internal.parsing;\r
2 \r
3 import java.io.InputStream;\r
4 import java.nio.charset.Charset;\r
5 import java.util.ArrayList;\r
6 \r
7 import org.simantics.databoard.util.StreamUtil;\r
8 \r
9 public class SourceSplitter {\r
10         \r
11         public static class SplitPoint {\r
12                 public final int characterId;\r
13                 public final int lineId;\r
14                 \r
15                 public SplitPoint(int characterId, int lineId) {\r
16                         this.characterId = characterId;\r
17                         this.lineId = lineId;\r
18                 }\r
19         }\r
20         \r
21         public static ArrayList<SplitPoint> split(String source, int minSplit) {\r
22                 int length = source.length();\r
23                 int inPar = 0;\r
24                 int lineId = 0;\r
25                 int lastSplit = 0;\r
26                 ArrayList<SplitPoint> result = new ArrayList<SplitPoint>();\r
27                 result.add(new SplitPoint(0, 0));\r
28                 loop: for(int i=0;i<length;++i) {\r
29                         char c = source.charAt(i);\r
30 \r
31                         switch(c) {\r
32                         case '/':\r
33                                 ++i;\r
34                                 c = source.charAt(i);\r
35                                 if(c == '/') {\r
36                                         do {\r
37                                                 ++i;\r
38                                                 if(i == length)\r
39                                                         break loop;\r
40                                         } while(source.charAt(i) != '\n');\r
41                                         --i;\r
42                                 }\r
43                                 else if(c == '*') {\r
44                                         ++i;\r
45                                         if(source.charAt(i) == '\n')\r
46                                                 ++lineId;\r
47                                         do {\r
48                                                 ++i;\r
49                                                 if(i >= length)\r
50                                                         break loop;\r
51                                                 c = source.charAt(i);\r
52                                                 if(c == '\n')\r
53                                                         ++lineId;\r
54                                         } while(c != '/' || source.charAt(i-1) != '*');\r
55                                 }\r
56                                 break;\r
57                         case '<':\r
58                                 ++i;\r
59                                 c = source.charAt(i);\r
60                                 if(c != 'h') {\r
61                                         if(c == '\n')\r
62                                                 ++lineId;\r
63                                         break;\r
64                                 }\r
65                                 do {\r
66                                         ++i;\r
67                                         if(i == length)\r
68                                                 break loop;\r
69                                         c = source.charAt(i);\r
70                                         if(c == '\n') {\r
71                                                 ++lineId;\r
72                                                 break;\r
73                                         }\r
74                                 } while(c != '>');\r
75                                 break;\r
76                         case '"':\r
77                                 ++i;\r
78                                 if(i == length)\r
79                                         break loop;\r
80                                 c = source.charAt(i);\r
81                                 if(c == '"') {\r
82                                         ++i;\r
83                                         if(i == length)\r
84                                                 break loop;\r
85                                         c = source.charAt(i);\r
86                                         if(c == '"') {\r
87                                                 while(true) {\r
88                                                         ++i;\r
89                                                         if(i >= length)\r
90                                                                 break;\r
91                                                         c = source.charAt(i);\r
92                                                         if(c == '\n')\r
93                                                                 ++lineId;\r
94                                                         else if(c == '"' && i < length-2 && source.charAt(i+1) == '"' && source.charAt(i+2) == '"') {\r
95                                                                 i+=2;\r
96                                                                 break;                  \r
97                                                         }\r
98                                                 }\r
99                                         }\r
100                                         else\r
101                                                 --i;\r
102                                 }\r
103                                 else {\r
104                                         while(true) {\r
105                                                 ++i;\r
106                                                 if(i >= length)\r
107                                                         break;\r
108                                                 c = source.charAt(i);\r
109                                                 if(c == '"')\r
110                                                         break;\r
111                                                 else if(c == '\\')\r
112                                                         ++i;                    \r
113                                                 else if(c == '\n') {\r
114                                                         ++lineId;\r
115                                                         break;\r
116                                                 }\r
117                                         }\r
118                                 }\r
119                                 break;\r
120                         case '[':\r
121                         case '{':\r
122                         case '(':\r
123                                 ++inPar;\r
124                                 break;\r
125                         case ']':\r
126                         case '}':\r
127                         case ')':\r
128                                 --inPar;\r
129                                 break;\r
130                         case '\n':\r
131                                 ++lineId;\r
132                                 ++i;\r
133                                 if(i == length)\r
134                                         break;\r
135                                 c = source.charAt(i);\r
136                                 if(c == '\r') {\r
137                                         ++i;\r
138                                         if(i == length)\r
139                                                 break;\r
140                                         c = source.charAt(i);\r
141                                 }\r
142                                 if(c == '\n') {\r
143                                         --i;\r
144                                         break;\r
145                                 }\r
146                                 /*System.out.println();\r
147                                 System.out.print(lineId + "# ");\r
148                                 System.out.print(c);\r
149                                 */\r
150                                 if(i > lastSplit + minSplit && inPar == 0 && ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {\r
151                                         result.add(new SplitPoint(i, lineId));\r
152                                         lastSplit = i;\r
153                                 }\r
154                                 else\r
155                                         --i;\r
156                                 break;\r
157                         case '\r':\r
158                                 break;\r
159                         default:\r
160                                 //System.out.print(c);\r
161                         }\r
162                 }\r
163                 result.add(new SplitPoint(length, lineId));\r
164                 return result;\r
165         }\r
166         \r
167         public static void main(String[] args) throws Exception {               \r
168                 InputStream stream = SourceSplitter.class.getResourceAsStream("Layer0Deprecated.pgraph");\r
169                 String source = StreamUtil.readString(stream, Charset.forName("UTF-8"));\r
170                 stream.close();\r
171                 \r
172                 ArrayList<SplitPoint> sps = split(source, 1000); \r
173                 for(int i=1;i<sps.size();++i) {\r
174                         SplitPoint begin = sps.get(i-1);\r
175                         SplitPoint end = sps.get(i);\r
176                         System.out.println("-- " + begin.lineId + ":" + end.lineId);\r
177                         System.out.print(source.subSequence(begin.characterId, end.characterId));\r
178                 }\r
179         }\r
180         \r
181 }\r