std::list<std::string> tokenizeStringByOperators(const std::string &originalString) {
  std::list<std::string> tokens;
  std::string delimiter = "*/+-)(^";
  size_t prev = 0;
  size_t next = 0;
  while ((next = originalString.find_first_of(delimiter, prev)) != std::string::npos) {
    if (next - prev != 0) {
      // trim and push back number
      std::string number = originalString.substr(prev, next - prev);
      leftTrim(number);
      rightTrim(number);
      if (number != " ") {
        tokens.push_back(number);
      }
      // trim and push back operator
      std::string oper = originalString.substr(next, 1);
      leftTrim(oper);
      rightTrim(oper);
      if (oper != " ") {
        tokens.push_back(oper);
      }
      // increment by operator length
      prev = next + 1;
    } else {
      // leading operator
      if (originalString.substr(next, 1) == "-") {
        // if leading op is "-" we need to check if we need to parse a negative number
        // check if this is the first token in stream, or the previous token is not a number
        if (tokens.size() == 0 || !isANumber(tokens.back())) {
          next = originalString.find_first_of(delimiter, prev + 1);
          std::string negativeNumber = originalString.substr(prev, next - prev);
          // trim and push back negative number
          leftTrim(negativeNumber);
          rightTrim(negativeNumber);
          if (negativeNumber != " ") {
            tokens.push_back(negativeNumber);
          }
          // increment by operator length
          prev = next;
        }
      } else {
        // parse the operator
        tokens.push_back(originalString.substr(next, 1));
        // increment by operator length
        prev = next + 1;
      }
    }
  }
  if (prev < originalString.size()) {
    // trim and push back last token
    std::string last = originalString.substr(prev);
    leftTrim(last);
    rightTrim(last);
    tokens.push_back(last);
  }
  return tokens;
}
//--------------------------------------------------------------------------------------------------
/// 
//--------------------------------------------------------------------------------------------------
std::vector<std::string> RifEclipseUserDataParserTools::headerReader(std::stringstream& streamData, std::string& line)
{
    std::vector<std::string> header;

    while (!isANumber(line) && !streamData.eof())
    {
        header.push_back(line);
        std::getline(streamData, line);
    }
    return header;
}
bool isPositionFormatCorrect(const vector<string>& tokens) {

	//verify correct format for <PIECE_CHAR> <X> <Y>
	if (tokens.size() == 3) {
		if (tokens[0].size() == 1) {
			if (tokens[0].at(0) == 'R' || tokens[0].at(0) == 'P' || tokens[0].at(0) == 'S' || tokens[0].at(0) == 'B' || tokens[0].at(0) == 'F') {
				if (isANumber(tokens[1])) {
					if (stoi(tokens[1]) > 0 && stoi(tokens[1]) < NUM_OF_ROWS + 1) {
						if (isANumber(tokens[2])) {
							if (stoi(tokens[2]) > 0 && stoi(tokens[2]) < NUM_OF_COLS + 1)
								return true;
						}
					}
				}
			}
		}
	}

	//verify correct format for J <X> <Y> <PIECE_CHAR>
	if (tokens.size() == 4) {
		if (tokens[0].size() == 1) {
			if (tokens[0].at(0) == 'J') {
				if (tokens[3].size() == 1) {
					if (tokens[3].at(0) == 'R' || tokens[3].at(0) == 'P' || tokens[3].at(0) == 'S' || tokens[3].at(0) == 'B') {
						if (isANumber(tokens[1])) {
							if (stoi(tokens[1]) > 0 && stoi(tokens[1]) < NUM_OF_ROWS + 1) {
								if (isANumber(tokens[2])) {
									if (stoi(tokens[2]) > 0 && stoi(tokens[2]) < NUM_OF_COLS + 1)
										return true;
								}
							}
						}
					}
				}
			}
		}
	}

	return false;
}
bool isMoveFormatCorrect(const vector<string>& tokens) {

	//verify correct format for <FROM_X> <FROM_Y> <TO_X> <TO_Y> J: <Joker_X> <Joker_Y> <NEW_REP>
	if (tokens.size() == 4 || tokens.size() == 8) {
		for (vector<string>::size_type i = 0; i < tokens.size(); ++i) {
			if (i == 4) {
				if (tokens[i].size() != 2)
					return false;
				if (tokens[i].at(0) != 'J' || tokens[i].at(1) != ':')
					return false;
			}
			else if (i == 0 || i == 2 || i == 5) {//verify rows within range
				if (!isANumber(tokens[i]))
					return false;
				if (stoi(tokens[i]) < 1 || stoi(tokens[i]) > NUM_OF_ROWS) {
					return false;
				}
			}
			else if (i == 1 || i == 3 || i == 6) {
				if (!isANumber(tokens[i]))
					return false;
				if (stoi(tokens[i]) < 1 || stoi(tokens[i]) > NUM_OF_COLS) {
					return false;
				}
			}
			else {//i = 7
				if (tokens[i].size() != 1)
					return false;
				if (tokens[i].at(0) != 'R' && tokens[i].at(0) != 'P' && tokens[i].at(0) != 'S' && tokens[i].at(0) != 'B') {
					return false;
				}
			}
		}
	}
	return true;
}
Exemple #5
0
int executeNice(Cmd c){
	int priority;
	int i =0;
	int execReturn=0;
	if(strcmp(c->args[0],"nice")==0 && c->nargs > 1 && isANumber(c->args[1])){
		if( c->nargs == 2){
			//nice #num
			setpriority(PRIO_PROCESS,getpid(),atoi(c->args[1]));
			return 0;
		}
		//printf("%s to int\n",c->args[1]);
		priority= atoi(c->args[1]);
		shiftArrayByN(2, c);
		//printf("setting priority %d\n",priority);
	//	prCmd(c);
		nice(priority);
		errno=0;
		if(executeIfBuildInSameShellCommand(c) == 0){
			//printf("same shell\n");
			closeIO(c);
			return 0;
		}
		execReturn = execvp(c->args[0],c->args);
		handleError();
	}else if(strcmp(c->args[0],"nice")==0 && c->nargs > 1){
		//printf("%s to int\n",c->args[1]);
		priority= 4;
		shiftArrayByN(1, c);
		//printf("setting priority %d\n",priority);
		//prCmd(c);
		//nice(priority);
		setpriority(PRIO_PROCESS,getpid(),priority);
		errno=0;
		if(executeIfBuildInSameShellCommand(c) == 0){
			//printf("same shell\n");
			closeIO(c);
			return 0;
		}
		execReturn = execvp(c->args[0],c->args);
		handleError();
	}
	if(strcmp(c->args[0],"nice")==0 && c->nargs == 1){
	//nice(4);
	setpriority(PRIO_PROCESS,getpid(),4);
	return 0;
	}
}
Exemple #6
0
void spellCheckDocument(Documents* docs, int fNum)
{
    char* filename = docs->files[fNum];
    Tree* dico = docs->dico;
    FILE* doc = fopen(filename,"r");
    char word[1024];
    char** words = NULL;
    int count = 0;
    while (!feof(doc)) {
        fscanf(doc,"%s ",word);
        cleanupWord(word);
        if (*word==0 || isANumber(word)) continue;
        pthread_rwlock_rdlock(&docs->rwlock);
        bool found = lookupInTree(dico,word);
        pthread_rwlock_unlock(&docs->rwlock);
      if (!found) {
         printf("Word [%s] spelled incorrectly.\n",word);
      }
        if (!found && !(fNum % docs->j)) {
            words = realloc(words, sizeof(char*) * (count+1));
            words[count++] = strdup(word);
        }
    }
    int i;
    pthread_rwlock_wrlock(&docs->rwlock);
    for(i = 0; i < count; i++){
        bool found = lookupInTree(docs->dico, words[i]);
        if(!found){
            addStringToTree(docs->dico, words[i]);
            printf("%s is misspelled in %s\n", words[i], filename);
        }
        free(words[i]);
    }
    pthread_rwlock_unlock(&docs->rwlock);
    free(words);
    fclose(doc);
}
// shunting yard algorithm
double evaluate(std::list<std::string> &tokens) {
  std::stack<double> operands;
  std::stack<std::string> operators;
  while (!tokens.empty()) {
    if (!isANumber(tokens.front())) {
      // token is an operator
      std::string poppedOperator = tokens.front();
      tokens.pop_front();
      if (operators.empty()) {
        // empty operator stack, just push it on
        operators.push(poppedOperator);
      } else if (poppedOperator == "(") {
        // left paren, just push it on
        operators.push(poppedOperator);
      } else if (poppedOperator == ")") {
        // right paren, pop off and apply all operators until we find the left paren
        while (operators.top() != "(") {
          double operandTwo = operands.top();
          operands.pop();
          double operandOne = operands.top();
          operands.pop();
          std::string operatorToApply = operators.top();
          operators.pop();
          double newOperand = applyOperatorToOperands(operandOne, operandTwo, operatorToApply);
          operands.push(newOperand);
        }
        // found the left paren, pop it off
        if (!operators.empty()) {
          operators.pop();
        }
        // check for unary operator -
        if (!operators.empty()) {
          if (operators.top() == "-" && operands.size() == 1) {
            // apply unary operator -
            double operand = operands.top();
            operands.pop();
            operators.pop();
            operands.push(operand * -1);
          }
        }
      } else if (tokens.front() == "(") {
        // corner case, singly parened number
        operators.push(poppedOperator);
      } else {
        // check for operator precedence
        while (topOfStackHasHigherOrEqualPrecedenceThanOperator(poppedOperator, operators)) {
          double operandTwo = operands.top();
          operands.pop();
          double operandOne = operands.top();
          operands.pop();
          std::string operatorToApply = operators.top();
          operators.pop();
          double newOperand = applyOperatorToOperands(operandOne, operandTwo, operatorToApply);
          operands.push(newOperand);
        }
        // precedence cleared, push operator
        operators.push(poppedOperator);
      }
    } else {
      // token is a number, push to operand stack
      operands.push(toDouble(tokens.front()));
      tokens.pop_front();
    }
  }
// end of token list, apply all remaining operators
  while (!operators.empty()) {
    double operandTwo = operands.top();
    operands.pop();
    double operandOne = operands.top();
    operands.pop();
    std::cout << operandOne << " " << operandTwo << " " << operators.top() << std::endl;
    std::string operatorToApply = operators.top();
    operators.pop();
    double newOperand = applyOperatorToOperands(operandOne, operandTwo, operatorToApply);
    operands.push(newOperand);
  }
  return operands.top();
}
/*
 * Bekommt ein Kommando als String und bearbeitet diesen
 * Der String 'antwort' wird returned.
 */
