[alsa-devel] [PATCH v2 07/13] topology: Add private data parser

Takashi Iwai tiwai at suse.de
Tue Jul 7 18:19:57 CEST 2015


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?


Takashi


More information about the Alsa-devel mailing list