2013-09-04 9 views
9

Ich würde gerne wissen, ob es möglich ist, GNU Grep als eine Bibliothek zu portieren, abgesehen von den rechtlichen Komplikationen, wenn überhaupt, da dies für nicht-kommerzielle, aber akademische Verwendung ist. Ich habe viele Ports von GNU Grep gesehen. Zum Beispiel: GNU grep for win 32 here.Ist es möglich, GNU Grep als Bibliothek zu portieren?

Ich frage mich, warum niemand jemals versucht hat, grep als Bibliothek zu portieren? Es wäre ein großer Vorteil für Anwendungen, die String-Suche/Mining nutzen, da sie die Macht von GNU Grep intern in ihren Anwendungen nutzen können. Ich würde gerne dieses Kunststück versuchen, aber da ich neu im String-Suchen/-Mining bin, würde ich gerne die offensichtlichen Herausforderungen kennen, die auftreten können und warum es noch nicht getan wurde.

BEARBEITEN - Der Vorteil einer GNU-Grep-Bibliothek besteht darin, dass sie die String-Suche viel schneller durchführen wird, indem sie ihre eigene modifizierte Version von boyer-moore verwendet. Bei der Verwendung einer regulären Ausdruckswrapperbibliothek wie PCRE oder Boost reg exp oder Qt Reg-Ausdrücken usw. muss die Anwendung die Datei Zeile für Zeile lesen und jede Zeile mit der regulären Ausdruck analysieren. Das ist der offensichtliche Vorteil, den ich sehe.

+1

Es ist nicht * genau * das gleiche, aber haben Sie stattdessen die [PCRE-Bibliothek] (http://www.pcre.org/) in Betracht gezogen? –

+4

Um die grep-Schnittstelle als lib verfügbar zu machen, müssen Sie nicht tief in ihre Interna eintauchen. Hauptsächlich müssen Sie verstehen, wie es erstellt und wie die Befehlszeilenoptionen den spezifischen Funktionen zugeordnet werden. Nachdem ich das getan habe, ist es nur noch eine Frage des Schreibens einiger Wrapper und des gesamten Prozesses, eine Bibliothek zu erstellen. Probieren Sie es aus: ftp://ftp.gnu.org/gnu/grep/ – alk

+0

@AdamRosenfield, es ist definitiv nicht das, was ich will - siehe das Update. Danke, das ist was ich will, ich hoffe es ist machbar. – OverTheEdge

Antwort

1

Ja. Verknüpfen Sie es einfach als eine Bibliothek und nennen Sie es main() mit seinen beabsichtigten Argumenten. Oder besser, wenn Sie seinen main() zu etwas besser umbenennen, z. zu grep().

+3

Ich wette grep's main() ist nicht reentrant - d. H. Nicht so lustig Dinge passieren, wenn Sie es mehr als einmal nennen - mit viel Status aus dem vorherigen Lauf. – nos

+1

Sie haben Recht, obwohl ich denke, dass diese Probleme wahrscheinlich mit der Umwandlung ihrer globalen Variablen in lokale gelöst werden könnten. Und wenn Grep einen Exit macht(), war es auch ein Problem. Und wenn grep nicht den gesamten Speicher freigibt(), dann wird diese Bibliothek auslaufen. Aber diese Probleme können gelöst werden und scheinen nicht sehr schwierig zu sein, obwohl ein wenig mit dem Grep-Quellcode zu spielen scheint unvermeidlich zu sein. – peterh

Verwandte Themen