diff --git a/README.md b/README.md new file mode 100644 index 0000000..77acf85 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# wildmatch + +*wildmatch — это библиотека C/C++ под лицензией BSD для сопоставления шаблонов в стиле git/rsync.* + +## СИНТАКСИС + +```c +/* C API */ +#include + +if (wildmatch("/a/**/z", "/a/b/c/d/z", WM_WILDSTAR) == WM_MATCH) { + /* matched */ +} + +/* C++ API */ +#include + +if (wild::match("/a/**/z", "/a/b/c/d/z")) { + /* matched */ +} +``` + +## ОПИСАНИЕ + +**wildmatch** — это расширение функции `fnmatch(3)`, определённой в POSIX 1003.2-1992, раздел B.6. + +Расширение wildmatch позволяет `**` сопоставлять символ `/`, когда установлен флаг `WM_PATHNAME`. Это даёт практическое преимущество: можно совпадать со всеми подкаталогами пути с помощью `**`, а одинарная звёздочка `*` при этом остается для сопоставления внутри компонентов пути. + +C-API по умолчанию совместим с `fnmatch`. Расширение wildmatch включается передачей флага `WM_WILDSTAR` в `flags`. Задание `WM_WILDSTAR` неявно включает `WM_PATHNAME`. + +В C++-API аргумент `flags` по умолчанию равен `wild::WILDSTAR`. Вызов `wild::match(...)` только с двумя аргументами будет по умолчанию использовать расширенный синтаксис. + +Флаги `WM_` названы так же, как соответствующие им `FNM_` из `fnmatch`, и совпадают по поведению с `fnmatch(3)`, если `WM_WILDSTAR` не задан. + +## КОД ВОЗВРАТА + +C-API возвращает `WM_MATCH`, если строка совпала с шаблоном, и `WM_NOMATCH`, если не совпала. Эти значения определены как `#define` для 0 и 1 соответственно. + +C++-API возвращает логическое значение: `true` (совпадение) или `false` (нет совпадения). + +## ИСТОРИЯ + +Расширенный синтаксис wildmatch разрабатывался, ориентируясь на [тесты wildmatch](https://github.com/git/git/blob/maint/t/t3070-wildmatch.sh) из проекта [Git](https://git-scm.com). + +Название «wildmatch» взято из внутренней библиотеки в [rsync](https://rsync.samba.org/), используемой для сопоставления в стиле `fnmatch`. Реализация wildmatch в Git первоначально пришла из rsync. Изначальную реализацию wildmatch добавил в rsync Уэйн Дэвисон (Wayne Davison) в 2003 году. + +Набор тестов для wildmatch позаимствован из Git, однако сама библиотека не имеет общего происхождения с реализациями wildmatch ни в Git, ни в rsync. + +Изначально wildmatch основывался на реализации `fnmatch` из OpenBSD. Эта реализация была расширена обратно совместимым образом — путём введения нового флага `WM_WILDSTAR` для включения расширенного синтаксиса. diff --git a/files/patches/0001-soname.patch b/files/patches/0001-soname.patch new file mode 100644 index 0000000..f75f4d9 --- /dev/null +++ b/files/patches/0001-soname.patch @@ -0,0 +1,23 @@ +--- wildmatch/wildmatch/CMakeLists.txt 2025-09-18 03:05:09.594914856 +0300 ++++ wildmatch/wildmatch/CMakeLists.txt 2025-09-18 03:05:54.551187188 +0300 +@@ -4,6 +4,19 @@ + add_library(wildmatch-cxx SHARED wildmatch.cpp) + target_compile_options(wildmatch-cxx PRIVATE ${PROJECT_CXXFLAGS}) + +-install(TARGETS wildmatch wildmatch-cxx DESTINATION ${CMAKE_INSTALL_LIBDIR}) ++set_target_properties(wildmatch PROPERTIES ++ VERSION ${${PROJECT_NAME}_MAJOR_VERSION}.${${PROJECT_NAME}_MINOR_VERSION}.${${PROJECT_NAME}_PATCH_LEVEL} ++ SOVERSION ${${PROJECT_NAME}_MAJOR_VERSION} ++) ++ ++set_target_properties(wildmatch-cxx PROPERTIES ++ VERSION ${${PROJECT_NAME}_MAJOR_VERSION}.${${PROJECT_NAME}_MINOR_VERSION}.${${PROJECT_NAME}_PATCH_LEVEL} ++ SOVERSION ${${PROJECT_NAME}_MAJOR_VERSION} ++) ++ ++install(TARGETS wildmatch wildmatch-cxx ++ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ++ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ++ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(FILES wildmatch.h DESTINATION include/${PROJECT_NAME}) + install(FILES wildmatch.hpp DESTINATION include/${PROJECT_NAME}) diff --git a/files/series b/files/series new file mode 100644 index 0000000..0ccd122 --- /dev/null +++ b/files/series @@ -0,0 +1 @@ +patches/0001-soname.patch diff --git a/files/wildmatch.pc b/files/wildmatch.pc new file mode 100644 index 0000000..f93ee56 --- /dev/null +++ b/files/wildmatch.pc @@ -0,0 +1,9 @@ +prefix=/usr +includedir=${prefix}/include +libdir=${prefix}/lib + +Name: wildmatch +Description: wildmatch is a BSD-licensed C/C++ library for git/rsync-style pattern matching +Version: 0.5.0 +Libs: -L${libdir} -lwildmatch +Cflags: -I${includedir} diff --git a/package.yml b/package.yml new file mode 100644 index 0000000..66def89 --- /dev/null +++ b/package.yml @@ -0,0 +1,21 @@ +name : wildmatch +version : 0.5.0 +release : 1 +source : + - git|https://github.com/davvid/wildmatch.git : 16ba6a01804413b302e3fc9d747421d5d6f14599 +homepage : https://github.com/davvid/wildmatch +license : BSD-3-Clause +component : system.devel +summary : wildmatch is a BSD-licensed C/C++ library for git/rsync-style pattern matching. +description: | + wildmatch is a BSD-licensed C/C++ library for git/rsync-style pattern matching. +setup : | + %apply_patches + %cmake_ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr +build : | + %ninja_build +install : | + %ninja_install + install -Dm644 $pkgfiles/wildmatch.pc -t $installdir/usr/lib/pkgconfig