diff g23m/system/busyb/tools/header_gen.pl @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/system/busyb/tools/header_gen.pl	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,215 @@
+#
+# combined script: header_gen
+#
+# consists of:
+#   header_gen_rv_swe.pl
+#   header_gen_rv_test_inc.pl
+#   header_gen_rv_test_exec_level.pl
+#
+# to be invoked with:
+#   header_gen.pl { rv_swe | rv_test_inc | rv_test_exec_level } other-params
+#
+#   details see below
+#
+
+use strict;
+#use warnings;
+
+# Define and set global variables.
+my $selector = shift;
+print $selector . "   ";
+my $header_file = shift;
+print $header_file;
+my $guard_string = "\U__${selector}_H__";
+
+
+#
+# Function used to open and write the header to the include file.
+#
+sub open_header {
+    # open the file
+    open (HDR,">$header_file")||die "can't open $header_file \n";
+
+    # print guard pattern
+    print HDR "#ifndef $guard_string\n";
+    print HDR "#define $guard_string\n\n";
+}
+
+#
+# Function used to write the footer and close the include file.
+#
+sub close_footer {
+    # end guard pattern
+    print HDR "\n#endif /* $guard_string */\n";
+
+    # close the file
+    close HDR;
+}
+
+
+if ($selector eq 'rv_swe')
+{
+
+  open_header();
+
+  foreach (@ARGV) {
+    #look for the following pattern
+    if(/^(SWE_)?(\w+)_STATE=(\d+)/)
+    {
+      if ($3 == 1 || $3 == 2)
+      {
+        #print everything
+        print HDR "#define RVM_${2}_SWE\n";
+      }
+    }
+  }
+
+  close_footer();
+
+}
+elsif ($selector eq 'rv_test_inc')
+{
+
+#
+# header_gen_rv_test_inc.pl : tool to generate header files
+#
+# Short spec:
+#
+# This tool generates one header file using the information from the command
+# line. The expected fommand line form is:
+#
+# header-file-name other-parameters
+#
+# where header-file-name is the filename of the include file to be generated
+# (including path components).
+# other-parameters parameters define an association of names to values. each
+# association has the form:
+#
+# name=value
+#
+# name may have an prefix SWE_, which is then ignored. name must have the
+# suffix _STATE, otherwise this particular association is ignored.
+# only the component between SWE_ and _STATE gets considered. value must
+# be 2, otherwise this particular association is ignored.
+#
+# The tool generates from the accepted (not ignored) a list of defines.
+# the identifiers are the considered part of the other-parameters, but have
+# the prefix TEST_ and suffix _SWE. The values they define start with 1,
+# increasing.
+# the order of the parameters is not important. However, it must be the same
+# as of the tool header_gen_rv_test_exec_level.pl (see there).
+# Conveniently both tools should be invoked with the same other-parameters.
+#
+
+  open_header();
+
+  my $counter = 1;
+
+  foreach (@ARGV) {
+    #look for the following pattern
+    if(/^(SWE_)?(\w+)_STATE=(\d+)/)
+    {
+      if ($3 == 2)
+      {
+        print HDR "#define TEST_${2}_SWE ($counter)\n";
+        $counter++;
+      }
+    }
+  }
+
+  close_footer();
+
+}
+elsif ($selector eq 'rv_test_exec_level')
+{
+
+#
+# header_gen_rv_test_exec_level.pl : tool to generate header files
+#
+# Short spec:
+#
+# This tool generates one header file using the information from the command
+# line. The expected fommand line form is:
+#
+# header-file-name other-parameters
+#
+# where header-file-name is the filename of the include file to be generated
+# (including path components).
+# other-parameters parameters define an association of names to values. each
+# association has the form:
+#
+# name=value
+#
+# name may have an prefix SWE_, which is then ignored. name must have the
+# suffix _STATE, otherwise this particular association is ignored.
+# only the component between SWE_ and _STATE gets considered. value must
+# be 2, otherwise this particular association is ignored.
+#
+# the contents of the header file will be of the ANSI C language.
+# it is a the definition of an array:
+# static char TEST_LEVEL_LCD [TEST_LEVEL_LCD_LEN][TEST_LEVEL_LCD_STR_LEN] =
+# having 0-terminated strings as components.
+# the values of TEST_LEVEL_LCD_LEN and TEST_LEVEL_LCD_STR_LEN and the elements
+# of the array depend on the parameters:
+# TEST_LEVEL_LCD_LEN is the number of considered (or not ignored)
+# other-parameters PLUS 1.
+# TEST_LEVEL_LCD_STR_LEN is the length of the strings. various rules apply,
+# e.g. for 0 termination (but at last, it will get the value of 15!).
+# see below and/or ask a ANSI C guru.
+# the strings have the form: running index," - ", considered name component
+# (max 8 chars), filling blanks (up to the final length)
+# the running index use 3 characters, i.e. no more than 999 considered indexes
+# are allowed. this is no problem for the time being.
+# Thus we can compute the max length: 3+3+8+1=15 (running index, delimiter,
+# name, string delimiter \0).
+# There is one special initial string. it is always placed at index 0 and has
+# the contents "  TEST LEVEL  " plus '\0'.
+# the 2 spaces at the beginning are legacy, I guess they are just to have a
+# left alignment with the first 9 indexes (those with 1 figure indexes)
+#
+
+  if (@ARGV > 999)
+  {
+    die "cannot stand it - too many arguments";
+  }
+
+  open_header();
+
+  my $max_name_len = 8;
+  my @local_args;
+  foreach (@ARGV)
+  {
+    if(/^(SWE_)?(\w+)_STATE=(\d+)/ && $3 == 2)
+      {
+        push @local_args, substr($2, 0, $max_name_len);
+      }
+    }
+
+  print HDR "/* RV TEST TEST_LEVEL PARAMETER */\n";
+  print HDR "#define TEST_LEVEL_LCD_LEN     (".(@local_args+1).")\n";
+  print HDR "#define TEST_LEVEL_LCD_STR_LEN (".(3+3+$max_name_len+1).")\n\n";
+  print HDR "static char TEST_LEVEL_LCD [TEST_LEVEL_LCD_LEN][TEST_LEVEL_LCD_STR_LEN] = {\n";
+
+# the literal constant 1 represents the single char at the beginning ('T')
+# this is due to the fact that normally the first 3 chars are reserved for the
+# running index
+  my @print_lines = ("\"" . sprintf("  %-*s", 1+3+$max_name_len, "TEST LEVEL") . "\"");
+
+  my $counter = 1;
+  foreach (@local_args)
+  {
+    push @print_lines, "\"" . sprintf("%3d - %-*s", $counter, $max_name_len, $_) . "\"";
+    $counter++;
+  }
+
+  print HDR "    ", join ",\n    ", @print_lines;
+
+  print HDR "};\n";
+
+  close_footer();
+
+}
+else
+{
+    die "$selector not recognized";
+}