aboutsummaryrefslogtreecommitdiff
path: root/buildroot/share/scripts/pinsformat.js
diff options
context:
space:
mode:
Diffstat (limited to 'buildroot/share/scripts/pinsformat.js')
-rw-r--r--buildroot/share/scripts/pinsformat.js170
1 files changed, 170 insertions, 0 deletions
diff --git a/buildroot/share/scripts/pinsformat.js b/buildroot/share/scripts/pinsformat.js
new file mode 100644
index 0000000..a82c2f2
--- /dev/null
+++ b/buildroot/share/scripts/pinsformat.js
@@ -0,0 +1,170 @@
+#!/usr/bin/env node
+
+//
+// Formatter script for pins_MYPINS.h files
+//
+// Usage: mffmt [infile] [outfile]
+//
+// With no parameters convert STDIN to STDOUT
+//
+
+const fs = require("fs");
+
+// String lpad / rpad
+String.prototype.lpad = function(len, chr) {
+ if (!len) return this;
+ if (chr === undefined) chr = ' ';
+ var s = this+'', need = len - s.length;
+ if (need > 0) s = new Array(need+1).join(chr) + s;
+ return s;
+};
+
+String.prototype.rpad = function(len, chr) {
+ if (!len) return this;
+ if (chr === undefined) chr = ' ';
+ var s = this+'', need = len - s.length;
+ if (need > 0) s += new Array(need+1).join(chr);
+ return s;
+};
+
+const mpatt = [ '-?\\d+', 'P[A-I]\\d+', 'P\\d_\\d+' ],
+ definePatt = new RegExp(`^\\s*(//)?#define\\s+[A-Z_][A-Z0-9_]+\\s+(${mpatt[0]}|${mpatt[1]}|${mpatt[2]})\\s*(//.*)?$`, 'gm'),
+ ppad = [ 3, 4, 5 ],
+ col_comment = 50,
+ col_value_rj = col_comment - 3;
+
+var mexpr = [];
+for (let m of mpatt) mexpr.push(new RegExp('^' + m + '$'));
+
+const argv = process.argv.slice(2), argc = argv.length;
+
+var src_file = 0, src_name = 'STDIN', dst_file, do_log = false;
+if (argc > 0) {
+ let ind = 0;
+ if (argv[0] == '-v') { do_log = true; ind++; }
+ dst_file = src_file = src_name = argv[ind++];
+ if (ind < argc) dst_file = argv[ind];
+}
+
+// Read from file or STDIN until it terminates
+const filtered = process_text(fs.readFileSync(src_file).toString());
+if (dst_file)
+ fs.writeFileSync(dst_file, filtered);
+else
+ console.log(filtered);
+
+// Find the pin pattern so non-pin defines can be skipped
+function get_pin_pattern(txt) {
+ var r, m = 0, match_count = [ 0, 0, 0 ];
+ definePatt.lastIndex = 0;
+ while ((r = definePatt.exec(txt)) !== null) {
+ let ind = -1;
+ if (mexpr.some((p) => {
+ ind++;
+ const didmatch = r[2].match(p);
+ return r[2].match(p);
+ }) ) {
+ const m = ++match_count[ind];
+ if (m >= 10) {
+ return { match: mpatt[ind], pad:ppad[ind] };
+ }
+ }
+ }
+ return null;
+}
+
+function process_text(txt) {
+ if (!txt.length) return '(no text)';
+ const patt = get_pin_pattern(txt);
+ if (!patt) return txt;
+ const pindefPatt = new RegExp(`^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(${patt.match})\\s*(//.*)?$`),
+ noPinPatt = new RegExp(`^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+(-1)\\s*(//.*)?$`),
+ skipPatt = new RegExp('^(\\s*(//)?#define)\\s+(AT90USB|USBCON|BOARD_.+|.+_MACHINE_NAME|.+_SERIAL)\\s+(.+)\\s*(//.*)?$'),
+ aliasPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([A-Z_][A-Z0-9_()]+)\\s*(//.*)?$'),
+ switchPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'),
+ undefPatt = new RegExp('^(\\s*(//)?#undef)\\s+([A-Z_][A-Z0-9_]+)\\s*(//.*)?$'),
+ defPatt = new RegExp('^(\\s*(//)?#define)\\s+([A-Z_][A-Z0-9_]+)\\s+([-_\\w]+)\\s*(//.*)?$'),
+ condPatt = new RegExp('^(\\s*(//)?#(if|ifn?def|else|elif)(\\s+\\S+)*)\\s+(//.*)$'),
+ commPatt = new RegExp('^\\s{20,}(//.*)?$');
+ const col_value_lj = col_comment - patt.pad - 2;
+ var r, out = '', check_comment_next = false;
+ txt.split('\n').forEach((line) => {
+ if (check_comment_next)
+ check_comment_next = ((r = commPatt.exec(line)) !== null);
+
+ if (check_comment_next)
+ // Comments in column 45
+ line = ''.rpad(col_comment) + r[1];
+
+ else if ((r = pindefPatt.exec(line)) !== null) {
+ //
+ // #define MY_PIN [pin]
+ //
+ if (do_log) console.log("pin:", line);
+ const pinnum = r[4].charAt(0) == 'P' ? r[4] : r[4].lpad(patt.pad);
+ line = r[1] + ' ' + r[3];
+ line = line.rpad(col_value_lj) + pinnum;
+ if (r[5]) line = line.rpad(col_comment) + r[5];
+ }
+ else if ((r = noPinPatt.exec(line)) !== null) {
+ //
+ // #define MY_PIN -1
+ //
+ if (do_log) console.log("pin -1:", line);
+ line = r[1] + ' ' + r[3];
+ line = line.rpad(col_value_lj) + '-1';
+ if (r[5]) line = line.rpad(col_comment) + r[5];
+ }
+ else if ((r = skipPatt.exec(line)) !== null) {
+ //
+ // #define SKIP_ME
+ //
+ if (do_log) console.log("skip:", line);
+ }
+ else if ((r = aliasPatt.exec(line)) !== null) {
+ //
+ // #define ALIAS OTHER
+ //
+ if (do_log) console.log("alias:", line);
+ line = r[1] + ' ' + r[3];
+ line += r[4].lpad(col_value_rj + 1 - line.length);
+ if (r[5]) line = line.rpad(col_comment) + r[5];
+ }
+ else if ((r = switchPatt.exec(line)) !== null) {
+ //
+ // #define SWITCH
+ //
+ if (do_log) console.log("switch:", line);
+ line = r[1] + ' ' + r[3];
+ if (r[4]) line = line.rpad(col_comment) + r[4];
+ check_comment_next = true;
+ }
+ else if ((r = defPatt.exec(line)) !== null) {
+ //
+ // #define ...
+ //
+ if (do_log) console.log("def:", line);
+ line = r[1] + ' ' + r[3] + ' ';
+ line += r[4].lpad(col_value_rj + 1 - line.length);
+ if (r[5]) line = line.rpad(col_comment - 1) + ' ' + r[5];
+ }
+ else if ((r = undefPatt.exec(line)) !== null) {
+ //
+ // #undef ...
+ //
+ if (do_log) console.log("undef:", line);
+ line = r[1] + ' ' + r[3];
+ if (r[4]) line = line.rpad(col_comment) + r[4];
+ }
+ else if ((r = condPatt.exec(line)) !== null) {
+ //
+ // #if ...
+ //
+ if (do_log) console.log("cond:", line);
+ line = r[1].rpad(col_comment) + r[5];
+ check_comment_next = true;
+ }
+ out += line + '\n';
+ });
+ return out.replace(/\n\n+/g, '\n\n').replace(/\n\n$/g, '\n');
+}