Home > Java > javaTutorial > Java implements reading the index file of Doxygen query function

Java implements reading the index file of Doxygen query function

巴扎黑
Release: 2016-11-29 11:29:36
Original
1290 people have browsed it

The front-end of Doxygen’s Search function is implemented using search.php. I use java instead of php,

* @author tyrone

*

* TODO To change the template for this generated type comment go to

* Window - Preferences - Java - Code Style - Code Templates


Using Doxygen to generate source code documents requires a configuration file. There is a search option in the configuration file:

#------------------ -------------------------------------------------- -------

# Configuration::additions related to the search engine

#------------------------------ ------------------------------------------------

SEARCHENGINE = YES

If YES, the search.idx index file and search.php query interface will be generated when generating documents.


search.php will use the string to be queried as an input parameter to call the query function search($file,$word,&$statsList) implemented in php

I translated this method and other methods called by this method into java language , as follows:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.TreeMap;
import java.util.ArrayList;
import java.util. StringTokenizer;
/**Read search.idx*/
public class Search {
/**
* Query
* @param word
* @param statsList
* @return
*/
public Search(File fp){
String content="";
try{
BufferedInputStreamIn = new BufferedInputStream(new FileInputStream( fp ));
int len=In.available();
this.Content=new byte[len];
In.read(this.Content);
Scontent=new String(this.Content);
} catch(Exception ex){
ex.printStackTrace();
}
this.Scontent=new String(this.Content);
//this.Content=content.getBytes();
}
private byte[] Content;

private String Scontent;

private int Index;

private void setIndex(int ​​index){
this.Index=index;
}

private int getIndex(){
return this.Index;
}

private byte[] getContent(){
return this.Content;
}
private String getScontent(){
return this.Scontent;
}
/**&*/
public ArrayList Searching(String word,ArrayList statsList) {
this.setIndex(computeIndex(word));

TreeMap stat=new TreeMap();
int start=0;
int count=0;
byte[] buf=new byte[4];
if (this .getIndex()!=-1) // found a valid index
{
int totalHi=0;
int totalFreqHi=0;
int totalFreqLo=0;

//read 4 bytes skip header
int index=readInt( this.getIndex()*4+4);
//int index=readInt(8,this.getIn());
if (index>0){// found words matching the hash key
start=statsList.size ();
count=start;
String w=readString(index);
while (w.length()!=0){
int statIdx = readInt(this.getIndex());
if (w.compareTo( word)>=0){
// found word that matches (as substring)
stat.put("word",word);
stat.put("match",w);
stat.put("index ",new Integer(statIdx));
if (w.length()==word.length())
stat.put("full","true");
else
stat.put("full", "false");
statsList.add(stat);
}
w = readString(this.getIndex());
}

for (count=start;count{
TreeMap statInfo = (TreeMap)statsList.get(count);
int multiplier = 1;
// whole word matches have a double weight
String full=(String)statInfo.get("full");
if (full.compareTo("true")==0) multiplier=2;
Integer inte=(Integer)statInfo.get("index");
int numDocs = readInt(inte.intValue());
TreeMap[] docInfo =new TreeMap[numDocs];
// read docs info + occurrence frequency of the word
for (int i=0;i{
int idx=readInt(this.getIndex()); 
int freq=readInt(this.getIndex()); 
docInfo[i]=new TreeMap();
docInfo[i].put("idx",new Integer(idx));
docInfo[i].put("freq",new Integer(freq>>1));
docInfo[i].put("rank",new Double(0.0));
docInfo[i].put("hi",new Integer(freq&1));
if ((freq&1)>0) // word occurs in high priority doc
{
totalHi++;
totalFreqHi+=freq*multiplier;
}
else // word occurs in low priority doc
{
totalFreqLo+=freq*multiplier;
}
}
// read name and url info for the doc
for (int i=0;i{
Integer idx=(Integer)docInfo[i].get("idx");
docInfo[i].put("name",readString(idx.intValue()));
docInfo[i].put("url",readString(this.getIndex()));
}
statInfo.put("docs",docInfo);
}

int totalFreq=(totalHi+1)*totalFreqLo +totalFreqHi;
for (count=start;count{
TreeMap statInfo =(TreeMap)statsList.get(count);
int multiplier = 1;
// whole word matches have a double weight
String full=(String)statInfo.get("full");
if (full.compareTo("true")==0) multiplier=2;
TreeMap[] docInfo=(TreeMap[])statInfo.get("docs");
for (int i=0;i{
// compute frequency rank of the word in each doc
Integer inte=(Integer)docInfo[i].get("freq");
int freq=inte.intValue();
inte=(Integer)docInfo[i].get("hi");
if (inte.intValue()>0){
docInfo[i].put("rank",new Double((freq*multiplier+totalFreqLo)/totalFreq));
}else{
docInfo[i].put("rank",new Double((freq*multiplier)/totalFreq));
}
}
}
}
}
return statsList;
}

private int readInt(int index){

byte[] buf1;
int b1,b2,b3,b4;
try{
b1=this.getContent()[index];
b2=this.getContent()[index+1];
b3=this.getContent()[index+2];
b4=this.getContent()[index+3];

/**After a lot of effort, I found out that the byte converted into ASCII code in Java is 16 bits, while the idx stored in it is 8 bits.*/
b1=b1&0xff;
b2=b2&0xff;
b3=b3&0xff;
b4=b4&0xff;
index=index+4;
this.setIndex(index);
return (b1<<24)|(b2<<16)|(b3<<8)|(b4);
}catch(Exception ex){

}
return -1;
}
private String readString(int index){
String result="";
byte[] re=new byte[60];
int i=0;
byte ind;
while((ind=this.getContent()[index])!=0){
re[i]=ind;
if (i==59){
result=result+new String(re);
i=0;
}else{
i++;
}
index++;
}
result=result+new String(re,0,i);
this.setIndex(++index);
return result;
}
/**

* @param word
* @return
*/
private int computeIndex(String word)
{
int hi;
int lo;
if (word.length()<2) return -1;
// high char of the index
hi =word.charAt(0);
if (hi==0) return -1;
// low char of the index
lo =word.charAt(1);
if (lo==0) return -1;
// return index
return hi*256+lo;
}

/**args[0]=search.idx, args[1]="word1+word2+..." , how to display the statsList results is no longer important.*/

public static void main(String[] args){
Search se=new Search(new File(args[0]));
StringTokenizer st = new StringTokenizer(args[1],"+");
ArrayList result=new ArrayList();
while (st.hasMoreTokens()){
result=se.Searching(st.nextToken(),result);
}
for(int i=0;iTreeMap tm=(TreeMap)result.get(i);
TreeMap[] docs=(TreeMap[])tm.get("docs");
for (int l=0;lSystem.out.println((String)docs[l].get("name"));
System.out.println((String)docs[l].get("url"));
}
}
}
}


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template