Пример #1
0
list* SearchSignatureDatabase(signature_db* SignatureDatabase, trie_unit* Data, size_t DataSize)
{
  size_t NumMatches;
  if (!SignatureDatabase || !Data || !DataSize)
   return NULL;

  if (!SignatureDatabase->SearchMachine)
    return NULL;

  match* Matches = FindMatches(SignatureDatabase->SearchMachine, Data, DataSize, &NumMatches);

  // Translate signature identifiers to signatures
  list* MatchingSignatures = NULL;
  for (size_t MatchIndex = 0; MatchIndex < NumMatches; ++MatchIndex)
  {
    list* MatchList = Matches[MatchIndex].List;
    for (; MatchList; MatchList = MatchList->Next)
    {
      for (size_t SignatureDatabaseIndex = 0; SignatureDatabaseIndex < SignatureDatabase->SignatureCount; ++SignatureDatabaseIndex)
      {
        if (memcmp(SignatureDatabase->Signatures[SignatureDatabaseIndex]->Data,
              MatchList->Value,
              SignatureDatabase->Signatures[SignatureDatabaseIndex]->DataSize) == 0)
        {
          if (!MatchingSignatures)
            AllocateAndInitializeListHead(&MatchingSignatures, SignatureDatabase->Signatures[SignatureDatabaseIndex]);
          else
            UniqAppendToList(MatchingSignatures, SignatureDatabase->Signatures[SignatureDatabaseIndex]);
        }
      }
    }
  }

  return MatchingSignatures;
}
Пример #2
0
int InitializeSearchMachine(search_machine* SearchMachine, trie* Trie)
{
  SearchMachine->Trie = Trie;

  // For each keyword in the keyword tree, set out(Node-For-Keyword) = {Keyword}
  size_t TerminalCount;
  trie** Terminals = GatherTerminals(Trie, &TerminalCount);

  // Each state has an out (set of patterns recognized upon entering it
  // out :: Map StateID [String]
  SearchMachine->Out = xcalloc(GetTrieCount(), sizeof(list*));
  for (size_t TerminalIndex = 0; TerminalIndex < TerminalCount; ++TerminalIndex)
  {
    size_t DataLength;
    size_t TerminalIdentifier = Terminals[TerminalIndex]->Identifier;
    trie_unit* DataUpToNode = GetDataString(Terminals[TerminalIndex], &DataLength);
    Assert(DataUpToNode != NULL, "ISM1");
    AllocateAndInitializeListHead(&(SearchMachine->Out[TerminalIdentifier]), DataUpToNode);
  }

  SearchMachine->Fail = xcalloc(GetTrieCount(), sizeof(trie *));

  // goto :: Map (StateID, Symbol) StatePtr
  SearchMachine->Goto = xcalloc(sizeof(void *), GetTrieCount());

  // Copy over trie links into goto
  for (size_t TrieIndex = 0; TrieIndex < GetTrieCount(); TrieIndex++)
  {
    SearchMachine->Goto[TrieIndex] = xcalloc(sizeof(trie*), UNIT_CARDINALITY);
    trie* TrieToCopy = FindInTrieByIdentifier(Trie, TrieIndex);
    memcpy(SearchMachine->Goto[TrieIndex], TrieToCopy->Children, sizeof(trie*) * UNIT_CARDINALITY);
  }

  // g(ROOT, a) := ROOT forall a in SIGMA where a doesn't leave ROOT
  for (size_t AlphabetIndex = 0; AlphabetIndex < UNIT_CARDINALITY; ++AlphabetIndex)
  {
    if (Trie->Children[AlphabetIndex] == NULL)
    {
      SearchMachine->Goto[ROOT_IDENTIFIER][AlphabetIndex] = Trie;
    }
  }

  return 0;
}