-
Notifications
You must be signed in to change notification settings - Fork 3
/
Diff.js
127 lines (110 loc) · 4.82 KB
/
Diff.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
function ClassInfo( aClassName )
{
this.strName = aClassName;
this.mapClass = {};
this.mapMethod = {};
this.mapField = {};
}
function RootTree()
{
var pCurrClass = this;
var pCurrMethod = null;
var mapClass = {};
var mapMethod = {};
var mapField = {};
this.AddClass( aClassStr )
{
var pNewClass = new ClassInfo( aClassStr );
if ( pCurrClass != null )
{
pCurrClass.mapClass[aClassStr] = pNewClass;
}
pCurrClass = pNewClass;
}
}
function Diff( aSrcPath , aDstPath , aLogFolder )
{
//Open file
var fileSrc = new CWUtils.CAdoTextFile(); //Remember to new AdoTextFile so that all constants are initialized
if ( false == fileSrc.Open( aSrcPath , "UTF-8" ) )
{
WScript.Echo( "fileSrc.Open() failed. aSrcPath=" + aSrcPath );
WScript.Quit( -1 );
}
var fileDst = new CWUtils.CWshTextFile(); //Remember to new AdoTextFile so that all constants are initialized
if ( false == fileDst.Open( aDstPath , CWUtils.CWshTextFile.Mode.ForWriting , false , true ) )
{
WScript.Echo( "fileDst.Open() failed. aDstPath=" + aDstPath );
WScript.Quit( -1 );
}
WScript.Echo( "Converting: " + aSrcPath + " => " + aDstPath );
//https://msdn.microsoft.com/en-us/library/x53a06bb.aspx
var aryKeywords = [ "nested" , "abstract" , "add" , "alias" , "as" , "ascending" , "async" , "await" , "base" , "bool" , "break" , "byte" , "case" , "catch" , "char" , "checked" , "class" , "const" , "continue" , "decimal" , "default" , "delegate" , "descending" , "do" , "double" , "dynamic" , "else" , "enum" , "event" , "explicit" , "extern" , "false" , "finally" , "fixed" , "float" , "for" , "foreach" , "from" , "get" , "global" , "goto" , "group" , "if" , "implicit" , "in" , "in (generic modifier)" , "int" , "interface" , "internal" , "into" , "is" , "join" , "let" , "lock" , "long" , "namespace" , "new" , "null" , "object" , "operator" , "orderby" , "out" , "out (generic modifier)" , "override" , "params" , "partial" , "private" , "protected" , "public" , "readonly" , "ref" , "remove" , "return" , "sbyte" , "sealed" , "select" , "set" , "short" , "sizeof" , "stackalloc" , "static" , "string" , "struct" , "switch" , "this" , "throw" , "true" , "try" , "typeof" , "uint" , "ulong" , "unchecked" , "unsafe" , "ushort" , "using" , "value" , "var" , "virtual" , "void" , "volatile" , "where" , "while" , "yield" ];
var pTree = new RootTree();
var PARSER_STATE = { "NONE" : 0 ,
"BLOCK_START" : 1 , "BLOCK_END" : 2 ,
"COMMENT_SINGLE" : 3 , "COMMENT_START" : 4 , "COMMENT_END" : 5 ,
"CLASS" : 6 , "FIELD" : 7 , "METHOD" : 8 , "UNKNOWN" : 9 };
var nPrevParserState = PARSER_STATE.NONE;
var nParserState = PARSER_STATE.NONE;
var aryPtns;
aryPtns[PARSER_STATE.NONE] = /^\s*$/;
aryPtns[PARSER_STATE.BLOCK_START] = /^\s*\{$/;
aryPtns[PARSER_STATE.BLOCK_END] = /^\s*\}$/;
aryPtns[PARSER_STATE.COMMENT_SINGLE] = /^\s*\/\/(.*)/;
aryPtns[PARSER_STATE.COMMENT_START] = /^\s*\/\*(.*)/;
aryPtns[PARSER_STATE.COMMENT_END] = /^(.*)\*\//;
aryPtns[PARSER_STATE.CLASS] = /^\s*\.class.*?([^ ]+)$/;
aryPtns[PARSER_STATE.FIELD] = /^\s*\.field.*?([^ ]+)/;
aryPtns[PARSER_STATE.METHOD] = /^\s*\.method.*\r\n.*?([^ ]+\(.*\)).*$/;
aryPtns[PARSER_STATE.UNKNOWN] = /.*/;
var nCurrLine = 0;
while ( ! fileSrc.AtEndOfStream() )
{
var strLine = fileSrc.ReadLine();
nCurrLine++;
var aryLine = null;
for ( var state in aryPtns )
{
aryLine = aryPtns[state].exec( strLine );
if ( null != aryLine && nPrevParserState != nParserState )
{
nPrevParserState = nParserState;
nParserState = state;
break;
}
}
//Skip block comment
if ( ( nParserState == PARSER_STATE.COMMENT_SINGLE ) ||
( nPrevParserState == PARSER_STATE.COMMENT_START && nParserState != PARSER_STATE.COMMENT_END ) )
{
continue;
}
switch ( nParserState )
{
case PARSER_STATE.NONE :
{
break;
}
case PARSER_STATE.COMMENT_SINGLE :
{
var strComment = aryLine[1];
break;
}
case PARSER_STATE.CLASS :
{
var strClass = aryLine[1].split( " " ).pop();
pTree.AddClass( strClass );
break;
}
case PARSER_STATE.METHOD :
{
var strClass = aryLine[1].split( " " ).pop();
pTree.AddClass( strClass );
break;
}
}
}
fileSrc.Close();
fileDst.Close();
}