On Sun, 19 Jun 2011, steve tell wrote:

On Sat, 18 Jun 2011, Mike Frysinger wrote:
+ * language bindings.  In theory, this code could someday be merged into
+ * the core urjtag library.

let's do that now rather than later

This is the first of a 2-part patch.  This first one only refactors
existing routines, in preparation for a cleaner version of the pyhon bindings patch.

Subject: [PATCH 1/2] create urj_tap_chain_connect() and urj_bus_init()
 by factoring cmd_cable() and cmd_initbus() respectively.
 new routines present a more convenient API for use by C and language
 bindings.

---
 urjtag/include/urjtag/bus.h   |    9 ++++
 urjtag/include/urjtag/chain.h |    9 ++++
 urjtag/include/urjtag/cmd.h   |   18 ++++++++
 urjtag/src/bus/buses.c        |   43 ++++++++++++++++++++
 urjtag/src/cmd/cmd_cable.c    |   80 +-------------------------------------
 urjtag/src/cmd/cmd_initbus.c  |   35 +----------------
 urjtag/src/tap/chain.c        |   87 ++++++++++++++++++++++++++++++++++++++++-
 7 files changed, 167 insertions(+), 114 deletions(-)
From 0820d34f97cc713e34ec6a2c8e067987510e1be8 Mon Sep 17 00:00:00 2001
From: Steve Tell <[email protected]>
Date: Sat, 25 Jun 2011 12:49:01 -0400
Subject: [PATCH 1/2] create urj_tap_chain_connect() and urj_bus_init()
 by factoring cmd_cable() and cmd_initbus() respectively.
 new routines present a more convenient API for use by C and language
 bindings.

---
 urjtag/include/urjtag/bus.h   |    9 ++++
 urjtag/include/urjtag/chain.h |    9 ++++
 urjtag/include/urjtag/cmd.h   |   18 ++++++++
 urjtag/src/bus/buses.c        |   43 ++++++++++++++++++++
 urjtag/src/cmd/cmd_cable.c    |   80 +-------------------------------------
 urjtag/src/cmd/cmd_initbus.c  |   35 +----------------
 urjtag/src/tap/chain.c        |   87 ++++++++++++++++++++++++++++++++++++++++-
 7 files changed, 167 insertions(+), 114 deletions(-)

diff --git a/urjtag/include/urjtag/bus.h b/urjtag/include/urjtag/bus.h
index d08157c..e1cadae 100644
--- a/urjtag/include/urjtag/bus.h
+++ b/urjtag/include/urjtag/bus.h
@@ -58,4 +58,13 @@ int urj_bus_buses_delete (urj_bus_t *abus);
  */
 int urj_bus_buses_set (int n);
 
+/**
+ * initialize bus, assigning a driver to it.
+ * @param chain jtag chain object
+ * @param drivername name of bus driver 
+ * @param params additional driver-specific parameters
+ * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error
+ */
+int urj_bus_init (urj_chain_t *chain, const char *drivername, char *params[]);
+
 #endif /* URJ_BUS_H */
diff --git a/urjtag/include/urjtag/chain.h b/urjtag/include/urjtag/chain.h
index 9b8d477..7af51d2 100644
--- a/urjtag/include/urjtag/chain.h
+++ b/urjtag/include/urjtag/chain.h
@@ -49,6 +49,15 @@ struct URJ_CHAIN
 
 urj_chain_t *urj_tap_chain_alloc (void);
 void urj_tap_chain_free (urj_chain_t *chain);
+/**
+ * Connect to a chain of Tap controllers using the specified cable type.
+ * @param chain chain object to connect
+ * @param drivername name of cable driver.
+ * @param params some drivers reqiure additional parameters.
+ *
+ * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error 
+ */
+int urj_tap_chain_connect (urj_chain_t *chain, char *drivername, char 
*params[]);
 void urj_tap_chain_disconnect (urj_chain_t *chain);
 /** @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error */
 int urj_tap_chain_clock (urj_chain_t *chain, int tms, int tdi, int n);
