2013-09-04 16 views
9

Chciałbym wiedzieć, czy możliwe jest przeniesienie GNU grep jako biblioteki, pomijając prawne komplikacje, jeśli takie istnieją, ponieważ jest to wyłącznie do użytku niekomercyjnego, ale akademickiego. Widziałem wiele portów GNU grep. Na przykład: GNU grep for win 32 here.Czy można przenieść GNU grep do biblioteki?

Zastanawiam się, dlaczego nikt nigdy nie próbował przesłać grep jako biblioteki? Byłaby to ogromna korzyść dla aplikacji wykorzystujących wyszukiwanie/wyszukiwanie ciągów, ponieważ mogą one używać wewnętrznej mocy GNU grep w swoich aplikacjach. Chciałbym spróbować tego wyczynu, ale ponieważ jestem nowy w wyszukiwaniu/wydobywaniu ciągów znaków, chciałbym poznać oczywiste wyzwania, które mogą się pojawić i dlaczego nie zostało to jeszcze zrobione.

EDYCJA - Zaletą biblioteki GNU grep jest to, że będzie ona wyszukiwała ciąg znacznie szybciej, używając własnej zmodyfikowanej wersji programu boyer-moore. W przypadku gdy tak jak w przypadku korzystania z biblioteki owijania wyrażeń regularnych, takiej jak PCRE lub Zwiększ wyrażeń reg lub wyrażeń Qt Reg itp., , aplikacja musi odczytać plik wiersz po wierszu i przeanalizować każdą linię względem wyrażeń regularnych. Jest to oczywista korzyść, którą widzę.

+1

Nie jest to * dokładnie * to samo, ale czy zamiast tego brałeś pod uwagę bibliotekę [PCRE] (http://www.pcre.org/)? –

+4

Aby interfejs grep był dostępny jako lib, nie musisz zanurkować głęboko w jego wnętrze. Głównie musisz zrozumieć, w jaki sposób tworzy i jak opcje wiersza poleceń są przypisane do konkretnych funkcji. Uczyniwszy to, jest to tylko kwestia napisania niektórych wrapperów i zarządzania procesem budowy biblioteki w ogóle. Śmiało i spróbuj: ftp://ftp.gnu.org/gnu/grep/ – alk

+0

@AdamRosenfield, zdecydowanie nie jest to, czego chcę - zobacz aktualizację. Dzięki, alk, tego właśnie chcę, mam nadzieję, że jest to wykonalne. – OverTheEdge

Odpowiedz

1

Tak. Po prostu połącz go jako bibliotekę i wywołaj jej główną() z zamierzonymi argumentami. Lub lepiej, jeśli zmienisz nazwę main() na lepszą, f.e. do grep().

+3

Założę się, że grep's main() nie jest reentrantem - to znaczy, że nie będzie tak fajnych rzeczy, gdy zadzwonisz do niego więcej niż raz - mając dużo stanu z poprzedniego przebiegu. – nos

+1

Masz rację, chociaż sądzę, że te problemy można by prawdopodobnie rozwiązać poprzez konwersję zmiennych globalnych na lokalne. A jeśli grep robi exit(), to też był problem. A jeśli grep nie uwolni() - wszystkich jego zwartych pamięci, to ta biblioteka wycieknie. Ale te problemy można rozwiązać i nie wydaje się to bardzo trudne, choć odrobina gry z kodem źródłowym grep wydaje się być nieunikniona. – peterh

Powiązane problemy