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>