diff --git a/urjtag/include/urjtag/cmd.h b/urjtag/include/urjtag/cmd.h
index b7ea807..2cab40c 100644
--- a/urjtag/include/urjtag/cmd.h
+++ b/urjtag/include/urjtag/cmd.h
@@ -56,4 +56,22 @@ int urj_cmd_run (urj_chain_t *chain, char *params[]);
  */
 char **urj_cmd_complete (urj_chain_t *chain, const char *line, int point);
 
+/**
+ * Parse an number from a string, in the syntaxes supported by urjtag.
+ * @param s string containing textual representation of a number
+ * @param i pointer to variable in which to store the resulting number.
+ * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error 
+ */
+int urj_cmd_get_number (const char *s, long unsigned *i);
+
+/** @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error */
+int urj_cmd_test_cable (urj_chain_t * chain);
+
+/**
+ * Count the number of parameters in a list of strings
+ * @param params pointer to array of null-terminated strings
+ * @return number of parameter strings; 0 for none.
+ */
+int urj_cmd_params (char *params[]);
+
 #endif /* URJ_CMD_H */
diff --git a/urjtag/src/bus/buses.c b/urjtag/src/bus/buses.c
index e59960f..e7578fb 100644
--- a/urjtag/src/bus/buses.c
+++ b/urjtag/src/bus/buses.c
@@ -141,6 +141,49 @@ urj_bus_buses_set (int n)
     return URJ_STATUS_OK;
 }
 
+
+int
+urj_bus_init (urj_chain_t *chain, const char *drivername, char *params[])
+{
+    int drv, i;
+    const urj_param_t **bus_params;
+
+    if (urj_cmd_test_cable (chain) != URJ_STATUS_OK)
+        return URJ_STATUS_FAIL;
+
+    if (urj_tap_chain_active_part (chain) == NULL)
+        return URJ_STATUS_FAIL;
+
+    for (drv = 0; urj_bus_drivers[drv] != NULL; drv++)
+        if (strcasecmp (urj_bus_drivers[drv]->name, drivername) == 0)
+            break;
+
+    if (urj_bus_drivers[drv] == NULL)
+    {
+        urj_error_set (URJ_ERROR_NOTFOUND, "Unknown bus: %s", drivername);
+        return URJ_STATUS_FAIL;
+    }
+
+    urj_param_init (&bus_params);
+    for (i = 0; params[i] != NULL; i++)
+        if (urj_param_push (&urj_bus_param_list, &bus_params,
+                            params[i]) != URJ_STATUS_OK)
+        {
+            urj_param_clear (&bus_params);
+            return URJ_STATUS_FAIL;
+        }
+
+    if (urj_bus_init_bus(chain, urj_bus_drivers[drv], bus_params) == NULL)
+    {
+        urj_param_clear (&bus_params);
+        return URJ_STATUS_FAIL;
+    }
+
+    urj_param_clear (&bus_params);
+    return URJ_STATUS_OK;
+}
+
+
 urj_bus_t *
 urj_bus_init_bus (urj_chain_t *chain, const urj_bus_driver_t *bus_driver,
                   const urj_param_t *param[])
diff --git a/urjtag/src/cmd/cmd_cable.c b/urjtag/src/cmd/cmd_cable.c
index 3fd5700..45e15b8 100644
--- a/urjtag/src/cmd/cmd_cable.c
+++ b/urjtag/src/cmd/cmd_cable.c
@@ -48,15 +48,8 @@ cable_probe (char *params[])
 static int
 cmd_cable_run (urj_chain_t *chain, char *params[])
 {
-    urj_cable_t *cable = NULL;
     int i;
-    int j;
     int paramc = urj_cmd_params (params);
-    const urj_param_t **cable_params;
-    urj_cable_parport_devtype_t devtype = -1;
-    const char *devname = NULL;
-    int param_start = 2;
-    const urj_cable_driver_t *driver;
 
     /* we need at least one parameter for 'cable' command */
     if (paramc < 2)
@@ -102,78 +95,7 @@ cmd_cable_run (urj_chain_t *chain, char *params[])
         }
     }
 
