libag - الباحث الفضي الشهير، لكن المكتبة
منذ بضعة أسابيع، سألني أحد الأصدقاء إذا كنت أعرف أي أداة للبحث المتكرر عن التعبيرات العادية في النصوص والملفات الثنائية. يتبادر إلى ذهني Ag على الفور، لكن للأسف Ag(1) هو برنامج وليس مكتبة.
على الرغم من أن ذلك ليس مستحيلًا، إلا أن تحليل مخرجات Ag سيكون أمرًا صعبًا بعض الشيء، بالإضافة إلى أن إنشاء عملية جديدة لكل بحث يبدو مملاً. يمكن لأدوات مماثلة مثل ripgrep(1) الإخراج بتنسيق JSON، مما يجعل الأمر أسهل كثيرًا بالتأكيد، لكننا ما زلنا نتحدث عن عمليات النشر وتحليل المخرجات.
هكذا ولد ليباج. يتيح لك Libag استخدام محرك البحث ag (ومنشآته)، ولكن بالطريقة الصحيحة (أو تقريبًا).
يهدف Libag إلى أن يكون بسيطًا قدر الإمكان، وبالتالي يقسم عملية البحث إلى ثلاث خطوات بسيطة:
تهيئة كافة الهياكل الزراعية الداخلية (عبر ag_init()
)
قم بإجراء أي عدد تريده من عمليات البحث (عبر ag_search()
).
تنظيف الموارد (عبر ag_finish()
).
يتم إجراء إعدادات البحث المخصصة عبر ag_init_config()
و ag_set_config()
. النتائج هي قائمة بالبنية ag_result*، التي تحتوي على الملف، وقائمة التطابقات (تحتوي على المطابقة وإزاحات الملف المقابلة للمطابقة)، والأعلام.
(يمكن العثور على أمثلة كاملة في الأمثلة/)
#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 دعم جميع الميزات (العمل قيد التقدم) الخاصة بـ ag (أو على الأقل تلك التي تكون منطقية بالنسبة للمكتبة). بالإضافة إلى ذلك، فهو يسمح بالتحكم التفصيلي في سلاسل العمليات، عبر ag_start_workers()
و ag_stop_workers()
(راجع المستندات لمزيد من التفاصيل).
يحتوي Libag على دعم الارتباطات (التجريبية) للغات البرمجة الأخرى: Python وNode.js. لمزيد من المعلومات والوثائق التفصيلية، راجع الروابط/python والربطات/javascript.
يتطلب Libag نفس التبعيات مثل مترجم ag: c99 والمكتبات: zlib وlzma وpcre. يمكن تثبيت هذه المكتبات واحدة تلو الأخرى أو عن طريق مدير الحزم لديك.
بالنسبة للتوزيعات المشابهة لديبيان، شيء من هذا القبيل:
$ sudo apt install libpcre3-dev zlib1g-dev liblzma-dev
(أو اتبع توصيات Ag هنا)
بمجرد حل التبعيات، قم باستنساخ المستودع وبناءه. Libag يدعم Makefile وCMake. اختر ما يناسب احتياجاتك:
$ 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
يمكن العثور على الوثائق التفصيلية لكل روتين متاح على صفحات الدليل. بالإضافة إلى ذلك، تم التعليق على الكود المصدري على نطاق واسع (libag.h يجب قراءته!). يمكن العثور على وثائق الارتباطات والأمثلة هنا.
تتوفر أيضًا الأمثلة الكاملة في المجلد/الأمثلة ويتم إنشاؤها تلقائيًا مع المكتبة لراحتك؛-).
Libag منفتح دائمًا على المجتمع ومستعد لقبول المساهمات، سواء فيما يتعلق بالمشكلات أو الوثائق أو الاختبار أو الميزات الجديدة أو إصلاحات الأخطاء أو الأخطاء المطبعية، وما إلى ذلك. مرحبًا بك معنا.
Libag مرخص بموجب ترخيص Apache v2.