From 6e1e6fc83e1a695efdd73129e7cc1350dc21dab9 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Sat, 9 Sep 2017 20:52:58 +0200 Subject: [PATCH] all-in-one: strip include guards from header files --- allinone/build.js | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/allinone/build.js b/allinone/build.js index 10a742f..ced8001 100644 --- a/allinone/build.js +++ b/allinone/build.js @@ -3,15 +3,15 @@ var path = require('path'); var fs = require('fs'); var included = {}; -function lines(filename) { +function load(filename) { if (/[\/\\]/.test(filename)) - return fs.readFileSync(filename, 'utf8').split(/\r?\n/g); + return fs.readFileSync(filename, 'utf8'); var PATH = [ '.', 'include', 'src' ]; for (;;) { var dir = PATH.shift(); try { - return fs.readFileSync(dir + '/' + filename, 'utf8').split(/\r?\n/g); + return fs.readFileSync(dir + '/' + filename, 'utf8'); } catch (e) { if (PATH.length == 0) throw e; @@ -19,6 +19,36 @@ function lines(filename) { } } +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 + '*/' }