aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Heimpold <michael.heimpold@i2se.com>2018-12-18 15:02:25 +0100
committerChris Ball <chris@printf.net>2019-10-04 20:47:30 -0400
commit6c595aea070de5652afc6fe37ab4976806a522a2 (patch)
tree0b9d2e30b2510ed9c3305b5236da965eeeda3780
parentc19c7694d21c2d5b2878954eac8bc55a9bd639e7 (diff)
downloadmmc-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.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/lsmmc.c b/lsmmc.c
index e64117c..86713f7 100644
--- a/lsmmc.c
+++ b/lsmmc.c
@@ -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;