#include <str.h>
#include <buffer.h>

/*
 * The str_* functions have a pretty similar functionality to the byte_* ones
 * -- the most important enhacement is the recognition of \0.
 */

int
main()
{
	char *string1 = "foo bar";
	char string2[42] = "fnord";
	unsigned int len;
	unsigned int amm;
	unsigned int pos;
	int diff;
	int start;

	/* For determinating the difference between two strings, thew libowfat
	 * offers two functions:
	 * 
	 * int str_diff(const char *a,const char *b);
	 *
	 * and
	 *
	 * int str_diffn(const char *a,const char *b,unsigned int limit);
	 *
	 * They both return <0 if a is lexicographically smaller than b, 0 if they
	 * are equal and >0 if b is greater than a. The only difference is that
	 * str_diff compares everytime until a \0 is encountered and str_diffn
	 * compares max. until limit. Beware of checking just for 1 and -1!
	 */

	diff = str_diff(string1, string2);
	
	buffer_puts(buffer_1, "str_diff(string1, string2): ");
	buffer_putlong(buffer_1, diff);
	buffer_putnlflush(buffer_1);


	/* As in byte_diff(), there is a macro str_equal(a,b) for convience. */

	/* For the frequent task of testing whether a string starts with an another
	 * is the following function:
	 *
	 * int str_start(const char *a,const char *b);
	 *
	 * It simply returns 1 if a starts with b and 0 otherwise.
	 */

	start = str_start(string1, "foo");

	buffer_puts(buffer_1, "str_start(string1, \"foo\"): ");
	buffer_putlong(buffer_1, start);
	buffer_putnlflush(buffer_1);
 

	/* Determinating the length of a string is also easy with the libowfat:
	 *
	 * unsigned int str_len(const char *s);
	 * 
	 * returns the index of \0 in the string and that's also the length.
	 */

	len = str_len(string1);

	buffer_puts(buffer_1, "str_len(buffer_1): ");
	buffer_putulong(buffer_1, len);
	buffer_putnlflush(buffer_1);


	/* One of the most used ANSI-C-functions is strcpy() and the libowfat has
	 * an own version:
	 *
	 * unsigned int str_copy(char *out,const char *in);
	 *
	 * It copies "in" into "out" until the first \0 is copied and returns the
	 * number of bytes copied.
	 */

	amm = str_copy(string2, string1); /* Returns 7, string2 now begins with "foo bar\0". */

	buffer_puts(buffer_1, "str_copy(string1, string2): ");
	buffer_putulong(buffer_1, amm);
	buffer_putnlflush(buffer_1);


	/* Similar to byte_* there are:
	 *  
	 * unsigned int str_chr(const char *haystack,char needle);
	 * 
	 * and
	 *
	 * unsigned int str_rchr(const char *haystack,char needle);
	 *
	 * The first one returns the index of the _first_ occurency of "needle" in
	 * "haystack" and the second returns the last one. Both return the index of
	 * \0 if the "needle" hasn't been found.
	 */

	pos = str_chr(string1, 'b'); /* Returns 4. */

	buffer_puts(buffer_1, "str_chr(string1, 'b'): ");
	buffer_putulong(buffer_1, pos);
	buffer_putnlflush(buffer_1);

	return 0;
}