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