1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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;
}
|