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; }
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'; }
Letters idString() const { return Letters(12, _idString); }
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"; }