diff options
Diffstat (limited to 'src/searchindex.cpp')
-rw-r--r-- | src/searchindex.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/searchindex.cpp b/src/searchindex.cpp new file mode 100644 index 0000000..241d0a8 --- /dev/null +++ b/src/searchindex.cpp @@ -0,0 +1,124 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +#include "searchindex.h" +#include "suffixtree.h" + +SearchIndex::SearchIndex() : refDict(10007), nameIndex(10007) +{ + indexCount=1; + //indexTree = new IndexTree; + suffixTree = new SuffixTree; +} + +SearchIndex::~SearchIndex() +{ + //delete indexTree; + delete suffixTree; +} + +void SearchIndex::addReference(const char *key,const char *ref) +{ + DocRef *dr=new DocRef(indexCount,key,ref); + nameIndex.insert(indexCount,dr); + refList.append(dr); + refDict.insert(key,dr); + indexCount++; +} + +bool SearchIndex::addWord(const char *key,const char *word,bool special) +{ + DocRef *dr=0; + if (word && key && strlen(key)>0 && (dr=refDict[key])) + { + suffixTree->insertWord(((QString)word).lower(),dr->index(),special); + return TRUE; + } + else if (word) + { + printf("SearchIndex::addWord() key `%s' not found!\n",key); + return FALSE; + } + else + { + printf("SearchIndex::addWord() trying to insert word with length 0\n"); + return FALSE; + } +} + +bool SearchIndex::saveIndex(const char *fileName) +{ + QFile f(fileName); + if (!f.open(IO_WriteOnly)) return FALSE; + + // write header + if (f.writeBlock("DOXI",4)!=4) return FALSE; // write header + + // compute forward offsets for all children of each node. + suffixTree->resolveForwardReferences(); + + // compute offset to the reference index table + int offset=suffixTree->size()+9; + + // write the offset + if (writeNumber(f,offset)) return FALSE; + + // write the suffix tree + if (!suffixTree->write(f)) return FALSE; + + f.putch(0); + + // write the index reference table + DocRef *dr=refList.first(); + offset+=refList.count()*4; + while (dr) + { + writeNumber(f,offset); + offset+=strlen(dr->name())+strlen(dr->url())+2; + dr=refList.next(); + } + + // write the references + dr=refList.first(); + while (dr) + { + writeString(f,dr->name()); + writeString(f,dr->url()); + dr=refList.next(); + } + + //printf("Building index tree\n"); + printf("Size of the suffix tree is %d bytes\n",suffixTree->size()); + printf("Number of tree nodes is %d\n",suffixTree->numberOfNodes()); + printf("Number of links %d\n",indexCount); + //suffixTree->buildIndex(); + //printf("Computing reference offsets\n"); + //int offset=suffixTree->size()+8; + //indexTree->setOffsets(&nameIndex); + //printf("Saving suffix tree\n"); + //printf("Saving index tree\n"); + //result&=indexTree->write(f); + //printf("Saving reference list\n"); + //dr=refList.first(); + //while (dr) + //{ + // result&=!writeString(f,dr->name()); + // result&=!writeString(f,dr->url()); + // dr=refList.next(); + //} + //suffixTree->dump(); + return TRUE; +} |