/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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.
 */
#if !defined(XALAN_XPATHCAPI_HEADER_GUARD_1357924680)
#define XALAN_XPATHCAPI_HEADER_GUARD_1357924680



#if defined(_MSC_VER)

#if defined(XALAN_BUILD_DLL)

#define XALAN_XPATHCAPI_EXPORT __declspec(dllexport)
#define XALAN_XPATHCAPI_EXPORT_FUNCTION(T) T __declspec(dllexport)

#else

#define XALAN_XPATHCAPI_EXPORT __declspec(dllimport)
#define XALAN_XPATHCAPI_EXPORT_FUNCTION(T) T __declspec(dllimport)

#endif

#else

#define XALAN_XPATHCAPI_EXPORT
#define XALAN_XPATHCAPI_EXPORT_FUNCTION(T) T

#endif



/**
 * This is a simple C interface for the class XPathEvaluator. It's 
 * the user's responsibility to call XalanXPathAPIInitialize() before making
 * any other API calls, and to call XalanXPathAPITerminate() when finished
 * with the API.
 */
#if defined(__cplusplus)
extern "C"
{
#endif

#define XALAN_XPATH_API_SUCCESS                     0
#define XALAN_XPATH_API_ERROR_ALREADY_INITIALIZED   1
#define XALAN_XPATH_API_ERROR_ALREADY_TERMINATED    2
#define XALAN_XPATH_API_ERROR_INITIALIZATION_FAILED 3
#define XALAN_XPATH_API_ERROR_TERMINATION_FAILED    4
#define XALAN_XPATH_API_ERROR_NOT_INITIALIZED       5
#define XALAN_XPATH_API_ERROR_CANNOT_REINITIALIZE   6
#define XALAN_XPATH_API_ERROR_INVALID_PARAMETER     7
#define XALAN_XPATH_API_ERROR_INVALID_EXPRESSION    8
#define XALAN_XPATH_API_ERROR_BAD_XML               9
#define XALAN_XPATH_API_ERROR_UNSUPPORTED_ENCODING  10
#define XALAN_XPATH_API_ERROR_TRANSCODING           11
#define XALAN_XPATH_API_ERROR_INVALID_XPATH         12
#define XALAN_XPATH_API_ERROR_UNKNOWN               13


/**
 * Handle used to store the address of XalanTransformer instance.
 */
typedef void*   XalanXPathEvaluatorHandle;

/**
 * Handle used to store the address of compiled XPath instance.
 */
typedef void*   XalanXPathHandle;


#if defined(OS390)
#pragma export(XalanXPathAPIInitialize)
#pragma export(XalanXPathAPITerminate)
#pragma export(XalanCreateXPathEvaluator)
#pragma export(XalanDestroyXPathEvaluator)
#pragma export(XalanCreateXPath)
#pragma export(XalanDestroyXPath)
#pragma export(XalanEvaluateXPathAsBoolean)
#pragma export(XalanEvaluateXPathExpressionAsBoolean)
#endif

/**
 * Initialize Xerces and the XPath API.
 *
 * Should be called only once per process before making
 * any other API calls.
 *
 * @return 0 for success, or a non-zero error code upon failure
 */
XALAN_XPATHCAPI_EXPORT_FUNCTION(int)
XalanXPathAPIInitialize();

/**
 * Terminate Xerces and the XPath API.
 *
 * Should be called only once per process after deleting all
 * instances of XalanXPathEvaluator.  Once a process has called
 * this function, it cannot use the API for the remaining
 * lifetime of the process.
 *
 * @return 0 for success, or a non-zero error code upon failure
 */
XALAN_XPATHCAPI_EXPORT_FUNCTION(int)
XalanXPathAPITerminate();

/**
 * Create a XalanXPathEvaluator instance.
 *
 * @param theXalanHandle A pointer to the handle for the new instance.   
 * @return 0 for success, or a non-zero error code upon failure
 */
XALAN_XPATHCAPI_EXPORT_FUNCTION(int)
XalanCreateXPathEvaluator(XalanXPathEvaluatorHandle*    theHandle);

/**
 * Destroy a XalanXPathEvaluator instance.
 * 
 * @param theXalanHandle The handle of the instance to destroy.
 * @return 0 for success, or a non-zero error code upon failure
 */
XALAN_XPATHCAPI_EXPORT_FUNCTION(int)
XalanDestroyXPathEvaluator(XalanXPathEvaluatorHandle    theXalanHandle);

/**
 * Creates a compiled XPath instance.
 *
 * @param theXalanHandle The handle of XalanXPathEvaluatorHandle instance.   
 * @param theXPathExpression The expression to compile
 * @param theXPathExpressionEncoding The encoding of the expression.  If NULL or an empty string, the local code page is assumed.
 * @param theXPathHandle A pointer to the handle for the new instance
 * @return 0 for success, or a non-zero error code upon failure
 */
XALAN_XPATHCAPI_EXPORT_FUNCTION(int)
XalanCreateXPath(
            XalanXPathEvaluatorHandle   theXalanHandle,
            const char*                 theXPathExpression,
            const char*                 theXPathExpressionEncoding,
            XalanXPathHandle*           theXPathHandle);

/**
 * Destroys a compiled XPath instance.
 *
 * @param theXalanHandle The handle of XalanXPathEvaluatorHandle instance.   
 * @param theXPathHandle The handle of XPath instance
 * @return 0 for success, or a non-zero error code upon failure
 */
XALAN_XPATHCAPI_EXPORT_FUNCTION(int)
XalanDestroyXPath(
            XalanXPathEvaluatorHandle   theXalanHandle,
            XalanXPathHandle            theXPathHandle);

/**
 * Evaluates a compiled XPath instance.
 *
 * @param theXalanHandle The handle of XalanXPathEvaluatorHandle instance.   
 * @param theXPathHandle The pointer to handle for instance
 * @param theXML The XML document to use for evaluating the XPath expression
 * @param theResult A pointer to an int to receive the result.
 * @return 0 for success, or a non-zero error code upon failure
 */
XALAN_XPATHCAPI_EXPORT_FUNCTION(int)
XalanEvaluateXPathAsBoolean(
            XalanXPathEvaluatorHandle   theXalanHandle,
            XalanXPathHandle            theXPathHandle,
            const char*                 theXML,
            int*                        theResult);

/**
 * Evaluates an XPath expression
 *
 * @param theXalanHandle The handle of XalanXPathEvaluatorHandle instance.   
 * @param theXPathExpression The expression to evaluate
 * @param theXPathExpressionEncoding The encoding of the expression.  If NULL or an empty string, the local code page is assumed.
 * @param theXML The XML document to use for evaluating the XPath expression
 * @param theResult A pointer to an int to receive the result.
 * @return 0 for success, or a non-zero error code upon failure
 */
XALAN_XPATHCAPI_EXPORT_FUNCTION(int)
XalanEvaluateXPathExpressionAsBoolean(
            XalanXPathEvaluatorHandle   theXalanHandle,
            const char*                 theXPathExpression,
            const char*                 theXPathExpressionEncoding,
            const char*                 theXML,
            int*                        theResult);

#if defined(__cplusplus)
}
#endif



#endif
