/* Copyright 2000-2018 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef API_VERSION_H
#define API_VERSION_H

/**
 * @file api_version.h
 * @brief APR-iconv Versioning Interface
 * 
 * APR-iconv's Version
 *
 * There are several different mechanisms for accessing the version. There
 * is a string form, and a set of numbers; in addition, there are constants
 * which can be compiled into your application, and you can query the library
 * being used for its actual version.
 *
 * Note that it is possible for an application to detect that it has been
 * compiled against a different version of API by use of the compile-time
 * constants and the use of the run-time query function.
 *
 * API version numbering follows the guidelines specified in:
 *
 *     http://apr.apache.org/versioning.html
 */


/* The numeric compile-time version constants. These constants are the
 * authoritative version numbers for API. 
 */

/** major version 
 * Major API changes that could cause compatibility problems for older
 * programs such as structure size changes.  No binary compatibility is
 * possible across a change in the major version.
 */
#define API_MAJOR_VERSION       1

/** minor version
 * Minor API changes that do not cause binary compatibility problems.
 * Reset to 0 when upgrading API_MAJOR_VERSION
 */
#define API_MINOR_VERSION       2

/** patch level 
 * The Patch Level never includes API changes, simply bug fixes.
 * Reset to 0 when upgrading API_MINOR_VERSION
 */
#define API_PATCH_VERSION       3

/** 
 * The symbol API_IS_DEV_VERSION is only defined for internal,
 * "development" copies of API.  It is undefined for released versions
 * of API.
 */
#define API_IS_DEV_VERSION


#if defined(API_IS_DEV_VERSION) || defined(DOXYGEN)
/** Internal: string form of the "is dev" flag */
#define API_IS_DEV_STRING "-dev"
#else
#define API_IS_DEV_STRING ""
#endif

#ifndef API_STRINGIFY
/** Properly quote a value as a string in the C preprocessor */
#define API_STRINGIFY(n) API_STRINGIFY_HELPER(n)
/** Helper macro for API_STRINGIFY */
#define API_STRINGIFY_HELPER(n) #n
#endif

/** The formatted string of API's version */
#define API_VERSION_STRING \
     API_STRINGIFY(API_MAJOR_VERSION) "." \
     API_STRINGIFY(API_MINOR_VERSION) "." \
     API_STRINGIFY(API_PATCH_VERSION) \
     API_IS_DEV_STRING

/** An alternative formatted string of APR's version */
/* macro for Win32 .rc files using numeric csv representation */
#define API_VERSION_STRING_CSV API_MAJOR_VERSION ##, \
                             ##API_MINOR_VERSION ##, \
                             ##API_PATCH_VERSION


#ifndef API_VERSION_ONLY

/* The C language API to access the version at run time, 
 * as opposed to compile time.  API_VERSION_ONLY may be defined 
 * externally when preprocessing apr_version.h to obtain strictly 
 * the C Preprocessor macro declarations.
 */

#include "apr_version.h"

#include "apr_iconv.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Return APR-iconv's version information information in a numeric form.
 *
 *  @param pvsn Pointer to a version structure for returning the version
 *              information.
 */
API_DECLARE(void) api_version(apr_version_t *pvsn);

/** Return API's version information as a string. */
API_DECLARE(const char *) api_version_string(void);

#ifdef __cplusplus
}
#endif

#endif /* ndef API_VERSION_ONLY */

#endif /* ndef API_VERSION_H */
