summaryrefslogtreecommitdiffstats
path: root/gl/regex.h
diff options
context:
space:
mode:
Diffstat (limited to 'gl/regex.h')
-rw-r--r--gl/regex.h142
1 files changed, 87 insertions, 55 deletions
diff --git a/gl/regex.h b/gl/regex.h
index 854c6eda..a7e0bd02 100644
--- a/gl/regex.h
+++ b/gl/regex.h
@@ -1,22 +1,21 @@
1/* Definitions for data structures and routines for the regular 1/* Definitions for data structures and routines for the regular
2 expression library. 2 expression library.
3 Copyright (C) 1985, 1989-1993, 1995-1998, 2000-2003, 2005-2013 Free Software 3 Copyright (C) 1985, 1989-2022 Free Software Foundation, Inc.
4 Foundation, Inc.
5 This file is part of the GNU C Library. 4 This file is part of the GNU C Library.
6 5
7 The GNU C Library is free software; you can redistribute it and/or 6 The GNU C Library is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public 7 modify it under the terms of the GNU Lesser General Public
9 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
10 version 3 of the License, or (at your option) any later version. 9 version 2.1 of the License, or (at your option) any later version.
11 10
12 The GNU C Library is distributed in the hope that it will be useful, 11 The GNU C Library is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details. 14 Lesser General Public License for more details.
16 15
17 You should have received a copy of the GNU General Public 16 You should have received a copy of the GNU Lesser General Public
18 License along with the GNU C Library; if not, see 17 License along with the GNU C Library; if not, see
19 <http://www.gnu.org/licenses/>. */ 18 <https://www.gnu.org/licenses/>. */
20 19
21#ifndef _REGEX_H 20#ifndef _REGEX_H
22#define _REGEX_H 1 21#define _REGEX_H 1
@@ -42,11 +41,6 @@ extern "C" {
42 supported within glibc itself, and glibc users should not define 41 supported within glibc itself, and glibc users should not define
43 _REGEX_LARGE_OFFSETS. */ 42 _REGEX_LARGE_OFFSETS. */
44 43
45/* The type of nonnegative object indexes. Traditionally, GNU regex
46 uses 'int' for these. Code that uses __re_idx_t should work
47 regardless of whether the type is signed. */
48typedef size_t __re_idx_t;
49
50/* The type of object sizes. */ 44/* The type of object sizes. */
51typedef size_t __re_size_t; 45typedef size_t __re_size_t;
52 46
@@ -58,7 +52,6 @@ typedef size_t __re_long_size_t;
58 52
59/* The traditional GNU regex implementation mishandles strings longer 53/* The traditional GNU regex implementation mishandles strings longer
60 than INT_MAX. */ 54 than INT_MAX. */
61typedef int __re_idx_t;
62typedef unsigned int __re_size_t; 55typedef unsigned int __re_size_t;
63typedef unsigned long int __re_long_size_t; 56typedef unsigned long int __re_long_size_t;
64 57
@@ -244,19 +237,16 @@ extern reg_syntax_t re_syntax_options;
244 | RE_INVALID_INTERVAL_ORD) 237 | RE_INVALID_INTERVAL_ORD)
245 238
246# define RE_SYNTAX_GREP \ 239# define RE_SYNTAX_GREP \
247 (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ 240 ((RE_SYNTAX_POSIX_BASIC | RE_NEWLINE_ALT) \
248 | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ 241 & ~(RE_CONTEXT_INVALID_DUP | RE_DOT_NOT_NULL))
249 | RE_NEWLINE_ALT)
250 242
251# define RE_SYNTAX_EGREP \ 243# define RE_SYNTAX_EGREP \
252 (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ 244 ((RE_SYNTAX_POSIX_EXTENDED | RE_INVALID_INTERVAL_ORD | RE_NEWLINE_ALT) \
253 | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ 245 & ~(RE_CONTEXT_INVALID_OPS | RE_DOT_NOT_NULL))
254 | RE_NEWLINE_ALT | RE_NO_BK_PARENS \
255 | RE_NO_BK_VBAR)
256 246
247/* POSIX grep -E behavior is no longer incompatible with GNU. */
257# define RE_SYNTAX_POSIX_EGREP \ 248# define RE_SYNTAX_POSIX_EGREP \
258 (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \ 249 RE_SYNTAX_EGREP
259 | RE_INVALID_INTERVAL_ORD)
260 250
261/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ 251/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
262# define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC 252# define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
@@ -491,7 +481,8 @@ typedef struct re_pattern_buffer regex_t;
491#ifdef _REGEX_LARGE_OFFSETS 481#ifdef _REGEX_LARGE_OFFSETS
492/* POSIX 1003.1-2008 requires that regoff_t be at least as wide as 482/* POSIX 1003.1-2008 requires that regoff_t be at least as wide as
493 ptrdiff_t and ssize_t. We don't know of any hosts where ptrdiff_t 483 ptrdiff_t and ssize_t. We don't know of any hosts where ptrdiff_t
494 is wider than ssize_t, so ssize_t is safe. */ 484 is wider than ssize_t, so ssize_t is safe. ptrdiff_t is not
485 visible here, so use ssize_t. */
495typedef ssize_t regoff_t; 486typedef ssize_t regoff_t;
496#else 487#else
497/* The traditional GNU regex implementation mishandles strings longer 488/* The traditional GNU regex implementation mishandles strings longer
@@ -531,6 +522,30 @@ typedef struct
531 522
532/* Declarations for routines. */ 523/* Declarations for routines. */
533 524
525#ifndef _REGEX_NELTS
526# if (defined __STDC_VERSION__ && 199901L <= __STDC_VERSION__ \
527 && !defined __STDC_NO_VLA__)
528# define _REGEX_NELTS(n) n
529# else
530# define _REGEX_NELTS(n)
531# endif
532#endif
533
534#if defined __GNUC__ && 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
535# pragma GCC diagnostic push
536# pragma GCC diagnostic ignored "-Wvla"
537#endif
538
539#ifndef _Attr_access_
540# ifdef __attr_access
541# define _Attr_access_(arg) __attr_access (arg)
542# elif defined __GNUC__ && 10 <= __GNUC__
543# define _Attr_access_(x) __attribute__ ((__access__ x))
544# else
545# define _Attr_access_(x)
546# endif
547#endif
548
534#ifdef __USE_GNU 549#ifdef __USE_GNU
535/* Sets the current default syntax to SYNTAX, and return the old syntax. 550/* Sets the current default syntax to SYNTAX, and return the old syntax.
536 You can also simply assign to the 're_syntax_options' variable. */ 551 You can also simply assign to the 're_syntax_options' variable. */
@@ -541,11 +556,12 @@ extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
541 BUFFER. Return NULL if successful, and an error string if not. 556 BUFFER. Return NULL if successful, and an error string if not.
542 557
543 To free the allocated storage, you must call 'regfree' on BUFFER. 558 To free the allocated storage, you must call 'regfree' on BUFFER.
544 Note that the translate table must either have been initialised by 559 Note that the translate table must either have been initialized by
545 'regcomp', with a malloc'ed value, or set to NULL before calling 560 'regcomp', with a malloc'ed value, or set to NULL before calling
546 'regfree'. */ 561 'regfree'. */
547extern const char *re_compile_pattern (const char *__pattern, size_t __length, 562extern const char *re_compile_pattern (const char *__pattern, size_t __length,
548 struct re_pattern_buffer *__buffer); 563 struct re_pattern_buffer *__buffer)
564 _Attr_access_ ((__read_only__, 1, 2));
549 565
550 566
551/* Compile a fastmap for the compiled pattern in BUFFER; used to 567/* Compile a fastmap for the compiled pattern in BUFFER; used to
@@ -560,34 +576,40 @@ extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
560 match, or -2 for an internal error. Also return register 576 match, or -2 for an internal error. Also return register
561 information in REGS (if REGS and BUFFER->no_sub are nonzero). */ 577 information in REGS (if REGS and BUFFER->no_sub are nonzero). */
562extern regoff_t re_search (struct re_pattern_buffer *__buffer, 578extern regoff_t re_search (struct re_pattern_buffer *__buffer,
563 const char *__string, __re_idx_t __length, 579 const char *__String, regoff_t __length,
564 __re_idx_t __start, regoff_t __range, 580 regoff_t __start, regoff_t __range,
565 struct re_registers *__regs); 581 struct re_registers *__regs)
582 _Attr_access_ ((__read_only__, 2, 3));
566 583
567 584
568/* Like 're_search', but search in the concatenation of STRING1 and 585/* Like 're_search', but search in the concatenation of STRING1 and
569 STRING2. Also, stop searching at index START + STOP. */ 586 STRING2. Also, stop searching at index START + STOP. */
570extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer, 587extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
571 const char *__string1, __re_idx_t __length1, 588 const char *__string1, regoff_t __length1,
572 const char *__string2, __re_idx_t __length2, 589 const char *__string2, regoff_t __length2,
573 __re_idx_t __start, regoff_t __range, 590 regoff_t __start, regoff_t __range,
574 struct re_registers *__regs, 591 struct re_registers *__regs,
575 __re_idx_t __stop); 592 regoff_t __stop)
593 _Attr_access_ ((__read_only__, 2, 3))
594 _Attr_access_ ((__read_only__, 4, 5));
576 595
577 596
578/* Like 're_search', but return how many characters in STRING the regexp 597/* Like 're_search', but return how many characters in STRING the regexp
579 in BUFFER matched, starting at position START. */ 598 in BUFFER matched, starting at position START. */
580extern regoff_t re_match (struct re_pattern_buffer *__buffer, 599extern regoff_t re_match (struct re_pattern_buffer *__buffer,
581 const char *__string, __re_idx_t __length, 600 const char *__String, regoff_t __length,
582 __re_idx_t __start, struct re_registers *__regs); 601 regoff_t __start, struct re_registers *__regs)
602 _Attr_access_ ((__read_only__, 2, 3));
583 603
584 604
585/* Relates to 're_match' as 're_search_2' relates to 're_search'. */ 605/* Relates to 're_match' as 're_search_2' relates to 're_search'. */
586extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer, 606extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
587 const char *__string1, __re_idx_t __length1, 607 const char *__string1, regoff_t __length1,
588 const char *__string2, __re_idx_t __length2, 608 const char *__string2, regoff_t __length2,
589 __re_idx_t __start, struct re_registers *__regs, 609 regoff_t __start, struct re_registers *__regs,
590 __re_idx_t __stop); 610 regoff_t __stop)
611 _Attr_access_ ((__read_only__, 2, 3))
612 _Attr_access_ ((__read_only__, 4, 5));
591 613
592 614
593/* Set REGS to hold NUM_REGS registers, storing them in STARTS and 615/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
@@ -608,36 +630,41 @@ extern void re_set_registers (struct re_pattern_buffer *__buffer,
608 regoff_t *__starts, regoff_t *__ends); 630 regoff_t *__starts, regoff_t *__ends);
609#endif /* Use GNU */ 631#endif /* Use GNU */
610 632
611#if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_BSD) 633#if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_MISC)
612# ifndef _CRAY
613/* 4.2 bsd compatibility. */ 634/* 4.2 bsd compatibility. */
614extern char *re_comp (const char *); 635extern char *re_comp (const char *);
615extern int re_exec (const char *); 636extern int re_exec (const char *);
616# endif
617#endif 637#endif
618 638
619/* GCC 2.95 and later have "__restrict"; C99 compilers have 639/* For plain 'restrict', use glibc's __restrict if defined.
640 Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
620 "restrict", and "configure" may have defined "restrict". 641 "restrict", and "configure" may have defined "restrict".
621 Other compilers use __restrict, __restrict__, and _Restrict, and 642 Other compilers use __restrict, __restrict__, and _Restrict, and
622 'configure' might #define 'restrict' to those words, so pick a 643 'configure' might #define 'restrict' to those words, so pick a
623 different name. */ 644 different name. */
624#ifndef _Restrict_ 645#ifndef _Restrict_
625# if 199901L <= __STDC_VERSION__ 646# if defined __restrict \
626# define _Restrict_ restrict 647 || 2 < __GNUC__ + (95 <= __GNUC_MINOR__) \
627# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__) 648 || __clang_major__ >= 3
628# define _Restrict_ __restrict 649# define _Restrict_ __restrict
650# elif 199901L <= __STDC_VERSION__ || defined restrict
651# define _Restrict_ restrict
629# else 652# else
630# define _Restrict_ 653# define _Restrict_
631# endif 654# endif
632#endif 655#endif
633/* gcc 3.1 and up support the [restrict] syntax. Don't trust 656/* For the ISO C99 syntax
634 sys/cdefs.h's definition of __restrict_arr, though, as it 657 array_name[restrict]
635 mishandles gcc -ansi -pedantic. */ 658 use glibc's __restrict_arr if available.
659 Otherwise, GCC 3.1 and clang support this syntax (but not in C++ mode).
660 Other ISO C99 compilers support it as well. */
636#ifndef _Restrict_arr_ 661#ifndef _Restrict_arr_
637# if ((199901L <= __STDC_VERSION__ \ 662# ifdef __restrict_arr
638 || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \ 663# define _Restrict_arr_ __restrict_arr
639 && !defined __STRICT_ANSI__)) \ 664# elif ((199901L <= __STDC_VERSION__ \
640 && !defined __GNUG__) 665 || 3 < __GNUC__ + (1 <= __GNUC_MINOR__) \
666 || __clang_major__ >= 3) \
667 && !defined __cplusplus)
641# define _Restrict_arr_ _Restrict_ 668# define _Restrict_arr_ _Restrict_
642# else 669# else
643# define _Restrict_arr_ 670# define _Restrict_arr_
@@ -650,15 +677,20 @@ extern int regcomp (regex_t *_Restrict_ __preg,
650 int __cflags); 677 int __cflags);
651 678
652extern int regexec (const regex_t *_Restrict_ __preg, 679extern int regexec (const regex_t *_Restrict_ __preg,
653 const char *_Restrict_ __string, size_t __nmatch, 680 const char *_Restrict_ __String, size_t __nmatch,
654 regmatch_t __pmatch[_Restrict_arr_], 681 regmatch_t __pmatch[_Restrict_arr_
682 _REGEX_NELTS (__nmatch)],
655 int __eflags); 683 int __eflags);
656 684
657extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg, 685extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg,
658 char *_Restrict_ __errbuf, size_t __errbuf_size); 686 char *_Restrict_ __errbuf, size_t __errbuf_size)
687 _Attr_access_ ((__write_only__, 3, 4));
659 688
660extern void regfree (regex_t *__preg); 689extern void regfree (regex_t *__preg);
661 690
691#if defined __GNUC__ && 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
692# pragma GCC diagnostic pop
693#endif
662 694
663#ifdef __cplusplus 695#ifdef __cplusplus
664} 696}