/**
 * 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_utils_defines.h>
#include <axis2_error.h>
#include <axis2_env.h>
#include <string.h>

#ifdef __cplusplus
extern "C"
{
#endif

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

    AXIS2_EXTERN void* AXIS2_CALL
    axis2_strdup (const void *ptr, 
                  const axis2_env_t *env);

    /**
     * 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
    axis2_strndup (
            const void *ptr, 
            int n, 
            const axis2_env_t *env );

    /**
     * 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
    axis2_strmemdup(const void *ptr, 
            size_t n, 
            const axis2_env_t *env);

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

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

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

    AXIS2_EXTERN axis2_ssize_t AXIS2_CALL
    axis2_strlen(const axis2_char_t * s);

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

    AXIS2_EXTERN int AXIS2_CALL
    axis2_strncasecmp(const axis2_char_t *s1, 
                      const 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_EXTERN axis2_char_t* AXIS2_CALL
    axis2_stracat(const axis2_char_t *s1, 
                  const axis2_char_t *s2, 
                  const axis2_env_t *env);

    /**
     * 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
    axis2_strcat(const axis2_env_t *env, ...);
        
    AXIS2_EXTERN axis2_char_t * AXIS2_CALL
    axis2_strstr (const axis2_char_t *heystack,
                  const axis2_char_t *needle);

    AXIS2_EXTERN axis2_char_t * AXIS2_CALL
    axis2_rindex(const axis2_char_t *s, 
                 axis2_char_t c);
    /* replaces s1 with s2 */                 
    AXIS2_EXTERN axis2_char_t* AXIS2_CALL
    axis2_replace(const axis2_env_t *env,
                  axis2_char_t *str,
                  int s1,
                  int s2);
                                   
   AXIS2_EXTERN axis2_char_t* AXIS2_CALL
   axis2_strltrim(
           const axis2_env_t *env,
           const axis2_char_t *_s,
           const axis2_char_t *_trim);

   AXIS2_EXTERN axis2_char_t* AXIS2_CALL 
   axis2_strrtrim(
           const axis2_env_t *env,
           const axis2_char_t *_s,
           const axis2_char_t *_trim);

   AXIS2_EXTERN axis2_char_t* AXIS2_CALL 
   axis2_strtrim(
           const axis2_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
   axis2_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
   axis2_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
   axis2_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
   axis2_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
   axis2_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
    axis2_strcasestr(
            const axis2_char_t *heystack, 
            const axis2_char_t *needle);
   

#define AXIS2_STRDUP(pts, env) \
        axis2_strdup(pts, env)

#define AXIS2_STRNDUP(pts, n, env) \
        axis2_strndup(pts, n, env)

#define AXIS2_STRMEMDUP(pts, n, env) \
        axis2_strmemdup(pts, n, env)

#define AXIS2_MEMCHR(pts, c, n) \
        axis2_memchr(pts, c, n)
        
#define AXIS2_STRCMP(s1, s2) \
        axis2_strcmp(s1, s2)
        
#define AXIS2_STRNCMP(s1, s2, n) \
        axis2_strncmp(s1, s2, n)
        
#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)
        
#define AXIS2_REPLACE(env, str, s1, s2) \
        axis2_replace(env, str, s1, s2)        

#define AXIS2_STRLTRIM(env, s, trim) \
      axis2_strltrim(env, s, trim)

#define AXIS2_STRRTRIM(env, s, trim) \
      axis2_strrtrim(env, s, trim)

#define AXIS2_STRTRIM(env, s, trim) \
      axis2_strtrim(env, s, trim)

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

#endif                          /* AXIS2_STRING_H */
