From 48026bb824fd2d9cfb00ecd040db6ef3a416bae9 Mon Sep 17 00:00:00 2001
From: Clyne Sullivan <clyne@bitgloo.com>
Date: Fri, 22 Jan 2021 21:43:36 -0500
Subject: upload initial port

---
 ChibiOS_20.3.2/tools/style/stylecheck.pl | 291 +++++++++++++++++++++++++++++++
 1 file changed, 291 insertions(+)
 create mode 100644 ChibiOS_20.3.2/tools/style/stylecheck.pl

(limited to 'ChibiOS_20.3.2/tools/style/stylecheck.pl')

diff --git a/ChibiOS_20.3.2/tools/style/stylecheck.pl b/ChibiOS_20.3.2/tools/style/stylecheck.pl
new file mode 100644
index 0000000..9a44cbd
--- /dev/null
+++ b/ChibiOS_20.3.2/tools/style/stylecheck.pl
@@ -0,0 +1,291 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use File::Basename;
+
+# Desired indentation.
+my $indentation = 2;
+
+if ($#ARGV != 0) {
+  print "\nUsage: stylecheck.pl source\n";
+  exit;
+}
+
+my $source = $ARGV[0];
+
+open(my $in,  "<", $source) or die "Can't open source: $!";
+
+my $lineno = 0;
+my @c_source = <$in>;
+my $filename = $source;
+$filename =~ y/\\/\//;
+$filename = basename($filename);
+
+my $cr        = "\r";
+my $lf        = "\n";
+my $tab       = "\t";
+
+sub style {
+  my $desc = shift;
+
+  print("style: $desc at line $lineno in \"$source\"\n");
+}
+
+sub error {
+  my $desc = shift;
+
+  print("error: $desc at line $lineno in \"$source\"\n");
+}
+
+my $emptycnt = 0;
+my $c_comment_complete = 0;
+my $c_comment = "";
+my $state     = "start";
+foreach my $line (@c_source) {
+
+  $lineno += 1;
+
+  #****************************************************************************
+  # Processing comments after decoding.
+  if ($c_comment_complete != 0) {
+#    print($c_comment . "\n");
+    
+    #******************************************************************************
+    # Special case of lint comment.
+    if ("$c_comment" =~ /^\s*\/\*lint/) {
+    }
+    else {
+      #******************************************************************************
+      # Check on glued doxygen back-comment start.
+      if ("$c_comment" =~ /^\s*\/\*\*<[^\s]/) {
+        style "detected glued doxygen back-comment start";
+      }
+
+      #******************************************************************************
+      # Check on glued doxygen comment start.
+      if ("$c_comment" =~ /^\s*\/\*\*[^\s<]/) {
+        style "detected glued doxygen comment start";
+      }
+
+      #******************************************************************************
+      # Check on glued comment start.
+      if ("$c_comment" =~ /^\s*\/\*[^\s\*=]/) {
+        style "detected glued comment start";
+      }
+
+      #******************************************************************************
+      # Check on lower case letter at comment beginning.
+      if ("$c_comment" =~ /^\s*\/\*\s*[a-z]/) {
+        style "detected lower case comment start";
+      }
+
+      #******************************************************************************
+      # Check on loose comment stop.
+#      if ("$line" =~ /\s\*\//) {
+#        style "detected loose comment stop";
+#      }
+    }
+
+    $c_comment_complete = 0;
+  }
+
+  #****************************************************************************
+  # Check on EOL.
+  if (not ($line =~ /$cr$lf$/)) {
+    error "detected malformed EOL";
+  }
+  $line =~ s/$cr//;
+  $line =~ s/$lf//;
+
+  #****************************************************************************
+  # Check on trailing spaces.
+  if ($line =~ /\s$/) {
+    style "detected trailing spaces";
+  }
+
+  #****************************************************************************
+  # Check on TABs.
+  if ($line =~ /$tab/) {
+    style "detected TAB";
+    $line =~ s/$tab/    /;
+  }
+
+  #****************************************************************************
+  # Check on empty lines.
+  my $tmp = $line;
+  $tmp =~ s/\s//;
+  if (length($tmp) == 0) {
+    $emptycnt = $emptycnt + 1;
+    if ($emptycnt == 2) {
+      style "detected multiple empty lines"
+    }
+    next;
+  }
+  else {
+    $emptycnt = 0;
+  }
+
+  #****************************************************************************
+  # Stripping strings content for ease of parsing, all strings become _string_.
+  $line =~ s/\\\"//;
+  if ($line =~ s/(\"[^"]*\")/_string_/) {
+#    print "string: $1 replaced by _string_\n";
+  }
+
+  #******************************************************************************
+  # State machine handling.
+  if ($state eq "start") {
+
+    #******************************************************************************
+    # Standard separator.
+
+    #******************************************************************************
+    # Comment start matching.
+    if ("$line" =~ /\/\*/) {
+    
+      #******************************************************************************
+      # Single or multi line comments.
+      if ("$line" =~ /\*\//) {
+        # Special case of single line comments.
+        $line =~ /(\/\*.*\*\/)/;
+        $c_comment = $1;
+        $c_comment_complete = 1;
+      }
+      else {
+        # Start of multi-line comment.
+        $line =~ /(\/\*.*)/;
+        $c_comment = $1;
+        $state = "incomment";
+      }
+    }
+    else {
+
+      #****************************************************************************
+      # Check on C++ comments.
+      if ($line =~ /\/\//) {
+        style "detected // comment";
+      }
+
+      #****************************************************************************
+      # Check on commas.
+      if ($line =~ /,\S/) {
+        style "detected comma not followed by space";
+      }
+
+      #****************************************************************************
+      # Check on loose semicolons.
+      if ($line =~ /\S\s;/) {
+        style "detected loose semicolon";
+      }
+
+      #****************************************************************************
+      # Check on glued keywords.
+      if ($line =~ /\sif\(/) {
+        style "detected glued \"if\"";
+      }
+      if ($line =~ /\sfor\(/) {
+        style "detected glued \"for\"";
+      }
+      if ($line =~ /\swhile\(/) {
+        style "detected glued \"while\"";
+      }
+      if ($line =~ /\)while/) {
+        style "detected glued \"while\"";
+      }
+      if ($line =~ /\sswitch\(/) {
+        style "detected glued \"switch\"";
+      }
+      if ($line =~ /\sdo\{/) {
+        style "detected glued \"do\"";
+      }
+
+      #****************************************************************************
+      # Check on loose parenthesis.
+      if ($line =~ /\(\s+/) {
+        style "detected loose \"(\"";
+      }
+      if ($line =~ /\S\s+\)/) {
+        style "detected loose \")\"";
+      }
+
+      #****************************************************************************
+      # Check on glued braces.
+      if ($line =~ /\)\{/) {
+        style "detected glued left brace";
+      }
+      if ($line =~ /\w\{/) {
+        style "detected glued left brace";
+      }
+      if ($line =~ /\}\w/) {
+        style "detected glued right brace";
+      }
+
+      #****************************************************************************
+      # Check on (some) operators.
+      # Before: <<= << >>= >> <= >= == != += -= *= /= %= &= |= ^=
+      if ($line =~ /(\(\S<<=?|\S>>=?|[^\s<]<=|[^\s>]>=|\S[=!+\-*\/%&|^]=)/) {
+        style "detected glued operator (1)";
+      }
+      # After: =
+      elsif ($line =~ /=[^\s=]/) {
+        style "detected glued assignment/comparison operator (2)";
+      }
+      # Before: =
+      elsif ($line =~ /[^\s\=\!\+\-\*\/\%\&\|\^\<\>]=/) {
+        style "detected glued assignment/comparison operator (3)";
+      }
+      # After: << >>
+      elsif ($line =~ /(<<|>>)[^\s=]/) {
+        style "detected glued assignment/comparison operator (4)";
+      }
+      # Before: && || ^^
+      elsif ($line =~ /\S(&&|\|\||\^\^)/) {
+        style "detected glued logical operator (1)";
+      }
+      # After: && || ^^
+      elsif ($line =~ /(&&|\|\||\^\^)\S/) {
+        style "detected glued logical operator (2)";
+      }
+
+      #****************************************************************************
+      # Check function-call-like returns (not perfect so disabled).
+      if ($line =~ /return\s*\(/) {
+        if ($line =~ /return\s*\([\w\d\s\*]*\)\s*[^;]/) {
+        }
+        else {
+#          style "detected function-call-like return";
+        }
+      }
+    }
+  }
+
+  #******************************************************************************
+  # Scanning for comment end.
+  elsif ($state eq "incomment") {
+    # Left trimming.
+    $line =~ s/^\s+//;
+    if ("$line" =~ /^\s*\*\/\s*$/) {
+      # Just end of comment line.
+      $c_comment .= "*/";
+      $c_comment_complete = 1;
+#      print("$c_comment");
+      $state = "start";
+    }
+    elsif ("$line" =~ /\*\/\s*$/) {
+      # Text followed by end of comment.
+      $line =~ /(.*\*\/)/;
+      $c_comment .= " " . $1;
+      $c_comment_complete = 1;
+#      print("$c_comment");
+      $state = "start";
+    }
+    else {
+      # Add the whole line, remove first * and following spaces if any.
+      $line =~ s/^\*?\s*//;
+      $c_comment .= " " . $line;
+#      print("$c_comment");
+    }
+  }
+}
+
+close $in or die "$in: $!";
-- 
cgit v1.2.3