/* strlen, strcpy, strcat, strcmp, strchr, strstr - 
   verzije sa pokazivacima */
/* Vezbe radi, implementirane su funkcije biblioteke string.h */
#include <stdio.h>
#include <stdlib.h> /* Zbog NULL */

/* Izracunava duzinu stringa */
int string_length(char *s)
{
	char* t;
	for (t = s; *t; t++)
		;
	return t - s;
}


/* Kopira string src u string dest. Pretpostavlja da u dest ima dovoljno prostora. */
void string_copy(char *dest, char *src)
{
	/* Kopira karakter po karakter, sve dok nije iskopiran karakter '\0' */
	while(*dest++ = *src++)
		;
	
}

/* Nadovezuje string t na kraj stringa s. Pretpostavlja da u s ima dovoljno prostora. */
void string_concatenate(char *s, char *t)
{
	/* Pronalazimo kraj stringa s */
	while (*s)
		s++;

	/* Vrsi se kopiranje, slicno funkciji string_copy */
	while (*s++ = *t++)
		;
}

/* Vrsi leksikografsko poredjenje dva stringa. 
    Vraca :
        0 - ukoliko su stringovi jednaki
        <0 - ukoliko je s leksikografski ispred t
        >0 - ukoliko je s leksikografski iza t
*/
int string_compare(char *s, char *t)
{
	/* Petlja tece sve dok ne naidjemo na prvi razliciti karakter */
	for (; *s == *t; s++, t++)
		if (*s == '\0') /* Naisli smo na kraj oba stringa, a nismo nasli razliku */
			return 0;


	/* *s i *t su prvi karakteri u kojima se niske razlikuju. 
	   Na osnovu njihovog odnosa, odredjuje se odnos stringova */
	return *s - *t;
}

/* Pronalazi prvu poziciju karaktera c u stringu s, i vraca pokazivac na nju, 
   odnosno NULL ukoliko s ne sadrzi c */
char* string_char(char *s, char c)
{
	for (; *s; s++)
		if (*s == c)
			return s;
			
	/* Nije nadjeno */				
	return NULL;
}

/* Pronalazi poslednju poziciju karaktera c u stringu s, i vraca pokazivac na nju,
   odnosno NULL ukoliko s ne sadrzi c */
char* string_last_char(char *s, char c)
{
	char *t = s;
	/* Pronalazimo kraj stringa s */
	while (*t++)
		;
	
	/* Krecemo od kraja i trazimo c unazad */
	for (t--; t >= s; t--)
		if (*t == c)
			return t;
			
	/* Nije nadjeno */				
	return NULL;
	
}

/* Proverava da li string str sadrzi string sub.
   Vraca poziciju na kojoj sub pocinje, odnosno -1 ukoliko ga nema 
*/
char* string_string(char *str, char *sub)
{
	char *s, *t;
	/* Proveravamo da li sub pocinje na svakoj poziciji i */
	for (; *str; str++)
		/* Poredimo sub sa str pocevsi od poziciji i sve dok ne naidjemo na razliku */
		for (s = str, t = sub; *s == *t; s++, t++)
			/* Nismo naisli na razliku a ispitali smo sve karaktere niske sub */
			if (*(t+1) == '\0') 
				return str;
	/* Nije nadjeno */				
	return NULL;
}

int main() {
	char s[100];
	char t[] = "Zdravo";
	char u[] = " svima";
	char r[] = "racunari";
	
	string_copy(s, t);
	printf("%s\n", s);
	
	string_concatenate(s, u);
	printf("%s\n", s);
	
	printf("%d\n",string_char(r, 'n') - r);
	printf("%d\n",string_last_char(r, 'a') - r);
	
	printf("%d\n",string_string(r, "rac") - r);
	printf("%d\n",string_string(r, "ari") - r);
	printf("%d\n",string_string(r, "cun") - r);
	printf("%p\n",string_string(r, "cna"));

	return 0;
}