#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>

char *substr(char *tmp, int x, int y){
	char *string = strdup(tmp);
	string[x + y - 1] = '\0';
	return string + x - 1;
}

int countstr(char *string, char *delimiter){
	char *tmp = strdup(string);
	char *tmpd = strdup(delimiter);
	int cnt=0;
	int i = 0;
		while(i <= strlen(tmp)){
			if (!strcmp(substr(tmp, i, strlen(tmpd)) , tmpd)){
				cnt++;
			}
		i++;
		}
	return cnt;
}

char *replacestr(char *string, char *search, char *replace){
        int i = 0;
        int j = 0;
        char *tmp = malloc (strlen(string) - strlen(search) + strlen(replace));
                while (string[i]){
                        if (!strncmp (&string[i], search, strlen(search))){
                                strcat (&tmp[i], replace) ;
                                i += strlen(search) - 1;
                                j += strlen(replace) -1 ;
                        } else tmp[j] = string[i];
                i++;
                j++;
                }
        return tmp;
}

char **explode (char *string, char *delimiter){
	char **array, *tmp;
	int i = 0;
	int j = 0;
	int lend = strlen(delimiter);
	array = malloc (sizeof(char *) * countstr(string, delimiter));
	tmp = strdup (string);
	array[0]= tmp;
		while (tmp[i]) {
		        if (!strncmp(&tmp[i], delimiter, lend)){
		                tmp[i] = '\0';
				i += lend;
                		array[++j] = tmp + i;
		        } else i++; 
		}
	return array;
}

char *strtoupper(char *string){
	char *tmp = malloc (strlen(string));
	int i = 0;
		while (string[i]){
			tmp[i] = toupper(string[i]);
			i++;
		}
	return tmp;
}

char *strtolower(char *string){
	char *tmp = malloc (strlen(string));
	int i = 0;
		while (string[i]){
			tmp[i] = tolower(string[i]);
			i++;
		}
	return tmp;
}

char *addslashes (char *string){
        int i = 0;
        int j = 0;
        char *buffer = malloc (strlen(string)+50);
        for (i=0;i <= strlen (string);i++){
                switch (string[i]){
                case 39:
                case 34:
                        buffer[j++] = 92;
                        buffer[j++] = string[i];
                        break;
                default:
                        buffer[j++] = string[i];
                }
        }
        return buffer;
}

char *stripslashes (char *string){
        int i = 0;
        int j = 0;
        char *buffer = malloc (strlen(string)+50);
        for (i=0;i <= strlen (string);i++){
                switch (string[i]){
                case 39:
                case 34:
                        buffer[j++] = string[i];
                        break;
                default:
                        buffer[j++] = string[i];
                }
        }
        return buffer;
}


char *trim (char *string){
	char *tmp = malloc (strlen(string));
	int i = 0;
	int j = 0;
		while (string[i]){
			if (string[i] == '\0' || string[i] == '\n' || string[i] == '\r' || string[i] == '\t' || string[i] == '\v'){
				j--;
			} else tmp[j] = string[i];
		j++;
		i++;
		}
	return tmp;
}

char *ltrim (char *string){
	char *tmp = malloc (strlen(string));
	int i = 0;
		while (string[i] == '\0' || string[i] == '\n' || string[i] == '\r' || string[i] == '\t' || string[i] == '\v'){
			i++;
		}
	strcat(tmp, &string[i]);
	return tmp;
}

char *ucfirst(char *string){
	char *tmp = malloc (strlen(string));
	tmp[0] = toupper (string[0]);
	strcat (tmp, &string[1]);
	return tmp;
}

char *ucwords(char *string){
	char *tmp = malloc (strlen(string));
	int i = 0;
		while (string[i]){
			if (string[i] == ' '){
				tmp[i] = ' ';
				i++;
				tmp[i] = toupper (string[i]);
			} else 	tmp[i] = string[i];
		i++;
		}
	tmp[0] = toupper (tmp[0]);
	return tmp;
}

char *revstr(char *string){
	char *tmp = malloc (strlen(string));
	int i = strlen(string) - 1;
	int j = 0;
		while (string[i]){
			tmp[j++] = string[i--];
		}
	return tmp;
}

char *repeatstr(char *string, int multiple){
	char *tmp = malloc (strlen(string) * multiple);
	int i;
		for (i = 0; i <multiple; i++){
			strcat(tmp, string);
		}
	return tmp;
}
