Browse Source

Replaced strnstr with built-in string_ strnstr

Marco Bambini 8 years ago
parent
commit
2d276a9893
3 changed files with 24 additions and 3 deletions
  1. 3 3
      src/runtime/gravity_core.c
  2. 20 0
      src/utils/gravity_utils.c
  3. 1 0
      src/utils/gravity_utils.h

+ 3 - 3
src/runtime/gravity_core.c

@@ -1543,7 +1543,7 @@ static bool operator_string_sub (gravity_vm *vm, gravity_value_t *args, uint16_t
 	gravity_string_t *s2 = VALUE_AS_STRING(v2);
 	gravity_string_t *s2 = VALUE_AS_STRING(v2);
 	
 	
 	// subtract s2 from s1
 	// subtract s2 from s1
-	char *found = strnstr(s1->s, s2->s, (size_t)s1->len);
+	char *found = string_strnstr(s1->s, s2->s, (size_t)s1->len);
 	if (!found) RETURN_VALUE(VALUE_FROM_STRING(vm, s1->s, s1->len), rindex);
 	if (!found) RETURN_VALUE(VALUE_FROM_STRING(vm, s1->s, s1->len), rindex);
 	
 	
 	// substring found
 	// substring found
@@ -1632,7 +1632,7 @@ static bool string_index (gravity_vm *vm, gravity_value_t *args, uint16_t nargs,
 	gravity_string_t *str_to_index = VALUE_AS_STRING(GET_VALUE(1));
 	gravity_string_t *str_to_index = VALUE_AS_STRING(GET_VALUE(1));
 
 
 	// search for the string
 	// search for the string
-	char *ptr = strnstr(main_str->s, str_to_index->s, (size_t)main_str->len);
+	char *ptr = string_strnstr(main_str->s, str_to_index->s, (size_t)main_str->len);
 
 
 	// if it doesn't exist, return null
 	// if it doesn't exist, return null
 	if (ptr == NULL) {
 	if (ptr == NULL) {
@@ -1870,7 +1870,7 @@ static bool string_split (gravity_vm *vm, gravity_value_t *args, uint16_t nargs,
 	char *original = string->s;
 	char *original = string->s;
     uint32_t slen = string->len;
     uint32_t slen = string->len;
 	while (1) {
 	while (1) {
-		char *p = strnstr(original, sep, (size_t)slen);
+		char *p = string_strnstr(original, sep, (size_t)slen);
 		if (p == NULL) {
 		if (p == NULL) {
             if (marray_size(list->array) == 0) slen = 0;
             if (marray_size(list->array) == 0) slen = 0;
 			marray_push(gravity_value_t, list->array, VALUE_FROM_STRING(vm, original, string->len - slen));
 			marray_push(gravity_value_t, list->array, VALUE_FROM_STRING(vm, original, string->len - slen));

+ 20 - 0
src/utils/gravity_utils.c

@@ -347,6 +347,26 @@ uint32_t string_size (const char *p) {
 	return (uint32_t)strlen(p);
 	return (uint32_t)strlen(p);
 }
 }
 
 
+// From: https://opensource.apple.com/source/Libc/Libc-339/string/FreeBSD/strnstr.c
+char *string_strnstr(const char *s, const char *find, size_t slen) {
+    char c, sc;
+    size_t len;
+    
+    if ((c = *find++) != '\0') {
+        len = strlen(find);
+        do {
+            do {
+                if ((sc = *s++) == '\0' || slen-- < 1)
+                    return (NULL);
+            } while (sc != c);
+            if (len > slen)
+                return (NULL);
+        } while (strncmp(s, find, len) != 0);
+        s--;
+    }
+    return ((char *)s);
+}
+
 // MARK: - UTF-8 Functions -
 // MARK: - UTF-8 Functions -
 
 
 /*
 /*

+ 1 - 0
src/utils/gravity_utils.h

@@ -50,6 +50,7 @@ const char	*string_dup (const char *s1);
 const char	*string_ndup (const char *s1, size_t n);
 const char	*string_ndup (const char *s1, size_t n);
 void		string_reverse (char *p);
 void		string_reverse (char *p);
 uint32_t	string_size (const char *p);
 uint32_t	string_size (const char *p);
+char        *string_strnstr(const char *s, const char *find, size_t slen);
 
 
 // UTF-8
 // UTF-8
 uint32_t	utf8_charbytes (const char *s, uint32_t i);
 uint32_t	utf8_charbytes (const char *s, uint32_t i);