示例#1
0
FileReader::MatrixExp FileReader::getMatrixFromString(const std::string &strInput, unsigned nRowNumber,
	unsigned nColumnNumber)
{
	std::string strTemp(strInput);

	removeBrackets(strTemp, MATRIX_ELEMENT_START_SYMBOL, MATRIX_ELEMENT_END_SYMBOL);
	std::cout << "String: " << strTemp << std::endl;

	std::vector<std::string> vecTemp = splitStringToElements(strTemp, MATRIX_ELEMENT_DELIMITER);

	MatrixExp matr(nRowNumber, nColumnNumber);
	unsigned nElem(0);
	try
	{
		for(unsigned i = 0; i < matr.size1(); ++i)
		{
			for(unsigned j = 0; j < matr.size2(); ++j)
			{
				// At the moment only matrix which contains digits can be read from a file
				// TODO: Add full support of reading from a file into Expression
				SimpleExpression exp(SimpleItem(std::string(""), 0,
					boost::lexical_cast<double>(vecTemp[nElem++])));
				matr.insert_element(i, j, exp);
			}
		}
	} catch (boost::bad_lexical_cast e)
	{
		throw fileException("Only digital matrices are supported.");
	}

	return matr;
}
示例#2
0
void FileReader::exciseMatrixSize(std::string &strInput, unsigned &nRowNumber, unsigned &nColumnNumber)
{
	size_t startPos, endPos;
	if( ((startPos = strInput.find_first_of(MATRIX_SIZE_START_SYMBOL)) == std::string::npos) ||
		((endPos = strInput.find_first_of(MATRIX_SIZE_END_SYMBOL)) == std::string::npos) )
	{
		throw fileException("Incorrect matrix description");
	}

	std::string strMatrixSize = strInput.substr(startPos, endPos - startPos + 1);
	strInput.erase(startPos, endPos - startPos + 1);
	removeBrackets(strMatrixSize, MATRIX_SIZE_START_SYMBOL, MATRIX_SIZE_END_SYMBOL);

	if((strMatrixSize.find(MATRIX_ELEMENT_DELIMITER) == std::string::npos) ||
		(std::count(strMatrixSize.begin(), strMatrixSize.end(), MATRIX_ELEMENT_DELIMITER) != 1))
	{
		throw fileException("Incorrect matrix size");
	}

	std::vector<std::string> vecMatrixSizes(splitStringToElements(strMatrixSize, MATRIX_ELEMENT_DELIMITER));
	if(vecMatrixSizes.size() != 2)
	{
		throw fileException("Matrix size must contain 2 digits");
	}

	try
	{
		nRowNumber = boost::lexical_cast<unsigned>(vecMatrixSizes[0]);
		nColumnNumber = boost::lexical_cast<unsigned>(vecMatrixSizes[1]);
	} catch (boost::bad_lexical_cast e)
	{
		throw fileException("Failed to cast Row anf Column numbers.");
	}
}
ArithmeticExpression::ArithmeticExpression(string in) {	//constructor with 1 parameter (string in)
	int openBrackets = 0;		//openBrackets counts how many '(' are in the expression
	int closedBrackets = 0;		//closedBrackets counts how many ')' are in the expression
	splitIndex = 0;				//index of the operator
	input = in;					//sets input as string parameter (the expression)
	input = removeWhiteSpace(input);	//removes white space in the expression
	input = removeBrackets(input);		//removes outer excess brackets in the expression

	//checks addition and subtraction
	for (unsigned int i=0; i<input.length(); i++) {	//for each character in the expression
		char b = '0';		//placeholder for b when i = 0
		if (i > 0)
			b = input.at(i-1);	//b is the character before c
		char c = input.at(i);	//c is the current character being looked at in the expression
		if (c == '(' )			//if c is an open bracket,
			openBrackets++;		//add one to openBrackets.
		else if (c == ')' )		//if c is a closed bracket,
			closedBrackets++;	//add one to closedBrackets.
		else if ((c == '+' || (c == '-' && b != '(')) && openBrackets == closedBrackets) {	//if c is operator + or - and number of '(' == number of ')',
			splitIndex = i;		//sets splitIndex to the index of the operator.
		}
	}

	//checks multiplication and division
	if (splitIndex == 0) {		//if there are no more + or - operators, looks for * or /
		for (unsigned int i=0; i<input.length(); i++) {
			char c = input.at(i);
			if (c == '(' )
				openBrackets++;
			else if (c == ')' )
				closedBrackets++;
			else if ((c == '*' || c == '/') && openBrackets == closedBrackets)	//if c is operator * or / and number of brackets are equal,
				splitIndex = i;		//sets splitIndex to the index of the operator
		}
	}
}
示例#4
0
uint32_t transfer(char **arguments, assembler *instState,table_t *t){
 int P_Bit;
 char *Rd = arguments[0];
 char *address = arguments[1];
 uint32_t rd = getConst(Rd);
 int addrlen = strlen(address);

 if(*address == '='){
  //numeric constant;
  int val = getConst(address);

  if(val <= 0xFF){
   //mov instruction;
   isMov = 1;
   char **inst = malloc(sizeof(char*)*3);
   for(int i=0; i<3; i++){
	inst[i] = malloc(sizeof(char)*20);
   }
   strcpy(inst[0],"mov");
   strcpy(inst[1],Rd);
   strcpy(inst[2],(address+1));
   inst[2] = prepend(inst[2],'#');
   return ass_data_process(inst,t);

  }else{
   strip(arguments[1]);
   insertExpression(instState->BigVals,arguments[1],val,instState->counter);
   rd <<= 12;
   uint32_t val_mask = 0xE59F0000;
   return val_mask | rd;

  }
 }
 char **splitAddress = tokeniser(address,",");

 if(address[0] == '[' && address[4] != ']' && address[3] != ']'){
  //PRE instruction;
  P_Bit = 1;
  char *pre_address = removeBrackets(address);
  char **expression = tokeniser(pre_address,".");
  uint32_t rn = getConst(expression[0]);
  uint32_t transfer_mask1 = 0xE5900000;
  uint32_t incVal = getConst(expression[1]);
  uint32_t offset = incVal; //TODO: ONCE MOV is fixed replace this with the val generated by mov
  rn <<= 16;
  rd <<= 12;
  return transfer_mask1 | rn | rd | offset;

 }else if(addrlen <= 5){
  //PRE instruction;
  P_Bit = 1;
  char *Rn = removeBrackets(splitAddress[0]);
  uint32_t rn = getConst(Rn);
  uint32_t transfer_mask2 = 0xE5900000;
  rn <<= 16;
  rd <<= 12;
  return transfer_mask2 | rn | rd;

 }else{
  //Post instruction;
  P_Bit = 0;
  uint32_t transfer_mask3 = 0xE6900000;
  char **expression = tokeniser(address,".");
  uint32_t rn = getConst(removeBrackets(expression[0]));
  uint32_t offset = getConst(expression[1]);
  rn <<= 16;
  rd <<= 12;
  return transfer_mask3 | rn | rd | offset;
 }
}
MP3Data * MP3DataGenerator::readMetadata( const char * p_filePath)
{
	// Set up file connection.
	myID3_Tag = new ID3_Tag();
	myID3_Tag->Link( p_filePath);

	// Storage with default initialization.
	MP3Data * myMP3Data = new MP3Data();
	myMP3Data->setAll( "<undefinded>");

	// Retrieve metadata.
	ID3_Tag::Iterator * tagIter = myID3_Tag->CreateIterator();
	ID3_Frame * myFrame = NULL;
	while( NULL != ( myFrame = tagIter->GetNext()))
	{			
		if( NULL != myFrame)
		{			
			ID3_Field * myField = myFrame->GetField( ID3FN_TEXT);
			// Check if current frame is part of the set aka a field of interest.
			std::set<ID3_FrameID>::iterator current = interestingID3_FrameIDs->find( myFrame->GetID());
			if ( NULL != myField && current != interestingID3_FrameIDs->end())
			{
				ID3_FrameID_LUT * myLUT = new ID3_FrameID_LUT();
				std::string frameRealname = std::string( myLUT->getRealname( myFrame->GetID()));
				// @TODO Show encoding in gui (optional)
				if( myField->GetEncoding() == ID3TE_ASCII || ID3TE_ISO8859_1)
				{
					encoding += frameRealname + ": ISO8859_1 , ";
					// Genre needs to be converted.
					if( myFrame->GetID() == ID3FID_CONTENTTYPE) // ID3_FrameID = 32
					{
						const char * genre = myField->GetRawText();
						// ID3V1 genre has is an int surrounded by round brackets; ID3V2 genre is text.
						unsigned int genreIntegerAlias = removeBrackets( genre);
						if( genreIntegerAlias < ID3_NR_OF_V1_GENRES && genre[0] == '(')
							myMP3Data->setGenre( ID3_v1_genre_description[ genreIntegerAlias]);
						else 
							myMP3Data->setGenre( genre);
					}
					// All other tags.
					else if( myFrame->GetID() == ID3FID_TITLE)
						myMP3Data->setTitle( myField->GetRawText());
					else if( myFrame->GetID() == ID3FID_ALBUM)
						myMP3Data->setAlbum( myField->GetRawText());
					else if( myFrame->GetID() == ID3FID_YEAR)
						myMP3Data->setYear( myField->GetRawText());
					else if( myFrame->GetID() == ID3FID_TRACKNUM)
						myMP3Data->setTracknumber( myField->GetRawText());
					else if( myFrame->GetID() == ID3FID_LEADARTIST)
						myMP3Data->setArtist( myField->GetRawText());
				}
				else if( myField->GetEncoding() == ID3TE_UTF8)
				{
					encoding += frameRealname + ": utf8 , ";
					myMP3Data->setAll( "<unicode utf8 encoding>");
				}
				else if( myField->GetEncoding() == ID3TE_UNICODE || ID3TE_UTF16)
				{
					encoding += frameRealname + ": utf16 ,";
					// @TODO Conversion to std::string ... myField->GetRawUnicodeText();
					myMP3Data->setAll( "<unicode utf16 encoding>");
				}
				else if( myField->GetEncoding() == ID3TE_UTF16BE)
				{
					encoding += frameRealname + ": utf16be , ";
					myMP3Data->setAll( "<unicode utf16be encoding>");
				}
				else if( myField->GetEncoding() == ID3TE_NUMENCODINGS)
				{
					encoding += frameRealname + ": numencodings , ";
					myMP3Data->setAll( "<numencoding>");
				}
				else
				{
					encoding += frameRealname + ": unknown , ";
					myMP3Data->setAll( "<<unknown encoding>");
				}
			}
		}
	}
	// Retrieve file path and file name.
	myMP3Data->setFilepath( p_filePath);
	myMP3Data->setFilename( getFilename( p_filePath).c_str());
	return myMP3Data;
}