xref: /haiku/src/apps/text_search/Grepper.h (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /*
2  * Copyright (c) 1998-2007 Matthijs Hollemans
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 #ifndef GREPPER_H
6 #define GREPPER_H
7 
8 #include <Messenger.h>
9 
10 class FileIterator;
11 class Model;
12 
13 // Executes "grep" in a background thread.
14 class Grepper {
15 public:
16 								Grepper(const char* pattern, const Model* model,
17 									const BHandler* target,
18 									FileIterator* iterator);
19 	virtual						~Grepper();
20 
21 			bool				IsValid() const;
22 
23 			void				Start();
24 			void				Cancel();
25 
26 private:
27 	// Spawns the real grepper threads.
28 	static	int32				_SpawnRunnerThread(void* cookie);
29 	static	int32				_SpawnWriterThread(void* cookie);
30 
31 	// The threads functions that does the actual grepping.
32 			int32				_RunnerThread();
33 			int32				_WriterThread();
34 
35 	// Remembers, and possibly escapes, the search pattern.
36 			void				_SetPattern(const char* source);
37 
38 	// Prepends all quotes, dollars and backslashes with at backslash
39 	// to prevent the shell from misinterpreting them.
40 			bool				_EscapeSpecialChars(char* buffer,
41 									ssize_t bufferSize);
42 
43 	private:
44 	// The (escaped) search pattern.
45 			char*				fPattern;
46 
47 	// The settings from the model.
48 			BMessenger			fTarget;
49 			bool				fRegularExpression : 1;
50 			bool				fCaseSensitive : 1;
51 			uint32				fEncoding;
52 
53 	// The supplier of files to grep
54 			FileIterator*		fIterator;
55 
56 	// Our thread's ID.
57 			thread_id			fRunnerThreadId;
58 	// xargs input pipe
59 			int					fXargsInput;
60 
61 	// Whether our thread must quit.
62 	volatile bool				fMustQuit;
63 };
64 
65 #endif // GREPPER_H
66