-    /* search cable driver list */
-    for (i = 0; urj_tap_cable_drivers[i]; i++)
-        if (strcasecmp (params[1], urj_tap_cable_drivers[i]->name) == 0)
-            break;
-    driver = urj_tap_cable_drivers[i];
-    if (!driver)
-    {
-        urj_error_set (URJ_ERROR_NOTFOUND, _("Unknown cable type: '%s'"),
-                       params[1]);
-        return URJ_STATUS_FAIL;
-    }
-
-    if (paramc >= 3 && strcasecmp (params[2], "help") == 0)
-    {
-        driver->help (URJ_LOG_LEVEL_NORMAL, driver->name);
-        return URJ_STATUS_OK;
-    }
-
-    if (driver->device_type == URJ_CABLE_DEVICE_PARPORT)
-    {
-        if (paramc < 4)
-        {
-            urj_error_set (URJ_ERROR_SYNTAX,
-                           "parallel cable requires >= 4 parameters");
-            return URJ_STATUS_FAIL;
-        }
-        for (j = 0; j < URJ_CABLE_PARPORT_N_DEVS; j++)
-            if (strcasecmp (params[2],
-                            urj_cable_parport_devtype_string(j)) == 0)
-                break;
-        if (j == URJ_CABLE_PARPORT_N_DEVS)
-        {
-            urj_error_set (URJ_ERROR_INVALID,
-                           "unknown parallel port device type '%s'", 
params[2]);
-            return URJ_STATUS_FAIL;
-        }
-
-        devtype = j;
-        devname = params[3];
-        param_start = 4;
-    }
-
-    urj_param_init (&cable_params);
-    for (j = param_start; params[j] != NULL; j++)
-        if (urj_param_push (&urj_cable_param_list, &cable_params,
-                            params[j]) != URJ_STATUS_OK)
-        {
-            urj_param_clear (&cable_params);
-            return URJ_STATUS_FAIL;
-        }
-
-    switch (driver->device_type)
-    {
-    case URJ_CABLE_DEVICE_PARPORT:
-        cable = urj_tap_cable_parport_connect (chain, driver, devtype, devname,
-                                               cable_params);
-        break;
-    case URJ_CABLE_DEVICE_USB:
-        cable = urj_tap_cable_usb_connect (chain, driver, cable_params);
-        break;
-    case URJ_CABLE_DEVICE_OTHER:
-        cable = urj_tap_cable_other_connect (chain, driver, cable_params);
-        break;
-    }
-
-    urj_param_clear (&cable_params);
-
-    if (cable == NULL)
-        return URJ_STATUS_FAIL;
-
-    chain->cable->chain = chain;
-    return URJ_STATUS_OK;
+    return urj_tap_chain_connect(chain, params[1], &params[2]);
 }
 
 static void
diff --git a/urjtag/src/cmd/cmd_initbus.c b/urjtag/src/cmd/cmd_initbus.c
index 2c9f266..946ac48 100644
--- a/urjtag/src/cmd/cmd_initbus.c
+++ b/urjtag/src/cmd/cmd_initbus.c
@@ -51,40 +51,7 @@ cmd_initbus_run (urj_chain_t *chain, char *params[])
         return URJ_STATUS_FAIL;
     }
 
-    if (urj_cmd_test_cable (chain) != URJ_STATUS_OK)
-        return URJ_STATUS_FAIL;
-
-    if (urj_tap_chain_active_part (chain) == NULL)
-        return URJ_STATUS_FAIL;
-
-    for (drv = 0; urj_bus_drivers[drv] != NULL; drv++)
-        if (strcasecmp (urj_bus_drivers[drv]->name, params[1]) == 0)
-            break;
-
-    if (urj_bus_drivers[drv] == NULL)
-    {
-        urj_error_set (URJ_ERROR_NOTFOUND, _("Unknown bus: %s"), params[1]);
-        return URJ_STATUS_FAIL;
-    }
-
-    urj_param_init (&bus_params);
-    for (i = 2; params[i] != NULL; i++)
-        if (urj_param_push (&urj_bus_param_list, &bus_params,
-                            params[i]) != URJ_STATUS_OK)
-        {
-            urj_param_clear (&bus_params);
-            return URJ_STATUS_FAIL;
-        }
-
-    if (urj_bus_init_bus(chain, urj_bus_drivers[drv], bus_params) == NULL)
-    {
-        urj_param_clear (&bus_params);
-        return URJ_STATUS_FAIL;
-    }
-
-    urj_param_clear (&bus_params);
-
-    return URJ_STATUS_OK;
+    return urj_bus_init(chain, params[0], &params[1]);
 }
 
 static void
