Ejemplo n.º 1
0
Char Fsm::Translate(Char c) const
{
	if (!m_sparsed || c == Epsilon)
		return c;
	else
		return Letters().Representative(c);
}
QString CSmfCredMgrClientSymbian::generateNONCE(const qint64 Length)
	{
	srand(time(0));
	QDateTime UniqueNumber = QDateTime::currentDateTime();

	//read upto milliseconds
	QString RetString(UniqueNumber.toString("hh:mm:ss.zzz"));

	QString Letters(
			"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");

	//append a randomly generated string to RetString
	for (int i = RetString.count(); i < Length; i++)
		{
		RetString.insert((i), Letters.at(rand() % Letters.size()));
		}

	return RetString;
	}
Ejemplo n.º 3
0
void Fsm::DumpState(yostream& s, size_t state) const
{
	// Fill in a 'row': Q -> exp(V) (for current state)
	yvector< ybitset<MaxChar> > row(Size());
	for (TransitionRow::const_iterator rit = m_transitions[state].begin(), rie = m_transitions[state].end(); rit != rie; ++rit)
		for (StatesSet::const_iterator sit = rit->second.begin(), sie = rit->second.end(); sit != sie; ++sit) {
			if (*sit >= Size()) {
				std::cerr << "WTF?! Transition from " << state << " on letter " << rit->first << " leads to non-existing state " << *sit << "\n";
				YASSERT(false);
			}
			if (Letters().Contains(rit->first)) {
				const yvector<Char>& letters = Letters().Klass(Letters().Representative(rit->first));
				for (yvector<Char>::const_iterator lit = letters.begin(), lie = letters.end(); lit != lie; ++lit)
					row[*sit].set(*lit);
			} else
				row[*sit].set(rit->first);
		}

	bool statePrinted = false;
	// Display each destination state
	for (yvector< ybitset<MaxChar> >::iterator rit = row.begin(), rie = row.end(); rit != rie; ++rit) {
		unsigned begin = 0, end = 0;

		ystring delimiter;
		ystring label;
		if (rit->test(Epsilon)) {
			label += delimiter + CharDump(Epsilon);
			delimiter = " ";
		}
		if (rit->test(BeginMark)) {
			label += delimiter + CharDump(BeginMark);
			delimiter = " ";
		}
		if (rit->test(EndMark)) {
			label += delimiter + CharDump(EndMark);
			delimiter = " ";
		}
		unsigned count = 0;
		for (unsigned i = 0; i < 256; ++i)
			if (rit->test(i))
				++count;
		if (count != 0 && count != 256) {
			label += delimiter + "[";
			bool complementary = (count > 128);
			if (count > 128)
				label += "^";
			while (begin < 256) {
				for (begin = end; begin < 256 && (rit->test(begin) == complementary); ++begin)
					;
				for (end = begin; end < 256 && (rit->test(end) == !complementary); ++end)
					;
				if (begin + 1 == end) {
					label += CharDump(begin);
					delimiter = " ";
				} else if (begin != end) {
					label += CharDump(begin) + "-" + (CharDump(end-1));
					delimiter = " ";
				}
			}
			label += "]";
			delimiter = " ";
		} else if (count == 256) {
			label += delimiter + ".";
			delimiter = " ";
		}
		if (!label.empty()) {
			if (!statePrinted) {
				s << "    " << state << "[shape=\"" << (IsFinal(state) ? "double" : "") << "circle\",label=\"" << state;
				Tags::const_iterator ti = tags.find(state);
				if (ti != tags.end())
					s << " (tags: " << ti->second << ")";
				s << "\"]\n";
				if (Initial() == state)
					s << "    \"initial\" -> " << state << '\n';
				statePrinted = true;
			}
			s << "    " << state << " -> " << std::distance(row.begin(), rit) << "[label=\"" << label;

			// Display outputs
			Outputs::const_iterator oit = outputs.find(state);
			if (oit != outputs.end()) {
				Outputs::value_type::second_type::const_iterator oit2 = oit->second.find(std::distance(row.begin(), rit));
				if (oit2 == oit->second.end())
					;
				else {
					yvector<int> payload;
					for (unsigned i = 0; i < sizeof(oit2->second) * 8; ++i)
						if (oit2->second & (1ul << i))
							payload.push_back(i);
					if (!payload.empty())
						s << " (outputs: " << Join(payload.begin(), payload.end(), ", ") << ")";
				}
			}

			s << "\"]\n";
		}
	}

	if (statePrinted)
		s << '\n';
}
Ejemplo n.º 4
0
 Letters idString() const {
   return Letters(12, _idString);
 }
Ejemplo n.º 5
0
void Fsm::DumpState(yostream& s, size_t state) const
{
	s << "    ";

	// Fill in a 'row': Q -> exp(V) (for current state)
	yvector< ybitset<MaxChar> > row(Size());
	for (TransitionRow::const_iterator rit = m_transitions[state].begin(), rie = m_transitions[state].end(); rit != rie; ++rit)
		for (StatesSet::const_iterator sit = rit->second.begin(), sie = rit->second.end(); sit != sie; ++sit) {
			if (*sit >= Size()) {
				std::cerr << "WTF?! Transition from " << state << " on letter " << rit->first << " leads to non-existing state " << *sit << "\n";
				YASSERT(false);
			}
			if (Letters().Contains(rit->first)) {
				const yvector<Char>& letters = Letters().Klass(Letters().Representative(rit->first));
				for (yvector<Char>::const_iterator lit = letters.begin(), lie = letters.end(); lit != lie; ++lit)
					row[*sit].set(*lit);
			} else
				row[*sit].set(rit->first);
		}

	// Display each destination state
	for (yvector< ybitset<MaxChar> >::iterator rit = row.begin(), rie = row.end(); rit != rie; ++rit) {
		unsigned begin = 0, end = 0;

		bool empty = true;
		if (rit->test(Epsilon)) {
			s << "<Epsilon> ";
			empty = false;
		}
		if (rit->test(BeginMark)) {
			s << "<Begin> ";
			empty = false;
		}
		if (rit->test(EndMark)) {
			s << "<End> ";
			empty = false;
		}
		while (begin < 256) {
			for (begin = end; begin < 256 && !rit->test(begin); ++begin)
				;
			for (end = begin; end < 256 && rit->test(end); ++end)
				;
			if (begin + 1 == end) {
				s << CharDump(begin);
				empty = false;
			} else if (begin != end) {
				s << CharDump(begin) << ".." << (CharDump(end-1));
				empty = false;
			}
			if (!empty)
				s << " ";
		}
		if (!empty) {
			s << " => " << std::distance(row.begin(), rit);

			// Display outputs
			Outputs::const_iterator oit = outputs.find(state);
			if (oit != outputs.end()) {
				Outputs::value_type::second_type::const_iterator oit2 = oit->second.find(std::distance(row.begin(), rit));
				if (oit2 == oit->second.end())
					;
				else {
					yvector<int> payload;
					for (unsigned i = 0; i < sizeof(oit2->second) * 8; ++i)
						if (oit2->second & (1ul << i))
							payload.push_back(i);
					if (!payload.empty())
						s << "[" << Join(payload.begin(), payload.end(), ", ") << "]";
				}
			}
			s << "\n    ";
		}
	}
	if (Initial() == state)
		s << "[initial] ";
	if (IsFinal(state))
		s << "[final] ";
	Tags::const_iterator ti = tags.find(state);
	if (ti != tags.end())
		s << "[tags: " << ti->second << "] ";
	s << "\n";
}