[flashrom] [PATCH 08/10] print.c: Fix multiline support.

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Wed Jul 17 09:37:38 CEST 2013


Am 10.07.2013 21:17 schrieb Stefan Tauner:
>  - Use the reentrant tokenizer version strtok_r to break up vendor and model
>    names in print.c
>  - Add implementation of strtok_r for mingw (posix only)
>  - Free allocated temporary memory again.
>
> Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>
> ---
>  print.c | 49 ++++++++++++++++++++++++++++++++++++-------------
>  1 file changed, 36 insertions(+), 13 deletions(-)
>
> diff --git a/print.c b/print.c
> index 6ca2a57..b163cbf 100644
> --- a/print.c
> +++ b/print.c
> @@ -25,6 +25,26 @@
>  #include "flash.h"
>  #include "programmer.h"
>  
> +#ifdef __MINGW32__
> +static char* strtok_r(char *str, const char *delim, char **nextp)
> +{
> +	if (str == NULL)
> +		str = *nextp;
> +
> +	str += strspn(str, delim); /* Skip leading delimiters */
> +	if (*str == '\0')
> +		return NULL;
> +
> +	char *ret = str;
> +	str += strcspn(str, delim); /* Find end of token */
> +	if (*str != '\0')
> +		*str++ = '\0';
> +
> +	*nextp = str;
> +	return ret;
> +}
> +#endif

OK.
In the future, we may want to make strtok_r a wrapper around strtok_s
(which is in C11). It might take some time for the C library on various
platforms to catch up on this, though.


> +
>  /*
>   * Return a string corresponding to the bustype parameter.
>   * Memory is obtained with malloc() and must be freed with free() by the caller.
> @@ -69,7 +89,8 @@ static int print_supported_chips(void)
>  	int maxtypelen = strlen("Type") + 1;
>  	const struct flashchip *chip;
>  	char *s;
> -	char *tmpven, *tmpdev;
> +	char *ven, *dev;
> +	char *tmpven, *tmpdev, *tmpven_save, *tmpdev_save;
>  	int tmpvenlen, tmpdevlen, curvenlen, curdevlen;
>  
>  	/* calculate maximum column widths and by iterating over all chips */
> @@ -179,17 +200,17 @@ static int print_supported_chips(void)
>  		 * - after all other values are printed print the surplus tokens
>  		 *   on fresh lines
>  		 */
> -		tmpven = malloc(strlen(chip->vendor) + 1);
> -		if (tmpven == NULL) {
> +		ven = malloc(strlen(chip->vendor) + 1);
> +		if (ven == NULL) {
>  			msg_gerr("Out of memory!\n");
>  			return 1;
>  		}
> -		strcpy(tmpven, chip->vendor);
> +		strcpy(ven, chip->vendor);
>  
> -		tmpven = strtok(tmpven, delim);
> +		tmpven = strtok_r(ven, delim, &tmpven_save);
>  		msg_ginfo("%s", tmpven);
>  		curvenlen = strlen(tmpven);
> -		while ((tmpven = strtok(NULL, delim)) != NULL) {
> +		while ((tmpven = strtok_r(NULL, delim, &tmpven_save)) != NULL) {
>  			msg_ginfo("%s", delim);
>  			curvenlen++;
>  			tmpvenlen = strlen(tmpven);
> @@ -203,17 +224,17 @@ static int print_supported_chips(void)
>  			msg_ginfo(" ");
>  
>  		/* support for multiline device names as above */
> -		tmpdev = malloc(strlen(chip->name) + 1);
> -		if (tmpdev == NULL) {
> +		dev = malloc(strlen(chip->name) + 1);
> +		if (dev == NULL) {
>  			msg_gerr("Out of memory!\n");
>  			return 1;
>  		}
> -		strcpy(tmpdev, chip->name);
> +		strcpy(dev, chip->name);
>  
> -		tmpdev = strtok(tmpdev, delim);
> +		tmpdev = strtok_r(dev, delim, &tmpdev_save);
>  		msg_ginfo("%s", tmpdev);
>  		curdevlen = strlen(tmpdev);
> -		while ((tmpdev = strtok(NULL, delim)) != NULL) {
> +		while ((tmpdev = strtok_r(NULL, delim, &tmpdev_save)) != NULL) {
>  			msg_ginfo("%s", delim);
>  			curdevlen++;
>  			tmpdevlen = strlen(tmpdev);
> @@ -287,7 +308,7 @@ static int print_supported_chips(void)
>  			if (tmpven != NULL){
>  				msg_ginfo("%s", tmpven);
>  				curvenlen = strlen(tmpven);
> -				while ((tmpven = strtok(NULL, delim)) != NULL) {
> +				while ((tmpven = strtok_r(NULL, delim, &tmpven_save)) != NULL) {
>  					msg_ginfo("%s", delim);
>  					curvenlen++;
>  					tmpvenlen = strlen(tmpven);
> @@ -306,7 +327,7 @@ static int print_supported_chips(void)
>  			if (tmpdev != NULL){
>  				msg_ginfo("%s", tmpdev);
>  				curdevlen = strlen(tmpdev);
> -				while ((tmpdev = strtok(NULL, delim)) != NULL) {
> +				while ((tmpdev = strtok_r(NULL, delim, &tmpdev_save)) != NULL) {
>  					msg_ginfo("%s", delim);
>  					curdevlen++;
>  					tmpdevlen = strlen(tmpdev);
> @@ -319,6 +340,8 @@ static int print_supported_chips(void)
>  			}
>  		}
>  		msg_ginfo("\n");
> +		free(ven);
> +		free(dev);
>  	}
>  
>  	return 0;

Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

Thanks for fixing this!

Regards,
Carl-Daniel

-- 
http://www.hailfinger.org/





More information about the flashrom mailing list