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