123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- /*************************************************
- * Perl-Compatible Regular Expressions *
- *************************************************/
- /* PCRE is a library of functions to support regular expressions whose syntax
- and semantics are as close as possible to those of the Perl 5 language.
- Written by Philip Hazel
- Original API code Copyright (c) 1997-2012 University of Cambridge
- New API code Copyright (c) 2016-2020 University of Cambridge
- -----------------------------------------------------------------------------
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the University of Cambridge nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
- -----------------------------------------------------------------------------
- */
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- /* Save the configured link size, which is in bytes. In 16-bit and 32-bit modes
- its value gets changed by pcre2_intmodedep.h (included by pcre2_internal.h) to
- be in code units. */
- static int configured_link_size = LINK_SIZE;
- #include "pcre2_internal.h"
- /* These macros are the standard way of turning unquoted text into C strings.
- They allow macros like PCRE2_MAJOR to be defined without quotes, which is
- convenient for user programs that want to test their values. */
- #define STRING(a) # a
- #define XSTRING(s) STRING(s)
- /*************************************************
- * Return info about what features are configured *
- *************************************************/
- /* If where is NULL, the length of memory required is returned.
- Arguments:
- what what information is required
- where where to put the information
- Returns: 0 if a numerical value is returned
- >= 0 if a string value
- PCRE2_ERROR_BADOPTION if "where" not recognized
- or JIT target requested when JIT not enabled
- */
- PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION
- pcre2_config(uint32_t what, void *where)
- {
- if (where == NULL) /* Requests a length */
- {
- switch(what)
- {
- default:
- return PCRE2_ERROR_BADOPTION;
- case PCRE2_CONFIG_BSR:
- case PCRE2_CONFIG_COMPILED_WIDTHS:
- case PCRE2_CONFIG_DEPTHLIMIT:
- case PCRE2_CONFIG_HEAPLIMIT:
- case PCRE2_CONFIG_JIT:
- case PCRE2_CONFIG_LINKSIZE:
- case PCRE2_CONFIG_MATCHLIMIT:
- case PCRE2_CONFIG_NEVER_BACKSLASH_C:
- case PCRE2_CONFIG_NEWLINE:
- case PCRE2_CONFIG_PARENSLIMIT:
- case PCRE2_CONFIG_STACKRECURSE: /* Obsolete */
- case PCRE2_CONFIG_TABLES_LENGTH:
- case PCRE2_CONFIG_UNICODE:
- return sizeof(uint32_t);
- /* These are handled below */
- case PCRE2_CONFIG_JITTARGET:
- case PCRE2_CONFIG_UNICODE_VERSION:
- case PCRE2_CONFIG_VERSION:
- break;
- }
- }
- switch (what)
- {
- default:
- return PCRE2_ERROR_BADOPTION;
- case PCRE2_CONFIG_BSR:
- #ifdef BSR_ANYCRLF
- *((uint32_t *)where) = PCRE2_BSR_ANYCRLF;
- #else
- *((uint32_t *)where) = PCRE2_BSR_UNICODE;
- #endif
- break;
- case PCRE2_CONFIG_COMPILED_WIDTHS:
- *((uint32_t *)where) = 0
- #ifdef SUPPORT_PCRE2_8
- + 1
- #endif
- #ifdef SUPPORT_PCRE2_16
- + 2
- #endif
- #ifdef SUPPORT_PCRE2_32
- + 4
- #endif
- ;
- break;
- case PCRE2_CONFIG_DEPTHLIMIT:
- *((uint32_t *)where) = MATCH_LIMIT_DEPTH;
- break;
- case PCRE2_CONFIG_HEAPLIMIT:
- *((uint32_t *)where) = HEAP_LIMIT;
- break;
- case PCRE2_CONFIG_JIT:
- #ifdef SUPPORT_JIT
- *((uint32_t *)where) = 1;
- #else
- *((uint32_t *)where) = 0;
- #endif
- break;
- case PCRE2_CONFIG_JITTARGET:
- #ifdef SUPPORT_JIT
- {
- const char *v = PRIV(jit_get_target)();
- return (int)(1 + ((where == NULL)?
- strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v)));
- }
- #else
- return PCRE2_ERROR_BADOPTION;
- #endif
- case PCRE2_CONFIG_LINKSIZE:
- *((uint32_t *)where) = (uint32_t)configured_link_size;
- break;
- case PCRE2_CONFIG_MATCHLIMIT:
- *((uint32_t *)where) = MATCH_LIMIT;
- break;
- case PCRE2_CONFIG_NEWLINE:
- *((uint32_t *)where) = NEWLINE_DEFAULT;
- break;
- case PCRE2_CONFIG_NEVER_BACKSLASH_C:
- #ifdef NEVER_BACKSLASH_C
- *((uint32_t *)where) = 1;
- #else
- *((uint32_t *)where) = 0;
- #endif
- break;
- case PCRE2_CONFIG_PARENSLIMIT:
- *((uint32_t *)where) = PARENS_NEST_LIMIT;
- break;
- /* This is now obsolete. The stack is no longer used via recursion for
- handling backtracking in pcre2_match(). */
- case PCRE2_CONFIG_STACKRECURSE:
- *((uint32_t *)where) = 0;
- break;
- case PCRE2_CONFIG_TABLES_LENGTH:
- *((uint32_t *)where) = TABLES_LENGTH;
- break;
- case PCRE2_CONFIG_UNICODE_VERSION:
- {
- #if defined SUPPORT_UNICODE
- const char *v = PRIV(unicode_version);
- #else
- const char *v = "Unicode not supported";
- #endif
- return (int)(1 + ((where == NULL)?
- strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v)));
- }
- break;
- case PCRE2_CONFIG_UNICODE:
- #if defined SUPPORT_UNICODE
- *((uint32_t *)where) = 1;
- #else
- *((uint32_t *)where) = 0;
- #endif
- break;
- /* The hackery in setting "v" below is to cope with the case when
- PCRE2_PRERELEASE is set to an empty string (which it is for real releases).
- If the second alternative is used in this case, it does not leave a space
- before the date. On the other hand, if all four macros are put into a single
- XSTRING when PCRE2_PRERELEASE is not empty, an unwanted space is inserted.
- There are problems using an "obvious" approach like this:
- XSTRING(PCRE2_MAJOR) "." XSTRING(PCRE_MINOR)
- XSTRING(PCRE2_PRERELEASE) " " XSTRING(PCRE_DATE)
- because, when PCRE2_PRERELEASE is empty, this leads to an attempted expansion
- of STRING(). The C standard states: "If (before argument substitution) any
- argument consists of no preprocessing tokens, the behavior is undefined." It
- turns out the gcc treats this case as a single empty string - which is what
- we really want - but Visual C grumbles about the lack of an argument for the
- macro. Unfortunately, both are within their rights. As there seems to be no
- way to test for a macro's value being empty at compile time, we have to
- resort to a runtime test. */
- case PCRE2_CONFIG_VERSION:
- {
- const char *v = (XSTRING(Z PCRE2_PRERELEASE)[1] == 0)?
- XSTRING(PCRE2_MAJOR.PCRE2_MINOR PCRE2_DATE) :
- XSTRING(PCRE2_MAJOR.PCRE2_MINOR) XSTRING(PCRE2_PRERELEASE PCRE2_DATE);
- return (int)(1 + ((where == NULL)?
- strlen(v) : PRIV(strcpy_c8)((PCRE2_UCHAR *)where, v)));
- }
- }
- return 0;
- }
- /* End of pcre2_config.c */
|