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>
This commit is contained in:
1 parent
c19c7694d2
commit
6c595aea07
1 file changed
+7
-4
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user