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@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);
msg_ginfo("%s", tmpven); curvenlen = strlen(tmpven);tmpven = strtok_r(ven, delim, &tmpven_save);
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);
msg_ginfo("%s", tmpdev); curdevlen = strlen(tmpdev);tmpdev = strtok_r(dev, delim, &tmpdev_save);
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@gmx.net
Thanks for fixing this!
Regards, Carl-Daniel
On Wed, 17 Jul 2013 09:37:38 +0200 Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net wrote:
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@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.
I have added a fixme there.
Acked-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Thanks for fixing this!
I broke it too... ;)
Thanks, r1700