On Tue, 2015-07-07 at 18:19 +0200, Takashi Iwai wrote:
On Tue, 07 Jul 2015 17:54:02 +0200, Liam Girdwood wrote:
On Wed, 2015-07-01 at 18:20 +0200, Takashi Iwai wrote:
+static int get_hex_num(const char *str) +{
- char *tmp, *s = NULL;
- int i = 0;
- tmp = strdup(str);
- if (tmp == NULL)
return -ENOMEM;
- s = strtok(tmp, ",");
- while (s != NULL) {
s = strtok(NULL, ",");
i++;
- }
- free(tmp);
- return i;
Hmm, this just counts the number of comma + 1, so you don't need to duplicate the string?
The string here is duplicated since strtok is destructive (it overwrites the delimiters with NULL) and the string is being used later on by the calling function.
Yes, but what I meant is something like below:
static int get_hex_num(const char *str) { int i = 0;
if (!*str) return 0; for (;;) { i++; str = strchr(str, ','); if (!str) return i; str++; } }
... so that it works without strdup().
But it seems that strtok() skips the starting delimiter or handles multiple delimiters as a single, so the result will become inconsistent. That is, all the following strings will give "a" and "b" via strtok(): a,b a,,b ,a,b a,b,
I guess you don't want to have an empty list element, right?
Lets ask the author :) but IMO an empty list should be skipped here.
Yao, what's your rational behind this code ?
Liam