From 86e4e9d16befd02230a699f045afdd68a47f6122 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Wed, 12 Oct 2011 20:57:55 +0200 Subject: [PATCH] use memcmp for startswith/endswith This fixes an uninitialized variable bug and should be faster since most libc has optimized memcmp() Signed-off-by: Natanael Copa --- stringy/stringy.c | 43 +++++++++++++------------------------------ 1 files changed, 13 insertions(+), 30 deletions(-) diff --git a/stringy/stringy.c b/stringy/stringy.c index 3341b87..aa9a2a2 100644 --- a/stringy/stringy.c +++ b/stringy/stringy.c @@ -65,44 +65,27 @@ static int endswith(lua_State *L) { size_t token_len; const char *token = luaL_checklstring(L, 2, &token_len); + int end = 0; - int ti = token_len, si = string_len, end = 1; - if(token_len <= string_len){ - while(ti > 0) { - if(string[--si] != token[--ti]){ - end = 0; - break; - - } - } - } - else { - end = 0; + if(token_len <= string_len) { + string += string_len - token_len; + end = memcmp(string, token, token_len) == 0; } lua_pushboolean(L, end); return 1; } static int startswith(lua_State *L) { - const char *string = luaL_checkstring(L, 1); - int string_len = lua_objlen(L, 1); + size_t string_len; + const char *string = luaL_checklstring(L, 1, &string_len); + + size_t token_len; + const char *token = luaL_checklstring(L, 2, &token_len); + int start = 0; + + if (token_len <= string_len) + start = memcmp(string, token, token_len) == 0; - const char *token = luaL_checkstring(L, 2); - int token_len = lua_objlen(L, 2); - int i, start = 1; - // please make this less ugly... - if(token_len <= string_len){ - while(i < token_len) { - if(string[i] != token[i]){ - start = 0; - break; - } - i++; - } - } - else { - start = 0; - } lua_pushboolean(L, start); return 1; } -- 1.7.7