swish.h
上传用户:qin5330
上传日期:2007-01-05
资源大小:114k
文件大小:14k
源码类别:

搜索引擎

开发平台:

Perl

  1. /*
  2. ** Copyright (C) 1995, 1996, 1997, 1998 Hewlett-Packard Company
  3. ** Originally by Kevin Hughes, kev@kevcom.com, 3/11/94
  4. **
  5. ** This program and library is free software; you can redistribute it and/or
  6. ** modify it under the terms of the GNU (Library) General Public License
  7. ** as published by the Free Software Foundation; either version 2
  8. ** of the License, or any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU (Library) General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU (Library) General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18. **-------------------------------------------------
  19. ** Added support for METADATA
  20. ** G. Hill  ghill@library.berkeley.edu   3/18/97
  21. **
  22. ** Added Document Properties support
  23. ** Mark Gaulin gaulin@designinfo.com  11/24/98
  24. */
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <math.h>
  28. #include <sys/types.h>
  29. #include <sys/stat.h>
  30. #include <locale.h>
  31. #include <ctype.h>
  32. #include "config.h"
  33. #ifdef NEXTSTEP
  34. #include <sys/dir.h>
  35. #else
  36. #ifdef _WIN32
  37. #include "win32/dirent.h"
  38. #else    
  39. #include <dirent.h>
  40. #endif
  41. #endif
  42. #include <ctype.h>
  43. #include <stdlib.h>
  44. #include <time.h>
  45. #include <setjmp.h>
  46. #ifndef _WIN32
  47. #include <regex.h>
  48. #else
  49. #include "Win32regex.h"
  50. #endif
  51. #define VERSION "1.3"
  52. #define INDEXHEADER "# SWISH format 1.3"
  53. #define INDEXVERSION "# Swish-e format 1.3"
  54. #define INDEXFILE "index.swish-e"
  55. #define STEMMINGHEADER "# Stemming Applied:"
  56. #define MAXFILELEN 1000
  57. #define MAXSTRLEN 2000
  58. #define MAXWORDLEN 1000
  59. #define MAXTITLELEN 200
  60. #define MAXSUFFIXLEN 10
  61. #define MAXENTLEN 10
  62. #define HASHSIZE 101
  63. #define BIGHASHSIZE 1009
  64. #define MAXPAR 10
  65. #define MAXCHARDEFINED 200
  66. #define TI_OPEN 1
  67. #define TI_CLOSE 2
  68. #define TI_FOUND 4
  69. #define NOWORD "thisisnotaword"
  70. #define SECSPERMIN 60
  71. #define NO_RULE 0
  72. #define AND_RULE 1
  73. #define OR_RULE 2
  74. #define NOT_RULE 3
  75. #define IN_FILE 1
  76. #define IN_TITLE 2
  77. #define IN_HEAD 4
  78. #define IN_BODY 8
  79. #define IN_COMMENTS 16
  80. #define IN_HEADER 32
  81. #define IN_EMPHASIZED 64
  82. #define IN_ALL 127
  83. #define MAXLONGLEN 16
  84. #define MAXCHARS 135
  85. #define MAXHEADCHARS MAXLONGLEN * MAXCHARS
  86. #define METANAMEPOS MAXCHARS - 4
  87. #define STOPWORDPOS MAXCHARS - 3
  88. #define FILELISTPOS MAXCHARS - 2
  89. #define FILEOFFSETPOS MAXCHARS - 1
  90. /*
  91.  * This structure defines all of the functions that need to
  92.  * be implemented to an Indexing Data Source.
  93.  * Right now there are two Indexing Data Source types:
  94.  *  file-system based and an HTTP web crawler.
  95.  * Any Data Source can be created as long as all of the
  96.  * functions below are properly initialized.
  97.  */
  98. struct _indexing_data_source_def
  99. {
  100.   const char* IndexingDataSourceName;            /* long name for data source */
  101.   const char* IndexingDataSourceId;             /* short name for data source */
  102.   void (*indexpath_fn)(char *path); /* routine to index a "path" */
  103.   int (*vgetc_fn)(void *vp); /* get char from "file" */
  104.   int (*vsize_fn)(void *vp); /* get size of "file" */
  105.   int (*parseconfline_fn)(char *line); /* parse config file lines */
  106. };
  107. #ifdef SUPPORT_DOC_PROPERTIES
  108. struct docPropertyEntry 
  109. {
  110. int metaName; /* meta field identifier; from getMetaName() */
  111. char *propValue; /* string from META's CONTENTS attribute */
  112. struct docPropertyEntry *next;
  113. };
  114. #else
  115. struct docPropertyEntry { int x; }; /* bogus, unused structure */
  116. #endif
  117. struct metaEntry {
  118. char* metaName;
  119. int index;
  120. #ifdef SUPPORT_DOC_PROPERTIES
  121. /* is this meta field a Document Property? */
  122. char isDocProperty; /* true is doc property */
  123. char isOnlyDocProperty; /* true if NOT an indexable meta tag (ie: not in MetaNames) */
  124. #endif
  125. struct metaEntry* next;
  126. };
  127. struct sortresult {
  128. char *fileinfo;
  129. int rank;
  130. #ifdef SUPPORT_DOC_PROPERTIES
  131. /* file position where this document's properties are stored */
  132. long propPos;
  133. #endif
  134. struct sortresult *left;
  135. struct sortresult *right;
  136. };
  137. struct result {
  138. int filenum;
  139. int rank;
  140. int structure;
  141. struct result *next;
  142. };
  143. struct file {
  144. char *filename;
  145. char *title;
  146. int size;
  147. #ifdef SUPPORT_DOC_PROPERTIES
  148. struct docPropertyEntry* docProperties;
  149. #endif SUPPORT_DOC_PROPERTIES
  150. struct file *next;
  151. };
  152. struct filenum {
  153. int fileshort;
  154. long filelong;
  155. struct filenum *next;
  156. };
  157. struct location {
  158. int filenum;
  159. int frequency;
  160. int emphasized;
  161. int structure;
  162. int metaName;
  163. struct location *next;
  164. };
  165. struct entry {
  166. char *word;
  167. int tfrequency;
  168. struct location *locationlist;
  169. struct entry *left;
  170. struct entry *right;
  171. };
  172. struct sortentry {
  173. char *filename;
  174. char *title;
  175. struct sortentry *left;
  176. struct sortentry *right;
  177. };
  178. struct swline {
  179. char *line;
  180. struct swline *next;
  181. };
  182. struct fwordtotal {
  183. int filenum;
  184. int totalwords;
  185. struct fwordtotal *next;
  186. };
  187. #ifndef MAIN_FILE
  188. #define VAR extern
  189. #else
  190. #define VAR
  191. #endif
  192. VAR struct _indexing_data_source_def *IndexingDataSource;
  193. VAR struct file *filelist;
  194. VAR struct entry *entrylist;
  195. VAR struct swline *replacelist;
  196. VAR struct swline *searchwordlist;
  197. VAR struct swline *nocontentslist;
  198. VAR struct swline *dirlist;
  199. VAR struct swline *indexlist;
  200. VAR struct swline *hashstoplist[HASHSIZE];
  201. VAR char *stopList[HASHSIZE];
  202. VAR struct result *resulthashlist[HASHSIZE];
  203. VAR struct fwordtotal *fwordtotals[BIGHASHSIZE];
  204. VAR struct filenum *filehashlist[BIGHASHSIZE];
  205. VAR struct metaEntry* metaEntryList;
  206. VAR long offsets[MAXCHARS];
  207. VAR char wordchars[MAXCHARDEFINED];
  208. VAR char beginchars[MAXCHARDEFINED];
  209. VAR char endchars[MAXCHARDEFINED];
  210. VAR char ignorelastchar[MAXCHARDEFINED];
  211. VAR char ignorefirstchar[MAXCHARDEFINED];
  212. VAR int verbose;
  213. VAR int minwordlimit;
  214. VAR int maxwordlimit;
  215. VAR int bigrank;
  216. VAR int maxhits;
  217. VAR int totalwords;
  218. VAR int followsymlinks;
  219. VAR int commonerror;
  220. VAR int stopPos;
  221. VAR int indexComments;
  222. VAR int applyStemmingRules; /* added 11/24/98 - MG */
  223. VAR int useCustomOutputDelimiter; /* added 11/24/98 - MG */
  224. VAR char customOutputDelimiter[MAXSTRLEN]; /* added 11/24/98 - MG */
  225. VAR int ignoreTotalWordCountWhenRanking; /* added 11/24/98 - MG */
  226. VAR char indexn[MAXSTRLEN];
  227. VAR char indexd[MAXSTRLEN];
  228. VAR char indexp[MAXSTRLEN];
  229. VAR char indexa[MAXSTRLEN];
  230. VAR char errorstr[MAXSTRLEN];
  231. #ifdef MAIN_FILE
  232. char *indexchars ="abcdefghijklmnopqrstuvwxyz懒旅呐魄壬仕掏蜗醒矣哉重寠仝圮轃捺徕沅彐玷殛腱眍镳耱篝貊鴾氝