Commit 096f9b86 authored by Hartmut Knaack's avatar Hartmut Knaack Committed by Jonathan Cameron

tools:iio:iio_utils: implement digit calculation

Previously, the return value of sscanf() was treated as an indication of
the digits it would have read. Yet, sscanf() only returns the amount of
valid matches.
Therefore, introduce a function to calculate the decimal digits of the
read number and use this one to commence a colon search, as originally
intended.
Signed-off-by: default avatarHartmut Knaack <knaack.h@gmx.de>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent dc8b5d6e
......@@ -431,6 +431,18 @@ int build_channel_array(const char *device_dir,
return ret;
}
int calc_digits(int num)
{
int count = 0;
while (num != 0) {
num /= 10;
count++;
}
return count;
}
/**
* find_type_by_name() - function to match top level types by name
* @name: top level type instance name
......@@ -441,7 +453,7 @@ int build_channel_array(const char *device_dir,
int find_type_by_name(const char *name, const char *type)
{
const struct dirent *ent;
int number, numstrlen;
int number, numstrlen, ret;
FILE *nameFile;
DIR *dp;
......@@ -459,9 +471,19 @@ int find_type_by_name(const char *name, const char *type)
strcmp(ent->d_name, "..") != 0 &&
strlen(ent->d_name) > strlen(type) &&
strncmp(ent->d_name, type, strlen(type)) == 0) {
numstrlen = sscanf(ent->d_name + strlen(type),
"%d",
&number);
errno = 0;
ret = sscanf(ent->d_name + strlen(type), "%d", &number);
if (ret < 0) {
ret = -errno;
printf("failed to read element number\n");
goto error_close_dir;
} else if (ret != 1) {
ret = -EIO;
printf("failed to match element number\n");
goto error_close_dir;
}
numstrlen = calc_digits(number);
/* verify the next character is not a colon */
if (strncmp(ent->d_name + strlen(type) + numstrlen,
":",
......@@ -495,6 +517,11 @@ int find_type_by_name(const char *name, const char *type)
}
closedir(dp);
return -ENODEV;
error_close_dir:
if (closedir(dp) == -1)
perror("find_type_by_name(): Failed to close directory");
return ret;
}
int _write_sysfs_int(char *filename, char *basedir, int val, int verify)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment