commonlib/bsd: Optimize strnlen()
This patch changes the strnlen() implementation to fix a small issue where we would dereference once more byte than intended when not finding a NUL-byte within the specified amount of characters. It also changes the implementation to rely on a pre-calculated end pointer rather than a running counter, since this seems to lead to slightly better assembly (one less instruction in the inner loop) on most architectures. Change-Id: Ic36768fd3a26e2b64143904e78cd0b52ba66898d Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/83933 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Yu-Ping Wu <yupingso@google.com>
This commit is contained in:
committed by
Felix Held
parent
82c0dd2909
commit
f9ab107d32
@@ -15,10 +15,19 @@ size_t strlen(const char *str)
|
|||||||
|
|
||||||
size_t strnlen(const char *str, size_t maxlen)
|
size_t strnlen(const char *str, size_t maxlen)
|
||||||
{
|
{
|
||||||
size_t len = 0;
|
const char *ptr = str;
|
||||||
while (*str++ && len < maxlen)
|
const char *end = str + maxlen;
|
||||||
len++;
|
|
||||||
return len;
|
if (!maxlen)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
while (*ptr++) {
|
||||||
|
/* Make sure this checks for ==, not >=, because the calculation
|
||||||
|
for `end` may overflow in some edge cases. */
|
||||||
|
if (ptr == end)
|
||||||
|
return maxlen;
|
||||||
|
}
|
||||||
|
return ptr - str - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *strcat(char *dst, const char *src)
|
char *strcat(char *dst, const char *src)
|
||||||
|
Reference in New Issue
Block a user