libag - 유명한 The Silver Searcher이지만 라이브러리
몇 주 전에 한 친구가 나에게 텍스트 및 바이너리 파일에서 재귀 정규식 검색을 위한 도구를 알고 있는지 물었습니다. Ag가 바로 떠올랐지만 안타깝게도 ag(1)은 라이브러리가 아닌 프로그램입니다.
불가능하지는 않지만 Ag 출력을 구문 분석하는 것은 약간 골치 아픈 일이며 모든 검색에 대해 새 프로세스를 생성하는 것은 지루하게 들립니다. ripgrep(1)과 같은 유사한 도구는 JSON 형식으로 출력할 수 있으므로 훨씬 더 쉬워지지만 여전히 프로세스 생성 및 출력 구문 분석에 대해 이야기하고 있습니다.
그렇게 리바그가 탄생했습니다. Libag을 사용하면 Ag 검색 엔진(및 그 기능)을 올바른 방식으로(또는 거의 그렇게) 사용할 수 있습니다.
Libag는 가능한 한 간단하게 만들어졌으므로 검색 프로세스를 세 가지 간단한 단계로 나눕니다.
모든 내부 Ag 구조 초기화( 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는 반드시 읽어야 합니다!). 바인딩 및 예제에 대한 문서는 여기에서 찾을 수 있습니다.
전체 예제는 example/ 폴더에서도 사용할 수 있으며 사용자의 편의를 위해 라이브러리와 함께 자동으로 구축됩니다 ;-).
Libag은 항상 커뮤니티에 열려 있으며 문제, 문서, 테스트, 새로운 기능, 버그 수정, 오타 등의 기여를 기꺼이 받아들입니다. 참여를 환영합니다.
Libag는 Apache v2 라이선스에 따라 라이선스가 부여됩니다.