summaryrefslogtreecommitdiffstats
path: root/src/searchindex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/searchindex.cpp')
-rw-r--r--src/searchindex.cpp124
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;
+}