.TH PCRE2_PATTERN_INFO 3 "21 November 2015" "PCRE2 10.21"
.SH NAME
PCRE2 - Perl-compatible regular expressions (revised API)
.SH SYNOPSIS
.rs
.sp
.B #include <pcre2.h>
.PP
.nf
.B int pcre2_pattern_info(const pcre2 *\fIcode\fP, uint32_t \fIwhat\fP, void *\fIwhere\fP);
.fi
.
.SH DESCRIPTION
.rs
.sp
This function returns information about a compiled pattern. Its arguments are:
.sp
  \fIcode\fP     Pointer to a compiled regular expression
  \fIwhat\fP     What information is required
  \fIwhere\fP    Where to put the information
.sp
The recognized values for the \fIwhat\fP argument, and the information they
request are as follows:
.sp
  PCRE2_INFO_ALLOPTIONS      Final options after compiling
  PCRE2_INFO_ARGOPTIONS      Options passed to \fBpcre2_compile()\fP
  PCRE2_INFO_BACKREFMAX      Number of highest back reference
  PCRE2_INFO_BSR             What \eR matches:
                               PCRE2_BSR_UNICODE: Unicode line endings
                               PCRE2_BSR_ANYCRLF: CR, LF, or CRLF only
  PCRE2_INFO_CAPTURECOUNT    Number of capturing subpatterns
  PCRE2_INFO_FIRSTBITMAP     Bitmap of first code units, or NULL
  PCRE2_INFO_FIRSTCODETYPE   Type of start-of-match information
                               0 nothing set
                               1 first code unit is set
                               2 start of string or after newline
  PCRE2_INFO_FIRSTCODEUNIT   First code unit when type is 1
  PCRE2_INFO_HASBACKSLASHC   Return 1 if pattern contains \eC
  PCRE2_INFO_HASCRORLF       Return 1 if explicit CR or LF matches
                               exist in the pattern
  PCRE2_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
  PCRE2_INFO_JITSIZE         Size of JIT compiled code, or 0
  PCRE2_INFO_LASTCODETYPE    Type of must-be-present information
                               0 nothing set
                               1 code unit is set
  PCRE2_INFO_LASTCODEUNIT    Last code unit when type is 1
  PCRE2_INFO_MATCHEMPTY      1 if the pattern can match an
                               empty string, 0 otherwise
  PCRE2_INFO_MATCHLIMIT      Match limit if set,
                               otherwise PCRE2_ERROR_UNSET
  PCRE2_INFO_MAXLOOKBEHIND   Length (in characters) of the longest
                               lookbehind assertion
  PCRE2_INFO_MINLENGTH       Lower bound length of matching strings
  PCRE2_INFO_NAMECOUNT       Number of named subpatterns
  PCRE2_INFO_NAMEENTRYSIZE   Size of name table entries
  PCRE2_INFO_NAMETABLE       Pointer to name table
  PCRE2_CONFIG_NEWLINE       Code for the newline sequence:
                               PCRE2_NEWLINE_CR
                               PCRE2_NEWLINE_LF
                               PCRE2_NEWLINE_CRLF
                               PCRE2_NEWLINE_ANY
                               PCRE2_NEWLINE_ANYCRLF
  PCRE2_INFO_RECURSIONLIMIT  Recursion limit if set,
                               otherwise PCRE2_ERROR_UNSET
  PCRE2_INFO_SIZE            Size of compiled pattern
.sp
If \fIwhere\fP is NULL, the function returns the amount of memory needed for
the requested information, in bytes. Otherwise, the \fIwhere\fP argument must
point to an unsigned 32-bit integer (uint32_t variable), except for the
following \fIwhat\fP values, when it must point to a variable of the type
shown:
.sp
  PCRE2_INFO_FIRSTBITMAP     const uint8_t *
  PCRE2_INFO_JITSIZE         size_t
  PCRE2_INFO_NAMETABLE       PCRE2_SPTR
  PCRE2_INFO_SIZE            size_t
.sp
The yield of the function is zero on success or:
.sp
  PCRE2_ERROR_NULL           the argument \fIcode\fP is NULL
  PCRE2_ERROR_BADMAGIC       the "magic number" was not found
  PCRE2_ERROR_BADOPTION      the value of \fIwhat\fP is invalid
  PCRE2_ERROR_BADMODE        the pattern was compiled in the wrong mode
  PCRE2_ERROR_UNSET          the requested information is not set
.P
There is a complete description of the PCRE2 native API in the
.\" HREF
\fBpcre2api\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcre2posix\fP
.\"
page.
