libag – Der berühmte The Silver Searcher, aber Bibliothek
Vor ein paar Wochen fragte mich ein Freund, ob ich ein Tool für die rekursive Suche nach regulären Ausdrücken in Text- und Binärdateien kenne. Ag kam mir sofort in den Sinn, aber leider ist ag(1) ein Programm und keine Bibliothek.
Das Parsen der Ag-Ausgabe ist zwar nicht unmöglich, würde aber ein wenig Kopfschmerzen bereiten, und es klingt mühsam, für jede Suche einen neuen Prozess zu erstellen. Ähnliche Tools wie ripgrep(1) können im JSON-Format ausgeben, was es sicherlich viel einfacher macht, aber wir reden immer noch über das Spawnen von Prozessen und das Parsen von Ausgaben.
So wurde Libag geboren. Mit Libag können Sie die AG-Suchmaschine (und ihre Funktionen) nutzen, jedoch auf die richtige (oder fast richtige) Weise.
Libag soll so einfach wie möglich sein und unterteilt den Suchvorgang daher in drei einfache Schritte:
Initialisieren Sie alle internen Ag-Strukturen (über ag_init()
)
Führen Sie so viele Suchvorgänge durch, wie Sie möchten (über ag_search()
).
Bereinigen Sie die Ressourcen (über ag_finish()
).
Benutzerdefinierte Sucheinstellungen werden über ag_init_config()
und ag_set_config()
vorgenommen. Die Ergebnisse sind eine Liste von struct ag_result*, die die Datei enthält, eine Liste von Übereinstimmungen (mit der Übereinstimmung und den Dateioffsets, die der Übereinstimmung entsprechen) und Flags.
(Vollständige Beispiele finden Sie in examples/)
#include <libag.h>
...
struct ag_result * * results ;
size_t nresults ;
char * query = "foo" ;
char * paths [ 1 ] = { "." };
/* Initiate Ag library with default options. */
ag_init ();
/* Searches for foo in the current path. */
results = ag_search ( query , 1 , paths , & nresults );
if (! results ) {
printf ( "No result foundn" );
return ( 1 );
}
printf ( "%zu results found\n" , nresults );
/* Show them on the screen, if any. */
for ( size_t i = 0 ; i < nresults ; i ++ ) {
for ( size_t j = 0 ; j < results [ i ] -> nmatches ; j ++ ) {
printf ( "file: %s, match: %sn" ,
results [ i ] -> file , results [ i ] -> matches [ j ] -> match ,
}
}
/* Free all results. */
ag_free_all_results ( results , nresults );
/* Release Ag resources. */
ag_finish ();
...
Libag beabsichtigt, alle Funktionen (in Arbeit) von ag zu unterstützen (oder zumindest diejenigen, die für eine Bibliothek sinnvoll sind). Darüber hinaus ermöglicht es eine detaillierte Kontrolle über Arbeitsthreads über ag_start_workers()
und ag_stop_workers()
(weitere Einzelheiten finden Sie in der Dokumentation).
Libag bietet (experimentelle) Bindungsunterstützung für andere Programmiersprachen: Python und Node.js. Weitere Informationen und eine ausführlichere Dokumentation finden Sie unter bindings/python und bindings/javascript.
Libag erfordert die gleichen Abhängigkeiten wie ag: c99-Compiler und Bibliotheken: zlib, lzma und pcre. Diese Bibliotheken können einzeln oder von Ihrem Paketmanager installiert werden.
Für Debian-ähnliche Distributionen etwa:
$ sudo apt install libpcre3-dev zlib1g-dev liblzma-dev
(oder folgen Sie den Ag-Empfehlungen hier)
Sobald die Abhängigkeiten aufgelöst sind, klonen Sie das Repository und erstellen Sie es. Libag unterstützt Makefile und CMake. Wählen Sie diejenige aus, die Ihren Anforderungen am besten entspricht:
$ git clone https://github.com/Theldus/libag.git
$ cd libag/
$ make -j4
# Optionally (if you want to install):
$ make install # (PREFIX and DESTDIR allowed here, defaults to /usr/local/)
$ mkdir build/ && cd build/
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make -j4
# Optionally (if you want to install):
$ make install
Eine detaillierte Dokumentation jeder verfügbaren Routine finden Sie auf den Manpages. Außerdem ist der Quellcode ausführlich kommentiert (libag.h ist ein Muss!). Dokumentation zu Bindungen und Beispiele finden Sie hier.
Vollständige Beispiele sind ebenfalls im Ordner „examples/“ verfügbar und werden zu Ihrer Bequemlichkeit automatisch zusammen mit der Bibliothek erstellt ;-).
Libag ist immer offen für die Community und bereit, Beiträge anzunehmen, sei es bei Problemen, Dokumentation, Tests, neuen Funktionen, Fehlerbehebungen, Tippfehlern usw. Willkommen an Bord.
Libag ist unter der Apache v2-Lizenz lizenziert.