[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