Merge pull request #48 from illiliti/pcre2

Replace pcre with pcre2
This commit is contained in:
Owen Rafferty 2022-07-12 20:19:45 -05:00 committed by GitHub
commit 36672100de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 485 additions and 26 deletions

View File

@ -1,5 +1,7 @@
#!/bin/sh -e
patch -p1 < musl.patch
# Remove 'util-linux' dependency.
sed 's/libmount_dep.found()/false/' meson.build > _
mv -f _ meson.build

View File

@ -1 +1,2 @@
77b21da5bd195a8e5f751206a2acab477636e3d02fe4f3796ede5788255382ae
5f3ee36e34f4aaab393c3e3dc46fb01b32f7ead6c88d41d7f20d88a49cdef1d9
5476b0c742dc348812de45f0a26dc9f471c432e56aec2c2074a23a8488c1caf6

View File

@ -1,5 +1,5 @@
libffi
meson make
pcre
pcre2
pkgconf make
zlib

View File

@ -0,0 +1,17 @@
diff --git a/glib/gmain.c b/glib/gmain.c
index fcf0b3dba..af1ed66b4 100644
--- a/glib/gmain.c
+++ b/glib/gmain.c
@@ -73,6 +73,12 @@
#include <sys/syscall.h>
#include <sys/wait.h>
#include <linux/wait.h> /* P_PIDFD */
+#ifndef W_EXITCODE
+#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
+#endif
+#ifndef W_STOPCODE
+#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
+#endif
#endif /* HAVE_PIDFD */
#ifdef G_OS_WIN32

View File

@ -1 +1,2 @@
https://download.gnome.org/sources/glib/MAJOR.MINOR/glib-VERSION.tar.xz
patches/musl.patch

View File

@ -1 +1 @@
2.73.1 1
2.73.2 1

View File

@ -1,10 +0,0 @@
#!/bin/sh -e
./configure \
--prefix=/usr \
--enable-unicode-properties
make
make install
rm -rf "$1/usr/share/doc"

View File

@ -1 +0,0 @@
4e6ce03e0336e8b4a3d6c2b70b1c5e18590a5673a98186da90d4f33c23defc09

View File

@ -1 +0,0 @@
https://downloads.sourceforge.net/pcre/pcre-VERSION.tar.gz

View File

@ -1 +0,0 @@
8.45 1

View File

@ -1,4 +1,4 @@
pcre
pcre2
________________________________________________________________________________
Perl Compatible Regular Expressions (PCRE) is a library written in C, which
@ -24,7 +24,7 @@ ________________________________________________________________________________
+------------------------------------------------------------------------------+
| |
| $ kiss b pcre |
| $ kiss b pcre2 |
| |
+------------------------------------------------------------------------------+

12
extra/pcre2/build Executable file
View File

@ -0,0 +1,12 @@
#!/bin/sh -e
./configure \
--prefix=/usr \
--enable-pcre2-16 \
--enable-pcre2-32 \
--enable-pcre2grep-libz \
--enable-pcre2grep-libbz2 \
--enable-jit
make
make DESTDIR="$1" install

1
extra/pcre2/checksums Normal file
View File

@ -0,0 +1 @@
14e4b83c4783933dc17e964318e6324f7cae1bc75d8f3c79bc6969f00c159d68

1
extra/pcre2/sources Normal file
View File

@ -0,0 +1 @@
https://github.com/PCRE2Project/pcre2/releases/download/pcre2-VERSION/pcre2-VERSION.tar.bz2

1
extra/pcre2/version Normal file
View File

@ -0,0 +1 @@
10.40 1

View File

@ -1,7 +1,8 @@
#!/bin/sh -e
patch -p1 < sway-static.patch
patch -p1 < no-evdev.patch
for p in *.patch; do
patch -p1 < "$p"
done
# Build fails in subprojects/seatd with clang
# due to -Werror -> -Wsign-compare.

View File

@ -1,5 +1,6 @@
8ac605dd25204dcd87ab352c8639b75361dc9ed276673797ef9c92bfd7cd18b5
1b999077290f3f5aa86cf98e3610df56834fbc23b12b4f2ead5bf31ecad0372f
210ddf8efa1149cde4dd35908bef8e9e63c2edaa0cdb5435f2e6db277fafff3c
0c0777dc70569be07bf602b55628c474a5ceb256650e4bcccaefd4038ae4a655
884c36e3184fc41ddd9353c667e85ba27843ad3f392344b0fd70e2a81bf503b6
78719bb6c8accabf18418631911624164c4164c72bb37381922668f6f635463b
0c0777dc70569be07bf602b55628c474a5ceb256650e4bcccaefd4038ae4a655

View File

@ -7,7 +7,7 @@ linux-headers make
mesa
meson make
pango
pcre
pcre2
pixman
pkgconf make
wayland

View File

