ctags.rb 1.0.0

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