#ifndef	_SEARCH_H_
#define	_SEARCH_H_

#import <regex.h>
#import <stdio.h>
#import "text/egrep.h"

extern char *foundWord;			/* word previously found by findWord */
extern int binarySearchIgnoreCase;

#define bm_table_size		256

typedef struct bm_machine	{
	unsigned short	plength;
	unsigned short	skiptab[bm_table_size];
	char		casemap[bm_table_size];
	char		pattern[0];
} bm_machine;

/* functions for matching regular expressios */
extern char *re_match_within(char *s, struct regex *re);
extern char *re_match_prefix(char *s, struct regex *re);
extern char *re_match_word(char *s, struct regex *re);
extern char *re_match_exactly(char *s, struct regex *re);
extern char *re_search(int fd, char *context, 
	char *(*routine)(char *, struct regex *), struct regex *re);

/* functions for string matching */
extern bm_machine *bm_compile(char *s, int ignore_case);
extern char *bm_match(char *s, int slength, bm_machine *machine);
extern char *bm_match_prefix(char *s, int slength, bm_machine *machine);
extern char *bm_match_word(char *s, int slength, bm_machine *machine);
extern char *bm_match_exactly(char *s, int slength, bm_machine *machine);
extern char *bm_search(int fd, char *context, 
	char *(*routine)(char *, int, bm_machine *), bm_machine *machine);

/* functions for binary searching sorted files */
extern BSbcompare(char *s, char *t);
extern BSfcompare(char *s, char *t);
extern char *BinarySearch(FILE *f, char *word);
extern char *binarySearch(FILE *f, char *word, 
	char *s, int s_len, int (*compare)(char *, char *));
extern long refOffset(char *s);
extern long findWord(FILE *f, char *word);

/* ancillary searching functions */
extern char *isFunctionWord(char *s);


#endif

