tools: iio: generic_buffer: Fix generic scale extraction
authorIrina Tirdea <irina.tirdea@intel.com>
Fri, 27 Mar 2015 11:53:00 +0000 (13:53 +0200)
committerJonathan Cameron <jic23@kernel.org>
Sat, 28 Mar 2015 11:01:49 +0000 (11:01 +0000)
When using generic_buffer to read data, the scale is not properly
detected for scale shared by type. This is caused by a problem
with the generation of generic name out of the full name.
E.g.: for current->name in_accel_z, the extracted generic name
is "in" (when it should be "in_accel"). This is used in generic_buffer
to generate scale and offset paths (in_accel_scale).

Consider the in_ or out_ prefix when extracting the generic name
from the full name.

Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Reviewed-by: Daniel Baluta <daniel.baluta@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
tools/iio/iio_utils.c

index 2680a2e..6f64521 100644 (file)
 
 const char *iio_dir = "/sys/bus/iio/devices/";
 
+static char * const iio_direction[] = {
+       "in",
+       "out",
+};
+
 /**
  * iioutils_break_up_name() - extract generic name from full channel name
  * @full_name: the full channel name
@@ -30,10 +35,19 @@ int iioutils_break_up_name(const char *full_name,
 {
        char *current;
        char *w, *r;
-       char *working;
+       char *working, *prefix = "";
+       int i;
 
-       current = strdup(full_name);
+       for (i = 0; i < sizeof(iio_direction) / sizeof(iio_direction[0]); i++)
+               if (!strncmp(full_name, iio_direction[i],
+                            strlen(iio_direction[i]))) {
+                       prefix = iio_direction[i];
+                       break;
+               }
+
+       current = strdup(full_name + strlen(prefix) + 1);
        working = strtok(current, "_\0");
+
        w = working;
        r = working;
 
@@ -45,7 +59,7 @@ int iioutils_break_up_name(const char *full_name,
                r++;
        }
        *w = '\0';
-       *generic_name = strdup(working);
+       asprintf(generic_name, "%s_%s", prefix, working);
        free(current);
 
        return 0;