From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH v2 07/13] topology: Add private data parser Date: Tue, 07 Jul 2015 18:19:57 +0200 Message-ID: References: <1435758275-4047-1-git-send-email-liam.r.girdwood@linux.intel.com> <1435758275-4047-7-git-send-email-liam.r.girdwood@linux.intel.com> <1436284442.7271.30.camel@loki> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id EAB382654EF for ; Tue, 7 Jul 2015 18:19:59 +0200 (CEST) In-Reply-To: <1436284442.7271.30.camel@loki> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: Liam Girdwood Cc: Vinod Koul , "Jin, Yao" , Mark Brown , alsa-devel@alsa-project.org List-Id: alsa-devel@alsa-project.org 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