diff options
author | Michael Heimpold <michael.heimpold@i2se.com> | 2018-12-18 15:02:25 +0100 |
---|---|---|
committer | Chris Ball <chris@printf.net> | 2019-10-04 20:47:30 -0400 |
commit | 6c595aea070de5652afc6fe37ab4976806a522a2 (patch) | |
tree | 0b9d2e30b2510ed9c3305b5236da965eeeda3780 | |
parent | c19c7694d21c2d5b2878954eac8bc55a9bd639e7 (diff) | |
download | mmc-utils-6c595aea070de5652afc6fe37ab4976806a522a2.tar.gz |
Optimize to_binstr() function
Appending multiple times to same string is slow since strcat() needs
to determine the end during each run. So manually maintain a pointer
to the end to speed-up things.
Signed-off-by: Michael Heimpold <michael.heimpold@i2se.com>
Cc: Michael Heimpold <mhei@heimpold.de>
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Chris Ball <chris@printf.net>
-rw-r--r-- | lsmmc.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -371,12 +371,14 @@ char *to_binstr(char *hexstr) "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111", }; - char *binstr; + char *binstr, *tail; binstr = calloc(strlen(hexstr) * 4 + 1, sizeof(char)); if (!binstr) return NULL; + tail = binstr; + while (hexstr && *hexstr != '\0') { if (!isxdigit(*hexstr)) { free(binstr); @@ -384,13 +386,14 @@ char *to_binstr(char *hexstr) } if (isdigit(*hexstr)) - strcat(binstr, bindigits[*hexstr - '0']); + strcat(tail, bindigits[*hexstr - '0']); else if (islower(*hexstr)) - strcat(binstr, bindigits[*hexstr - 'a' + 10]); + strcat(tail, bindigits[*hexstr - 'a' + 10]); else - strcat(binstr, bindigits[*hexstr - 'A' + 10]); + strcat(tail, bindigits[*hexstr - 'A' + 10]); hexstr++; + tail += 4; } return binstr; |