char* doThis(char* cmd) {
	/* Erkennung der gewuenschten Methode */

	/* Ausgabe des besten Studenten (entweder allgemein oder einer Fachrichtung */
	if (!strcasecmp(cmd, "ping")) { //Testmethode, um Kommunikation Client<->Server zu testen
		return "pong";
	}

	/*
	 * *********************  Funktion Best  ********************************
	 * Rechte: 0, Antwrotet mit besten Studenten
	 */
	if (!strncasecmp(cmd, "best", 4)) {
		if (!strcasecmp(cmd, "best()")) { //der beste alle Studenten
			if (bestGlobal(&stud) != -1) { //speichert den besten Studenten auf stud und prueft gleichzeitig den Fehlerfall
				char cache[] =
						"Bester Student ist %s %s mit Notendurchschnitt: %.2lf";
				sprintf(antwort, cache, stud.fname, stud.lname, stud.avg);
				printf("%s", antwort);
				return antwort;
			} else {
				return "Lesefehler";
			}
		}
		if (!strcasecmp(cmd, "best(itti)")) { //der beste itti Student
			if (bestPartial("itti", &stud) != -1) {
				char cache[] =
						"Bester ITTI.-Student ist %s %s mit Notendurchschnitt: %.2lf";
				sprintf(antwort, cache, stud.fname, stud.lname, stud.avg);
				printf("%s", antwort);
				return antwort;
			} else {
				return "Lesefehler";
			}
		}
		if (!strcasecmp(cmd, "best(info)")) { //der beste info Student
			if (bestPartial("info", &stud) != -1) {
				char cache[] =
						"Bester INF.-Student ist %s %s mit Notendurchschnitt: %.2lf";
				sprintf(antwort, cache, stud.fname, stud.lname, stud.avg);
				printf("%s", antwort);
				return antwort;
			} else {
				return "Lesefehler";
			}
		}
		if (!strcasecmp(cmd, "best(mathe)")) { //der beste mathe Student
			if (bestPartial("mathe", &stud) != -1) {
				char cache[] =
						"Bester Math.-Student ist %s %s mit Notendurchschnitt: %.2lf";
				sprintf(antwort, cache, stud.fname, stud.lname, stud.avg);
				printf("%s", antwort);
				return antwort;
			} else {
				return "Lesefehler";
			}
		}

		return "Dieser Studiengang ist nicht bekannt.";
	}

	/*
	 *  ***********************  Funktion CREATE  ************************
	 *  Nur Admin : 111, Fuegt einen Eintrag der DB hinzu
	 */
	if (!strncasecmp(cmd, "create(", 7)) {

		if (getStatus() != 111) { //prueft, ob Admin eingeloggt ist
			return "create() ist nur Admins erlaubt.";
		}

		char vorname[64];
		char nachname[64];
		char matrikel_string[10];
		long matrikel;
		char bday[9];
		double noten[MAXLVs] = { 0 };
		char fach[32];

		int i = 6;
// Vorname parsen
		int versatz = ++i;
		while (cmd[i] != ',') {
			if (!isALetter(cmd[i])) {
				return "Namen bestehen nur aus Buchstaben.";
			}
			vorname[i - versatz] = cmd[i];
			i++;
			if (i > 50) {
				return "1. Parameter zu lang!";
			}
		}
		vorname[i - versatz] = '\0';

// Nachname parsen
		versatz = ++i;
		while (cmd[i] != ',') {
			if (!isALetter(cmd[i])) {
				return "Namen bestehen nur aus Buchstaben.";
			}
			nachname[i - versatz] = cmd[i];
			i++;
			if (i > 100) {
				return "2. Parameter zu lang!";
			}
		}
		nachname[i - versatz] = '\0';

// Matrikel parsen
		versatz = ++i;
		while (cmd[i] != ',') {
			matrikel_string[i - versatz] = cmd[i];
			if ((i - versatz > 8) && (cmd[i + 1] != ',')) {
				return "Matrikel hat 9 Stellen (1)";
			}
			if ((i - versatz < 8) && (cmd[i + 1] == ',')) {
				return "Matrikel hat 9 Stellen (2)";
			}
			if (!isANumber(cmd[i])) {
				return "Matrikelnummer besteht nur aus Zahlen.";
			}
			i++;
		}
		//matrikel_string[i - versatz] = '\0';
		matrikel = atoi(matrikel_string);
		if (matrikel < 100000000)
			return "Matrikel darf keine fuehrenden Nullen haben.";

// Geburtstag parsen
		versatz = ++i;
		while (cmd[i] != ',') {
			bday[i - versatz] = cmd[i];
			i++;
		}
		if (i - versatz != 8) {
			return "Geburtstagsangaben haben insgesamt 8 Stellen.";
		}
		int j;
		for (j = 0; j < 8; j++) { //ueberprueft richtigen Aufbau des Geburtsdatums
			if (j == 2 || j == 5) {
				if (bday[j] != '.') {
					return "Geburtsdaten haben das Format DD.MM.YY\n";
				}
			} else {
				if (!isANumber(bday[j])) {
					return "Geburtsdaten haben das Format DD.MM.YY\n";
				}
			}
		}
		char* p;
		int day, month;
		day = strtol(bday, &p, 10);
		month = strtol((p + 1), NULL, 10);

		if (day > 31 || month > 12) {
			return "Kein g�ltiges Geburtsdatum";
		}
		bday[i - versatz] = '\0';
		//long geburtstag = atoi(btag);//Geburtstag ist immer ohne f�hrende Nullen!

		versatz = ++i;
		if (cmd[i] != '[') {
			return "Noten nur in Form von [1.3,2.7,3.0,4.0] angeben (max. 10)";
		}

// Noten parsen
		versatz = ++i;
		char tempnote[4];				// Noten haben immer 3 zeichen
		int x = 0; 						// Anzahl der Noten
		while (cmd[i] != ']') {			// Bis zum Ende der Noten also ] - Noten
			if ((!isANumber(cmd[i])) || (!isANumber(cmd[i + 2]))) {
				return "Noten sind immer mit Vorkomma.Nachkomma anzugeben zB \"1.0\".";
			}
			if (i > 200)
				return "Notenliste nicht korrekt!";
			char cache[] = "%c.%c";
			sprintf(tempnote, cache, cmd[i], cmd[i + 2]);
			double checknote = atof(tempnote);
			if ((checknote < 1.0) || (checknote > 5.0))
				return "Noten muessen zwischen 1.0 und 5.0 liegen.";
			noten[x] = checknote;
			x++;
			i = i + 4;						//Sprung zu n�chsten Note
			if (cmd[i - 1] == ']') {			// Notenliste is zuende
				break;
			}
		}

//Studienfach parsen
		versatz = ++i;
		while (cmd[i] != ')' && cmd[i] != ' ') {
			fach[i - versatz] = cmd[i];
			i++;
		}
		fach[i - versatz] = '\0';

		if ((strcmp(fach, "itti")) && (strcmp(fach, "info"))
				&& (strcmp(fach, "mathe"))) {
			return "Nur \"itti\",\"info\" oder \"mathe\" als Studiengaeng maeglich.";
		}

// Doppelte Eintraege verhindern.
		if ((getStudent(matrikel, &stud))) {
			return "Dieser Eintrag existiert schon in der Datenbank";
		}

		/*
		 *		printf("Datensatz: Vorname: %s, Nachname: %s, Matrikel: %li mit %i Noten in Datenbank %s\n",
		 *				vorname, nachname, matrikel, x, fach);
		 */

// DB Operation aufrufen
		if (create(vorname, nachname, matrikel, bday, noten, fach) < 0) {
			return "Fehler beim eintragen in die Datenbank.";
		}
		return "Datensatz wurde erfolgreich in die Datenbank eingetragen.";

	}

	/*
	 *  ***********************  Funktion DELETE  ************************
	 *	Rechte: 111, entfernt einen Eintrag aus der DB
	 */
	if (!strncmp(cmd, "delete(", 7)) {

		if (getStatus() != 111) {
			return "delete() ist nur Admins erlaubt.";
		}

// Matrikel parsen
		int i = 0;
		char matrikel_string[9];
		while (cmd[i + 7] != ')') {
			if (!isANumber(cmd[i + 7])) {
				return "Matrikelnummer besteht nur aus Zahlen.";
			}
			matrikel_string[i] = cmd[i + 7];
			if ((i > 8) && (cmd[i + 7 + 1] != ')')) {
				return "Matrikel hat 9 Stellen (zu kurz)";
			}
			if ((i < 8) && (cmd[i + 7 + 1] == ')')) {
				return "Matrikel hat 9 Stellen (zu lang)";
			}
			i++;
		}
		long matrikel = atol(matrikel_string);

// DB Operation aufrufen
		if (delete(matrikel) > 0) {
			return "Eintrag wurde erfolgreich aus der DB entfernt.";
		}
		return "Eintrag konnte nicht aus der DB entfernt werden.";
	}

	/*
	 * **************************** Funktion READ  ***********************
	 * Funktioniert wie delete!
	 */
	if (!strncmp(cmd, "read(", 5)) {

		/*
		 * Studenten duerfen nur sich selbst lesen, Admins durfen alles lesen
		 * Aktueller Student : getUser(), vor der Rueckgabe vergleich.
		 */
		char user_matrikel[32];
		if (getStatus() != 111) {
			getIdentity(user_matrikel);
			if (!strcmp(user_matrikel, "000000000")) {
				return "read() ist nur Admins und Studenten erlaubt";
			}
		}

		int i = 0;
		char matrikel_string[9];
		while (cmd[i + 5] != ')') {
			if (!isANumber(cmd[i + 5])) {
				return "Matrikelnummer besteht nur aus Zahlen.";
			}
			matrikel_string[i] = cmd[i + 5];
			if ((i > 8) && (cmd[i + 5 + 1] != ')')) {
				return "Matrikel hat max. 9 Stellen";
			}
			if ((i < 8) && (cmd[i + 5 + 1] == ')')) {
				return "Matrikel besteht aus 9 Stellen";
			}
			i++;
		}
		long matrikel = atol(matrikel_string);
		/*
		 Wenn nicht Admin:
		 Usermatrikel und Studentenmatrikel pruefen
		 */
		if (getStatus() != 111) {
			getIdentity(user_matrikel);
			long user_matrikel_long = atol(user_matrikel);
			if (user_matrikel_long != matrikel) {
				return "Studenten ist der Zugriff nur auf ihre eigenen Daten gestattet.";
			}
		}
		if (getStudent(matrikel, &stud) == 1) {

			sprintf(antwort,
					"\nName: %s %s\nStudienfach: %s\nGeburtsdatum: %s\nDurchschnitt: %.2f\n",
					stud.fname, stud.lname, stud.fach, stud.bdate, stud.avg);
			char notenout[64] = "Noten:";
			int i;
			for (i = 0; i < MAXLVs; i++) {
				if (stud.marks[i] >= 1) {
					char singlenote[5];
					sprintf(singlenote, " %.1lf", stud.marks[i]);
					strcat(notenout, singlenote);
				}
			}
			strcat(antwort, notenout);
			strcat(antwort, "\n");
			return antwort;
		}
		return "Student nicht gefunden";

	}

	/*
	 *  ************************** Funktion UPDATE ***********************
	 *  Rechte 111, Veraendert die Daten eines Eintrags
	 */

	if (!strncasecmp(cmd, "update(", 7)) {
		// Rechtekontrolle
		if (getStatus() != 111) {
			return "update() ist nur Admins gestattet.";
		}
//Matrikel Parsen
		int i = 0;
		char matrikel_string[9];
		while (cmd[i + 7] != ',') {
			if (!isANumber(cmd[i + 7])) {
				return "Matrikelnummer besteht nur aus Zahlen.";
			}
			matrikel_string[i] = cmd[i + 7];
			if ((i > 8) && (cmd[i + 7 + 1] != ',')) {
				return "Matrikel hat max. 9 Stellen";
			}
			if ((i < 8) && (cmd[i + 7 + 1] == ',')) {
				return "Matrikel besteht aus 9 Stellen";
			}
			if (isALetter(cmd[i + 7])) {
				return "MAtrikel muss aus Nummern bestehen";
			}
			i++;
		}

		long matrikel = atol(matrikel_string);
		i++;
//Attribut parsen
		char attribut[32];
		int versatz = i;
		while (cmd[i + 7] != ':') {
			attribut[i - versatz] = cmd[i + 7];
			i++;
		}
		attribut[i - versatz] = '\0';
		i++;

// Attribut pr�fen
		if (strcasecmp(attribut, "vorname") && strcasecmp(attribut, "nachname")
				&& strcasecmp(attribut, "noten")
				&& strcasecmp(attribut, "datum")) {
			return "Gueltige Attribute sind: \n"
					"- Vorname\n"
					"- Nachname\n"
					"- Noten\n"
					"- Datum\n";
		}

		char value[32];
		versatz = i;
		while (cmd[i + 7] != ')') {
			if ((!strcasecmp(attribut, "vorname"))
					|| (!strcasecmp(attribut, "nachname"))) { //Wenn Vorname oder Nachname: Ueberpruefen ob nur Buchstaben
				if (!isALetter(cmd[i + 7])) {
					return "Namen bestehen nur aus Buchstaben";
				}
			}

			value[i - versatz] = cmd[i + 7];
			i++;
		}

		if (!strcasecmp(attribut, "datum")) { //Wenn Geburtstag, Ueberpruefen auf gueltiges Datum
			char* p;
			int day, month;
			day = strtol(value, &p, 10);
			month = strtol((p + 1), NULL, 10);

			if ((day > 31) || (month > 12)) {
				return "Kein gueltiges Geburtsdatum";
			}
		}
		value[i - versatz] = '\0';

// DB Operation aufrufen
		if (update(matrikel, attribut, value) > 0) {
			return "Eintrag erfolgreich modifiziert";
		}
		return "Eintrag konnte nicht modifiziert werden.";

	}

	/*
	 * ************************* Funktion RECHTE *************************
	 * rechte: 0, Gibt die Aktuellen Rechte aus
	 */
	if (!strcasecmp(cmd, "rechte")) {
		char cache[] = "Deine Rechte: %i";
		sprintf(antwort, cache, getStatus());
		return antwort;
	}

	/*
	 * ************************* Funktion LOGIN ***************************
	 * rechte: 0, ermoeglicht seine Rechte zu erhoehen
	 */
	if (!strncmp(cmd, "login(", 6)) {
		if (getStatus() > 0) {
			return "Mehrfachanmeldung nicht moeglich.";
		}
// USername parsen
		int i = 6;
		char givenName[32];
		char givenPwd[32];
		int versatz = 6;
		while (cmd[i] != ',') {
			givenName[i - versatz] = cmd[i];
			i++;
			if (i > 30) {
				return "Fehler in der Namensangabe!";
			}
		}
		givenName[i - versatz] = '\0';
		i++;

// Passwort parsen
		versatz = i;
		while (cmd[i] != ')') {
			givenPwd[i - versatz] = cmd[i];
			i++;
			if (i > 60) {
				return "Fehler in der Passwortangabe!";
			}
		}
		givenPwd[i - versatz] = '\0';

// DB Operation aufrufen
		int value = login(givenName, givenPwd);

		switch (value) {
		case 0: {
			char cache[] = "Erfolgreich angemeldet als user: %s";
			sprintf(antwort, cache, givenName);
			return antwort;
		}
		case 1:
			return "Falsches Passwort!";
		case -1:
			return "Kein Benutzerprofil gefunden.";
		}
	}

	/*
	 * ******************** Funktion LOGOUT ***********************
	 * rechte 0, Ermoeglicht ein sicheres Logout
	 */
	if (!strcasecmp(cmd, "logout")) {
		if (getStatus() == 0) {
			return "Keine abmeldung erforderlich.";
		}
		logout();
		return "Erfolgreich abgemeldet.";
	}

	return "Operation nicht bekannt. Probiere \"help\"";
}