From f1fc04d7609ab074647aa00e96d4c66d5135b155 Mon Sep 17 00:00:00 2001 From: Michael Heimpold Date: Tue, 18 Dec 2018 15:02:25 +0100 Subject: [PATCH 4/9] 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 Cc: Michael Heimpold --- lsmmc.c | 11 +++++++---- 1 file 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; -- 2.17.1