--- ./stringy.c.orig
+++ ./stringy.c
@@ -8,49 +8,27 @@
 
 
 static int endswith(lua_State *L) {
-    const char *string = luaL_checkstring(L, 1);
-    int string_len = lua_objlen(L, 1);
+    size_t string_len, token_len;
+    const char *string = luaL_checklstring(L, 1, &string_len);
+    const char *token = luaL_checklstring(L, 2, &token_len);
+    int end = 0;
 
-    const char *token = luaL_checkstring(L, 2);
-    int token_len = lua_objlen(L, 2);
-
-    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;
-
-            }
-        }
+        string += string_len - token_len;
+	end = memcmp(string, token, token_len) == 0;
     }
-    else {
-        end = 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, token_len;
+    const char *string = luaL_checklstring(L, 1, &string_len);
+    const char *token = luaL_checklstring(L, 2, &token_len);
+    int start = 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;
-    }
+    if(token_len <= string_len)
+        start = memcmp(string, token, token_len) == 0;
     lua_pushboolean(L, start);
     return 1;
 }