1/* 2* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. 3* Licensed under the Apache License, Version 2.0 (the "License"); 4* you may not use this file except in compliance with the License. 5* You may obtain a copy of the License at 6* 7* http://www.apache.org/licenses/LICENSE-2.0 8* 9* Unless required by applicable law or agreed to in writing, software 10* distributed under the License is distributed on an "AS IS" BASIS, 11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12* See the License for the specific language governing permissions and 13* limitations under the License. 14*/ 15const xlsx = require("xlsx"); 16const fs = require("fs"); 17const path = require("path"); 18const stdio = require("stdio"); 19 20let ops = stdio.getopt({ 21 'directory': { key: 'd', args: 1, description: "scan directory" }, 22 'output': { key: 'o', args: 1, description: "output directory", default: "." }, 23}); 24 25let distDir = ops.directory; 26let outDir = ops.output; 27 28function union(a, b) { 29 let ret = new Set(); 30 a.forEach((n1) => { 31 ret.add(n1); 32 }); 33 b.forEach((n1) => { 34 ret.add(n1); 35 }); 36 return ret; 37} 38 39function intersection(a, b) { 40 let ret = new Set(); 41 a.forEach((n1) => { 42 if (b.has(n1)) { 43 ret.add(n1); 44 } 45 }) 46 return ret; 47} 48 49function collectFromSheet(sheet) { 50 let row = 2; 51 let collectInclude = new Set() 52 let collectFunction = new Set() 53 while (true) { 54 let idx = "B" + row; 55 if (!(idx in sheet)) { 56 break; 57 } 58 collectInclude.add(sheet[idx].w); 59 60 if (sheet["C" + row].w == "Function") { 61 collectFunction.add(sheet["D" + row].w); 62 } 63 row += 1; 64 } 65 return [collectInclude, collectFunction] 66} 67let wb = xlsx.readFile(path.join(__dirname, "Andr_N_Games_api.xlsx")); 68 69let c1 = collectFromSheet(wb.Sheets.Games); 70let c2 = collectFromSheet(wb.Sheets.N); 71 72let androidFeature = { 73 include: union(c1[0], c2[0]), 74 function: union(c1[1], c2[1]), 75} 76////////////////////////////////////////////////////// 77 78let projectFiles = { 79 c: [], 80 cpp: [], 81 h: [], 82} 83 84let projectFeature = { 85 "function": new Set(), 86 "include": new Set() 87} 88 89function collectFromFile(fn) { 90 let data = fs.readFileSync(fn, { encoding: "utf8" }); 91 92 for (let ss of data.matchAll(/([A-Za-z_][A-Za-z0-9_]*) *\(/g)) { 93 projectFeature["function"].add(ss[1]); 94 } 95 96 for (let ss of data.matchAll(/# *include *(<|") *([A-Za-z_][A-Za-z0-9_\-/]*(.h(pp)*)*) *(>|")/g)) { 97 let s = ss[2].split("/"); 98 s = s[s.length - 1]; 99 projectFeature["include"].add(s); 100 } 101} 102 103function collectFile (pth, f) { 104 let fn = path.join(pth, f); 105 let st; 106 try { 107 st = fs.statSync(fn); 108 } catch(err){ 109 return; 110 } 111 if (st.isDirectory()) { 112 collectFeature(fn); 113 } 114 else if (st.isFile()) { 115 if (f.endsWith(".h")) { 116 projectFiles.h.push(fn); 117 collectFromFile(fn); 118 } 119 else if (f.endsWith(".cpp")) { 120 projectFiles.cpp.push(fn); 121 collectFromFile(fn); 122 } 123 else if (f.endsWith(".c")) { 124 projectFiles.c.push(fn); 125 collectFromFile(fn); 126 } 127 } 128} 129 130function collectFeature(pth) { 131 let files = fs.readdirSync(pth); 132 133 for (let f of files) { 134 collectFile(pth, f); 135 } 136} 137 138collectFeature(distDir) 139 140let result = { 141 function: intersection(androidFeature["function"], projectFeature["function"]), 142 include: intersection(androidFeature["include"], projectFeature["include"]), 143} 144console.log(result); 145///////////////////////////////save to excel 146function string2u8buff(s) { 147 let buf = new ArrayBuffer(s.length); 148 let view = new Uint8Array(buf); 149 for (let i = 0; i !== s.length; ++i) { 150 view[i] = s.charCodeAt(i) & 0xff; 151 } 152 return view; 153} 154 155let wopts = { 156 bookType: "xlsx", 157 bookSST: false, 158 type: 'binary' 159}; 160let workbook = xlsx.utils.book_new(); 161 162let s1 = [] 163for (let f of result.function) { 164 s1.push({ function: f }) 165} 166let sheet1 = xlsx.utils.json_to_sheet(s1); 167xlsx.utils.book_append_sheet(workbook, sheet1, 'sheet1'); 168 169let s2 = [] 170for (let f of result.include) { 171 s2.push({ include: f }) 172} 173let sheet2 = xlsx.utils.json_to_sheet(s2); 174xlsx.utils.book_append_sheet(workbook, sheet2, 'sheet2'); 175 176let wbout = xlsx.write(workbook, wopts); 177let ddd = string2u8buff(wbout); 178let outPath = path.join(outDir, "result.xlsx"); 179console.log("output:", outPath); 180fs.writeFileSync(outPath, ddd); 181