/*
Schreiben Sie eine Funktion strlen, die als Parameter
eine Zeichenkette übergeben bekommt. Bestimmen Sie
die Länge der Zeichenkette und geben Sie diese
als Rückgabewert zurück.

Schreiben Sie eine Funktion singleCount mit einer Zeichenkette 
und einem Zeichen als Parameter. Berechnen Sie die Anzahl der 
Häufigkeit des Zeichens in der Zeichenkette und geben Sie
diesen Wert als Rückgabewert zurück.

Schreiben Sie eine Funktion, die alle Zeichen einer Zeichenkette
in Großbuchstaben umwandelt. const int iCaseDiff = 'A' - 'a';
'a' + iCaseDiff -->  'a' + 'A' - 'a'

Schreiben Sie eine Funktion, die überprüft, ob es sich bei der
übergebenen Zeichenkette um ein Palindrom handelt. 
einnegermitgazellezagtimregennie

Schreiben Sie dazu geeignete Testfunktionen.
*/

#include <iostream>
using namespace std;

int strlen(char* acInString)
{
	int iLen=0;
	while(*acInString++ != 0)
	{
		iLen++;
	}
	return iLen;
}

void testCase_strlen(char* acInString, int iExpectedValue)
{
	int iLen = strlen(acInString);
	cout << "strlen(\"" << acInString << "\") ";
	if(iLen == iExpectedValue)
	{
		cout << "ok";
	}
	else
	{
		cout << "== " << iLen << " not ok, expected: " << iExpectedValue;
	}
	cout << endl;
}

void test_strlen()
{
	testCase_strlen("1234567", 7);
	testCase_strlen("", 0);
	testCase_strlen("abcdefghijklm", 13);
}

char* toUpperCase(char* acInString)
{
	int iLen = strlen(acInString);
	char* acResult = new char[iLen+1];
	for(int li=0; li<iLen; ++li)
	{
		char cCurrent = acInString[li];
		if(cCurrent >= 'a' && cCurrent <= 'z')
		{
			cCurrent += 'A' - 'a';
		}
		acResult[li] = cCurrent;
	}
	acResult[iLen] = 0;
	return acResult;
}

bool compare(char* acInString1, char* acInString2)
{
	int iLen1 = strlen(acInString1);
	int iLen2 = strlen(acInString2);
	bool bResult = iLen1 == iLen2;
	if(bResult)
	{
		for(int li=0; li<iLen1; ++li)
		{
			if(acInString1[li] != acInString2[li])
			{
				return false;
			}
		}
	}
	return bResult;
}

void testCase_toUpperCase(char* acInString, char* acInExpectedString)
{
	char* acResult = toUpperCase(acInString);
	if(compare(acResult, acInExpectedString))
	{
		cout << "toUpperCase(\"" << acInString << "\") ok" << endl;
	}
	else
	{
		cout << "toUpperCase(\"" << acInString << "\") not ok, result: "
			 << acResult << ", expected: "
			 << acInExpectedString << endl;
	}
}

void test_toUpperCase()
{
	testCase_toUpperCase("abcdef", "ABCDEF");
	testCase_toUpperCase("abCDefHallo", "ABCDEFHALLO");
}

void main()
{
	test_strlen();
	test_toUpperCase();
}

