From 397fe2630170e33eee06533749b1802f9371cb3e Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Thu, 15 Oct 2020 19:17:58 -0400 Subject: read: Use memchr() in seekNewline() instead of looping over entire string --- read.c | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) (limited to 'read.c') diff --git a/read.c b/read.c index 1378671..22d6e47 100644 --- a/read.c +++ b/read.c @@ -123,29 +123,22 @@ static char *readBytes(redisReader *r, unsigned int bytes) { /* Find pointer to \r\n. */ static char *seekNewline(char *s, size_t len) { - int pos = 0; + char *_s = s, *ret; int _len = len-1; - /* Position should be < len-1 because the character at "pos" should be - * followed by a \n. Note that strchr cannot be used because it doesn't - * allow to search a limited length and the buffer that is being searched - * might not have a trailing NULL character. */ - while (pos < _len) { - while(pos < _len && s[pos] != '\r') pos++; - if (pos==_len) { - /* Not found. */ - return NULL; - } else { - if (s[pos+1] == '\n') { - /* Found. */ - return s+pos; - } else { - /* Continue searching. */ - pos++; - } + /* Exclude the last character from the searched length because the found + * '\r' should be followed by a '\n' */ + while ((ret = memchr(_s, '\r', _len)) != NULL) { + if (ret[1] == '\n') { + /* Found. */ + break; } + /* Continue searching. */ + ret++; + _len -= ret - _s; + _s = ret; } - return NULL; + return ret; } /* Convert a string into a long long. Returns REDIS_OK if the string could be -- cgit v1.2.3