summaryrefslogtreecommitdiffstats
path: root/testing/lua5.2-stringy/0001-use-memcmp-for-startswith-endswith.patch
blob: 4680a05615b7d7672d7d5de50262fec8f68badc6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
From 86e4e9d16befd02230a699f045afdd68a47f6122 Mon Sep 17 00:00:00 2001
From: Natanael Copa <ncopa@alpinelinux.org>
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 <ncopa@alpinelinux.org>
---
 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