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