//---------------------------------------------------------------------------



#include "check.h"

bool Illegalchar (std::string & Str)
{
   bool b = false;
   for (unsigned int i=0; i<Str.length()-1; i++)
   {
      if (!(DEZ || ISOP || ZAL))
      {
         Str.erase (i,1);
         b = true;
         i--;
      }
   }
   return b;
}


bool Klammern (std::string & Str)
{
   int counter = 0;
   int x =0;
   int y =0;
   x = Str.find_first_of ('(');
   y = Str.find_first_of (')');

   if (x>y)
      throw Klamm();

   x = Str.find_last_of ('(');
   y = Str.find_last_of (')');

   if (x>y)
      throw Klamm();

   for (unsigned int i=0; i<Str.length()-1; i++)
   {
      if (Str[i] == '(')
      {
         counter++;
      }
      if (Str[i] == ')')
      {
         counter--;
      }
   }
   if (counter != 0)
      throw Klamm();
   return false;
}

enum EVorig {Zahl,Op};


bool Zahlen (std::string & Str)
{
   unsigned int i = 0;
   EVorig Vorig;
   i = 0;
   bool b = false;

   Vorig = Op;
   for (i=0; i<Str.length()-1; i++)
   {
      if (Vorig == Op && ISOPOK)
      {
         Str.erase(i,1);
         i--;
         b = true;
      }
      if (ZAL || Str[i] == ')')
         Vorig = Zahl;
      else
         Vorig = Op;
   }
   return b;
}

enum EKlammer {offen, zu, kein};

bool Operatoren(std::string & Str)
{
   bool b = false;
   EKlammer Klammer = kein;
   for (unsigned int i=0; i<Str.length()-1; i++)
   {
      if (Klammer == offen)
      {
         if (ISOP && Str[i] != '(' && Str[i] != ')')
         {
            Str.erase (i,1);
            i--;
            b = true;
         }
      }
      if (Klammer == zu)
      {
         if (!(ISOP && Str[i] != '(' && Str[i] != ')'))
         {
            Str.insert(i, "*\0", 1);
            i++;
            b = true;
         }
      }
      if (Str[i] == '(')
         Klammer = offen;
      else
      if (Str[i] == ')')
         Klammer = zu;
      else
         Klammer = kein;
   }
   return b;
}


bool Check(std::string & Str)
{
   bool b = false;
   b= (
      Illegalchar (Str) ||
      Zahlen      (Str) ||
      Operatoren  (Str) ||
      Klammern    (Str)
   );
   return b;
}


