diff gsm-fw/services/ffs/mktarget.pl @ 217:30a173257f4a

gsm-fw/services/ffs: ffs_target.c generation and compilation
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 06 Jan 2014 08:07:36 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/services/ffs/mktarget.pl	Mon Jan 06 08:07:36 2014 +0000
@@ -0,0 +1,167 @@
+#!/usr/bin/perl -w
+#
+# mktarget.pl by Mads Meisner-Jensen (mmj@ti.com)
+#
+# Auto-generate target code from ffs.c source file.
+#
+
+$FFSPATH = shift;
+if (!defined($FFSPATH) || $FFSPATH eq "") {
+    $FFSPATH = ".";
+}
+
+$OUTPATH = shift;
+if (!defined($OUTPATH) || $OUTPATH eq "") {
+  $OUTPATH = $FFSPATH;
+}
+
+$verbose = 1;
+
+$STATE_OUTSIDE = 0;
+$STATE_IN_FUNCTION = 1;
+$STATE_IN_TASK = 2;
+$state = $STATE_OUTSIDE;
+
+
+############################################################################
+# Main
+############################################################################
+
+$verbose > 0 && print "mktarget.pl operating in directory '$FFSPATH'\n";
+
+open (FFS, "<$FFSPATH/ffs.c") || die "Failed to open 'ffs.c'";
+print $OUTPATH;
+open (TARGETC, ">$OUTPATH/ffs_target.c") || die "Failed to open 'ffs_target.c'";
+
+target_put("/**********************************************************\n");
+target_put(" *\n");
+target_put(" * This is an auto-generated file. Do NOT edit!\n");
+target_put(" *\n");
+target_put(" **********************************************************/\n\n\n");
+
+while (<FFS>)
+{
+    if ($state == $STATE_OUTSIDE)
+    {
+        target_put($_);
+        if (/^{\s*$/) {
+            $state = $STATE_IN_FUNCTION;
+        }
+    }
+    elsif ($state == $STATE_IN_FUNCTION)
+    {
+        if (/^\s*\/\/\s*TASKBEGIN\s*(\w+)\s*(\w+)\s*\((.*)\)(.*)$/m)
+        {
+            $state = $STATE_IN_TASK;
+
+            $rettype = $1;
+            $func = $2;
+            $funclc = lc($func);
+            
+            @args = split(',', $3);
+            @values = ();
+            @reqmembers = ();
+            foreach (@args) {
+                ($left, $right) = $_ =~ /(\w+)=(.+)/m;
+                push (@reqmembers, $left);
+                push (@values, $right);
+            }
+            
+            @vars = split(';', $4);
+            
+            task_begin();
+        }
+        else
+        {
+            target_put($_);
+            if (/^}\s*$/m) {
+                $state = $STATE_OUTSIDE;
+
+                # Write the task_* code after the function
+                target_put("\n");
+                target_put(@taskcode);
+                @taskcode = ();
+            }
+        }
+    }
+    elsif ($state == $STATE_IN_TASK)
+    {
+        if (/^.*TASKEND.*$/m)
+        {
+            $state = $STATE_IN_FUNCTION;
+
+            foreach (@values) {
+                if (/^[a-zA-Z]+/m) {
+                    task_put("#undef $_\n");
+                }
+            }
+            task_put("\n");
+#            task_put("    return EFFS_OK;\n");
+            task_put("}\n\n");
+        }
+        else {
+            task_put($_);
+        }
+    }
+    else
+    {
+        die "Bad state!";
+    }
+}
+
+close (FFS) || die;
+close (TARGETC) || die;
+
+sub task_put
+{
+    push (@taskcode, @_);
+}
+
+sub target_put
+{
+    print TARGETC @_;
+}
+
+sub task_begin
+{
+    $verbose > 0 && print "ffs_$funclc ($func)\n";
+    $verbose > 1 && print "  args = @args\n";
+    $verbose > 1 && print "    left = @values, right = @reqmembers\n";
+    $verbose > 1 && print "  vars = @vars\n";
+    $verbose > 1 && print "\n";
+
+    task_put("$rettype task_$funclc(struct ffs_req_s *p)\n");
+    task_put("{\n");
+    foreach (@vars) {
+        task_put("   $_;\n");
+    }
+    task_put("\n");
+    for $i (0..$#args) {
+        # If value starts with alpha char, e.g. a variable name
+        if ($values[$i] =~ /^[a-zA-Z]+/m) {
+            task_put("#define $values[$i] p->$reqmembers[$i]\n");
+        }
+    }
+
+    target_put("    {\n");
+    target_put("        struct ffs_req_s *req;\n");
+    target_put("        MSG_ALLOC(req);\n");
+
+    for $i (0..$#args) {
+        # Typecasting is necessary for the sake of the tms470 compiler
+        if ($reqmembers[$i] eq "src") {
+            target_put("        req->$reqmembers[$i] = (char *) $values[$i];\n");
+        }
+        else {
+            target_put("        req->$reqmembers[$i] = $values[$i];\n");
+        }
+    }
+    target_put("        req->request_id = request_id_get();\n");     
+    target_put("        req->fb = fb;\n");     
+    target_put("        req->cp = cp;\n");
+    target_put("        req->cmd = $func;\n");
+    target_put("        MSG_SEND(req);\n");
+    target_put("        return req->request_id;\n");
+    target_put("    }\n");
+
+}