/**
 * Copyright 2004,2005 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 AXIS2_STRING_H
#define AXIS2_STRING_H

#include <axis2_defines.h>
#include <axis2_error.h>
#include <axis2_env.h>

#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @defgroup axis2_string String
 * @ingroup axis2_util 
 * @{
 */

    AXIS2_DECLARE(void*)
    axis2_strdup (const void *ptr, axis2_env_t **env);

    AXIS2_DECLARE(int)
    axis2_strcmp (const axis2_char_t * s1, const axis2_char_t * s2);

    AXIS2_DECLARE(axis2_ssize_t)
    axis2_strlen(const axis2_char_t * s);

    AXIS2_DECLARE(int)
    axis2_strcasecmp(const axis2_char_t *s1, axis2_char_t *s2);

    AXIS2_DECLARE(int)
    axis2_strncasecmp(const axis2_char_t *s1, axis2_char_t *s2, int n);
    
    /* much similar to the strcat behaviour. But the difference is
     * this allocates new memory to put the conatenated string rather than
     * modifying the first argument. The user should free the allocated
     * memory for the return value
     */
    AXIS2_DECLARE(axis2_char_t*)
    axis2_stracat(const axis2_char_t *s1, const axis2_char_t *s2, axis2_env_t **env);
    
    AXIS2_DECLARE(axis2_char_t *)
    axis2_strstr (const axis2_char_t *heystack,
                    const axis2_char_t *needle);

    AXIS2_DECLARE(axis2_char_t *)
    axis2_rindex(const axis2_char_t *s, axis2_char_t c);

#define AXIS2_STRDUP(pts, env) axis2_strdup(pts, env)
#define AXIS2_STRCMP(s1, s2) axis2_strcmp(s1, s2)
#define AXIS2_STRLEN(s) axis2_strlen(s)
#define AXIS2_STRCASECMP(s1,s2) axis2_strcasecmp(s1,s2)
#define AXIS2_STRNCASECMP(s1,s2,n) axis2_strncasecmp(s1,s2,n)
#define AXIS2_STRACAT(s1, s2, env) axis2_stracat(s1, s2, env)
#define AXIS2_STRSTR(s1, s2) axis2_strstr(s1, s2)
#define AXIS2_RINDEX(s, c) axis2_rindex(s, c)

/** @} */
    
#ifdef __cplusplus
}
#endif

#endif                          /* AXIS2_STRING_H */