@ -0,0 +1,215 @@
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 <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#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 5e4de87f..c59e4142 100644
--- a/meson.build
+++ b/meson.build
@@ -36,7 +36,7 @@ if is_freebsd
endif
jsonc = dependency('json-c', version: '>=0.13')
-pcre = dependency('libpcre')
+pcre2 = dependency('libpcre2-8')
wayland_server = dependency('wayland-server')
wayland_client = dependency('wayland-client')
wayland_cursor = dependency('wayland-cursor')
diff --git a/sway/criteria.c b/sway/criteria.c
index d2a5566f..94751c5f 100644
--- a/sway/criteria.c
+++ b/sway/criteria.c
@@ -3,7 +3,8 @@
#include <stdio.h>
#include <stdbool.h>
#include <strings.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#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, &reg_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
@@ -155,7 +161,7 @@ static bool criteria_matches_container(struct criteria *criteria,
bool exists = false;
struct sway_container *con = container;
for (int i = 0; i < con->marks->length; ++i) {
- if (regex_cmp(con->marks->items[i], criteria->con_mark->regex) == 0) {
+ if (regex_cmp(con->marks->items[i], criteria->con_mark->regex) >= 0) {
exists = true;
break;
}
@@ -192,8 +198,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(title, criteria->title->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(title, criteria->title->regex) < 0) {
return false;
}
break;
@@ -212,8 +218,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(shell, criteria->shell->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(shell, criteria->shell->regex) < 0) {
return false;
}
break;
@@ -232,8 +238,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(app_id, criteria->app_id->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(app_id, criteria->app_id->regex) < 0) {
return false;
}
break;
@@ -264,8 +270,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(class, criteria->class->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(class, criteria->class->regex) < 0) {
return false;
}
break;
@@ -284,8 +290,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(instance, criteria->instance->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(instance, criteria->instance->regex) < 0) {
return false;
}
break;
@@ -304,8 +310,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(window_role, criteria->window_role->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(window_role, criteria->window_role->regex) < 0) {
return false;
}
break;
@@ -363,8 +369,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(ws->name, criteria->workspace->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(ws->name, criteria->workspace->regex) < 0) {
return false;
}
break;
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,

View File

@ -1,5 +1,6 @@
https://github.com/swaywm/sway/archive/VERSION.tar.gz
https://gitlab.freedesktop.org/wlroots/wlroots/-/archive/e5063ef3a3b12d4384595cb0554cf1f84d5be6f8.tar.gz subprojects/wlroots
https://git.sr.ht/~kennylevinsen/seatd/archive/0.7.0.tar.gz subprojects/seatd
patches/sway-static.patch
patches/no-evdev.patch
patches/pcre2.patch
patches/sway-static.patch

View File

@ -1 +1 @@
6ffa4b1f7000cd90d63213820039ee432803e66a 2
6ffa4b1f7000cd90d63213820039ee432803e66a 3

View File

@ -4,6 +4,7 @@
export CFLAGS="$CFLAGS -Wno-error"
patch -p1 < no-evdev.patch
patch -p1 < pcre2.patch
# Default background color.
sed 's/0.25f, 0.25f, 0.25f/0.929, 0.870, 0.678/' \

View File

@ -1,2 +1,3 @@
0c64536fb2883ec518e75cfb119f9300115fb49b084e3fde62b794fe2c6c8d84
089a4e120c4c99ff784f7e5fc0f050f8416b4d5b98d418c2d36afe3f31da3349
82095453e072da69ee26d9f221f7c25ecf5f092882727e4d2c755d8ad6aa78ee

View File

@ -8,7 +8,7 @@ linux-headers make
mesa
meson make
pango
pcre
pcre2
pixman
pkgconf make
wayland

View File

@ -0,0 +1,215 @@
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 <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#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 5e4de87f..c59e4142 100644
--- a/meson.build
+++ b/meson.build
@@ -36,7 +36,7 @@ if is_freebsd
endif
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..94751c5f 100644
--- a/sway/criteria.c
+++ b/sway/criteria.c
@@ -3,7 +3,8 @@
#include <stdio.h>
#include <stdbool.h>
#include <strings.h>
-#include <pcre.h>
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
#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, &reg_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
@@ -155,7 +161,7 @@ static bool criteria_matches_container(struct criteria *criteria,
bool exists = false;
struct sway_container *con = container;
for (int i = 0; i < con->marks->length; ++i) {
- if (regex_cmp(con->marks->items[i], criteria->con_mark->regex) == 0) {
+ if (regex_cmp(con->marks->items[i], criteria->con_mark->regex) >= 0) {
exists = true;
break;
}
@@ -192,8 +198,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(title, criteria->title->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(title, criteria->title->regex) < 0) {
return false;
}
break;
@@ -212,8 +218,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(shell, criteria->shell->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(shell, criteria->shell->regex) < 0) {
return false;
}
break;
@@ -232,8 +238,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(app_id, criteria->app_id->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(app_id, criteria->app_id->regex) < 0) {
return false;
}
break;
@@ -264,8 +270,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(class, criteria->class->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(class, criteria->class->regex) < 0) {
return false;
}
break;
@@ -284,8 +290,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(instance, criteria->instance->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(instance, criteria->instance->regex) < 0) {
return false;
}
break;
@@ -304,8 +310,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(window_role, criteria->window_role->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(window_role, criteria->window_role->regex) < 0) {
return false;
}
break;
@@ -363,8 +369,8 @@ static bool criteria_matches_view(struct criteria *criteria,
return false;
}
break;
- case PATTERN_PCRE:
- if (regex_cmp(ws->name, criteria->workspace->regex) != 0) {
+ case PATTERN_PCRE2:
+ if (regex_cmp(ws->name, criteria->workspace->regex) < 0) {
return false;
}
break;
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,

View File

@ -1,2 +1,3 @@
https://github.com/swaywm/sway/releases/download/VERSION/sway-VERSION.tar.gz
patches/no-evdev.patch
patches/pcre2.patch

View File

@ -1 +1 @@
1.7 1
1.7 2