Add a pins formatting script
This commit is contained in:
		
				
					committed by
					
						
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							e62b52da99
						
					
				
				
					commit
					9340a33980
				
			
							
								
								
									
										141
									
								
								buildroot/share/scripts/pinsformat.js
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										141
									
								
								buildroot/share/scripts/pinsformat.js
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,141 @@
 | 
			
		||||
#!/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;
 | 
			
		||||
if (argc > 0) {
 | 
			
		||||
  src_file = src_name = argv[0];
 | 
			
		||||
  dst_file = argv[argc > 1 ? 1 : 0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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]
 | 
			
		||||
      //
 | 
			
		||||
      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
 | 
			
		||||
      //
 | 
			
		||||
      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) {
 | 
			
		||||
    }
 | 
			
		||||
    else if ((r = aliasPatt.exec(line)) !== null) {
 | 
			
		||||
      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) {
 | 
			
		||||
      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) {
 | 
			
		||||
      line = r[1] + ' ' + r[3] + ' ' + r[4];
 | 
			
		||||
      if (r[5]) line = line.rpad(col_comment) + r[5];
 | 
			
		||||
    }
 | 
			
		||||
    else if ((r = undefPatt.exec(line)) !== null) {
 | 
			
		||||
      line = r[1] + ' ' + r[3];
 | 
			
		||||
      if (r[4]) line = line.rpad(col_comment) + r[4];
 | 
			
		||||
    }
 | 
			
		||||
    else if ((r = condPatt.exec(line)) !== null) {
 | 
			
		||||
      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');
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user