Add toolchain and mbtk source

Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/mbtk_lib/src/mbtk_str.c b/mbtk/mbtk_lib/src/mbtk_str.c
new file mode 100755
index 0000000..ff2db9e
--- /dev/null
+++ b/mbtk/mbtk_lib/src/mbtk_str.c
@@ -0,0 +1,250 @@
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <mbtk_str.h>
+
+/*
+* Converts all of the characters in this String to lower.
+*
+* Parameters:
+*   src - The string should be converted.
+*   dest  - The lowercase string.
+*   len - The length of result string.Must be "strlen(src) + 1"
+* Returns:
+*   The string, converted to lowercase,or NULL for fail.
+*/
+void*
+str_tolower
+(
+    const void *src,
+    void *dest,
+    size_t len
+)
+{
+    const char *s = (char*)src;
+    char *d = (char*)dest;
+    if(!s
+        || !d
+        || (strlen(d) + 1 > len)){
+        return NULL;
+    }
+
+    char* temp = d;
+    while(*s){
+        *temp++ = tolower(*s++);
+    }
+    *temp = '\0';
+
+    return dest;
+}
+
+/*
+* Converts all of the characters in this String to upper case.
+*
+* Parameters:
+*   src - The string should be converted.
+*   dest  - The uppercase string.
+*   len - The length of result string.Must be "strlen(str_ptr) + 1"
+* Returns:
+*   The string, converted to uppercase.or NULL for fail.
+*/
+void*
+str_toupper
+(
+    const void *src,
+    void *dest,
+    size_t len
+)
+{
+    const char *s = (char*)src;
+    char *d = (char*)dest;
+    if(!s
+        || !d
+        || (strlen(d) + 1 > len)){
+        return NULL;
+    }
+    char* temp = d;
+    while(*s){
+        *temp++ = toupper(*s++);
+    }
+    *temp = '\0';
+    return dest;
+}
+
+/*
+* Remove the head and tail spaces.
+*/
+void*
+str_trim
+(
+    const void* str,
+    void *result,
+    size_t len
+)
+{
+    if(str == NULL || result == NULL
+        || len <= strlen((char*)str))
+    {
+        return NULL;
+    }
+
+    char* str_ptr = (char*)str;
+    while(*str_ptr && (*str_ptr == ' ' || *str_ptr == '\t' || *str_ptr == '\n' || *str_ptr == '\r')){
+        str_ptr++;
+    }
+
+    memset(result,0x0,len);
+    if(*str_ptr && strlen(str_ptr) > 0)
+    {
+        memset(result,0x0,len);
+        memcpy(result,str_ptr,strlen(str_ptr));
+        str_ptr = (char*)result + strlen((char*)result) - 1;
+        while(*str_ptr && (*str_ptr == ' ' || *str_ptr == '\t' || *str_ptr == '\n' || *str_ptr == '\r')){
+            *str_ptr = '\0';
+            str_ptr--;
+        }
+    }
+
+    return result;
+}
+
+/*
+* Returns true if and only if this string contains the specified sequence of char values.
+*
+* Parameters:
+*   str   -   The substring to search from.
+*   sub_str - The substring to search for.
+* Returns:
+*   True if str contains sub_str, false otherwise.
+*/
+bool
+str_contains
+(
+    const void* str,
+    const void* sub_str
+)
+{
+    const char *s = (char*)str;
+    const char *s_sub = (char*)sub_str;
+
+    if(!s || !s_sub){
+        return FALSE;
+    }
+
+    return str_indexof(s,s_sub)==-1?FALSE:TRUE;
+}
+
+/*
+* Returns the index within this string of the first occurrence of the specified substring.
+* If no such substring, then -1 is returned.
+*
+* Parameters:
+*   str   -   The substring to search from.
+*   sub_str - The substring to search for.
+* Returns:
+*   The index of the first occurrence of the specified substring,
+*   or -1 if there is no such occurrence.
+*/
+ssize_t
+str_indexof
+(
+    const void* str,
+    const void* sub_str
+)
+{
+    const char *s = (char*)str;
+    const char *s_sub = (char*)sub_str;
+
+    if(!s || !s_sub){
+            return -1;
+    }
+    char* position = strstr(s,s_sub);
+    if(!position){
+        return -1;
+    }else{
+        return position - s;
+    }
+}
+
+/*
+* Returns a new string that is a substring of this string. The substring begins
+* at the specified beginIndex and extends to the character at index endIndex - 1.
+* Thus the length of the substring is endIndex-beginIndex.
+*
+* Examples:
+*   "hamburger".substring(4, 8) returns "urge"
+*   "smiles".substring(1, 5) returns "mile"
+*
+* Parameters:
+*   begin_index     The beginning index, inclusive.
+*   end_index       The ending index, exclusive.
+* Returns:
+*   The specified substring or NULL.
+*/
+void*
+str_substring
+(
+    const void* str,
+    size_t begin_index,
+    size_t end_index,
+    void *sub_str,
+    size_t len
+)
+{
+    const char* s = (char*)str;
+    char *result = (char*)sub_str;
+    if(!s
+        || !result
+        || begin_index >= end_index
+        || begin_index >= strlen(s)
+        || end_index - begin_index + 1 > len){
+        return NULL;
+    }
+
+    if(end_index > strlen(s)){
+        end_index = strlen(s);
+    }
+
+    memcpy(result,s + begin_index,end_index - begin_index);
+    result[end_index - begin_index] = '\0';
+
+    return result;
+}
+
+bool str_startwith(const char* str, const void* prefix)
+{
+    if (!str || !(char*) prefix) {
+        return FALSE;
+    }
+    if (strlen((char*) str) < strlen((char*) prefix)) {
+        return FALSE;
+    }
+    return str_indexof(str, (char*) prefix) ? FALSE : TRUE;
+}
+
+void* strstr_hex(char *haystack,int haystack_len,
+                const char *needle,int needle_len)
+{
+    int index = 0;
+    if(haystack_len < needle_len)
+        return NULL;
+
+    while(index <= haystack_len - needle_len) {
+        if(!memcmp(haystack + index,needle,needle_len)){
+            return haystack + index;
+        }
+        index++;
+    }
+
+    return NULL;
+}
+
+bool str_empty(const void *str)
+{
+    if (str && strlen((char*)str) > 0)
+        return false;
+
+    return true;
+}
+