/************************************************* * 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-2022 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 #include "pcre2_internal.h" #define TYPE_OPTIONS … #define ALL_OPTIONS … #define DUMMY_BUFFER_SIZE … /* Generated pattern fragments */ #define STR_BACKSLASH_A … #define STR_BACKSLASH_z … #define STR_COLON_RIGHT_SQUARE_BRACKET … #define STR_DOT_STAR_LOOKBEHIND … #define STR_LOOKAHEAD_NOT_DOT … #define STR_QUERY_s … #define STR_STAR_NUL … /* States for POSIX processing */ enum { … }; /* Macro to add a character string to the output buffer, checking for overflow. */ #define PUTCHARS(string) … /* Literals that must be escaped: \ ? * + | . ^ $ { } [ ] ( ) */ static const char *pcre2_escaped_literals = …; /* Recognized escaped metacharacters in POSIX basic patterns. */ static const char *posix_meta_escapes = …; /************************************************* * Convert a POSIX pattern * *************************************************/ /* This function handles both basic and extended POSIX patterns. Arguments: pattype the pattern type pattern the pattern plength length in code units utf TRUE if UTF use_buffer where to put the output use_length length of use_buffer bufflenptr where to put the used length dummyrun TRUE if a dummy run ccontext the convert context Returns: 0 => success !0 => error code */ static int convert_posix(uint32_t pattype, PCRE2_SPTR pattern, PCRE2_SIZE plength, BOOL utf, PCRE2_UCHAR *use_buffer, PCRE2_SIZE use_length, PCRE2_SIZE *bufflenptr, BOOL dummyrun, pcre2_convert_context *ccontext) { … } /************************************************* * Convert a glob pattern * *************************************************/ /* Context for writing the output into a buffer. */ pcre2_output_context; /* Write a character into the output. Arguments: out output context chr the next character */ static void convert_glob_write(pcre2_output_context *out, PCRE2_UCHAR chr) { … } /* Write a string into the output. Arguments: out output context length length of out->out_str */ static void convert_glob_write_str(pcre2_output_context *out, PCRE2_SIZE length) { … } /* Prints the separator into the output. Arguments: out output context separator glob separator with_escape backslash is needed before separator */ static void convert_glob_print_separator(pcre2_output_context *out, PCRE2_UCHAR separator, BOOL with_escape) { … } /* Prints a wildcard into the output. Arguments: out output context separator glob separator with_escape backslash is needed before separator */ static void convert_glob_print_wildcard(pcre2_output_context *out, PCRE2_UCHAR separator, BOOL with_escape) { … } /* Parse a posix class. Arguments: from starting point of scanning the range pattern_end end of pattern out output context Returns: >0 => class index 0 => malformed class */ static int convert_glob_parse_class(PCRE2_SPTR *from, PCRE2_SPTR pattern_end, pcre2_output_context *out) { … } /* Checks whether the character is in the class. Arguments: class_index class index c character Returns: !0 => character is found in the class 0 => otherwise */ static BOOL convert_glob_char_in_class(int class_index, PCRE2_UCHAR c) { … } /* Parse a range of characters. Arguments: from starting point of scanning the range pattern_end end of pattern out output context separator glob separator with_escape backslash is needed before separator Returns: 0 => success !0 => error code */ static int convert_glob_parse_range(PCRE2_SPTR *from, PCRE2_SPTR pattern_end, pcre2_output_context *out, BOOL utf, PCRE2_UCHAR separator, BOOL with_escape, PCRE2_UCHAR escape, BOOL no_wildsep) { … } /* Prints a (*COMMIT) into the output. Arguments: out output context */ static void convert_glob_print_commit(pcre2_output_context *out) { … } /* Bash glob converter. Arguments: pattype the pattern type pattern the pattern plength length in code units utf TRUE if UTF use_buffer where to put the output use_length length of use_buffer bufflenptr where to put the used length dummyrun TRUE if a dummy run ccontext the convert context Returns: 0 => success !0 => error code */ static int convert_glob(uint32_t options, PCRE2_SPTR pattern, PCRE2_SIZE plength, BOOL utf, PCRE2_UCHAR *use_buffer, PCRE2_SIZE use_length, PCRE2_SIZE *bufflenptr, BOOL dummyrun, pcre2_convert_context *ccontext) { … } /************************************************* * Convert pattern * *************************************************/ /* This is the external-facing function for converting other forms of pattern into PCRE2 regular expression patterns. On error, the bufflenptr argument is used to return an offset in the original pattern. Arguments: pattern the input pattern plength length of input, or PCRE2_ZERO_TERMINATED options options bits buffptr pointer to pointer to output buffer bufflenptr pointer to length of output buffer ccontext convert context or NULL Returns: 0 for success, else an error code (+ve or -ve) */ PCRE2_EXP_DEFN int PCRE2_CALL_CONVENTION pcre2_pattern_convert(PCRE2_SPTR pattern, PCRE2_SIZE plength, uint32_t options, PCRE2_UCHAR **buffptr, PCRE2_SIZE *bufflenptr, pcre2_convert_context *ccontext) { … } /************************************************* * Free converted pattern * *************************************************/ /* This frees a converted pattern that was put in newly-allocated memory. Argument: the converted pattern Returns: nothing */ PCRE2_EXP_DEFN void PCRE2_CALL_CONVENTION pcre2_converted_pattern_free(PCRE2_UCHAR *converted) { … } /* End of pcre2_convert.c */