xref: /386bsd/usr/src/usr.bin/groff/include/search.h (revision a2142627)
1 // -*- C++ -*-
2 /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3      Written by James Clark (jjc@jclark.com)
4 
5 This file is part of groff.
6 
7 groff is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11 
12 groff is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License along
18 with groff; see the file COPYING.  If not, write to the Free Software
19 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20 
21 struct search_item;
22 struct search_item_iterator;
23 
24 class search_list {
25 public:
26   search_list();
27   ~search_list();
28   void add_file(const char *fn, int silent = 0);
29   int nfiles() const;
30 private:
31   search_item *list;
32   int niterators;
33   int next_fid;
34   friend class search_list_iterator;
35 };
36 
37 struct bmpattern;
38 
39 class linear_searcher {
40   const char *ignore_fields;
41   int truncate_len;
42   bmpattern **keys;
43   int nkeys;
44   const char *search_and_check(const bmpattern *key, const char *buf,
45 			       const char *bufend, const char **start = 0)
46     const;
47   int check_match(const char *buf, const char *bufend, const char *match,
48 		  int matchlen, const char **cont, const char **start)
49     const;
50 public:
51   linear_searcher(const char *query, int query_len,
52 		  const char *ign, int trunc);
53   ~linear_searcher();
54   int search(const char *buf, const char *bufend,
55 	     const char **startp, int *lengthp) const;
56 };
57 
58 class search_list_iterator {
59   search_list *list;
60   search_item *ptr;
61   search_item_iterator *iter;
62   char *query;
63   linear_searcher searcher;
64 public:
65   search_list_iterator(search_list *, const char *query);
66   ~search_list_iterator();
67   int next(const char **, int *, reference_id * = 0);
68 };
69 
70 class search_item {
71 protected:
72   char *name;
73   int filename_id;
74 public:
75   search_item *next;
76   search_item(const char *nm, int fid);
77   virtual search_item_iterator *make_search_item_iterator(const char *) = 0;
78   virtual ~search_item();
79   int is_named(const char *) const;
80   virtual int next_filename_id() const;
81 };
82 
83 class search_item_iterator {
84   char shut_g_plus_plus_up;
85 public:
86   virtual ~search_item_iterator();
87   virtual int next(const linear_searcher &, const char **ptr, int *lenp,
88 		   reference_id *) = 0;
89 };
90 
91 search_item *make_index_search_item(const char *filename, int fid);
92 search_item *make_linear_search_item(int fd, const char *filename, int fid);
93 
94 extern int linear_truncate_len;
95 extern const char *linear_ignore_fields;
96 extern int verify_flag;
97