static void TestCreateSet(void) // A routine to test the set creation and deletion code. // It compares the newly created set against a set called // "DefaultLocationForMoreSCFTest" to ensure that the set // created by MoreSCF matches a set created by the control // panel. { OSStatus err; OSStatus err2; CFStringRef newSetID; CFStringRef templateSetID; newSetID = NULL; templateSetID = NULL; err = MoreSCFindSetByUserVisibleNameAndCopyID(CFSTR(kDefaultLocationName), &templateSetID); if (err != noErr || templateSetID == NULL) { fprintf(stderr, "*** TestCreateSet requires that you create a default set named '%s' using the Network preferences panel.\n", kDefaultLocationName); err = -1; } if (err == noErr) { err = MoreSCNewSet(CFSTR("Frog"), &newSetID); } if (err == noErr) { if (!gRunQuiet) { fprintf(stderr, "New set ID is "); CFShow(newSetID); } err = CompareSets(newSetID, templateSetID); err2 = MoreSCDeleteSet(newSetID); if (err == noErr) { err = err2; } } CFQRelease(newSetID); CFQRelease(templateSetID); PrintTestResult(err, NULL); }
// Subset Construction for converting a Nondeterministic Finite Automaton (NFA) to a Deterministic Finite Automaton (DFA) // algorithm from book Compilers Principles and Tools: by Alfred V.Aho, Ravi Sethi and Jeffrey D. Ullman void dDeterministicFiniteAutonata::CreateDeterministicFiniteAutomaton (const dNonDeterministicFiniteAutonata& nfa) { if (nfa.IsValid()) { dTree<int, int> symbolsList; dList<dAutomataState*> stateArray; nfa.GetStartState()->GetStateArray(stateArray); for (dList<dAutomataState*>::dListNode* node = stateArray.GetFirst(); node; node = node->GetNext()) { dAutomataState* const state = node->GetInfo(); for (dList<dAutomataState::dTransition>::dListNode* transitionNode = state->m_transtions.GetFirst(); transitionNode; transitionNode = transitionNode->GetNext()) { dAutomataState::dTransition& transition = transitionNode->GetInfo(); dAutomataState::dCharacter ch (transition.GetCharater()); if (ch.m_symbol) { symbolsList.Insert(ch.m_symbol, ch.m_symbol); } } } dTree<dAutomataState*,dAutomataState*> NFAmap; dTree<dAutomataState*,dAutomataState*> subSet; int stateID = 0; NFAmap.Insert(nfa.GetStartState(), nfa.GetStartState()); dAutomataState* stackPool[2048]; EmptyTransitionClosure (NFAmap, subSet); // dAutomataState* const startState = new dAutomataState(subSet, stateID ++); dAutomataState* const startState = CreateTargetState(subSet, stateID ++); dList<dAutomataState*> newStatesList; int stack = 1; stackPool[0] = startState; newStatesList.Append(startState); while (stack) { stack --; dAutomataState* const state = stackPool[stack]; dTree<int, int>::Iterator iter (symbolsList); for (iter.Begin(); iter; iter ++) { int ch = iter.GetNode()->GetInfo(); dTree<dAutomataState*,dAutomataState*> moveSet; MoveSymbol (ch, state, moveSet); if (moveSet.GetCount()) { dTree<dAutomataState*,dAutomataState*> subSet; EmptyTransitionClosure (moveSet, subSet); dAutomataState* foundState = NULL; for (dList<dAutomataState*>::dListNode* node = newStatesList.GetFirst(); node; node = node->GetNext()) { dAutomataState* const state = node->GetInfo(); dAssert (state); if (CompareSets(state->m_myNFANullStates, subSet)) { foundState = state; break; } } if (foundState) { state->m_transtions.Append(dAutomataState::dTransition(ch, foundState)); } else { dAutomataState* const targetState = CreateTargetState(subSet, stateID ++); stackPool[stack] = targetState; stack ++; dAssert (stack < sizeof (stackPool)/sizeof (stackPool[0])); newStatesList.Append(targetState); state->m_transtions.Append(dAutomataState::dTransition(ch, targetState)); } } } } m_startState = startState; CopySet (nfa); } }