// Parser.cpp: implementation of the Parser class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Optima.h"
#include "Parser.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Parser::Parser()
{

}

Parser::~Parser()
{

}

void Parser::Parse(CEdit *source,Simplex& simplex)
{
int no_of_lines=source->GetLineCount();
char buffer[80];
CString line,temp;
int line_count=0;
simplex.no_of_vars=0;
simplex.no_of_const=0;
int length;
int const_mode=0;
int varfill_flag=-1;


for(int i=0;i<no_of_lines;i++)
{
	source->GetLine(i,(LPTSTR)buffer,78);	
	length=source->LineLength(source->LineIndex(i));
//	char t[10];
//	itoa(length,t,10);
//	AfxMessageBox(CString(t));
	buffer[length]=0;
	temp=(CString)buffer;
//	AfxMessageBox(temp);

	line="";

	int signset_flag=0;
	for(int j=0;j<temp.GetLength();j++)
	{
		CString letter=temp.Mid(j,1);
		if (letter!=" " && letter!="\t")
		{
			if(letter==">") 
			{
				letter="-1";
				if(const_mode) letter="1";

				signset_flag=1;
			}
			if(letter=="<") 
			{
				letter="1";
				if(const_mode) letter="2";
				signset_flag=1;
			}
			if(letter=="*") 
			{
				letter="3";
			}

			if(letter=="=" && !signset_flag) 
			{
				letter="0";
				if(const_mode) letter="";
			}
			line+=letter;
		}
	}

	
	temp="";
	int comma_counter=0;


	line.TrimLeft();
	line.TrimRight();

	if(line.CompareNoCase("end")==0) 
		break;

	if(line.CompareNoCase("signs")==0) 
	{
		const_mode=1;
		continue;
	}

	
	line+=",";
//	AfxMessageBox(line);




	for(j=0;j<line.GetLength();j++)
	{
		CString letter=line.Mid(j,1);
		if(letter!=",") 
			temp+=letter;
		else //____encountered a comma
		{
			float value=atof(LPCTSTR(temp));


			//AfxMessageBox(CString(Fraction(value)));

			if(const_mode==0)
			{
			if(line_count==0) //_____Obj function__
			{
			//	_gcvt(value,5,buffer);				
			//	AfxMessageBox(CString(buffer));
				simplex.C[comma_counter]=(Fraction)value;
				simplex.var_const[comma_counter]=1; //____Assume >0 types_______
				
				simplex.no_of_vars++;

			}
			
			else //_______Constraints____
			{
				//_______A matrix____
				if(comma_counter<simplex.no_of_vars) 
					simplex.A[line_count-1][comma_counter]=value;
				//_______Sign_______
				else if(comma_counter==simplex.no_of_vars) 
				{
					simplex.const_type[i-1]=int(value);
					simplex.no_of_const++;
				}
				//__________B Matrix________
				else 
					simplex.B[line_count-1]=value;
			}

			}
			else
			{
				int value=atoi(LPCTSTR(temp));	
				if(varfill_flag==-1)
					varfill_flag=value;
				else
				{
					simplex.var_const[varfill_flag-1]=value;
				//	AfxMessageBox("Sign="+temp);
					varfill_flag=-1;
				}
				
			}

			
			comma_counter++;
			temp="";
		}
	}//After the loop


	if(line.GetLength()>1) line_count++;
	
}



}