diff --git a/urjtag/src/tap/chain.c b/urjtag/src/tap/chain.c
index d677a88..97665f8 100644
--- a/urjtag/src/tap/chain.c
+++ b/urjtag/src/tap/chain.c
@@ -33,7 +33,7 @@
 #include <urjtag/tap_state.h>
 #include <urjtag/tap.h>
 #include <urjtag/data_register.h>
-
+#include <urjtag/cmd.h>
 #include <urjtag/bsdl.h>
 
 #include <urjtag/chain.h>
@@ -71,6 +71,91 @@ urj_tap_chain_free (urj_chain_t *chain)
     free (chain);
 }
 
+int
+urj_tap_chain_connect (urj_chain_t *chain, char *drivername, char *params[])
+{
+    urj_cable_t    *cable = NULL;
+    int             i;
+    int             j;
+    int             paramc = urj_cmd_params (params);
+    const urj_param_t **cable_params;
+    urj_cable_parport_devtype_t devtype = -1;
+    const char     *devname = NULL;
+    int             param_start = 0;
+    const urj_cable_driver_t *driver;
+
+    /* search cable driver list */
+    for (i = 0; urj_tap_cable_drivers[i]; i++)
+       if (strcasecmp (drivername, urj_tap_cable_drivers[i]->name) == 0)
+           break;
+    driver = urj_tap_cable_drivers[i];
+    if (!driver)
+    {
+       urj_error_set (URJ_ERROR_INVALID,
+                      "unknown cable driver '%s'", drivername);
+       return URJ_STATUS_FAIL;
+    }
+
+    if (driver->device_type == URJ_CABLE_DEVICE_PARPORT)
+    {
+       if (paramc < 3)
+       {
+           urj_error_set (URJ_ERROR_SYNTAX,
+                          "parallel cable requires >= 3 parameters");
+           return URJ_STATUS_FAIL;
+       }
+       for (j = 0; j < URJ_CABLE_PARPORT_N_DEVS; j++)
+           if (strcasecmp (params[0],
+                           urj_cable_parport_devtype_string (j)) == 0)
+               break;
+       if (j == URJ_CABLE_PARPORT_N_DEVS)
+       {
+           urj_error_set (URJ_ERROR_INVALID,
+                          "unknown parallel port device type '%s'",
+                          params[0]);
+           return URJ_STATUS_FAIL;
+       }
+
+       devtype = j;
+       devname = params[1];
+       param_start = 2;
+    }
+
+    urj_param_init (&cable_params);
+    for (j = param_start; params[j] != NULL; j++)
+       if (urj_param_push (&urj_cable_param_list, &cable_params,
+                           params[j]) != URJ_STATUS_OK)
+       {
+           urj_param_clear (&cable_params);
+           return URJ_STATUS_FAIL;
+       }
+
+    switch (driver->device_type)
+    {
+    case URJ_CABLE_DEVICE_PARPORT:
+       cable =
+           urj_tap_cable_parport_connect (chain, driver, devtype, devname,
+                                          cable_params);
+       break;
+    case URJ_CABLE_DEVICE_USB:
+       cable = urj_tap_cable_usb_connect (chain, driver, cable_params);
+       break;
+    case URJ_CABLE_DEVICE_OTHER:
+       cable = urj_tap_cable_other_connect (chain, driver, cable_params);
+       break;
+    }
+
+    urj_param_clear (&cable_params);
+
+    if (cable == NULL)
+    {
+       return URJ_STATUS_FAIL;
+    }
+
+    chain->cable->chain = chain;
+    return URJ_STATUS_OK;
+}
+
 void
 urj_tap_chain_disconnect (urj_chain_t *chain)
 {
-- 
1.7.4

------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a 
definitive record of customers, application performance, security 
threats, fraudulent activity and more. Splunk takes this data and makes 
sense of it. Business sense. IT sense. Common sense.. 
http://p.sf.net/sfu/splunk-d2d-c1
_______________________________________________
UrJTAG-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/urjtag-development

Reply via email to