svn_dep_compat.h revision 299742
1/**
2 * @copyright
3 * ====================================================================
4 *    Licensed to the Apache Software Foundation (ASF) under one
5 *    or more contributor license agreements.  See the NOTICE file
6 *    distributed with this work for additional information
7 *    regarding copyright ownership.  The ASF licenses this file
8 *    to you under the Apache License, Version 2.0 (the
9 *    "License"); you may not use this file except in compliance
10 *    with the License.  You may obtain a copy of the License at
11 *
12 *      http://www.apache.org/licenses/LICENSE-2.0
13 *
14 *    Unless required by applicable law or agreed to in writing,
15 *    software distributed under the License is distributed on an
16 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 *    KIND, either express or implied.  See the License for the
18 *    specific language governing permissions and limitations
19 *    under the License.
20 * ====================================================================
21 * @endcopyright
22 *
23 * @file svn_dep_compat.h
24 * @brief Compatibility macros and functions.
25 * @since New in 1.5.0.
26 */
27
28#ifndef SVN_DEP_COMPAT_H
29#define SVN_DEP_COMPAT_H
30
31#include <apr_version.h>
32
33#ifdef __cplusplus
34extern "C" {
35#endif /* __cplusplus */
36
37/**
38 * We assume that 'int' and 'unsigned' are at least 32 bits wide.
39 * This also implies that long (rev numbers) is 32 bits or wider.
40 *
41 * @since New in 1.9.
42 */
43#if    defined(APR_HAVE_LIMITS_H) \
44    && !defined(SVN_ALLOW_SHORT_INTS) \
45    && (INT_MAX < 0x7FFFFFFFl)
46#error int is shorter than 32 bits and may break Subversion. Define SVN_ALLOW_SHORT_INTS to skip this check.
47#endif
48
49/**
50 * We assume that 'char' is 8 bits wide.  The critical interfaces are
51 * our repository formats and RA encodings.  E.g. a 32 bit wide char may
52 * mess up UTF8 parsing, how we interpret size values etc.
53 *
54 * @since New in 1.9.
55 */
56#if    defined(CHAR_BIT) \
57    && !defined(SVN_ALLOW_NON_8_BIT_CHARS) \
58    && (CHAR_BIT != 8)
59#error char is not 8 bits and may break Subversion. Define SVN_ALLOW_NON_8_BIT_CHARS to skip this check.
60#endif
61
62/**
63 * Work around a platform dependency issue. apr_thread_rwlock_trywrlock()
64 * will make APR_STATUS_IS_EBUSY() return TRUE if the lock could not be
65 * acquired under Unix. Under Windows, this will not work. So, provide
66 * a more portable substitute.
67 *
68 * @since New in 1.8.
69 */
70#ifdef WIN32
71#define SVN_LOCK_IS_BUSY(x) \
72    (APR_STATUS_IS_EBUSY(x) || (x) == APR_FROM_OS_ERROR(WAIT_TIMEOUT))
73#else
74#define SVN_LOCK_IS_BUSY(x) APR_STATUS_IS_EBUSY(x)
75#endif
76
77/**
78 * APR keeps a few interesting defines hidden away in its private
79 * headers apr_arch_file_io.h, so we redefined them here.
80 *
81 * @since New in 1.9
82 */
83#ifndef APR_FREADONLY
84#define APR_FREADONLY 0x10000000
85#endif
86#ifndef APR_OPENINFO
87#define APR_OPENINFO  0x00100000
88#endif
89
90#if !APR_VERSION_AT_LEAST(1,4,0)
91#ifndef apr_time_from_msec
92#define apr_time_from_msec(msec) ((apr_time_t)(msec) * 1000)
93#endif
94#endif
95
96/**
97 * Check at compile time if the Serf version is at least a certain
98 * level.
99 * @param major The major version component of the version checked
100 * for (e.g., the "1" of "1.3.0").
101 * @param minor The minor version component of the version checked
102 * for (e.g., the "3" of "1.3.0").
103 * @param patch The patch level component of the version checked
104 * for (e.g., the "0" of "1.3.0").
105 *
106 * @since New in 1.5.
107 */
108#ifndef SERF_VERSION_AT_LEAST /* Introduced in Serf 0.1.1 */
109#define SERF_VERSION_AT_LEAST(major,minor,patch)                       \
110(((major) < SERF_MAJOR_VERSION)                                        \
111 || ((major) == SERF_MAJOR_VERSION && (minor) < SERF_MINOR_VERSION)    \
112 || ((major) == SERF_MAJOR_VERSION && (minor) == SERF_MINOR_VERSION && \
113     (patch) <= SERF_PATCH_VERSION))
114#endif /* SERF_VERSION_AT_LEAST */
115
116/**
117 * By default, if libsvn is built against one version of SQLite
118 * and then run using an older version, svn will error out:
119 *
120 *     svn: Couldn't perform atomic initialization
121 *     svn: SQLite compiled for 3.7.4, but running with 3.7.3
122 *
123 * That can be annoying when building on a modern system in order
124 * to deploy on a less modern one.  So these constants allow one
125 * to specify how old the system being deployed on might be.
126 * For example,
127 *
128 *     EXTRA_CFLAGS += -DSVN_SQLITE_MIN_VERSION_NUMBER=3007003
129 *     EXTRA_CFLAGS += '-DSVN_SQLITE_MIN_VERSION="3.7.3"'
130 *
131 * turns on code that works around infelicities in older versions
132 * as far back as 3.7.3 and relaxes the check at initialization time
133 * to permit them.
134 *
135 * @since New in 1.8.
136 */
137#ifndef SVN_SQLITE_MIN_VERSION_NUMBER
138#define SVN_SQLITE_MIN_VERSION_NUMBER SQLITE_VERSION_NUMBER
139#define SVN_SQLITE_MIN_VERSION SQLITE_VERSION
140#endif /* SVN_SQLITE_MIN_VERSION_NUMBER */
141
142/**
143 * Check at compile time if the SQLite version is at least a certain
144 * level.
145 * @param major The major version component of the version checked
146 * for (e.g., the "1" of "1.3.0").
147 * @param minor The minor version component of the version checked
148 * for (e.g., the "3" of "1.3.0").
149 * @param patch The patch level component of the version checked
150 * for (e.g., the "0" of "1.3.0").
151 *
152 * @since New in 1.6.
153 */
154#ifndef SQLITE_VERSION_AT_LEAST
155#define SQLITE_VERSION_AT_LEAST(major,minor,patch)                     \
156((major*1000000 + minor*1000 + patch) <= SVN_SQLITE_MIN_VERSION_NUMBER)
157#endif /* SQLITE_VERSION_AT_LEAST */
158
159#ifdef __cplusplus
160}
161#endif /* __cplusplus */
162
163#endif /* SVN_DEP_COMPAT_H */
164