10.30 bump
Remove the run-time dependency on gcc. Toolchain people say we cannot depend on gcc just because of stdlibc header files.
This commit is contained in:
parent
d92985a6b1
commit
cda3d6e262
1
.gitignore
vendored
1
.gitignore
vendored
@ -8,3 +8,4 @@
|
|||||||
/pcre2-10.23-RC1.tar.bz2
|
/pcre2-10.23-RC1.tar.bz2
|
||||||
/pcre2-10.23.tar.bz2
|
/pcre2-10.23.tar.bz2
|
||||||
/pcre2-10.30-RC1.tar.bz2
|
/pcre2-10.30-RC1.tar.bz2
|
||||||
|
/pcre2-10.30.tar.bz2
|
||||||
|
@ -1,457 +0,0 @@
|
|||||||
From 953920c6fac83750ac8a4528672f1bd2c41d1fc6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
|
|
||||||
Date: Thu, 20 Jul 2017 10:38:24 +0200
|
|
||||||
Subject: [PATCH] Distribute forgotten sljitProtExecAllocator.c
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
||||||
---
|
|
||||||
Makefile.am | 1 +
|
|
||||||
src/sljit/sljitProtExecAllocator.c | 421 +++++++++++++++++++++++++++++++++++++
|
|
||||||
2 files changed, 422 insertions(+)
|
|
||||||
create mode 100644 src/sljit/sljitProtExecAllocator.c
|
|
||||||
|
|
||||||
diff --git a/Makefile.am b/Makefile.am
|
|
||||||
index bbf23b8..7fa98c5 100644
|
|
||||||
--- a/Makefile.am
|
|
||||||
+++ b/Makefile.am
|
|
||||||
@@ -442,6 +442,7 @@ EXTRA_DIST += \
|
|
||||||
src/sljit/sljitNativeX86_32.c \
|
|
||||||
src/sljit/sljitNativeX86_64.c \
|
|
||||||
src/sljit/sljitNativeX86_common.c \
|
|
||||||
+ src/sljit/sljitProtExecAllocator.c \
|
|
||||||
src/sljit/sljitUtils.c
|
|
||||||
|
|
||||||
# Some of the JIT sources are also in separate files that are #included.
|
|
||||||
diff --git a/src/sljit/sljitProtExecAllocator.c b/src/sljit/sljitProtExecAllocator.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..8a5b2b3
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/src/sljit/sljitProtExecAllocator.c
|
|
||||||
@@ -0,0 +1,421 @@
|
|
||||||
+/*
|
|
||||||
+ * Stack-less Just-In-Time compiler
|
|
||||||
+ *
|
|
||||||
+ * Copyright Zoltan Herczeg (hzmester@freemail.hu). All rights reserved.
|
|
||||||
+ *
|
|
||||||
+ * Redistribution and use in source and binary forms, with or without modification, are
|
|
||||||
+ * permitted provided that the following conditions are met:
|
|
||||||
+ *
|
|
||||||
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
|
|
||||||
+ * conditions and the following disclaimer.
|
|
||||||
+ *
|
|
||||||
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
|
||||||
+ * of conditions and the following disclaimer in the documentation and/or other materials
|
|
||||||
+ * provided with the distribution.
|
|
||||||
+ *
|
|
||||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND CONTRIBUTORS ``AS IS'' AND ANY
|
|
||||||
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
|
||||||
+ * SHALL THE COPYRIGHT HOLDER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
||||||
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
||||||
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ This file contains a simple executable memory allocator
|
|
||||||
+
|
|
||||||
+ It is assumed, that executable code blocks are usually medium (or sometimes
|
|
||||||
+ large) memory blocks, and the allocator is not too frequently called (less
|
|
||||||
+ optimized than other allocators). Thus, using it as a generic allocator is
|
|
||||||
+ not suggested.
|
|
||||||
+
|
|
||||||
+ How does it work:
|
|
||||||
+ Memory is allocated in continuous memory areas called chunks by alloc_chunk()
|
|
||||||
+ Chunk format:
|
|
||||||
+ [ block ][ block ] ... [ block ][ block terminator ]
|
|
||||||
+
|
|
||||||
+ All blocks and the block terminator is started with block_header. The block
|
|
||||||
+ header contains the size of the previous and the next block. These sizes
|
|
||||||
+ can also contain special values.
|
|
||||||
+ Block size:
|
|
||||||
+ 0 - The block is a free_block, with a different size member.
|
|
||||||
+ 1 - The block is a block terminator.
|
|
||||||
+ n - The block is used at the moment, and the value contains its size.
|
|
||||||
+ Previous block size:
|
|
||||||
+ 0 - This is the first block of the memory chunk.
|
|
||||||
+ n - The size of the previous block.
|
|
||||||
+
|
|
||||||
+ Using these size values we can go forward or backward on the block chain.
|
|
||||||
+ The unused blocks are stored in a chain list pointed by free_blocks. This
|
|
||||||
+ list is useful if we need to find a suitable memory area when the allocator
|
|
||||||
+ is called.
|
|
||||||
+
|
|
||||||
+ When a block is freed, the new free block is connected to its adjacent free
|
|
||||||
+ blocks if possible.
|
|
||||||
+
|
|
||||||
+ [ free block ][ used block ][ free block ]
|
|
||||||
+ and "used block" is freed, the three blocks are connected together:
|
|
||||||
+ [ one big free block ]
|
|
||||||
+*/
|
|
||||||
+
|
|
||||||
+/* --------------------------------------------------------------------- */
|
|
||||||
+/* System (OS) functions */
|
|
||||||
+/* --------------------------------------------------------------------- */
|
|
||||||
+
|
|
||||||
+/* 64 KByte. */
|
|
||||||
+#define CHUNK_SIZE 0x10000
|
|
||||||
+
|
|
||||||
+struct chunk_header {
|
|
||||||
+ void *executable;
|
|
||||||
+ int fd;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ alloc_chunk / free_chunk :
|
|
||||||
+ * allocate executable system memory chunks
|
|
||||||
+ * the size is always divisible by CHUNK_SIZE
|
|
||||||
+ allocator_grab_lock / allocator_release_lock :
|
|
||||||
+ * make the allocator thread safe
|
|
||||||
+ * can be empty if the OS (or the application) does not support threading
|
|
||||||
+ * only the allocator requires this lock, sljit is fully thread safe
|
|
||||||
+ as it only uses local variables
|
|
||||||
+*/
|
|
||||||
+
|
|
||||||
+#include <fcntl.h>
|
|
||||||
+
|
|
||||||
+#ifndef O_NOATIME
|
|
||||||
+#define O_NOATIME 0
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+#ifdef __O_TMPFILE
|
|
||||||
+#ifndef O_TMPFILE
|
|
||||||
+#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
|
|
||||||
+#endif
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+int mkostemp(char *template, int flags);
|
|
||||||
+char *secure_getenv(const char *name);
|
|
||||||
+
|
|
||||||
+static SLJIT_INLINE int create_tempfile(void)
|
|
||||||
+{
|
|
||||||
+ int fd;
|
|
||||||
+
|
|
||||||
+ char tmp_name[256];
|
|
||||||
+ size_t tmp_name_len;
|
|
||||||
+ char *dir;
|
|
||||||
+ size_t len;
|
|
||||||
+
|
|
||||||
+#ifdef P_tmpdir
|
|
||||||
+ len = (P_tmpdir != NULL) ? strlen(P_tmpdir) : 0;
|
|
||||||
+
|
|
||||||
+ if (len > 0 && len < sizeof(tmp_name)) {
|
|
||||||
+ strcpy(tmp_name, P_tmpdir);
|
|
||||||
+ tmp_name_len = len;
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ strcpy(tmp_name, "/tmp");
|
|
||||||
+ tmp_name_len = 4;
|
|
||||||
+ }
|
|
||||||
+#else
|
|
||||||
+ strcpy(tmp_name, "/tmp");
|
|
||||||
+ tmp_name_len = 4;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ dir = secure_getenv("TMPDIR");
|
|
||||||
+ if (dir) {
|
|
||||||
+ len = strlen(dir);
|
|
||||||
+ if (len > 0 && len < sizeof(tmp_name)) {
|
|
||||||
+ strcpy(tmp_name, dir);
|
|
||||||
+ tmp_name_len = len;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ SLJIT_ASSERT(tmp_name_len > 0 && tmp_name_len < sizeof(tmp_name));
|
|
||||||
+
|
|
||||||
+ while (tmp_name_len > 0 && tmp_name[tmp_name_len - 1] == '/') {
|
|
||||||
+ tmp_name_len--;
|
|
||||||
+ tmp_name[tmp_name_len] = '\0';
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+#ifdef O_TMPFILE
|
|
||||||
+ fd = open(tmp_name, O_TMPFILE | O_EXCL | O_RDWR | O_NOATIME | O_CLOEXEC, S_IRUSR | S_IWUSR);
|
|
||||||
+ if (fd != -1)
|
|
||||||
+ return fd;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ if (tmp_name_len + 7 >= sizeof(tmp_name))
|
|
||||||
+ {
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ strcpy(tmp_name + tmp_name_len, "/XXXXXX");
|
|
||||||
+ fd = mkostemp(tmp_name, O_CLOEXEC | O_NOATIME);
|
|
||||||
+
|
|
||||||
+ if (fd == -1)
|
|
||||||
+ return fd;
|
|
||||||
+
|
|
||||||
+ if (unlink(tmp_name)) {
|
|
||||||
+ close(fd);
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return fd;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static SLJIT_INLINE struct chunk_header* alloc_chunk(sljit_uw size)
|
|
||||||
+{
|
|
||||||
+ struct chunk_header *retval;
|
|
||||||
+ int fd;
|
|
||||||
+
|
|
||||||
+ fd = create_tempfile();
|
|
||||||
+ if (fd == -1)
|
|
||||||
+ return NULL;
|
|
||||||
+
|
|
||||||
+ if (ftruncate(fd, size)) {
|
|
||||||
+ close(fd);
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ retval = (struct chunk_header *)mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
|
||||||
+
|
|
||||||
+ if (retval == MAP_FAILED) {
|
|
||||||
+ close(fd);
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ retval->executable = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_SHARED, fd, 0);
|
|
||||||
+
|
|
||||||
+ if (retval->executable == MAP_FAILED) {
|
|
||||||
+ munmap(retval, size);
|
|
||||||
+ close(fd);
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ retval->fd = fd;
|
|
||||||
+ return retval;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static SLJIT_INLINE void free_chunk(void *chunk, sljit_uw size)
|
|
||||||
+{
|
|
||||||
+ struct chunk_header *header = ((struct chunk_header *)chunk) - 1;
|
|
||||||
+
|
|
||||||
+ int fd = header->fd;
|
|
||||||
+ munmap(header->executable, size);
|
|
||||||
+ munmap(header, size);
|
|
||||||
+ close(fd);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* --------------------------------------------------------------------- */
|
|
||||||
+/* Common functions */
|
|
||||||
+/* --------------------------------------------------------------------- */
|
|
||||||
+
|
|
||||||
+#define CHUNK_MASK (~(CHUNK_SIZE - 1))
|
|
||||||
+
|
|
||||||
+struct block_header {
|
|
||||||
+ sljit_uw size;
|
|
||||||
+ sljit_uw prev_size;
|
|
||||||
+ sljit_sw executable_offset;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+struct free_block {
|
|
||||||
+ struct block_header header;
|
|
||||||
+ struct free_block *next;
|
|
||||||
+ struct free_block *prev;
|
|
||||||
+ sljit_uw size;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+#define AS_BLOCK_HEADER(base, offset) \
|
|
||||||
+ ((struct block_header*)(((sljit_u8*)base) + offset))
|
|
||||||
+#define AS_FREE_BLOCK(base, offset) \
|
|
||||||
+ ((struct free_block*)(((sljit_u8*)base) + offset))
|
|
||||||
+#define MEM_START(base) ((void*)((base) + 1))
|
|
||||||
+#define ALIGN_SIZE(size) (((size) + sizeof(struct block_header) + 7) & ~7)
|
|
||||||
+
|
|
||||||
+static struct free_block* free_blocks;
|
|
||||||
+static sljit_uw allocated_size;
|
|
||||||
+static sljit_uw total_size;
|
|
||||||
+
|
|
||||||
+static SLJIT_INLINE void sljit_insert_free_block(struct free_block *free_block, sljit_uw size)
|
|
||||||
+{
|
|
||||||
+ free_block->header.size = 0;
|
|
||||||
+ free_block->size = size;
|
|
||||||
+
|
|
||||||
+ free_block->next = free_blocks;
|
|
||||||
+ free_block->prev = NULL;
|
|
||||||
+ if (free_blocks)
|
|
||||||
+ free_blocks->prev = free_block;
|
|
||||||
+ free_blocks = free_block;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static SLJIT_INLINE void sljit_remove_free_block(struct free_block *free_block)
|
|
||||||
+{
|
|
||||||
+ if (free_block->next)
|
|
||||||
+ free_block->next->prev = free_block->prev;
|
|
||||||
+
|
|
||||||
+ if (free_block->prev)
|
|
||||||
+ free_block->prev->next = free_block->next;
|
|
||||||
+ else {
|
|
||||||
+ SLJIT_ASSERT(free_blocks == free_block);
|
|
||||||
+ free_blocks = free_block->next;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size)
|
|
||||||
+{
|
|
||||||
+ struct chunk_header *chunk_header;
|
|
||||||
+ struct block_header *header;
|
|
||||||
+ struct block_header *next_header;
|
|
||||||
+ struct free_block *free_block;
|
|
||||||
+ sljit_uw chunk_size;
|
|
||||||
+ sljit_sw executable_offset;
|
|
||||||
+
|
|
||||||
+ allocator_grab_lock();
|
|
||||||
+ if (size < (64 - sizeof(struct block_header)))
|
|
||||||
+ size = (64 - sizeof(struct block_header));
|
|
||||||
+ size = ALIGN_SIZE(size);
|
|
||||||
+
|
|
||||||
+ free_block = free_blocks;
|
|
||||||
+ while (free_block) {
|
|
||||||
+ if (free_block->size >= size) {
|
|
||||||
+ chunk_size = free_block->size;
|
|
||||||
+ if (chunk_size > size + 64) {
|
|
||||||
+ /* We just cut a block from the end of the free block. */
|
|
||||||
+ chunk_size -= size;
|
|
||||||
+ free_block->size = chunk_size;
|
|
||||||
+ header = AS_BLOCK_HEADER(free_block, chunk_size);
|
|
||||||
+ header->prev_size = chunk_size;
|
|
||||||
+ header->executable_offset = free_block->header.executable_offset;
|
|
||||||
+ AS_BLOCK_HEADER(header, size)->prev_size = size;
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ sljit_remove_free_block(free_block);
|
|
||||||
+ header = (struct block_header*)free_block;
|
|
||||||
+ size = chunk_size;
|
|
||||||
+ }
|
|
||||||
+ allocated_size += size;
|
|
||||||
+ header->size = size;
|
|
||||||
+ allocator_release_lock();
|
|
||||||
+ return MEM_START(header);
|
|
||||||
+ }
|
|
||||||
+ free_block = free_block->next;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ chunk_size = sizeof(struct chunk_header) + sizeof(struct block_header);
|
|
||||||
+ chunk_size = (chunk_size + size + CHUNK_SIZE - 1) & CHUNK_MASK;
|
|
||||||
+
|
|
||||||
+ chunk_header = alloc_chunk(chunk_size);
|
|
||||||
+ if (!chunk_header) {
|
|
||||||
+ allocator_release_lock();
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ executable_offset = (sljit_sw)((sljit_u8*)chunk_header->executable - (sljit_u8*)chunk_header);
|
|
||||||
+
|
|
||||||
+ chunk_size -= sizeof(struct chunk_header) + sizeof(struct block_header);
|
|
||||||
+ total_size += chunk_size;
|
|
||||||
+
|
|
||||||
+ header = (struct block_header *)(chunk_header + 1);
|
|
||||||
+
|
|
||||||
+ header->prev_size = 0;
|
|
||||||
+ header->executable_offset = executable_offset;
|
|
||||||
+ if (chunk_size > size + 64) {
|
|
||||||
+ /* Cut the allocated space into a free and a used block. */
|
|
||||||
+ allocated_size += size;
|
|
||||||
+ header->size = size;
|
|
||||||
+ chunk_size -= size;
|
|
||||||
+
|
|
||||||
+ free_block = AS_FREE_BLOCK(header, size);
|
|
||||||
+ free_block->header.prev_size = size;
|
|
||||||
+ free_block->header.executable_offset = executable_offset;
|
|
||||||
+ sljit_insert_free_block(free_block, chunk_size);
|
|
||||||
+ next_header = AS_BLOCK_HEADER(free_block, chunk_size);
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ /* All space belongs to this allocation. */
|
|
||||||
+ allocated_size += chunk_size;
|
|
||||||
+ header->size = chunk_size;
|
|
||||||
+ next_header = AS_BLOCK_HEADER(header, chunk_size);
|
|
||||||
+ }
|
|
||||||
+ next_header->size = 1;
|
|
||||||
+ next_header->prev_size = chunk_size;
|
|
||||||
+ next_header->executable_offset = executable_offset;
|
|
||||||
+ allocator_release_lock();
|
|
||||||
+ return MEM_START(header);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr)
|
|
||||||
+{
|
|
||||||
+ struct block_header *header;
|
|
||||||
+ struct free_block* free_block;
|
|
||||||
+
|
|
||||||
+ allocator_grab_lock();
|
|
||||||
+ header = AS_BLOCK_HEADER(ptr, -(sljit_sw)sizeof(struct block_header));
|
|
||||||
+ header = AS_BLOCK_HEADER(header, -header->executable_offset);
|
|
||||||
+ allocated_size -= header->size;
|
|
||||||
+
|
|
||||||
+ /* Connecting free blocks together if possible. */
|
|
||||||
+
|
|
||||||
+ /* If header->prev_size == 0, free_block will equal to header.
|
|
||||||
+ In this case, free_block->header.size will be > 0. */
|
|
||||||
+ free_block = AS_FREE_BLOCK(header, -(sljit_sw)header->prev_size);
|
|
||||||
+ if (SLJIT_UNLIKELY(!free_block->header.size)) {
|
|
||||||
+ free_block->size += header->size;
|
|
||||||
+ header = AS_BLOCK_HEADER(free_block, free_block->size);
|
|
||||||
+ header->prev_size = free_block->size;
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ free_block = (struct free_block*)header;
|
|
||||||
+ sljit_insert_free_block(free_block, header->size);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ header = AS_BLOCK_HEADER(free_block, free_block->size);
|
|
||||||
+ if (SLJIT_UNLIKELY(!header->size)) {
|
|
||||||
+ free_block->size += ((struct free_block*)header)->size;
|
|
||||||
+ sljit_remove_free_block((struct free_block*)header);
|
|
||||||
+ header = AS_BLOCK_HEADER(free_block, free_block->size);
|
|
||||||
+ header->prev_size = free_block->size;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* The whole chunk is free. */
|
|
||||||
+ if (SLJIT_UNLIKELY(!free_block->header.prev_size && header->size == 1)) {
|
|
||||||
+ /* If this block is freed, we still have (allocated_size / 2) free space. */
|
|
||||||
+ if (total_size - free_block->size > (allocated_size * 3 / 2)) {
|
|
||||||
+ total_size -= free_block->size;
|
|
||||||
+ sljit_remove_free_block(free_block);
|
|
||||||
+ free_chunk(free_block, free_block->size + sizeof(struct block_header));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ allocator_release_lock();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void)
|
|
||||||
+{
|
|
||||||
+ struct free_block* free_block;
|
|
||||||
+ struct free_block* next_free_block;
|
|
||||||
+
|
|
||||||
+ allocator_grab_lock();
|
|
||||||
+
|
|
||||||
+ free_block = free_blocks;
|
|
||||||
+ while (free_block) {
|
|
||||||
+ next_free_block = free_block->next;
|
|
||||||
+ if (!free_block->header.prev_size &&
|
|
||||||
+ AS_BLOCK_HEADER(free_block, free_block->size)->size == 1) {
|
|
||||||
+ total_size -= free_block->size;
|
|
||||||
+ sljit_remove_free_block(free_block);
|
|
||||||
+ free_chunk(free_block, free_block->size + sizeof(struct block_header));
|
|
||||||
+ }
|
|
||||||
+ free_block = next_free_block;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ SLJIT_ASSERT((total_size && free_blocks) || (!total_size && !free_blocks));
|
|
||||||
+ allocator_release_lock();
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr)
|
|
||||||
+{
|
|
||||||
+ return ((struct block_header *)(ptr))[-1].executable_offset;
|
|
||||||
+}
|
|
||||||
--
|
|
||||||
2.9.4
|
|
||||||
|
|
@ -1,104 +0,0 @@
|
|||||||
From 7511f7fe27af8e5a8e56be790b5bdb9a56475f12 Mon Sep 17 00:00:00 2001
|
|
||||||
From: ph10 <ph10@6239d852-aaf2-0410-a92c-79f79f948069>
|
|
||||||
Date: Tue, 25 Jul 2017 15:27:30 +0000
|
|
||||||
Subject: [PATCH] Fix bug in /xx implementation.
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@848 6239d852-aaf2-0410-a92c-79f79f948069
|
|
||||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
||||||
---
|
|
||||||
src/pcre2_compile.c | 19 ++++++++++++++-----
|
|
||||||
testdata/testinput1 | 12 ++++++++++++
|
|
||||||
testdata/testoutput1 | 16 ++++++++++++++++
|
|
||||||
3 files changed, 42 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c
|
|
||||||
index c4aa14e..8368b39 100644
|
|
||||||
--- a/src/pcre2_compile.c
|
|
||||||
+++ b/src/pcre2_compile.c
|
|
||||||
@@ -3535,8 +3535,12 @@ while (ptr < ptrend)
|
|
||||||
/* If x appears twice it sets the extended extended option. */
|
|
||||||
|
|
||||||
case CHAR_x:
|
|
||||||
- *optset |= ((*optset & PCRE2_EXTENDED) != 0)?
|
|
||||||
- PCRE2_EXTENDED_MORE : PCRE2_EXTENDED;
|
|
||||||
+ *optset |= PCRE2_EXTENDED;
|
|
||||||
+ if (ptr < ptrend && *ptr == CHAR_x)
|
|
||||||
+ {
|
|
||||||
+ *optset |= PCRE2_EXTENDED_MORE;
|
|
||||||
+ ptr++;
|
|
||||||
+ }
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
@@ -3545,11 +3549,16 @@ while (ptr < ptrend)
|
|
||||||
goto FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- options = (options | set) & (~unset);
|
|
||||||
|
|
||||||
- /* Unsetting extended should also get rid of extended-more. */
|
|
||||||
+ /* If we are setting extended without extended-more, ensure that any
|
|
||||||
+ existing extended-more gets unset. Also, unsetting extended must also
|
|
||||||
+ unset extended-more. */
|
|
||||||
|
|
||||||
- if ((options & PCRE2_EXTENDED) == 0) options &= ~PCRE2_EXTENDED_MORE;
|
|
||||||
+ if ((set & (PCRE2_EXTENDED|PCRE2_EXTENDED_MORE)) == PCRE2_EXTENDED ||
|
|
||||||
+ (unset & PCRE2_EXTENDED) != 0)
|
|
||||||
+ unset |= PCRE2_EXTENDED_MORE;
|
|
||||||
+
|
|
||||||
+ options = (options | set) & (~unset);
|
|
||||||
|
|
||||||
/* If the options ended with ')' this is not the start of a nested
|
|
||||||
group with option changes, so the options change at this level.
|
|
||||||
diff --git a/testdata/testinput1 b/testdata/testinput1
|
|
||||||
index 8c76e21..24de5b0 100644
|
|
||||||
--- a/testdata/testinput1
|
|
||||||
+++ b/testdata/testinput1
|
|
||||||
@@ -6146,4 +6146,16 @@ ef) x/x,mark
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
+/<(?x:[a b])>/xx
|
|
||||||
+ < >
|
|
||||||
+
|
|
||||||
+/<(?:[a b])>/xx
|
|
||||||
+ < >
|
|
||||||
+
|
|
||||||
+/<(?xxx:[a b])>/
|
|
||||||
+ < >
|
|
||||||
+
|
|
||||||
+/<(?-x:[a b])>/xx
|
|
||||||
+ < >
|
|
||||||
+
|
|
||||||
# End of testinput1
|
|
||||||
diff --git a/testdata/testoutput1 b/testdata/testoutput1
|
|
||||||
index 85c1aad..ca955f2 100644
|
|
||||||
--- a/testdata/testoutput1
|
|
||||||
+++ b/testdata/testoutput1
|
|
||||||
@@ -9739,4 +9739,20 @@ No match
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
+/<(?x:[a b])>/xx
|
|
||||||
+ < >
|
|
||||||
+ 0: < >
|
|
||||||
+
|
|
||||||
+/<(?:[a b])>/xx
|
|
||||||
+ < >
|
|
||||||
+No match
|
|
||||||
+
|
|
||||||
+/<(?xxx:[a b])>/
|
|
||||||
+ < >
|
|
||||||
+No match
|
|
||||||
+
|
|
||||||
+/<(?-x:[a b])>/xx
|
|
||||||
+ < >
|
|
||||||
+ 0: < >
|
|
||||||
+
|
|
||||||
# End of testinput1
|
|
||||||
--
|
|
||||||
2.9.4
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
From 0c0a69a8312a3fd9e20465940634a4caa6d84c07 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
|
|
||||||
Date: Thu, 20 Jul 2017 13:14:19 +0200
|
|
||||||
Subject: [PATCH] Fix formatting converted_length
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
size_t width varies among platforms.
|
|
||||||
|
|
||||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
||||||
---
|
|
||||||
src/pcre2test.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/pcre2test.c b/src/pcre2test.c
|
|
||||||
index 5d1cbdc..3775772 100644
|
|
||||||
--- a/src/pcre2test.c
|
|
||||||
+++ b/src/pcre2test.c
|
|
||||||
@@ -5466,7 +5466,7 @@ if (pat_patctl.convert_type != CONVERT_UNSET)
|
|
||||||
|
|
||||||
if (rc != 0)
|
|
||||||
{
|
|
||||||
- fprintf(outfile, "** Pattern conversion error at offset %lu: ",
|
|
||||||
+ fprintf(outfile, "** Pattern conversion error at offset %zu: ",
|
|
||||||
converted_length);
|
|
||||||
convert_return = print_error_message(rc, "", "\n")? PR_SKIP:PR_ABEND;
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.9.4
|
|
||||||
|
|
@ -1,334 +0,0 @@
|
|||||||
From 153c51539667cde9080ffca91ddab93f5aa31a81 Mon Sep 17 00:00:00 2001
|
|
||||||
From: ph10 <ph10@6239d852-aaf2-0410-a92c-79f79f948069>
|
|
||||||
Date: Sat, 29 Jul 2017 15:54:04 +0000
|
|
||||||
Subject: [PATCH] Hyphen at the end of a character class is always literal.
|
|
||||||
Give error for false range after \d etc.
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@850 6239d852-aaf2-0410-a92c-79f79f948069
|
|
||||||
|
|
||||||
Petr Písař <ppisar@redhat.com>: Ported to 10.30-RC1.
|
|
||||||
|
|
||||||
---
|
|
||||||
doc/pcre2pattern.3 | 11 ++++++-----
|
|
||||||
src/pcre2_compile.c | 30 +++++++++++++++++++++---------
|
|
||||||
testdata/testinput1 | 15 +++------------
|
|
||||||
testdata/testinput2 | 10 ++++++++++
|
|
||||||
testdata/testinput4 | 2 +-
|
|
||||||
testdata/testinput6 | 12 ------------
|
|
||||||
testdata/testoutput1 | 22 ++++------------------
|
|
||||||
testdata/testoutput2 | 15 +++++++++++++++
|
|
||||||
testdata/testoutput4 | 2 +-
|
|
||||||
testdata/testoutput6 | 18 ------------------
|
|
||||||
|
|
||||||
diff --git a/doc/pcre2pattern.3 b/doc/pcre2pattern.3
|
|
||||||
index c3d54a8..2e5f7f0 100644
|
|
||||||
--- a/doc/pcre2pattern.3
|
|
||||||
+++ b/doc/pcre2pattern.3
|
|
||||||
@@ -1,4 +1,4 @@
|
|
||||||
-.TH PCRE2PATTERN 3 "05 July 2017" "PCRE2 10.30"
|
|
||||||
+.TH PCRE2PATTERN 3 "29 July 2017" "PCRE2 10.30"
|
|
||||||
.SH NAME
|
|
||||||
PCRE2 - Perl-compatible regular expressions (revised API)
|
|
||||||
.SH "PCRE2 REGULAR EXPRESSION DETAILS"
|
|
||||||
@@ -1388,9 +1388,10 @@ or immediately after a range. For example, [b-d-z] matches letters in the range
|
|
||||||
b to d, a hyphen character, or z.
|
|
||||||
.P
|
|
||||||
Perl treats a hyphen as a literal if it appears before or after a POSIX class
|
|
||||||
-(see below) or a character type escape such as as \ed, but gives a warning in
|
|
||||||
-its warning mode, as this is most likely a user error. As PCRE2 has no facility
|
|
||||||
-for warning, an error is given in these cases.
|
|
||||||
+(see below) or before or after a character type escape such as as \ed or \eH.
|
|
||||||
+However, unless the hyphen is the last character in the class, Perl outputs a
|
|
||||||
+warning in its warning mode, as this is most likely a user error. As PCRE2 has
|
|
||||||
+no facility for warning, an error is given in these cases.
|
|
||||||
.P
|
|
||||||
It is not possible to have the literal character "]" as the end character of a
|
|
||||||
range. A pattern such as [W-]46] is interpreted as a class of two characters
|
|
||||||
@@ -3498,6 +3499,6 @@ Cambridge, England.
|
|
||||||
.rs
|
|
||||||
.sp
|
|
||||||
.nf
|
|
||||||
-Last updated: 05 July 2017
|
|
||||||
+Last updated: 29 July 2017
|
|
||||||
Copyright (c) 1997-2017 University of Cambridge.
|
|
||||||
.fi
|
|
||||||
diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c
|
|
||||||
index 8368b39..c801ee4 100644
|
|
||||||
--- a/src/pcre2_compile.c
|
|
||||||
+++ b/src/pcre2_compile.c
|
|
||||||
@@ -3105,21 +3105,23 @@ while (ptr < ptrend)
|
|
||||||
ptr = tempptr + 2;
|
|
||||||
|
|
||||||
/* Perl treats a hyphen after a POSIX class as a literal, not the
|
|
||||||
- start of a range. However, it gives a warning in its warning mode. PCRE
|
|
||||||
- does not have a warning mode, so we give an error, because this is
|
|
||||||
- likely an error on the user's part. */
|
|
||||||
+ start of a range. However, it gives a warning in its warning mode
|
|
||||||
+ unless the hyphen is the last character in the class. PCRE does not
|
|
||||||
+ have a warning mode, so we give an error, because this is likely an
|
|
||||||
+ error on the user's part. */
|
|
||||||
|
|
||||||
- if (ptr < ptrend && *ptr == CHAR_MINUS)
|
|
||||||
+ if (ptr < ptrend - 1 && *ptr == CHAR_MINUS &&
|
|
||||||
+ ptr[1] != CHAR_RIGHT_SQUARE_BRACKET)
|
|
||||||
{
|
|
||||||
errorcode = ERR50;
|
|
||||||
goto FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* Set "a hyphen is not the start of a range" just in case the POSIX
|
|
||||||
- class is followed by \E or \Q\E (possibly repeated - fuzzers do that
|
|
||||||
- kind of thing) and *then* a hyphen. This causes that hyphen to be
|
|
||||||
- treated as a literal. I don't think it's worth setting up special
|
|
||||||
- apparatus to do otherwise. */
|
|
||||||
+ /* Set "a hyphen is not the start of a range" for the -] case, and also
|
|
||||||
+ in case the POSIX class is followed by \E or \Q\E (possibly repeated -
|
|
||||||
+ fuzzers do that kind of thing) and *then* a hyphen. This causes that
|
|
||||||
+ hyphen to be treated as a literal. I don't think it's worth setting up
|
|
||||||
+ special apparatus to do otherwise. */
|
|
||||||
|
|
||||||
class_range_state = RANGE_NO;
|
|
||||||
|
|
||||||
@@ -3334,6 +3336,16 @@ while (ptr < ptrend)
|
|
||||||
ptr--;
|
|
||||||
goto CLASS_ESCAPE_FAILED;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ /* Perl gives a warning unless a following hyphen is the last character
|
|
||||||
+ in the class. PCRE throws an error. */
|
|
||||||
+
|
|
||||||
+ if (ptr < ptrend - 1 && *ptr == CHAR_MINUS &&
|
|
||||||
+ ptr[1] != CHAR_RIGHT_SQUARE_BRACKET)
|
|
||||||
+ {
|
|
||||||
+ errorcode = ERR50;
|
|
||||||
+ goto FAILED;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Proceed to next thing in the class. */
|
|
||||||
diff --git a/testdata/testinput1 b/testdata/testinput1
|
|
||||||
index 24de5b0..611a88c 100644
|
|
||||||
--- a/testdata/testinput1
|
|
||||||
+++ b/testdata/testinput1
|
|
||||||
@@ -1423,11 +1423,6 @@
|
|
||||||
\= Expect no match
|
|
||||||
aaa
|
|
||||||
|
|
||||||
-/[\d-z]+/
|
|
||||||
- 12-34z
|
|
||||||
-\= Expect no match
|
|
||||||
- aaa
|
|
||||||
-
|
|
||||||
/\x5c/
|
|
||||||
\\
|
|
||||||
|
|
||||||
@@ -3620,13 +3615,6 @@
|
|
||||||
/a*/g
|
|
||||||
abbab
|
|
||||||
|
|
||||||
-/^[\d-a]/
|
|
||||||
- abcde
|
|
||||||
- -things
|
|
||||||
- 0digit
|
|
||||||
-\= Expect no match
|
|
||||||
- bcdef
|
|
||||||
-
|
|
||||||
/[[:space:]]+/
|
|
||||||
> \x09\x0a\x0c\x0d\x0b<
|
|
||||||
|
|
||||||
@@ -6158,4 +6146,7 @@ ef) x/x,mark
|
|
||||||
/<(?-x:[a b])>/xx
|
|
||||||
< >
|
|
||||||
|
|
||||||
+/[[:digit:]-]+/
|
|
||||||
+ 12-24
|
|
||||||
+
|
|
||||||
# End of testinput1
|
|
||||||
diff --git a/testdata/testinput2 b/testdata/testinput2
|
|
||||||
index f3b7674..022df20 100644
|
|
||||||
--- a/testdata/testinput2
|
|
||||||
+++ b/testdata/testinput2
|
|
||||||
@@ -5365,4 +5365,14 @@ a)"xI
|
|
||||||
bababbc
|
|
||||||
babababc
|
|
||||||
|
|
||||||
+/[[:digit:]-a]/
|
|
||||||
+
|
|
||||||
+/[[:digit:]-[:print:]]/
|
|
||||||
+
|
|
||||||
+/[\d-a]/
|
|
||||||
+
|
|
||||||
+/[\H-z]/
|
|
||||||
+
|
|
||||||
+/[\d-[:print:]]/
|
|
||||||
+
|
|
||||||
# End of testinput2
|
|
||||||
diff --git a/testdata/testinput4 b/testdata/testinput4
|
|
||||||
index 798176c..0ef7b8e 100644
|
|
||||||
--- a/testdata/testinput4
|
|
||||||
+++ b/testdata/testinput4
|
|
||||||
@@ -567,7 +567,7 @@
|
|
||||||
/[[:^xdigit:]]/g,utf
|
|
||||||
M\x{442}
|
|
||||||
|
|
||||||
-/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥfffiflffifflſtstﬓﬔﬕﬖﬗ\d-_^]/utf
|
|
||||||
+/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥfffiflffifflſtstﬓﬔﬕﬖﬗ\d_^]/utf
|
|
||||||
|
|
||||||
/^[^d]*?$/
|
|
||||||
abc
|
|
||||||
diff --git a/testdata/testinput6 b/testdata/testinput6
|
|
||||||
index 14bdaed..ce2e082 100644
|
|
||||||
--- a/testdata/testinput6
|
|
||||||
+++ b/testdata/testinput6
|
|
||||||
@@ -1861,11 +1861,6 @@
|
|
||||||
\= Expect no match
|
|
||||||
aaa
|
|
||||||
|
|
||||||
-/[\d-z]+/
|
|
||||||
- 12-34z
|
|
||||||
-\= Expect no match
|
|
||||||
- aaa
|
|
||||||
-
|
|
||||||
/\x5c/
|
|
||||||
\\
|
|
||||||
|
|
||||||
@@ -3813,13 +3808,6 @@
|
|
||||||
/a*/g
|
|
||||||
abbab
|
|
||||||
|
|
||||||
-/^[\d-a]/
|
|
||||||
- abcde
|
|
||||||
- -things
|
|
||||||
- 0digit
|
|
||||||
-\= Expect no match
|
|
||||||
- bcdef
|
|
||||||
-
|
|
||||||
/[[:space:]]+/
|
|
||||||
> \x09\x0a\x0c\x0d\x0b<
|
|
||||||
|
|
||||||
diff --git a/testdata/testoutput1 b/testdata/testoutput1
|
|
||||||
index ca955f2..75ac0ca 100644
|
|
||||||
--- a/testdata/testoutput1
|
|
||||||
+++ b/testdata/testoutput1
|
|
||||||
@@ -1985,13 +1985,6 @@ No match
|
|
||||||
aaa
|
|
||||||
No match
|
|
||||||
|
|
||||||
-/[\d-z]+/
|
|
||||||
- 12-34z
|
|
||||||
- 0: 12-34z
|
|
||||||
-\= Expect no match
|
|
||||||
- aaa
|
|
||||||
-No match
|
|
||||||
-
|
|
||||||
/\x5c/
|
|
||||||
\\
|
|
||||||
0: \
|
|
||||||
@@ -5743,17 +5736,6 @@ No match
|
|
||||||
0:
|
|
||||||
0:
|
|
||||||
|
|
||||||
-/^[\d-a]/
|
|
||||||
- abcde
|
|
||||||
- 0: a
|
|
||||||
- -things
|
|
||||||
- 0: -
|
|
||||||
- 0digit
|
|
||||||
- 0: 0
|
|
||||||
-\= Expect no match
|
|
||||||
- bcdef
|
|
||||||
-No match
|
|
||||||
-
|
|
||||||
/[[:space:]]+/
|
|
||||||
> \x09\x0a\x0c\x0d\x0b<
|
|
||||||
0: \x09\x0a\x0c\x0d\x0b
|
|
||||||
@@ -9755,4 +9737,8 @@ No match
|
|
||||||
< >
|
|
||||||
0: < >
|
|
||||||
|
|
||||||
+/[[:digit:]-]+/
|
|
||||||
+ 12-24
|
|
||||||
+ 0: 12-24
|
|
||||||
+
|
|
||||||
# End of testinput1
|
|
||||||
diff --git a/testdata/testoutput2 b/testdata/testoutput2
|
|
||||||
index 7e138dc..2d9e347 100644
|
|
||||||
--- a/testdata/testoutput2
|
|
||||||
+++ b/testdata/testoutput2
|
|
||||||
@@ -16325,6 +16325,21 @@ No match
|
|
||||||
babababc
|
|
||||||
No match
|
|
||||||
|
|
||||||
+/[[:digit:]-a]/
|
|
||||||
+Failed: error 150 at offset 10: invalid range in character class
|
|
||||||
+
|
|
||||||
+/[[:digit:]-[:print:]]/
|
|
||||||
+Failed: error 150 at offset 10: invalid range in character class
|
|
||||||
+
|
|
||||||
+/[\d-a]/
|
|
||||||
+Failed: error 150 at offset 3: invalid range in character class
|
|
||||||
+
|
|
||||||
+/[\H-z]/
|
|
||||||
+Failed: error 150 at offset 3: invalid range in character class
|
|
||||||
+
|
|
||||||
+/[\d-[:print:]]/
|
|
||||||
+Failed: error 150 at offset 3: invalid range in character class
|
|
||||||
+
|
|
||||||
# End of testinput2
|
|
||||||
Error -65: PCRE2_ERROR_BADDATA (unknown error number)
|
|
||||||
Error -62: bad serialized data
|
|
||||||
diff --git a/testdata/testoutput4 b/testdata/testoutput4
|
|
||||||
index bb3f672..6056e6d 100644
|
|
||||||
--- a/testdata/testoutput4
|
|
||||||
+++ b/testdata/testoutput4
|
|
||||||
@@ -958,7 +958,7 @@ No match
|
|
||||||
0: M
|
|
||||||
0: \x{442}
|
|
||||||
|
|
||||||
-/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥfffiflffifflſtstﬓﬔﬕﬖﬗ\d-_^]/utf
|
|
||||||
+/[^ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽƁƂƄƆƇƉƊƋƎƏƐƑƓƔƖƗƘƜƝƟƠƢƤƦƧƩƬƮƯƱƲƳƵƷƸƼDŽLJNJǍǏǑǓǕǗǙǛǞǠǢǤǦǨǪǬǮDZǴǶǷǸǺǼǾȀȂȄȆȈȊȌȎȐȒȔȖȘȚȜȞȠȢȤȦȨȪȬȮȰȲȺȻȽȾɁΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫϒϓϔϘϚϜϞϠϢϤϦϨϪϬϮϴϷϹϺϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯѠѢѤѦѨѪѬѮѰѲѴѶѸѺѼѾҀҊҌҎҐҒҔҖҘҚҜҞҠҢҤҦҨҪҬҮҰҲҴҶҸҺҼҾӀӁӃӅӇӉӋӍӐӒӔӖӘӚӜӞӠӢӤӦӨӪӬӮӰӲӴӶӸԀԂԄԆԈԊԌԎԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅḀḂḄḆḈḊḌḎḐḒḔḖḘḚḜḞḠḢḤḦḨḪḬḮḰḲḴḶḸḺḼḾṀṂṄṆṈṊṌṎṐṒṔṖṘṚṜṞṠṢṤṦṨṪṬṮṰṲṴṶṸṺṼṾẀẂẄẆẈẊẌẎẐẒẔẠẢẤẦẨẪẬẮẰẲẴẶẸẺẼẾỀỂỄỆỈỊỌỎỐỒỔỖỘỚỜỞỠỢỤỦỨỪỬỮỰỲỴỶỸἈἉἊἋἌἍἎἏἘἙἚἛἜἝἨἩἪἫἬἭἮἯἸἹἺἻἼἽἾἿὈὉὊὋὌὍὙὛὝὟὨὩὪὫὬὭὮὯᾸᾹᾺΆῈΈῊΉῘῙῚΊῨῩῪΎῬῸΌῺΏabcdefghijklmnopqrstuvwxyzªµºßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷźżžſƀƃƅƈƌƍƒƕƙƚƛƞơƣƥƨƪƫƭưƴƶƹƺƽƾƿdžljnjǎǐǒǔǖǘǚǜǝǟǡǣǥǧǩǫǭǯǰdzǵǹǻǽǿȁȃȅȇȉȋȍȏȑȓȕȗșțȝȟȡȣȥȧȩȫȭȯȱȳȴȵȶȷȸȹȼȿɀɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯΐάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϐϑϕϖϗϙϛϝϟϡϣϥϧϩϫϭϯϰϱϲϳϵϸϻϼабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѡѣѥѧѩѫѭѯѱѳѵѷѹѻѽѿҁҋҍҏґғҕҗҙқҝҟҡңҥҧҩҫҭүұҳҵҷҹһҽҿӂӄӆӈӊӌӎӑӓӕӗәӛӝӟӡӣӥӧөӫӭӯӱӳӵӷӹԁԃԅԇԉԋԍԏաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚḁḃḅḇḉḋḍḏḑḓḕḗḙḛḝḟḡḣḥḧḩḫḭḯḱḳḵḷḹḻḽḿṁṃṅṇṉṋṍṏṑṓṕṗṙṛṝṟṡṣṥṧṩṫṭṯṱṳṵṷṹṻṽṿẁẃẅẇẉẋẍẏẑẓẕẖẗẘẙẚẛạảấầẩẫậắằẳẵặẹẻẽếềểễệỉịọỏốồổỗộớờởỡợụủứừửữựỳỵỷỹἀἁἂἃἄἅἆἇἐἑἒἓἔἕἠἡἢἣἤἥἦἧἰἱἲἳἴἵἶἷὀὁὂὃὄὅὐὑὒὓὔὕὖὗὠὡὢὣὤὥὦὧὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾐᾑᾒᾓᾔᾕᾖᾗᾠᾡᾢᾣᾤᾥᾦᾧᾰᾱᾲᾳᾴᾶᾷιῂῃῄῆῇῐῑῒΐῖῗῠῡῢΰῤῥῦῧῲῳῴῶῷⲁⲃⲅⲇⲉⲋⲍⲏⲑⲓⲕⲗⲙⲛⲝⲟⲡⲣⲥⲧⲩⲫⲭⲯⲱⲳⲵⲷⲹⲻⲽⲿⳁⳃⳅⳇⳉⳋⳍⳏⳑⳓⳕⳗⳙⳛⳝⳟⳡⳣⳤⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥfffiflffifflſtstﬓﬔﬕﬖﬗ\d_^]/utf
|
|
||||||
|
|
||||||
/^[^d]*?$/
|
|
||||||
abc
|
|
||||||
diff --git a/testdata/testoutput6 b/testdata/testoutput6
|
|
||||||
index a703ad3..b912944 100644
|
|
||||||
--- a/testdata/testoutput6
|
|
||||||
+++ b/testdata/testoutput6
|
|
||||||
@@ -2674,13 +2674,6 @@ No match
|
|
||||||
aaa
|
|
||||||
No match
|
|
||||||
|
|
||||||
-/[\d-z]+/
|
|
||||||
- 12-34z
|
|
||||||
- 0: 12-34z
|
|
||||||
-\= Expect no match
|
|
||||||
- aaa
|
|
||||||
-No match
|
|
||||||
-
|
|
||||||
/\x5c/
|
|
||||||
\\
|
|
||||||
0: \
|
|
||||||
@@ -5715,17 +5708,6 @@ No match
|
|
||||||
0:
|
|
||||||
0:
|
|
||||||
|
|
||||||
-/^[\d-a]/
|
|
||||||
- abcde
|
|
||||||
- 0: a
|
|
||||||
- -things
|
|
||||||
- 0: -
|
|
||||||
- 0digit
|
|
||||||
- 0: 0
|
|
||||||
-\= Expect no match
|
|
||||||
- bcdef
|
|
||||||
-No match
|
|
||||||
-
|
|
||||||
/[[:space:]]+/
|
|
||||||
> \x09\x0a\x0c\x0d\x0b<
|
|
||||||
0: \x09\x0a\x0c\x0d\x0b
|
|
||||||
--
|
|
||||||
2.9.4
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
|||||||
From 811cdcf78d9bab7d8309accc68b70f315e1193b2 Mon Sep 17 00:00:00 2001
|
|
||||||
From: zherczeg <zherczeg@6239d852-aaf2-0410-a92c-79f79f948069>
|
|
||||||
Date: Mon, 24 Jul 2017 04:05:38 +0000
|
|
||||||
Subject: [PATCH] JIT compiler update.
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@847 6239d852-aaf2-0410-a92c-79f79f948069
|
|
||||||
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
||||||
---
|
|
||||||
src/sljit/sljitLir.c | 7 +++----
|
|
||||||
src/sljit/sljitNativePPC_common.c | 3 +--
|
|
||||||
2 files changed, 4 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/sljit/sljitLir.c b/src/sljit/sljitLir.c
|
|
||||||
index d64b62e..66cdda3 100644
|
|
||||||
--- a/src/sljit/sljitLir.c
|
|
||||||
+++ b/src/sljit/sljitLir.c
|
|
||||||
@@ -124,10 +124,10 @@
|
|
||||||
/* SLJIT_REWRITABLE_JUMP is 0x1000. */
|
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
|
|
||||||
-# define PATCH_MB 0x4
|
|
||||||
-# define PATCH_MW 0x8
|
|
||||||
+# define PATCH_MB 0x4
|
|
||||||
+# define PATCH_MW 0x8
|
|
||||||
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
|
|
||||||
-# define PATCH_MD 0x10
|
|
||||||
+# define PATCH_MD 0x10
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1555,7 +1555,6 @@ static SLJIT_INLINE CHECK_RETURN_TYPE check_sljit_emit_cmov(struct sljit_compile
|
|
||||||
sljit_s32 dst_reg,
|
|
||||||
sljit_s32 src, sljit_sw srcw)
|
|
||||||
{
|
|
||||||
-(void)srcw; /* To stop compiler warning */
|
|
||||||
#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
|
||||||
CHECK_ARGUMENT(!(type & ~(0xff | SLJIT_I32_OP)));
|
|
||||||
CHECK_ARGUMENT((type & 0xff) >= SLJIT_EQUAL && (type & 0xff) <= SLJIT_ORDERED_F64);
|
|
||||||
diff --git a/src/sljit/sljitNativePPC_common.c b/src/sljit/sljitNativePPC_common.c
|
|
||||||
index 775c708..e76deb7 100644
|
|
||||||
--- a/src/sljit/sljitNativePPC_common.c
|
|
||||||
+++ b/src/sljit/sljitNativePPC_common.c
|
|
||||||
@@ -2282,16 +2282,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *co
|
|
||||||
FAIL_IF(emit_op_mem2(compiler, input_flags | LOAD_DATA, TMP_REG1, dst, dstw, dst, dstw));
|
|
||||||
|
|
||||||
invert = 0;
|
|
||||||
+ cr_bit = 0;
|
|
||||||
|
|
||||||
switch (type & 0xff) {
|
|
||||||
case SLJIT_LESS:
|
|
||||||
case SLJIT_SIG_LESS:
|
|
||||||
- cr_bit = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SLJIT_GREATER_EQUAL:
|
|
||||||
case SLJIT_SIG_GREATER_EQUAL:
|
|
||||||
- cr_bit = 0;
|
|
||||||
invert = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
--
|
|
||||||
2.9.4
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
|||||||
From e5a7fbea3d4478a57346135b8965c943a11da9c1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: ph10 <ph10@6239d852-aaf2-0410-a92c-79f79f948069>
|
|
||||||
Date: Fri, 21 Jul 2017 08:53:02 +0000
|
|
||||||
Subject: [PATCH] Put back pcre2_set_recursion_limit() as a real function,
|
|
||||||
synonym for pcre2_set_depth_limit() in order to preserve the ABI.
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@846 6239d852-aaf2-0410-a92c-79f79f948069
|
|
||||||
|
|
||||||
Petr Písař <ppisar@redhat.com>: Ported to 10.30-RC1
|
|
||||||
---
|
|
||||||
src/pcre2.h.generic | 4 +++-
|
|
||||||
src/pcre2.h.in | 4 +++-
|
|
||||||
src/pcre2_context.c | 8 +++++++-
|
|
||||||
|
|
||||||
diff --git a/src/pcre2.h.generic b/src/pcre2.h.generic
|
|
||||||
index 7cafb4c..287b12a 100644
|
|
||||||
--- a/src/pcre2.h.generic
|
|
||||||
+++ b/src/pcre2.h.generic
|
|
||||||
@@ -489,6 +489,8 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
|
|
||||||
PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
|
|
||||||
pcre2_set_offset_limit(pcre2_match_context *, PCRE2_SIZE); \
|
|
||||||
PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
|
|
||||||
+ pcre2_set_recursion_limit(pcre2_match_context *, uint32_t); \
|
|
||||||
+PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
|
|
||||||
pcre2_set_recursion_memory_management(pcre2_match_context *, \
|
|
||||||
void *(*)(PCRE2_SIZE, void *), void (*)(void *, void *), void *);
|
|
||||||
|
|
||||||
@@ -760,7 +762,7 @@ pcre2_compile are called by application code. */
|
|
||||||
#define pcre2_substring_number_from_name PCRE2_SUFFIX(pcre2_substring_number_from_name_)
|
|
||||||
|
|
||||||
/* Keep this old function name for backwards compatibility */
|
|
||||||
-#define pcre2_set_recursion_limit pcre2_set_depth_limit
|
|
||||||
+#define pcre2_set_recursion_limit PCRE2_SUFFIX(pcre2_set_recursion_limit_)
|
|
||||||
|
|
||||||
/* Keep this obsolete function for backwards compatibility: it is now a noop. */
|
|
||||||
#define pcre2_set_recursion_memory_management PCRE2_SUFFIX(pcre2_set_recursion_memory_management_)
|
|
||||||
diff --git a/src/pcre2.h.in b/src/pcre2.h.in
|
|
||||||
index 399ddcd..4a8e126 100644
|
|
||||||
--- a/src/pcre2.h.in
|
|
||||||
+++ b/src/pcre2.h.in
|
|
||||||
@@ -489,6 +489,8 @@ PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
|
|
||||||
PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
|
|
||||||
pcre2_set_offset_limit(pcre2_match_context *, PCRE2_SIZE); \
|
|
||||||
PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
|
|
||||||
+ pcre2_set_recursion_limit(pcre2_match_context *, uint32_t); \
|
|
||||||
+PCRE2_EXP_DECL int PCRE2_CALL_CONVENTION \
|
|
||||||
pcre2_set_recursion_memory_management(pcre2_match_context *, \
|
|
||||||
void *(*)(PCRE2_SIZE, void *), void (*)(void *, void *), void *);
|
|
||||||
|
|
||||||
@@ -760,7 +762,7 @@ pcre2_compile are called by application code. */
|
|
||||||
#define pcre2_substring_number_from_name PCRE2_SUFFIX(pcre2_substring_number_from_name_)
|
|
||||||
|
|
||||||
/* Keep this old function name for backwards compatibility */
|
|
||||||
-#define pcre2_set_recursion_limit pcre2_set_depth_limit
|
|
||||||
+#define pcre2_set_recursion_limit PCRE2_SUFFIX(pcre2_set_recursion_limit_)
|
|
||||||
|
|
||||||
/* Keep this obsolete function for backwards compatibility: it is now a noop. */
|
|
||||||
#define pcre2_set_recursion_memory_management PCRE2_SUFFIX(pcre2_set_recursion_memory_management_)
|
|
||||||
diff --git a/src/pcre2_context.c b/src/pcre2_context.c
|
|
||||||
index 9e557da..2c14df0 100644
|
|
||||||
--- a/src/pcre2_context.c
|
|
||||||
+++ b/src/pcre2_context.c
|
|
||||||
@@ -431,10 +431,16 @@ mcontext->offset_limit = limit;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-/* This function became obsolete at release 10.30. It is kept as a no-op for
|
|
||||||
+/* This function became obsolete at release 10.30. It is kept as a synonym for
|
|
||||||
backwards compatibility. */
|
|
||||||
|
|
||||||
PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
|
|
||||||
+pcre2_set_recursion_limit(pcre2_match_context *mcontext, uint32_t limit)
|
|
||||||
+{
|
|
||||||
+return pcre2_set_depth_limit(mcontext, limit);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
|
|
||||||
pcre2_set_recursion_memory_management(pcre2_match_context *mcontext,
|
|
||||||
void *(*mymalloc)(size_t, void *), void (*myfree)(void *, void *),
|
|
||||||
void *mydata)
|
|
||||||
--
|
|
||||||
2.9.4
|
|
||||||
|
|
31
pcre2.spec
31
pcre2.spec
@ -3,10 +3,10 @@
|
|||||||
%{bcond_with pcre2_enables_sealloc}
|
%{bcond_with pcre2_enables_sealloc}
|
||||||
|
|
||||||
# This is stable release:
|
# This is stable release:
|
||||||
%global rcversion RC1
|
#%%global rcversion RC1
|
||||||
Name: pcre2
|
Name: pcre2
|
||||||
Version: 10.30
|
Version: 10.30
|
||||||
Release: %{?rcversion:0.}6%{?rcversion:.%rcversion}%{?dist}
|
Release: %{?rcversion:0.}1%{?rcversion:.%rcversion}%{?dist}
|
||||||
%global myversion %{version}%{?rcversion:-%rcversion}
|
%global myversion %{version}%{?rcversion:-%rcversion}
|
||||||
Summary: Perl-compatible regular expression library
|
Summary: Perl-compatible regular expression library
|
||||||
# the library: BSD with exceptions
|
# the library: BSD with exceptions
|
||||||
@ -42,23 +42,6 @@ URL: http://www.pcre.org/
|
|||||||
Source: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/%{?rcversion:Testing/}%{name}-%{myversion}.tar.bz2
|
Source: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/%{?rcversion:Testing/}%{name}-%{myversion}.tar.bz2
|
||||||
# Do no set RPATH if libdir is not /usr/lib
|
# Do no set RPATH if libdir is not /usr/lib
|
||||||
Patch0: pcre2-10.10-Fix-multilib.patch
|
Patch0: pcre2-10.10-Fix-multilib.patch
|
||||||
# Add forgotten sources for SELinux JIT allocator, in upstream after 10.30-RC1,
|
|
||||||
# <https://lists.exim.org/lurker/message/20170720.103409.cb67b89d.en.html>
|
|
||||||
Patch1: pcre2-10.30-RC1-Distribute-forgotten-sljitProtExecAllocator.c.patch
|
|
||||||
# Preserve pcre2-10.23 ABI, in upstream after 10.30-RC1
|
|
||||||
# <https://lists.exim.org/lurker/message/20170720.111013.7f8f78d3.en.html>
|
|
||||||
Patch2: pcre2-10.30-RC1-Put-back-pcre2_set_recursion_limit-as-a-real-functio.patch
|
|
||||||
# Correct formatting a size_t variable, in upstream after 10.30-RC1,
|
|
||||||
# <https://lists.exim.org/lurker/message/20170720.112359.fa1910da.en.html>
|
|
||||||
Patch3: pcre2-10.30-RC1-Fix-formatting-converted_length.patch
|
|
||||||
# Fix a compiler warning in JIT code for ppc32, in upstream after 10.30-RC1
|
|
||||||
Patch4: pcre2-10.30-RC1-JIT-compiler-update.patch
|
|
||||||
# Fix applying local x modifier while global xx was in effect,
|
|
||||||
# in upstream after 10.30-RC1
|
|
||||||
Patch5: pcre2-10.30-RC1-Fix-bug-in-xx-implementation.patch
|
|
||||||
# Fix handling a hyphen at the end of a character class, upstream bug #2153,
|
|
||||||
# in upstream after 10.30-RC1
|
|
||||||
Patch6: pcre2-10.30-RC1-Hyphen-at-the-end-of-a-character-class-is-always-lit.patch
|
|
||||||
BuildRequires: autoconf
|
BuildRequires: autoconf
|
||||||
BuildRequires: automake
|
BuildRequires: automake
|
||||||
BuildRequires: coreutils
|
BuildRequires: coreutils
|
||||||
@ -107,7 +90,6 @@ Summary: Development files for %{name}
|
|||||||
Requires: %{name}%{?_isa} = %{version}-%{release}
|
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||||
Requires: %{name}-utf16%{?_isa} = %{version}-%{release}
|
Requires: %{name}-utf16%{?_isa} = %{version}-%{release}
|
||||||
Requires: %{name}-utf32%{?_isa} = %{version}-%{release}
|
Requires: %{name}-utf32%{?_isa} = %{version}-%{release}
|
||||||
Requires: gcc
|
|
||||||
|
|
||||||
%description devel
|
%description devel
|
||||||
Development files (headers, libraries for dynamic linking, documentation)
|
Development files (headers, libraries for dynamic linking, documentation)
|
||||||
@ -134,12 +116,6 @@ Utilities demonstrating PCRE2 capabilities like pcre2grep or pcre2test.
|
|||||||
%prep
|
%prep
|
||||||
%setup -q -n %{name}-%{myversion}
|
%setup -q -n %{name}-%{myversion}
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%patch1 -p1
|
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
|
||||||
%patch4 -p1
|
|
||||||
%patch5 -p1
|
|
||||||
%patch6 -p1
|
|
||||||
# Because of multilib patch
|
# Because of multilib patch
|
||||||
libtoolize --copy --force
|
libtoolize --copy --force
|
||||||
autoreconf -vif
|
autoreconf -vif
|
||||||
@ -243,6 +219,9 @@ make %{?_smp_mflags} check VERBOSE=yes
|
|||||||
%{_mandir}/man1/pcre2test.*
|
%{_mandir}/man1/pcre2test.*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Aug 15 2017 Petr Pisar <ppisar@redhat.com> - 10.30-1
|
||||||
|
- 10.30 bump
|
||||||
|
|
||||||
* Wed Aug 02 2017 Petr Pisar <ppisar@redhat.com> - 10.30-0.6.RC1
|
* Wed Aug 02 2017 Petr Pisar <ppisar@redhat.com> - 10.30-0.6.RC1
|
||||||
- Disable SELinux-friendly JIT allocator because it crashes after a fork
|
- Disable SELinux-friendly JIT allocator because it crashes after a fork
|
||||||
(upstream bug #1749)
|
(upstream bug #1749)
|
||||||
|
2
sources
2
sources
@ -1 +1 @@
|
|||||||
SHA512 (pcre2-10.30-RC1.tar.bz2) = f72722e12822cb9f2831980cbc786536b1394350cac542cf280e8c14cf9a10386bb0ee2cd73ceba7d9c521ff8f1e0e79a8d89aaf93638ceb0cd7f9eabbfa2d07
|
SHA512 (pcre2-10.30.tar.bz2) = f247a9f917c75920793b9919a45bb1426d126246e7a5d04e39d9407e44b5781f894a90cd3d232b385436b2f22be391335ab782664dd3a28c79058a2fcc74dc3e
|
||||||
|
Loading…
Reference in New Issue
Block a user