libag - The Silver Searcher yang terkenal, tetapi perpustakaan
Beberapa minggu yang lalu, seorang teman bertanya kepada saya apakah saya mengetahui alat apa pun untuk pencarian ekspresi reguler rekursif dalam file teks dan biner. Ag langsung terlintas di benak saya, tapi sayangnya, ag(1) adalah sebuah program, bukan perpustakaan.
Meskipun bukan tidak mungkin, mengurai keluaran Ag akan sedikit memusingkan, ditambah lagi memunculkan proses baru untuk setiap pencarian terdengar membosankan. Alat serupa seperti ripgrep(1) dapat menghasilkan keluaran dalam format JSON, yang tentunya membuatnya jauh lebih mudah, namun kita masih berbicara tentang proses pemijahan dan penguraian keluaran.
Begitulah libag lahir. Libag memungkinkan Anda menggunakan mesin pencari ag (dan fasilitasnya), tetapi dengan cara yang benar (atau hampir seperti itu).
Libag dimaksudkan sesederhana mungkin dan oleh karena itu membagi proses pencarian menjadi tiga langkah sederhana:
Inisialisasi semua struktur ag internal (melalui ag_init()
)
Lakukan pencarian sebanyak yang Anda suka (melalui ag_search()
).
Bersihkan sumber daya (melalui ag_finish()
).
Pengaturan pencarian khusus dilakukan melalui ag_init_config()
dan ag_set_config()
. Hasilnya adalah daftar struct ag_result*, yang berisi file, daftar kecocokan (berisi kecocokan dan offset file yang sesuai dengan kecocokan), dan flag.
(Contoh lengkap dapat dilihat pada contoh/)
#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 bermaksud untuk mendukung semua fitur (pekerjaan yang sedang berjalan) dari ag (atau setidaknya, fitur yang masuk akal untuk perpustakaan). Selain itu, ini memungkinkan kontrol mendetail atas thread pekerja, melalui ag_start_workers()
dan ag_stop_workers()
(lihat dokumen untuk detail selengkapnya).
Libag memiliki dukungan pengikatan (eksperimental) ke bahasa pemrograman lain: Python dan Node.js. Untuk informasi lebih lanjut dan dokumentasi lebih detail, lihat binding/python dan binding/javascript.
Libag memerlukan dependensi yang sama seperti kompiler ag: c99 dan perpustakaan: zlib, lzma, dan pcre. Pustaka ini dapat diinstal satu per satu atau oleh manajer paket Anda.
Untuk distribusi mirip Debian, kira-kira seperti:
$ sudo apt install libpcre3-dev zlib1g-dev liblzma-dev
(atau ikuti rekomendasi Ag di sini)
Setelah dependensi teratasi, kloning repositori dan bangun. Libag mendukung Makefile dan CMake. Pilih salah satu yang paling sesuai dengan kebutuhan Anda:
$ 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
Dokumentasi terperinci dari setiap rutinitas yang tersedia dapat ditemukan di halaman manual. Selain itu, kode sumbernya banyak dikomentari (libag.h harus dibaca!). Dokumentasi tentang binding dan contohnya dapat ditemukan di sini.
Contoh lengkap juga tersedia di folder contoh/ dan secara otomatis dibuat bersama dengan perpustakaan untuk kenyamanan Anda ;-).
Libag selalu terbuka untuk komunitas dan bersedia menerima kontribusi, baik terkait masalah, dokumentasi, pengujian, fitur baru, perbaikan bug, kesalahan ketik, dll. Selamat bergabung.
Libag dilisensikan di bawah lisensi Apache v2.