/**
 * 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.
 */

#ifndef AXUTIL_STRING_H
#define AXUTIL_STRING_H

#include <axutil_utils_defines.h>
#include <axutil_error.h>
#include <axutil_env.h>
#include <string.h>

#ifdef __cplusplus
extern "C"
{
#endif
    
    /**
     * @defgroup axutil_string string
     * @ingroup axis2_util
     * @{
     */

    typedef struct axutil_string axutil_string_t;

    /**
     * Creates a string struct.
     * @param str pointer to string. string struct would create a duplicate of 
     * this    
     * @param env pointer to environment struct
     * @return a pointer to newly created string struct
     */
    AXIS2_EXTERN axutil_string_t * AXIS2_CALL
    axutil_string_create(const axutil_env_t *env,
        const axis2_char_t *str);
    
    /**
     * Creates a string struct.
     * @param str pointer to string. string struct would not create a duplicate 
     * of this, but would assume ownership
     * @param env pointer to environment struct
     * @return a pointer to newly created string struct
     */
    AXIS2_EXTERN axutil_string_t * AXIS2_CALL
    axutil_string_create_assume_ownership(const axutil_env_t *env,
        axis2_char_t **str);

    /**
     * Creates a string struct.
     * @param str pointer to string. string struct would not create a duplicate 
     * of this and assumes the str would have longer life than that of itself
     * @param env pointer to environment struct
     * @return a pointer to newly created string struct     
     */
    AXIS2_EXTERN axutil_string_t* AXIS2_CALL
    axutil_string_create_const(const axutil_env_t *env,
        axis2_char_t **str);

    /**
     * Frees string struct.
     * @param string pointer to string struct
     * @param env pointer to environment struct
     * @return AXIS2_SUCCESS on success, else AXIS2_FAILURE
     */
    AXIS2_EXTERN void AXIS2_CALL
    axutil_string_free(struct axutil_string *string,
        const axutil_env_t *env);

    /**
     * Compares two strings. Checks if the two strings point to the same buffer.
     * Do not cmpare the buffer contents.
     * @param string pointer to string struct
     * @param env pointer to environment struct
     * @param string1 pointer to string struct to be compared
     * @return AXIS2_TRUE if string equals string1, AXIS2_FALSE otherwise 
     */
    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
    axutil_string_equals(const struct axutil_string *string,
        const axutil_env_t *env,
        const struct axutil_string *string1);

    /**
     * Clones a given string. Does not duplicate the buffer, rather 
     * increments the reference count. Each call to clone needs to have a 
     * matching free, when the clone is done with. 
     * @param string pointer to string struct
     * @param env pointer to environment struct
     * @returns pointer to cloned string struct instance
     */
    AXIS2_EXTERN struct axutil_string *AXIS2_CALL
    axutil_string_clone(struct axutil_string *string,
        const axutil_env_t *env);

    /**
     * Gets string buffer.
     * @param string pointer to string struct
     * @param env pointer to environment struct
     * @returns pointer to string buffer
     */
    AXIS2_EXTERN const axis2_char_t* AXIS2_CALL
    axutil_string_get_buffer(const struct axutil_string *string,
        const axutil_env_t *env);

    /**
     * Gets string length.  * @param string pointer to string struct * @param env pointer to environment struct * @returns buffer length */
    AXIS2_EXTERN unsigned int AXIS2_CALL
    axutil_string_get_length(const struct axutil_string *string,
        const axutil_env_t *env);
    
    /** @} */

    /**
     * @defgroup axutil_string_utils string_utils
     * @ingroup axis2_util
     * @{
     */

    AXIS2_EXTERN void* AXIS2_CALL
    axutil_strdup(const axutil_env_t *env,
	    const void *ptr);

    /**
     * duplicate the first n characters of a string into memory allocated 
     * the new string will be null-terminated
     * @param ptr The string to duplicate
     * @param n The number of characters to duplicate
     * @return The new string
     */
    AXIS2_EXTERN void* AXIS2_CALL
    axutil_strndup(const axutil_env_t *env,
	    const void *ptr,
        int n);

    /**
     * Create a null-terminated string by making a copy of a sequence
     * of characters and appending a null byte
     * @param ptr The block of characters to duplicate
     * @param n The number of characters to duplicate
     * @return The new string
     * @remark This is a faster alternative to axis2_strndup, for use
     *         when you know that the string being duplicated really
     *         has 'n' or more characters.  If the string might contain
     *         fewer characters, use axis2_strndup.
     */
    AXIS2_EXTERN void * AXIS2_CALL
    axutil_strmemdup(const void *ptr,
        size_t n,
        const axutil_env_t *env);

    AXIS2_EXTERN void * AXIS2_CALL
    axutil_memchr(const void *ptr,
        int c,
        size_t n);

    AXIS2_EXTERN int AXIS2_CALL
    axutil_strcmp(const axis2_char_t * s1,
        const axis2_char_t * s2);

    AXIS2_EXTERN int AXIS2_CALL
    axutil_strncmp(const axis2_char_t * s1,
        const axis2_char_t * s2,
        int n);

    AXIS2_EXTERN axis2_ssize_t AXIS2_CALL
    axutil_strlen(const axis2_char_t * s);

    AXIS2_EXTERN int AXIS2_CALL
    axutil_strcasecmp(const axis2_char_t *s1,
        const axis2_char_t *s2);

    AXIS2_EXTERN int AXIS2_CALL
    axutil_strncasecmp(const axis2_char_t *s1,
        const axis2_char_t *s2, 
        const 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_EXTERN axis2_char_t* AXIS2_CALL
    axutil_stracat(const axutil_env_t *env,
	    const axis2_char_t *s1,
        const axis2_char_t *s2);

    /**
     * Concatenate multiple strings, allocating memory
     * @param ... The strings to concatenate.  The final string must be NULL
     * @return The new string
     */
    AXIS2_EXTERN axis2_char_t * AXIS2_CALL
    axutil_strcat(const axutil_env_t *env, ...);

    AXIS2_EXTERN axis2_char_t * AXIS2_CALL
    axutil_strstr(const axis2_char_t *heystack,
        const axis2_char_t *needle);
    
    /**
     * Finds the first occurrence of a character in a string
     * @param s String in which the character is searched
     * @param ch Character to be searched
     * @return Pointer to to the first occurence of the charecter if it could
     *         be found in the string, NULL otherwise 
     */
    AXIS2_EXTERN axis2_char_t * AXIS2_CALL
    axutil_strchr(const axis2_char_t *s,
            axis2_char_t ch);

    AXIS2_EXTERN axis2_char_t * AXIS2_CALL
    axutil_rindex(const axis2_char_t *s,
        axis2_char_t c);

    /* replaces s1 with s2 */
    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_replace(const axutil_env_t *env,
        axis2_char_t *str,
        int s1,
        int s2);

    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_strltrim(const axutil_env_t *env,
        const axis2_char_t *_s,
        const axis2_char_t *_trim);

    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_strrtrim(const axutil_env_t *env,
        const axis2_char_t *_s,
        const axis2_char_t *_trim);

    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_strtrim(const axutil_env_t *env,
        const axis2_char_t *_s,
        const axis2_char_t *_trim);

    /**
     * replace given axis2_character with a new one.
     * @param str       string operation apply
     * @param old_char  the old axis2_character which would be replaced
     * @param new_char  new axis2_char_tacter
     * @return      replaced string
     */
    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_string_replace(axis2_char_t *str,
        axis2_char_t old_char,
        axis2_char_t new_char);

    /**
     * gives a sub string starting with given index.
     * @param str       string operation apply
     * @param c     starting index
     * @return      substring
     */
    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_string_substring_starting_at(axis2_char_t *str,
        int s);

    /**
     * gives a sub string ending with given index.
     * @param str       string operation apply
     * @param c     ending index
     * @return      substring
     */
    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_string_substring_ending_at(axis2_char_t *str,
        int e);

    /**
     * set a string to lowercase.
     * @param str   string
     * @return string with lowercase
     */
    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_string_tolower(axis2_char_t *str);

    /**
     * set a string to uppercase.
     * @param str   string
     * @return string with uppercase
     */
    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axutil_string_toupper(axis2_char_t *str);

    /**
     * Finds the first occurrence of the substring needle in the string 
     * haystack, ignores the case of both arguments. 
     * @param haystack string in which the given string is to be found
     * @param needle string to be found in haystack
     * @return pointer to the beginning of the substring, 
     * or NULL  if  the  substring  is  not found
     */
    AXIS2_EXTERN axis2_char_t * AXIS2_CALL
    axutil_strcasestr(const axis2_char_t *heystack,
        const axis2_char_t *needle);

    /** @} */

#ifdef __cplusplus
}
#endif

#endif                          /* AXIS2_STRING_H */
