var path = require('path'); var fs = require('fs'); var included = {}; function load(filename) { if (/[\/\\]/.test(filename)) return fs.readFileSync(filename, 'utf8'); var PATH = ['.', 'include', 'src']; for (;;) { var dir = PATH.shift(); try { return fs.readFileSync(dir + '/' + filename, 'utf8'); } catch (e) { if (PATH.length == 0) throw e; } } } function strip_guards(filename, source) { var lead_comments_re = /^(\s*\/\*((?!\*\/)[\s\S])*\*\/)*\s*/; var trail_comments_re = /(\s*\/\*((?!\*\/)[\s\S])*\*\/)*\s*$/; var lead_guards_re = /^#ifndef\s+(\w+)\s+#define\s+(\w+)\s+/; var trail_guards_re = /#endif$/; // Strip leading and trailing comments and whitespace. source = source.replace(lead_comments_re, ''); source = source.replace(trail_comments_re, ''); // Find include guards. var lead_guards = lead_guards_re.exec(source); var trail_guards = trail_guards_re.exec(source); // Remove include guards, if found. if (lead_guards && trail_guards && lead_guards[1] == lead_guards[2]) { console.error('Stripping include guards: ' + filename); source = source.replace(lead_guards_re, ''); source = source.replace(trail_guards_re, ''); } return source; } function lines(filename) { var source = load(filename); source = strip_guards(filename, source); return source.split(/\r?\n/g); } function comment(s) { return ''; //'/* ' + s + '*/' } function include(line, filename) { var key = path.basename(filename).toLowerCase(); if (included[key]) return comment(line); console.error('Including: ' + key); included[key] = true; return lines(filename); } var sys_included = {}; function include_sys(line, filename) { var key = path.basename(filename).toLowerCase(); if (sys_included[key]) return comment(line); sys_included[key] = true; } var source = []; for (var i = 2; i < process.argv.length; i++) { var filename = process.argv[i]; source = source.concat(include(null, filename)); } var patterns = [ {re: /^\s*#include\s*"([^"]*)".*$/, fn: include}, {re: /^\s*#include\s*<([^"]*)>.*$/, fn: include_sys} ] restart: for (var lno = 0; lno < source.length;) { for (var i in patterns) { var line = source[lno]; var pattern = patterns[i]; var match = pattern.re.exec(line); if (match) { var repl = pattern.fn.apply(null, match); if (repl != null && repl !== line) { source.splice.apply(source, [lno, 1].concat(repl)); continue restart; } } } lno++; } console.log(source.join('\n'));