From f614f35e7354980bf4f0a66ca99be9b5f3a7ac90 Mon Sep 17 00:00:00 2001 From: ndren Date: Sat, 12 Mar 2022 13:02:32 +0000 Subject: [PATCH] Replace pcre with pcre2 Closes: https://github.com/swaywm/sway/issues/6838 --- .builds/alpine.yml | 1 + .builds/archlinux.yml | 1 + .builds/freebsd.yml | 1 + README.de.md | 2 +- README.dk.md | 2 +- README.es.md | 2 +- README.fr.md | 2 +- README.gr.md | 2 +- README.hu.md | 2 +- README.ir.md | 2 +- README.ja.md | 2 +- README.ko.md | 2 +- README.md | 2 +- README.nl.md | 2 +- README.pl.md | 2 +- README.pt.md | 2 +- README.ro.md | 2 +- README.ru.md | 2 +- README.tr.md | 2 +- README.uk.md | 2 +- README.zh-CN.md | 2 +- README.zh-TW.md | 2 +- include/sway/criteria.h | 7 ++++--- meson.build | 2 +- sway/criteria.c | 44 +++++++++++++++++++++++------------------ sway/meson.build | 2 +- 26 files changed, 53 insertions(+), 43 deletions(-) diff --git a/.builds/alpine.yml b/.builds/alpine.yml index abf636ab..324cf6ce 100644 --- a/.builds/alpine.yml +++ b/.builds/alpine.yml @@ -12,6 +12,7 @@ packages: - mesa-dev - meson - pango-dev + - pcre2-dev - pixman-dev - scdoc - wayland-dev diff --git a/.builds/archlinux.yml b/.builds/archlinux.yml index ac4cdb4d..ac5536e5 100644 --- a/.builds/archlinux.yml +++ b/.builds/archlinux.yml @@ -9,6 +9,7 @@ packages: - libxkbcommon - meson - pango + - pcre2 - scdoc - wayland - wayland-protocols diff --git a/.builds/freebsd.yml b/.builds/freebsd.yml index 97e7eccc..aa3007d8 100644 --- a/.builds/freebsd.yml +++ b/.builds/freebsd.yml @@ -4,6 +4,7 @@ packages: - devel/json-c - devel/libevdev - devel/meson +- devel/pcre2 - devel/pkgconf - graphics/cairo - graphics/gdk-pixbuf2 diff --git a/README.de.md b/README.de.md index 01b5e9ad..059fda89 100644 --- a/README.de.md +++ b/README.de.md @@ -18,7 +18,7 @@ sway benötigt die folgenden Pakete: * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols\* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.dk.md b/README.dk.md index f712e96b..3a641295 100644 --- a/README.dk.md +++ b/README.dk.md @@ -29,7 +29,7 @@ Installationsafhængigheder: * [wlroots] * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.es.md b/README.es.md index 7af7d90b..5e598e1a 100644 --- a/README.es.md +++ b/README.es.md @@ -28,7 +28,7 @@ Instale las dependencias: * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.fr.md b/README.fr.md index 359a30f9..e99160e8 100644 --- a/README.fr.md +++ b/README.fr.md @@ -35,7 +35,7 @@ Installez les dépendances : * [wlroots] * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.gr.md b/README.gr.md index 4c30e29d..f325cb88 100644 --- a/README.gr.md +++ b/README.gr.md @@ -28,7 +28,7 @@ sway και wlroots γιά τεστάρισμα ή development. * [wlroots] * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.hu.md b/README.hu.md index 4e006f25..9e3bc9e1 100644 --- a/README.hu.md +++ b/README.hu.md @@ -28,7 +28,7 @@ Telepítsd a függőségeket: * [wlroots] * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.ir.md b/README.ir.md index 4542b93b..64956a9e 100644 --- a/README.ir.md +++ b/README.ir.md @@ -29,7 +29,7 @@ Patreon با نام کاربری SirCmpwn](https://patreon.com/sircmpwn) مرا * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.ja.md b/README.ja.md index 786e169c..ece9ce48 100644 --- a/README.ja.md +++ b/README.ja.md @@ -30,7 +30,7 @@ Swayは沢山のディストリビューションで提供されています。" * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.ko.md b/README.ko.md index 1086da0c..7a1f4ce1 100644 --- a/README.ko.md +++ b/README.ko.md @@ -27,7 +27,7 @@ IRC 채널을 방문하거나 sir@cmpwn.com으로 이메일을 보내 상담 받 * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.md b/README.md index 9c15b491..8e70aef5 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Install dependencies: * [wlroots] * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.nl.md b/README.nl.md index c0a93063..8a344f03 100644 --- a/README.nl.md +++ b/README.nl.md @@ -28,7 +28,7 @@ Afhankelijkheden installeren: * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.pl.md b/README.pl.md index 6d376b68..ab99abb1 100644 --- a/README.pl.md +++ b/README.pl.md @@ -28,7 +28,7 @@ Zainstaluj zależności: * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.pt.md b/README.pt.md index 92a4b54d..b22948aa 100644 --- a/README.pt.md +++ b/README.pt.md @@ -30,7 +30,7 @@ Instale as dependências: * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.ro.md b/README.ro.md index f7785b8f..4ce05093 100644 --- a/README.ro.md +++ b/README.ro.md @@ -25,7 +25,7 @@ Dependențe pentru instalare: * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.ru.md b/README.ru.md index d563859c..fb6f3344 100644 --- a/README.ru.md +++ b/README.ru.md @@ -29,7 +29,7 @@ sway и wlroots для тестирования или разработки. * [wlroots] * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.tr.md b/README.tr.md index 5c98a538..e09d2eaf 100644 --- a/README.tr.md +++ b/README.tr.md @@ -26,7 +26,7 @@ Aşağıdaki bağımlılıkları yükleyin: * [wlroots] * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.uk.md b/README.uk.md index ff9ebec3..d9adcd13 100644 --- a/README.uk.md +++ b/README.uk.md @@ -39,7 +39,7 @@ Sway доступний у багатьох дистрибутивах Linux (а * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.zh-CN.md b/README.zh-CN.md index 561d6c14..e3235f17 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -28,7 +28,7 @@ Sway 在很多发行版中可用. 尝试在你的发行版中安装 "sway" 包. * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/README.zh-TW.md b/README.zh-TW.md index bc30b903..a7168244 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -28,7 +28,7 @@ Sway 在許多發行版都有提供。請自己嘗試於你的發行版安裝 * [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots) * wayland * wayland-protocols \* -* pcre +* pcre2 * json-c * pango * cairo diff --git a/include/sway/criteria.h b/include/sway/criteria.h index ad8610cd..59f57f94 100644 --- a/include/sway/criteria.h +++ b/include/sway/criteria.h @@ -1,7 +1,8 @@ #ifndef _SWAY_CRITERIA_H #define _SWAY_CRITERIA_H -#include +#define PCRE2_CODE_UNIT_WIDTH 8 +#include #include "config.h" #include "list.h" #include "tree/view.h" @@ -15,13 +16,13 @@ enum criteria_type { }; enum pattern_type { - PATTERN_PCRE, + PATTERN_PCRE2, PATTERN_FOCUSED, }; struct pattern { enum pattern_type match_type; - pcre *regex; + pcre2_code *regex; }; struct criteria { diff --git a/meson.build b/meson.build index 71183007..5bedeb2e 100644 --- a/meson.build +++ b/meson.build @@ -45,7 +45,7 @@ subproject( ) jsonc = dependency('json-c', version: '>=0.13') -pcre = dependency('libpcre') +pcre2 = dependency('libpcre2-8') wayland_server = dependency('wayland-server', version: '>=1.20.0') wayland_client = dependency('wayland-client') wayland_cursor = dependency('wayland-cursor') diff --git a/sway/criteria.c b/sway/criteria.c index d2a5566f..4711a165 100644 --- a/sway/criteria.c +++ b/sway/criteria.c @@ -3,7 +3,8 @@ #include #include #include -#include +#define PCRE2_CODE_UNIT_WIDTH 8 +#include #include "sway/criteria.h" #include "sway/tree/container.h" #include "sway/config.h" @@ -40,17 +41,19 @@ bool criteria_is_empty(struct criteria *criteria) { char *error = NULL; // Returns error string on failure or NULL otherwise. -static bool generate_regex(pcre **regex, char *value) { - const char *reg_err; - int offset; - - *regex = pcre_compile(value, PCRE_UTF8 | PCRE_UCP, ®_err, &offset, NULL); +static bool generate_regex(pcre2_code **regex, char *value) { + int errorcode; + PCRE2_SIZE offset; + *regex = pcre2_compile((PCRE2_SPTR)value, PCRE2_ZERO_TERMINATED, PCRE2_UTF | PCRE2_UCP, &errorcode, &offset, NULL); if (!*regex) { + PCRE2_UCHAR buffer[256]; + pcre2_get_error_message(errorcode, buffer, sizeof(buffer)); + const char *fmt = "Regex compilation for '%s' failed: %s"; - int len = strlen(fmt) + strlen(value) + strlen(reg_err) - 3; + int len = strlen(fmt) + strlen(value) + strlen((char*) buffer) - 3; error = malloc(len); - snprintf(error, len, fmt, value, reg_err); + snprintf(error, len, fmt, value, buffer); return false; } @@ -66,7 +69,7 @@ static bool pattern_create(struct pattern **pattern, char *value) { if (strcmp(value, "__focused__") == 0) { (*pattern)->match_type = PATTERN_FOCUSED; } else { - (*pattern)->match_type = PATTERN_PCRE; + (*pattern)->match_type = PATTERN_PCRE2; if (!generate_regex(&(*pattern)->regex, value)) { return false; }; @@ -77,7 +80,7 @@ static bool pattern_create(struct pattern **pattern, char *value) { static void pattern_destroy(struct pattern *pattern) { if (pattern) { if (pattern->regex) { - pcre_free(pattern->regex); + pcre2_code_free(pattern->regex); } free(pattern); } @@ -99,8 +102,11 @@ void criteria_destroy(struct criteria *criteria) { free(criteria); } -static int regex_cmp(const char *item, const pcre *regex) { - return pcre_exec(regex, NULL, item, strlen(item), 0, 0, NULL, 0); +static int regex_cmp(const char *item, const pcre2_code *regex) { + pcre2_match_data *match_data = pcre2_match_data_create_from_pattern(regex, NULL); + int result = pcre2_match(regex, (PCRE2_SPTR)item, strlen(item), 0, 0, match_data, NULL); + pcre2_match_data_free(match_data); + return result; } #if HAVE_XWAYLAND @@ -192,7 +198,7 @@ static bool criteria_matches_view(struct criteria *criteria, return false; } break; - case PATTERN_PCRE: + case PATTERN_PCRE2: if (regex_cmp(title, criteria->title->regex) != 0) { return false; } @@ -212,7 +218,7 @@ static bool criteria_matches_view(struct criteria *criteria, return false; } break; - case PATTERN_PCRE: + case PATTERN_PCRE2: if (regex_cmp(shell, criteria->shell->regex) != 0) { return false; } @@ -232,7 +238,7 @@ static bool criteria_matches_view(struct criteria *criteria, return false; } break; - case PATTERN_PCRE: + case PATTERN_PCRE2: if (regex_cmp(app_id, criteria->app_id->regex) != 0) { return false; } @@ -264,7 +270,7 @@ static bool criteria_matches_view(struct criteria *criteria, return false; } break; - case PATTERN_PCRE: + case PATTERN_PCRE2: if (regex_cmp(class, criteria->class->regex) != 0) { return false; } @@ -284,7 +290,7 @@ static bool criteria_matches_view(struct criteria *criteria, return false; } break; - case PATTERN_PCRE: + case PATTERN_PCRE2: if (regex_cmp(instance, criteria->instance->regex) != 0) { return false; } @@ -304,7 +310,7 @@ static bool criteria_matches_view(struct criteria *criteria, return false; } break; - case PATTERN_PCRE: + case PATTERN_PCRE2: if (regex_cmp(window_role, criteria->window_role->regex) != 0) { return false; } @@ -363,7 +369,7 @@ static bool criteria_matches_view(struct criteria *criteria, return false; } break; - case PATTERN_PCRE: + case PATTERN_PCRE2: if (regex_cmp(ws->name, criteria->workspace->regex) != 0) { return false; } diff --git a/sway/meson.build b/sway/meson.build index 8eab31a2..5f34ce6b 100644 --- a/sway/meson.build +++ b/sway/meson.build @@ -213,7 +213,7 @@ sway_deps = [ libudev, math, pango, - pcre, + pcre2, glesv2, pixman, server_protos,