165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/************************************************* 265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich* Perl-Compatible Regular Expressions * 365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/ 465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* PCRE is a library of functions to support regular expressions whose syntax 665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichand semantics are as close as possible to those of the Perl 5 language. 765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Written by Philip Hazel 965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich Copyright (c) 1997-2012 University of Cambridge 1065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 1165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich----------------------------------------------------------------------------- 1265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichRedistribution and use in source and binary forms, with or without 1365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichmodification, are permitted provided that the following conditions are met: 1465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 1565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * Redistributions of source code must retain the above copyright notice, 1665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich this list of conditions and the following disclaimer. 1765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 1865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * Redistributions in binary form must reproduce the above copyright 1965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich notice, this list of conditions and the following disclaimer in the 2065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich documentation and/or other materials provided with the distribution. 2165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 2265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich * Neither the name of the University of Cambridge nor the names of its 2365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich contributors may be used to endorse or promote products derived from 2465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich this software without specific prior written permission. 2565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 2665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2965de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 3065de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 3165de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 3265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 3365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 3465de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3665de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPOSSIBILITY OF SUCH DAMAGE. 3765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich----------------------------------------------------------------------------- 3865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/ 3965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* This module contains the external function pcre_refcount(), which is an 4265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichauxiliary function that can be used to maintain a reference count in a compiled 4365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpattern data block. This might be helpful in applications where the block is 4465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichshared by different users. */ 4565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 4765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#ifdef HAVE_CONFIG_H 4865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "config.h" 4965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif 5065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#include "pcre_internal.h" 5265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/************************************************* 5565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich* Maintain reference count * 5665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*************************************************/ 5765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 5865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* The reference count is a 16-bit field, initialized to zero. It is not 5965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpossible to transfer a non-zero count from one host to a different host that 6065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichhas a different byte order - though I can't see why anyone in their right mind 6165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichwould ever want to do that! 6265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 6365de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichArguments: 6465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich argument_re points to compiled code 6565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich adjust value to add to the count 6665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 6765de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichReturns: the (possibly updated) count value (a non-negative number), or 6865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich a negative error number 6965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich*/ 7065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 7165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#if defined COMPILE_PCRE8 7265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION 7365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre_refcount(pcre *argument_re, int adjust) 7465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE16 7565de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION 7665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre16_refcount(pcre16 *argument_re, int adjust) 7765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#elif defined COMPILE_PCRE32 7865de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichPCRE_EXP_DEFN int PCRE_CALL_CONVENTION 7965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichpcre32_refcount(pcre32 *argument_re, int adjust) 8065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich#endif 8165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich{ 8265de34233da93a3d65c00b8aad3ff9aad44c57deNick KralevichREAL_PCRE *re = (REAL_PCRE *)argument_re; 8365de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (re == NULL) return PCRE_ERROR_NULL; 8465de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; 8565de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichif ((re->flags & PCRE_MODE) == 0) return PCRE_ERROR_BADMODE; 8665de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichre->ref_count = (-adjust > re->ref_count)? 0 : 8765de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich (adjust + re->ref_count > 65535)? 65535 : 8865de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich re->ref_count + adjust; 8965de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevichreturn re->ref_count; 9065de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich} 9165de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich 9265de34233da93a3d65c00b8aad3ff9aad44c57deNick Kralevich/* End of pcre_refcount.c */ 93