xref: /aosp_15_r20/external/gmmlib/Source/GmmLib/Scripts/GmmCheckCodingStandard.wsf (revision 35ffd701415c9e32e53136d61a677a8d0a8fc4a5)
1*35ffd701SAndroid Build Coastguard Worker//============================================================================
2*35ffd701SAndroid Build Coastguard Worker// Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker//
4*35ffd701SAndroid Build Coastguard Worker// Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker// copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker// to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker// and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker// Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker//
11*35ffd701SAndroid Build Coastguard Worker// The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker// in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker//
14*35ffd701SAndroid Build Coastguard Worker// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker// OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker//============================================================================
22*35ffd701SAndroid Build Coastguard Worker<job>
23*35ffd701SAndroid Build Coastguard Worker<script>
24*35ffd701SAndroid Build Coastguard Worker
25*35ffd701SAndroid Build Coastguard Worker// Globals
26*35ffd701SAndroid Build Coastguard Workervar fso = WScript.CreateObject("Scripting.FileSystemObject");
27*35ffd701SAndroid Build Coastguard Workervar err_count = 0;
28*35ffd701SAndroid Build Coastguard Workervar in_block_comment = false;
29*35ffd701SAndroid Build Coastguard Worker
30*35ffd701SAndroid Build Coastguard Worker// Main function
31*35ffd701SAndroid Build Coastguard Workerfunction main() {
32*35ffd701SAndroid Build Coastguard Worker    try {
33*35ffd701SAndroid Build Coastguard Worker        var dir;
34*35ffd701SAndroid Build Coastguard Worker
35*35ffd701SAndroid Build Coastguard Worker        // Get the directory to parse from the command-line
36*35ffd701SAndroid Build Coastguard Worker        {
37*35ffd701SAndroid Build Coastguard Worker            dir = WScript.Arguments.Unnamed.Item(0);
38*35ffd701SAndroid Build Coastguard Worker            if (!fso.folderExists(dir)) {
39*35ffd701SAndroid Build Coastguard Worker                print("ERROR: Cannot find directory " + dir);
40*35ffd701SAndroid Build Coastguard Worker                err_count++;
41*35ffd701SAndroid Build Coastguard Worker                return;
42*35ffd701SAndroid Build Coastguard Worker            }
43*35ffd701SAndroid Build Coastguard Worker            dir = fso.getAbsolutePathName(dir);
44*35ffd701SAndroid Build Coastguard Worker        }
45*35ffd701SAndroid Build Coastguard Worker
46*35ffd701SAndroid Build Coastguard Worker        print("Checking coding standard in " + dir);
47*35ffd701SAndroid Build Coastguard Worker
48*35ffd701SAndroid Build Coastguard Worker        // Loop thru each line of each source file and look for coding standard violations
49*35ffd701SAndroid Build Coastguard Worker        {
50*35ffd701SAndroid Build Coastguard Worker            foreach_line(dir, function(file, line, linenum) {
51*35ffd701SAndroid Build Coastguard Worker                var is_comment_line = false;
52*35ffd701SAndroid Build Coastguard Worker
53*35ffd701SAndroid Build Coastguard Worker                if (line.match(/\/\*/)) {
54*35ffd701SAndroid Build Coastguard Worker                    in_block_comment = true;
55*35ffd701SAndroid Build Coastguard Worker                }
56*35ffd701SAndroid Build Coastguard Worker                if (line.match(/\*\//)) {
57*35ffd701SAndroid Build Coastguard Worker                    in_block_comment = false;
58*35ffd701SAndroid Build Coastguard Worker                }
59*35ffd701SAndroid Build Coastguard Worker                if (line.match(/^\s*\/\//) || in_block_comment) {
60*35ffd701SAndroid Build Coastguard Worker                    is_comment_line = true;
61*35ffd701SAndroid Build Coastguard Worker                }
62*35ffd701SAndroid Build Coastguard Worker                if (line.match(/\t/)) {
63*35ffd701SAndroid Build Coastguard Worker                    report_error(file, linenum, "Found tabs. Check your IDE settings and replace tabs with spaces.");
64*35ffd701SAndroid Build Coastguard Worker                };
65*35ffd701SAndroid Build Coastguard Worker            })
66*35ffd701SAndroid Build Coastguard Worker        }
67*35ffd701SAndroid Build Coastguard Worker    } catch (e) {
68*35ffd701SAndroid Build Coastguard Worker        print("ERROR: Exception caught in main(). " + e.message);
69*35ffd701SAndroid Build Coastguard Worker        err_count++;
70*35ffd701SAndroid Build Coastguard Worker        return;
71*35ffd701SAndroid Build Coastguard Worker    }
72*35ffd701SAndroid Build Coastguard Worker}
73*35ffd701SAndroid Build Coastguard Worker
74*35ffd701SAndroid Build Coastguard Worker// Loops thru each file recursively and applies a function to
75*35ffd701SAndroid Build Coastguard Worker// every line
76*35ffd701SAndroid Build Coastguard Workerfunction foreach_line(dir, apply) {
77*35ffd701SAndroid Build Coastguard Worker    try {
78*35ffd701SAndroid Build Coastguard Worker        var folder;
79*35ffd701SAndroid Build Coastguard Worker
80*35ffd701SAndroid Build Coastguard Worker        // Parse all source files in this directory
81*35ffd701SAndroid Build Coastguard Worker        {
82*35ffd701SAndroid Build Coastguard Worker            folder = fso.getFolder(dir);
83*35ffd701SAndroid Build Coastguard Worker            var files = new Enumerator(folder.Files);
84*35ffd701SAndroid Build Coastguard Worker            for (; !files.atEnd(); files.moveNext()) {
85*35ffd701SAndroid Build Coastguard Worker                var path = files.item().path;
86*35ffd701SAndroid Build Coastguard Worker                var path_l = path.toLowerCase();
87*35ffd701SAndroid Build Coastguard Worker                if (path_l.match(/(\.cpp|\.hpp|\.h)$/)) {
88*35ffd701SAndroid Build Coastguard Worker                    parse_file(path, apply);
89*35ffd701SAndroid Build Coastguard Worker                }
90*35ffd701SAndroid Build Coastguard Worker            }
91*35ffd701SAndroid Build Coastguard Worker        }
92*35ffd701SAndroid Build Coastguard Worker
93*35ffd701SAndroid Build Coastguard Worker        // Recurse through all subfolders
94*35ffd701SAndroid Build Coastguard Worker        {
95*35ffd701SAndroid Build Coastguard Worker            var subfolders = new Enumerator(folder.SubFolders);
96*35ffd701SAndroid Build Coastguard Worker            for (; !subfolders.atEnd(); subfolders.moveNext()) {
97*35ffd701SAndroid Build Coastguard Worker                foreach_line(subfolders.item().path, apply);
98*35ffd701SAndroid Build Coastguard Worker            }
99*35ffd701SAndroid Build Coastguard Worker        }
100*35ffd701SAndroid Build Coastguard Worker    }
101*35ffd701SAndroid Build Coastguard Worker    catch (e) {
102*35ffd701SAndroid Build Coastguard Worker        print("ERROR: Failed to parse directory " + dir + ". " + e.message);
103*35ffd701SAndroid Build Coastguard Worker        err_count++;
104*35ffd701SAndroid Build Coastguard Worker        return;
105*35ffd701SAndroid Build Coastguard Worker    }
106*35ffd701SAndroid Build Coastguard Worker}
107*35ffd701SAndroid Build Coastguard Worker
108*35ffd701SAndroid Build Coastguard Worker// Parse every line in the file and applies the
109*35ffd701SAndroid Build Coastguard Worker// given function.
110*35ffd701SAndroid Build Coastguard Workerfunction parse_file(path, apply) {
111*35ffd701SAndroid Build Coastguard Worker    try {
112*35ffd701SAndroid Build Coastguard Worker        in_block_comment = false;
113*35ffd701SAndroid Build Coastguard Worker        var f = fso.openTextFile(path, 1);
114*35ffd701SAndroid Build Coastguard Worker        var i = 0;
115*35ffd701SAndroid Build Coastguard Worker        while (!f.atEndOfStream) {
116*35ffd701SAndroid Build Coastguard Worker            i++;
117*35ffd701SAndroid Build Coastguard Worker            var line = f.readLine();
118*35ffd701SAndroid Build Coastguard Worker            try {
119*35ffd701SAndroid Build Coastguard Worker                apply(path, line, i);
120*35ffd701SAndroid Build Coastguard Worker            } catch(e) {
121*35ffd701SAndroid Build Coastguard Worker                report_error(path, i, "Failed to parse line. " + e.message);
122*35ffd701SAndroid Build Coastguard Worker            }
123*35ffd701SAndroid Build Coastguard Worker        }
124*35ffd701SAndroid Build Coastguard Worker        f.close();
125*35ffd701SAndroid Build Coastguard Worker    } catch (e) {
126*35ffd701SAndroid Build Coastguard Worker        print("ERROR: Failed to open " + path + ". " + e.message);
127*35ffd701SAndroid Build Coastguard Worker        err_count++;
128*35ffd701SAndroid Build Coastguard Worker    }
129*35ffd701SAndroid Build Coastguard Worker}
130*35ffd701SAndroid Build Coastguard Worker
131*35ffd701SAndroid Build Coastguard Worker// Prints a message
132*35ffd701SAndroid Build Coastguard Workerfunction print(msg) {
133*35ffd701SAndroid Build Coastguard Worker    WScript.echo(msg);
134*35ffd701SAndroid Build Coastguard Worker}
135*35ffd701SAndroid Build Coastguard Worker
136*35ffd701SAndroid Build Coastguard Worker// Prints an error message in a VisualStudio-friendly format
137*35ffd701SAndroid Build Coastguard Workerfunction report_error(file, linenum, msg) {
138*35ffd701SAndroid Build Coastguard Worker    print(file + "(" + linenum + ") : error : " + msg);
139*35ffd701SAndroid Build Coastguard Worker    err_count++;
140*35ffd701SAndroid Build Coastguard Worker}
141*35ffd701SAndroid Build Coastguard Worker
142*35ffd701SAndroid Build Coastguard Workermain();
143*35ffd701SAndroid Build Coastguard Workerprint("\nFound " + err_count + " error(s)\n");
144*35ffd701SAndroid Build Coastguard WorkerWScript.quit(err_count);
145*35ffd701SAndroid Build Coastguard Worker</script>
146*35ffd701SAndroid Build Coastguard Worker</job>