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