1a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* -*- buffer-read-only: t -*- vi: set ro: */ 2a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ 3a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Extended regular expression matching and search library. 4a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 5a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Free Software Foundation, Inc. 6a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner This file is part of the GNU C Library. 7a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. 8a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 9a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner This program is free software; you can redistribute it and/or modify 10a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner it under the terms of the GNU General Public License as published by 11a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the Free Software Foundation; either version 3, or (at your option) 12a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner any later version. 13a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 14a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner This program is distributed in the hope that it will be useful, 15a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 16a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner GNU General Public License for more details. 18a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 19a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner You should have received a copy of the GNU General Public License along 20a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner with this program; if not, write to the Free Software Foundation, 21a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 22a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 23a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef _REGEX_INTERNAL_H 24a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define _REGEX_INTERNAL_H 1 25a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 26a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <assert.h> 27a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <ctype.h> 28a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdbool.h> 29a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdio.h> 30a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdlib.h> 31a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <string.h> 32a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 33a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef _LIBC 34a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <langinfo.h> 35a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 36a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include "localcharset.h" 37a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 38a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if defined HAVE_LOCALE_H || defined _LIBC 39a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <locale.h> 40a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 41a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 42a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <wchar.h> 43a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <wctype.h> 44a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <stdint.h> 45a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if defined _LIBC 46a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <bits/libc-lock.h> 47a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 48a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __libc_lock_init(NAME) do { } while (0) 49a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __libc_lock_lock(NAME) do { } while (0) 50a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __libc_lock_unlock(NAME) do { } while (0) 51a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 52a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 53a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* In case that the system doesn't have isblank(). */ 54a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if !defined _LIBC && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK)) 55a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define isblank(ch) ((ch) == ' ' || (ch) == '\t') 56a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 57a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 58a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef _LIBC 59a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# ifndef _RE_DEFINE_LOCALE_FUNCTIONS 60a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define _RE_DEFINE_LOCALE_FUNCTIONS 1 61a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <locale/localeinfo.h> 62a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <locale/elem-hash.h> 63a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <locale/coll-lookup.h> 64a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif 65a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 66a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 67a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* This is for other GNU distributions with internationalized messages. */ 68a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC 69a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <libintl.h> 70a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# ifdef _LIBC 71a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# undef gettext 72a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define gettext(msgid) \ 73a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner INTUSE(__dcgettext) (_libc_intl_domainname, msgid, LC_MESSAGES) 74a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif 75a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 76a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define gettext(msgid) (msgid) 77a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 78a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 79a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef gettext_noop 80a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* This define is so xgettext can find the internationalizable 81a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner strings. */ 82a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define gettext_noop(String) String 83a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 84a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 85a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* For loser systems without the definition. */ 86a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef SIZE_MAX 87a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define SIZE_MAX ((size_t) -1) 88a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 89a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 90a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if (defined MB_CUR_MAX && HAVE_LOCALE_H && HAVE_WCTYPE_H && HAVE_ISWCTYPE && HAVE_WCSCOLL) || _LIBC 91a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define RE_ENABLE_I18N 92a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 93a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 94a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if __GNUC__ >= 3 95a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BE(expr, val) __builtin_expect (expr, val) 96a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 97a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BE(expr, val) (expr) 98a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# ifdef _LIBC 99a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define inline 100a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif 101a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 102a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 103a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Number of ASCII characters. */ 104a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define ASCII_CHARS 0x80 105a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 106a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Number of single byte characters. */ 107a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define SBC_MAX (UCHAR_MAX + 1) 108a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 109a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define COLL_ELEM_LEN_MAX 8 110a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 111a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* The character which represents newline. */ 112a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define NEWLINE_CHAR '\n' 113a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define WIDE_NEWLINE_CHAR L'\n' 114a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 115a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Rename to standard API for using out of glibc. */ 116a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef _LIBC 117a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __wctype wctype 118a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __iswctype iswctype 119a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __btowc btowc 120a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __wcrtomb wcrtomb 121a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __mbrtowc mbrtowc 122a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __regfree regfree 123a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define attribute_hidden 124a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif /* not _LIBC */ 125a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 126a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) 127a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __attribute(arg) __attribute__ (arg) 128a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 129a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __attribute(arg) 130a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 131a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 132a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef __re_idx_t Idx; 133a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 134a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Special return value for failure to match. */ 135a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define REG_MISSING ((Idx) -1) 136a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 137a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Special return value for internal error. */ 138a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define REG_ERROR ((Idx) -2) 139a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 140a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Test whether N is a valid index, and is not one of the above. */ 141a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef _REGEX_LARGE_OFFSETS 142a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define REG_VALID_INDEX(n) ((Idx) (n) < REG_ERROR) 143a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 144a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define REG_VALID_INDEX(n) (0 <= (n)) 145a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 146a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 147a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Test whether N is a valid nonzero index. */ 148a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef _REGEX_LARGE_OFFSETS 149a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define REG_VALID_NONZERO_INDEX(n) ((Idx) ((n) - 1) < (Idx) (REG_ERROR - 1)) 150a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 151a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define REG_VALID_NONZERO_INDEX(n) (0 < (n)) 152a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 153a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 154a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* A hash value, suitable for computing hash tables. */ 155a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef __re_size_t re_hashval_t; 156a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 157a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* An integer used to represent a set of bits. It must be unsigned, 158a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner and must be at least as wide as unsigned int. */ 159a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef unsigned long int bitset_word_t; 160a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* All bits set in a bitset_word_t. */ 161a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define BITSET_WORD_MAX ULONG_MAX 162a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 163a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Number of bits in a bitset_word_t. For portability to hosts with 164a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner padding bits, do not use '(sizeof (bitset_word_t) * CHAR_BIT)'; 165a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner instead, deduce it directly from BITSET_WORD_MAX. Avoid 166a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner greater-than-32-bit integers and unconditional shifts by more than 167a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 31 bits, as they're not portable. */ 168a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if BITSET_WORD_MAX == 0xffffffffUL 169a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 32 170a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#elif BITSET_WORD_MAX >> 31 >> 4 == 1 171a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 36 172a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#elif BITSET_WORD_MAX >> 31 >> 16 == 1 173a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 48 174a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#elif BITSET_WORD_MAX >> 31 >> 28 == 1 175a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 60 176a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#elif BITSET_WORD_MAX >> 31 >> 31 >> 1 == 1 177a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 64 178a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#elif BITSET_WORD_MAX >> 31 >> 31 >> 9 == 1 179a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 72 180a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 3 == 1 181a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 128 182a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 == 1 183a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 256 184a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 > 1 185a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define BITSET_WORD_BITS 257 /* any value > SBC_MAX will do here */ 186a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# if BITSET_WORD_BITS <= SBC_MAX 187a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# error "Invalid SBC_MAX" 188a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif 189a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 190a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# error "Add case for new bitset_word_t size" 191a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 192a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 193a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Number of bitset_word_t values in a bitset_t. */ 194a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define BITSET_WORDS ((SBC_MAX + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS) 195a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 196a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef bitset_word_t bitset_t[BITSET_WORDS]; 197a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef bitset_word_t *re_bitset_ptr_t; 198a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef const bitset_word_t *re_const_bitset_ptr_t; 199a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 200a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define PREV_WORD_CONSTRAINT 0x0001 201a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define PREV_NOTWORD_CONSTRAINT 0x0002 202a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define NEXT_WORD_CONSTRAINT 0x0004 203a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define NEXT_NOTWORD_CONSTRAINT 0x0008 204a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define PREV_NEWLINE_CONSTRAINT 0x0010 205a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define NEXT_NEWLINE_CONSTRAINT 0x0020 206a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define PREV_BEGBUF_CONSTRAINT 0x0040 207a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define NEXT_ENDBUF_CONSTRAINT 0x0080 208a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define WORD_DELIM_CONSTRAINT 0x0100 209a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define NOT_WORD_DELIM_CONSTRAINT 0x0200 210a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 211a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef enum 212a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 213a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT, 214a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT, 215a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT, 216a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT, 217a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner LINE_FIRST = PREV_NEWLINE_CONSTRAINT, 218a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner LINE_LAST = NEXT_NEWLINE_CONSTRAINT, 219a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner BUF_FIRST = PREV_BEGBUF_CONSTRAINT, 220a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner BUF_LAST = NEXT_ENDBUF_CONSTRAINT, 221a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner WORD_DELIM = WORD_DELIM_CONSTRAINT, 222a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT 223a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_context_type; 224a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 225a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 226a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 227a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx alloc; 228a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nelem; 229a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx *elems; 230a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_node_set; 231a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 232a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef enum 233a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 234a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner NON_TYPE = 0, 235a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 236a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Node type, These are used by token, node, tree. */ 237a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner CHARACTER = 1, 238a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner END_OF_RE = 2, 239a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner SIMPLE_BRACKET = 3, 240a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_BACK_REF = 4, 241a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_PERIOD = 5, 242a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef RE_ENABLE_I18N 243a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner COMPLEX_BRACKET = 6, 244a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_UTF8_PERIOD = 7, 245a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif /* RE_ENABLE_I18N */ 246a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 247a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used 248a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner when the debugger shows values of this enum type. */ 249a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define EPSILON_BIT 8 250a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_OPEN_SUBEXP = EPSILON_BIT | 0, 251a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_CLOSE_SUBEXP = EPSILON_BIT | 1, 252a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_ALT = EPSILON_BIT | 2, 253a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_DUP_ASTERISK = EPSILON_BIT | 3, 254a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ANCHOR = EPSILON_BIT | 4, 255a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 256a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Tree type, these are used only by tree. */ 257a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner CONCAT = 16, 258a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner SUBEXP = 17, 259a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 260a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Token type, these are used only by token. */ 261a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_DUP_PLUS = 18, 262a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_DUP_QUESTION, 263a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_OPEN_BRACKET, 264a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_CLOSE_BRACKET, 265a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_CHARSET_RANGE, 266a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_OPEN_DUP_NUM, 267a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_CLOSE_DUP_NUM, 268a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_NON_MATCH_LIST, 269a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_OPEN_COLL_ELEM, 270a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_CLOSE_COLL_ELEM, 271a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_OPEN_EQUIV_CLASS, 272a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_CLOSE_EQUIV_CLASS, 273a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_OPEN_CHAR_CLASS, 274a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_CLOSE_CHAR_CLASS, 275a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_WORD, 276a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_NOTWORD, 277a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_SPACE, 278a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner OP_NOTSPACE, 279a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner BACK_SLASH 280a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 281a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_token_type_t; 282a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 283a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef RE_ENABLE_I18N 284a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 285a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 286a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Multibyte characters. */ 287a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner wchar_t *mbchars; 288a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 289a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Collating symbols. */ 290a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# ifdef _LIBC 291a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int32_t *coll_syms; 292a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif 293a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 294a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Equivalence classes. */ 295a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# ifdef _LIBC 296a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int32_t *equiv_classes; 297a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif 298a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 299a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Range expressions. */ 300a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# ifdef _LIBC 301a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner uint32_t *range_starts; 302a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner uint32_t *range_ends; 303a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# else /* not _LIBC */ 304a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner wchar_t *range_starts; 305a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner wchar_t *range_ends; 306a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif /* not _LIBC */ 307a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 308a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Character classes. */ 309a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner wctype_t *char_classes; 310a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 311a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* If this character set is the non-matching list. */ 312a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int non_match : 1; 313a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 314a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* # of multibyte characters. */ 315a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nmbchars; 316a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 317a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* # of collating symbols. */ 318a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx ncoll_syms; 319a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 320a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* # of equivalence classes. */ 321a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nequiv_classes; 322a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 323a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* # of range expressions. */ 324a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nranges; 325a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 326a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* # of character classes. */ 327a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nchar_classes; 328a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_charset_t; 329a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif /* RE_ENABLE_I18N */ 330a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 331a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 332a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 333a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner union 334a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 335a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char c; /* for CHARACTER */ 336a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */ 337a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef RE_ENABLE_I18N 338a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_charset_t *mbcset; /* for COMPLEX_BRACKET */ 339a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif /* RE_ENABLE_I18N */ 340a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx idx; /* for BACK_REF */ 341a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_context_type ctx_type; /* for ANCHOR */ 342a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } opr; 343a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if __GNUC__ >= 2 && !__STRICT_ANSI__ 344a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_token_type_t type : 8; 345a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 346a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_token_type_t type; 347a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 348a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int constraint : 10; /* context constraint */ 349a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int duplicated : 1; 350a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int opt_subexp : 1; 351a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef RE_ENABLE_I18N 352a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int accept_mb : 1; 353a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* These 2 bits can be moved into the union if needed (e.g. if running out 354a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner of bits; move opr.c to opr.c.c and move the flags to opr.c.flags). */ 355a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int mb_partial : 1; 356a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 357a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int word_char : 1; 358a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_token_t; 359a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 360a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT) 361a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 362a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct re_string_t 363a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 364a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Indicate the raw buffer which is the original string passed as an 365a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner argument of regexec(), re_search(), etc.. */ 366a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const unsigned char *raw_mbs; 367a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Store the multibyte string. In case of "case insensitive mode" like 368a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner REG_ICASE, upper cases of the string are stored, otherwise MBS points 369a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the same address that RAW_MBS points. */ 370a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char *mbs; 371a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef RE_ENABLE_I18N 372a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Store the wide character string which is corresponding to MBS. */ 373a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner wint_t *wcs; 374a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx *offsets; 375a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner mbstate_t cur_state; 376a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 377a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Index in RAW_MBS. Each character mbs[i] corresponds to 378a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner raw_mbs[raw_mbs_idx + i]. */ 379a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx raw_mbs_idx; 380a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* The length of the valid characters in the buffers. */ 381a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx valid_len; 382a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* The corresponding number of bytes in raw_mbs array. */ 383a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx valid_raw_len; 384a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* The length of the buffers MBS and WCS. */ 385a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx bufs_len; 386a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* The index in MBS, which is updated by re_string_fetch_byte. */ 387a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx cur_idx; 388a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* length of RAW_MBS array. */ 389a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx raw_len; 390a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN. */ 391a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx len; 392a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* End of the buffer may be shorter than its length in the cases such 393a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner as re_match_2, re_search_2. Then, we use STOP for end of the buffer 394a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner instead of LEN. */ 395a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx raw_stop; 396a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS. */ 397a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx stop; 398a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 399a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* The context of mbs[0]. We store the context independently, since 400a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the context of mbs[0] may be different from raw_mbs[0], which is 401a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner the beginning of the input string. */ 402a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int tip_context; 403a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* The translation passed as a part of an argument of re_compile_pattern. */ 404a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner RE_TRANSLATE_TYPE trans; 405a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Copy of re_dfa_t's word_char. */ 406a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_const_bitset_ptr_t word_char; 407a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* true if REG_ICASE. */ 408a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char icase; 409a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char is_utf8; 410a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char map_notascii; 411a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char mbs_allocated; 412a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char offsets_needed; 413a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char newline_anchor; 414a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char word_ops_used; 415a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int mb_cur_max; 416a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 417a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct re_string_t re_string_t; 418a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 419a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 420a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct re_dfa_t; 421a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct re_dfa_t re_dfa_t; 422a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 423a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef _LIBC 424a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# if defined __i386__ && !defined __EMX__ 425a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define internal_function __attribute ((regparm (3), stdcall)) 426a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# else 427a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define internal_function 428a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif 429a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 430a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 431a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic reg_errcode_t re_string_realloc_buffers (re_string_t *pstr, 432a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx new_buf_len) 433a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner internal_function; 434a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef RE_ENABLE_I18N 435a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic void build_wcs_buffer (re_string_t *pstr) internal_function; 436a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr) 437a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner internal_function; 438a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif /* RE_ENABLE_I18N */ 439a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic void build_upper_buffer (re_string_t *pstr) internal_function; 440a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic void re_string_translate_buffer (re_string_t *pstr) internal_function; 441a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic unsigned int re_string_context_at (const re_string_t *input, Idx idx, 442a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int eflags) 443a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner internal_function __attribute ((pure)); 444a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_peek_byte(pstr, offset) \ 445a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((pstr)->mbs[(pstr)->cur_idx + offset]) 446a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_fetch_byte(pstr) \ 447a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((pstr)->mbs[(pstr)->cur_idx++]) 448a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_first_byte(pstr, idx) \ 449a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF) 450a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_is_single_byte_char(pstr, idx) \ 451a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \ 452a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner || (pstr)->wcs[(idx) + 1] != WEOF)) 453a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx) 454a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_cur_idx(pstr) ((pstr)->cur_idx) 455a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_get_buffer(pstr) ((pstr)->mbs) 456a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_length(pstr) ((pstr)->len) 457a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx]) 458a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx)) 459a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx)) 460a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 461a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#include <alloca.h> 462a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 463a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef _LIBC 464a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# if HAVE_ALLOCA 465a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* The OS usually guarantees only one guard page at the bottom of the stack, 466a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner and a page size can be as small as 4096 bytes. So we cannot safely 467a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner allocate anything larger than 4096 bytes. Also care for the possibility 468a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner of a few compiler-allocated temporary stack slots. */ 469a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __libc_use_alloca(n) ((n) < 4032) 470a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# else 471a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* alloca is implemented with malloc, so just use malloc. */ 472a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define __libc_use_alloca(n) 0 473a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif 474a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 475a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 476a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifndef MAX 477a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# define MAX(a,b) ((a) < (b) ? (b) : (a)) 478a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 479a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 480a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t))) 481a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t))) 482a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_free(p) free (p) 483a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 484a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct bin_tree_t 485a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 486a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct bin_tree_t *parent; 487a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct bin_tree_t *left; 488a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct bin_tree_t *right; 489a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct bin_tree_t *first; 490a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct bin_tree_t *next; 491a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 492a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_token_t token; 493a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 494a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* `node_idx' is the index in dfa->nodes, if `type' == 0. 495a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Otherwise `type' indicate the type of this node. */ 496a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx node_idx; 497a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 498a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct bin_tree_t bin_tree_t; 499a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 500a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define BIN_TREE_STORAGE_SIZE \ 501a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((1024 - sizeof (void *)) / sizeof (bin_tree_t)) 502a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 503a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct bin_tree_storage_t 504a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 505a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct bin_tree_storage_t *next; 506a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner bin_tree_t data[BIN_TREE_STORAGE_SIZE]; 507a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 508a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct bin_tree_storage_t bin_tree_storage_t; 509a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 510a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define CONTEXT_WORD 1 511a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define CONTEXT_NEWLINE (CONTEXT_WORD << 1) 512a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1) 513a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1) 514a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 515a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD) 516a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE) 517a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF) 518a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF) 519a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_ORDINARY_CONTEXT(c) ((c) == 0) 520a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 521a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_') 522a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR) 523a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_WIDE_WORD_CHAR(ch) (iswalnum (ch) || (ch) == L'_') 524a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR) 525a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 526a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \ 527a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \ 528a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \ 529a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\ 530a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context))) 531a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 532a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \ 533a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \ 534a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \ 535a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \ 536a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context))) 537a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 538a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct re_dfastate_t 539a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 540a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_hashval_t hash; 541a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set nodes; 542a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set non_eps_nodes; 543a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set inveclosure; 544a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set *entrance_nodes; 545a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct re_dfastate_t **trtable, **word_trtable; 546a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int context : 4; 547a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int halt : 1; 548a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* If this state can accept `multi byte'. 549a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Note that we refer to multibyte characters, and multi character 550a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner collating elements as `multi byte'. */ 551a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int accept_mb : 1; 552a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* If this state has backreference node(s). */ 553a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int has_backref : 1; 554a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int has_constraint : 1; 555a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 556a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct re_dfastate_t re_dfastate_t; 557a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 558a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct re_state_table_entry 559a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 560a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx num; 561a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx alloc; 562a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t **array; 563a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 564a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 565a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */ 566a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 567a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 568a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 569a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx next_idx; 570a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx alloc; 571a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t **array; 572a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} state_array_t; 573a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 574a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */ 575a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 576a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 577a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 578a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx node; 579a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx str_idx; /* The position NODE match at. */ 580a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner state_array_t path; 581a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_sub_match_last_t; 582a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 583a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Store information about the node NODE whose type is OP_OPEN_SUBEXP. 584a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner And information about the node, whose type is OP_CLOSE_SUBEXP, 585a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner corresponding to NODE is stored in LASTS. */ 586a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 587a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 588a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 589a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx str_idx; 590a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx node; 591a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner state_array_t *path; 592a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx alasts; /* Allocation size of LASTS. */ 593a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nlasts; /* The number of LASTS. */ 594a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_sub_match_last_t **lasts; 595a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_sub_match_top_t; 596a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 597a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct re_backref_cache_entry 598a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 599a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx node; 600a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx str_idx; 601a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx subexp_from; 602a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx subexp_to; 603a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char more; 604a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char unused; 605a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned short int eps_reachable_subexps_map; 606a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 607a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 608a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 609a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 610a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* The string object corresponding to the input string. */ 611a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_string_t input; 612a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) 613a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const re_dfa_t *const dfa; 614a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#else 615a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const re_dfa_t *dfa; 616a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 617a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* EFLAGS of the argument of regexec. */ 618a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int eflags; 619a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Where the matching ends. */ 620a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx match_last; 621a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx last_node; 622a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* The state log used by the matcher. */ 623a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t **state_log; 624a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx state_log_top; 625a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Back reference cache. */ 626a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nbkref_ents; 627a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx abkref_ents; 628a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct re_backref_cache_entry *bkref_ents; 629a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int max_mb_elem_len; 630a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nsub_tops; 631a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx asub_tops; 632a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_sub_match_top_t **sub_tops; 633a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_match_context_t; 634a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 635a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 636a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 637a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t **sifted_states; 638a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t **limited_states; 639a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx last_node; 640a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx last_str_idx; 641a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set limits; 642a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} re_sift_context_t; 643a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 644a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct re_fail_stack_ent_t 645a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 646a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx idx; 647a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx node; 648a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner regmatch_t *regs; 649a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set eps_via_nodes; 650a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 651a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 652a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct re_fail_stack_t 653a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 654a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx num; 655a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx alloc; 656a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct re_fail_stack_ent_t *stack; 657a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 658a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 659a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstruct re_dfa_t 660a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 661a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_token_t *nodes; 662a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner size_t nodes_alloc; 663a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner size_t nodes_len; 664a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx *nexts; 665a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx *org_indices; 666a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set *edests; 667a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set *eclosures; 668a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_node_set *inveclosures; 669a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner struct re_state_table_entry *state_table; 670a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t *init_state; 671a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t *init_state_word; 672a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t *init_state_nl; 673a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_dfastate_t *init_state_begbuf; 674a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner bin_tree_t *str_tree; 675a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner bin_tree_storage_t *str_tree_storage; 676a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_bitset_ptr_t sb_char; 677a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int str_tree_storage_idx; 678a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 679a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* number of subexpressions `re_nsub' is in regex_t. */ 680a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner re_hashval_t state_hash_mask; 681a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx init_node; 682a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx nbackref; /* The number of backreference in this dfa. */ 683a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 684a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* Bitmap expressing which backreference is used. */ 685a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner bitset_word_t used_bkref_map; 686a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner bitset_word_t completed_bkref_map; 687a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 688a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int has_plural_match : 1; 689a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner /* If this dfa has "multibyte node", which is a backreference or 690a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner a node which can accept multibyte character or multi character 691a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner collating element. */ 692a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int has_mb_node : 1; 693a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int is_utf8 : 1; 694a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int map_notascii : 1; 695a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned int word_ops_used : 1; 696a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int mb_cur_max; 697a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner bitset_t word_char; 698a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner reg_syntax_t syntax; 699a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner Idx *subexp_map; 700a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef DEBUG 701a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner char* re_str; 702a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 703a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef _LIBC 704a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner __libc_lock_define (, lock) 705a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif 706a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner}; 707a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 708a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set)) 709a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_node_set_remove(set,id) \ 710a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1)) 711a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_node_set_empty(p) ((p)->nelem = 0) 712a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#define re_node_set_free(set) re_free ((set)->elems) 713a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 714a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 715a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef enum 716a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 717a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner SB_CHAR, 718a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner MB_CHAR, 719a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner EQUIV_CLASS, 720a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner COLL_SYM, 721a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner CHAR_CLASS 722a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} bracket_elem_type; 723a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 724a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnertypedef struct 725a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 726a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner bracket_elem_type type; 727a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner union 728a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 729a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char ch; 730a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner unsigned char *name; 731a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner wchar_t wch; 732a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } opr; 733a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} bracket_elem_t; 734a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 735a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 736a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Inline functions for bitset_t operation. */ 737a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 738a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline void 739a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_set (bitset_t set, Idx i) 740a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 741a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS; 742a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 743a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 744a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline void 745a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_clear (bitset_t set, Idx i) 746a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 747a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS); 748a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 749a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 750a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline bool 751a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_contain (const bitset_t set, Idx i) 752a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 753a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1; 754a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 755a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 756a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline void 757a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_empty (bitset_t set) 758a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 759a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner memset (set, '\0', sizeof (bitset_t)); 760a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 761a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 762a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline void 763a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_set_all (bitset_t set) 764a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 765a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS)); 766a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (SBC_MAX % BITSET_WORD_BITS != 0) 767a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner set[BITSET_WORDS - 1] = 768a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1; 769a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 770a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 771a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline void 772a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_copy (bitset_t dest, const bitset_t src) 773a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 774a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner memcpy (dest, src, sizeof (bitset_t)); 775a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 776a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 777a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline void 778a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_not (bitset_t set) 779a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 780a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int bitset_i; 781a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i) 782a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner set[bitset_i] = ~set[bitset_i]; 783a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (SBC_MAX % BITSET_WORD_BITS != 0) 784a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner set[BITSET_WORDS - 1] = 785a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner ((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1) 786a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner & ~set[BITSET_WORDS - 1]); 787a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 788a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 789a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline void 790a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_merge (bitset_t dest, const bitset_t src) 791a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 792a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int bitset_i; 793a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) 794a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner dest[bitset_i] |= src[bitset_i]; 795a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 796a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 797a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline void 798a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerbitset_mask (bitset_t dest, const bitset_t src) 799a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 800a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int bitset_i; 801a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i) 802a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner dest[bitset_i] &= src[bitset_i]; 803a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 804a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 805a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#ifdef RE_ENABLE_I18N 806a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner/* Inline functions for re_string. */ 807a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline int 808a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerinternal_function __attribute ((pure)) 809a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerre_string_char_size_at (const re_string_t *pstr, Idx idx) 810a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 811a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int byte_idx; 812a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (pstr->mb_cur_max == 1) 813a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return 1; 814a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx) 815a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (pstr->wcs[idx + byte_idx] != WEOF) 816a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner break; 817a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return byte_idx; 818a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 819a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 820a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic inline wint_t 821a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerinternal_function __attribute ((pure)) 822a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerre_string_wchar_at (const re_string_t *pstr, Idx idx) 823a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 824a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (pstr->mb_cur_max == 1) 825a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return (wint_t) pstr->mbs[idx]; 826a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return (wint_t) pstr->wcs[idx]; 827a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 828a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 829a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerstatic int 830a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerinternal_function __attribute ((pure)) 831a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turnerre_string_elem_size_at (const re_string_t *pstr, Idx idx) 832a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner{ 833a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# ifdef _LIBC 834a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const unsigned char *p, *extra; 835a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner const int32_t *table, *indirect; 836a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner int32_t tmp; 837a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# include <locale/weight.h> 838a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES); 839a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 840a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner if (nrules != 0) 841a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner { 842a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB); 843a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner extra = (const unsigned char *) 844a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB); 845a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE, 846a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner _NL_COLLATE_INDIRECTMB); 847a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner p = pstr->mbs + idx; 848a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner tmp = findidx (&p); 849a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return p - pstr->mbs - idx; 850a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner } 851a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner else 852a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner# endif /* _LIBC */ 853a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner return 1; 854a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner} 855a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif /* RE_ENABLE_I18N */ 856a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner 857a6dfe5f70959a596290e1591579d26a288a1a2f9David 'Digit' Turner#endif /* _REGEX_INTERNAL_H */ 858