1f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 2f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Perl-Compatible Regular Expressions * 3f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 4f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 5f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* PCRE is a library of functions to support regular expressions whose syntax 6f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichand semantics are as close as possible to those of the Perl 5 language. 7f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 8f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich Written by Philip Hazel 9f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich Copyright (c) 1997-2012 University of Cambridge 10f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 11f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich----------------------------------------------------------------------------- 12f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichRedistribution and use in source and binary forms, with or without 13f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmodification, are permitted provided that the following conditions are met: 14f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 15f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Redistributions of source code must retain the above copyright notice, 16f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich this list of conditions and the following disclaimer. 17f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 18f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Redistributions in binary form must reproduce the above copyright 19f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich notice, this list of conditions and the following disclaimer in the 20f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich documentation and/or other materials provided with the distribution. 21f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 22f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich * Neither the name of the University of Cambridge nor the names of its 23f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich contributors may be used to endorse or promote products derived from 24f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich this software without specific prior written permission. 25f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 26f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 27f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 30f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPOSSIBILITY OF SUCH DAMAGE. 37f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich----------------------------------------------------------------------------- 38f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*/ 39f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 40f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 41f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* This module contains the external function pcre_version(), which returns a 42f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichstring that identifies the PCRE version that is in use. */ 43f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 44f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 45f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#ifdef HAVE_CONFIG_H 46f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include "config.h" 47f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 48f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 49f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#include "pcre_internal.h" 50f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 51f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 52f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/************************************************* 53f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich* Return version string * 54f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich*************************************************/ 55f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 56f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* These macros are the standard way of turning unquoted text into C strings. 57f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichThey allow macros like PCRE_MAJOR to be defined without quotes, which is 58f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichconvenient for user programs that want to test its value. */ 59f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 60f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define STRING(a) # a 61f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#define XSTRING(s) STRING(s) 62f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 63f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* A problem turned up with PCRE_PRERELEASE, which is defined empty for 64f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichproduction releases. Originally, it was used naively in this code: 65f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 66f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich return XSTRING(PCRE_MAJOR) 67f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich "." XSTRING(PCRE_MINOR) 68f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich XSTRING(PCRE_PRERELEASE) 69f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich " " XSTRING(PCRE_DATE); 70f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 71f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichHowever, when PCRE_PRERELEASE is empty, this leads to an attempted expansion of 72f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichSTRING(). The C standard states: "If (before argument substitution) any 73f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichargument consists of no preprocessing tokens, the behavior is undefined." It 74f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichturns out the gcc treats this case as a single empty string - which is what we 75f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreally want - but Visual C grumbles about the lack of an argument for the 76f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichmacro. Unfortunately, both are within their rights. To cope with both ways of 77f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichhandling this, I had resort to some messy hackery that does a test at run time. 78f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichI could find no way of detecting that a macro is defined as an empty string at 79f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpre-processor time. This hack uses a standard trick for avoiding calling 80f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichthe STRING macro with an empty argument when doing the test. */ 81f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 82f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#if defined COMPILE_PCRE8 83f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION 84f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre_version(void) 85f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined COMPILE_PCRE16 86f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION 87f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre16_version(void) 88f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#elif defined COMPILE_PCRE32 89f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick KralevichPCRE_EXP_DEFN const char * PCRE_CALL_CONVENTION 90f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichpcre32_version(void) 91f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich#endif 92f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich{ 93f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevichreturn (XSTRING(Z PCRE_PRERELEASE)[1] == 0)? 94f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich XSTRING(PCRE_MAJOR.PCRE_MINOR PCRE_DATE) : 95f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich XSTRING(PCRE_MAJOR.PCRE_MINOR) XSTRING(PCRE_PRERELEASE PCRE_DATE); 96f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich} 97f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich 98f73ff17bddb7dc18ff9044773dd65d040e8f4fcfNick Kralevich/* End of pcre_version.c */ 99