haiku/src/apps/text_search/Grepper.h

66 lines
1.5 KiB
C++

/*
* Copyright (c) 1998-2007 Matthijs Hollemans
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef GREPPER_H
#define GREPPER_H
#include <Messenger.h>
class FileIterator;
class Model;
// Executes "grep" in a background thread.
class Grepper {
public:
Grepper(const char* pattern, const Model* model,
const BHandler* target,
FileIterator* iterator);
virtual ~Grepper();
bool IsValid() const;
void Start();
void Cancel();
private:
// Spawns the real grepper threads.
static int32 _SpawnRunnerThread(void* cookie);
static int32 _SpawnWriterThread(void* cookie);
// The threads functions that does the actual grepping.
int32 _RunnerThread();
int32 _WriterThread();
// Remembers, and possibly escapes, the search pattern.
void _SetPattern(const char* source);
// Prepends all quotes, dollars and backslashes with at backslash
// to prevent the shell from misinterpreting them.
bool _EscapeSpecialChars(char* buffer,
ssize_t bufferSize);
private:
// The (escaped) search pattern.
char* fPattern;
// The settings from the model.
BMessenger fTarget;
bool fRegularExpression : 1;
bool fCaseSensitive : 1;
uint32 fEncoding;
// The supplier of files to grep
FileIterator* fIterator;
// Our thread's ID.
thread_id fRunnerThreadId;
// xargs input pipe
int fXargsInput;
// Whether our thread must quit.
volatile bool fMustQuit;
};
#endif // GREPPER_H