/* GLIB - Library of useful routines for C programming
 * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
 * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
 * file for a list of people on the GLib Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GLib at ftp://ftp.gtk.org/pub/gtk/.
 */

#ifndef __G_STRING_H__
#define __G_STRING_H__

#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
#error "Only <glib.h> can be included directly."
#endif

#include <glib/gtypes.h>
#include <glib/gunicode.h>
#include <glib/gbytes.h>
#include <glib/gutils.h>  /* for G_CAN_INLINE */

G_BEGIN_DECLS

typedef struct _GString         GString;

struct _GString
{
  gchar  *str;
  gsize len;
  gsize allocated_len;
};

GString*     g_string_new               (const gchar     *init);
GString*     g_string_new_len           (const gchar     *init,
                                         gssize           len);
GString*     g_string_sized_new         (gsize            dfl_size);
gchar*       g_string_free              (GString         *string,
                                         gboolean         free_segment);
GLIB_AVAILABLE_IN_2_34
GBytes*      g_string_free_to_bytes     (GString         *string);
gboolean     g_string_equal             (const GString   *v,
                                         const GString   *v2);
guint        g_string_hash              (const GString   *str);
GString*     g_string_assign            (GString         *string,
                                         const gchar     *rval);
GString*     g_string_truncate          (GString         *string,
                                         gsize            len);
GString*     g_string_set_size          (GString         *string,
                                         gsize            len);
GString*     g_string_insert_len        (GString         *string,
                                         gssize           pos,
                                         const gchar     *val,
                                         gssize           len);
GString*     g_string_append            (GString         *string,
                                         const gchar     *val);
GString*     g_string_append_len        (GString         *string,
                                         const gchar     *val,
                                         gssize           len);
GString*     g_string_append_c          (GString         *string,
                                         gchar            c);
GString*     g_string_append_unichar    (GString         *string,
                                         gunichar         wc);
GString*     g_string_prepend           (GString         *string,
                                         const gchar     *val);
GString*     g_string_prepend_c         (GString         *string,
                                         gchar            c);
GString*     g_string_prepend_unichar   (GString         *string,
                                         gunichar         wc);
GString*     g_string_prepend_len       (GString         *string,
                                         const gchar     *val,
                                         gssize           len);
GString*     g_string_insert            (GString         *string,
                                         gssize           pos,
                                         const gchar     *val);
GString*     g_string_insert_c          (GString         *string,
                                         gssize           pos,
                                         gchar            c);
GString*     g_string_insert_unichar    (GString         *string,
                                         gssize           pos,
                                         gunichar         wc);
GString*     g_string_overwrite         (GString         *string,
                                         gsize            pos,
                                         const gchar     *val);
GString*     g_string_overwrite_len     (GString         *string,
                                         gsize            pos,
                                         const gchar     *val,
                                         gssize           len);
GString*     g_string_erase             (GString         *string,
                                         gssize           pos,
                                         gssize           len);
GString*     g_string_ascii_down        (GString         *string);
GString*     g_string_ascii_up          (GString         *string);
void         g_string_vprintf           (GString         *string,
                                         const gchar     *format,
                                         va_list          args);
void         g_string_printf            (GString         *string,
                                         const gchar     *format,
                                         ...) G_GNUC_PRINTF (2, 3);
void         g_string_append_vprintf    (GString         *string,
                                         const gchar     *format,
                                         va_list          args);
void         g_string_append_printf     (GString         *string,
                                         const gchar     *format,
                                         ...) G_GNUC_PRINTF (2, 3);
GString*     g_string_append_uri_escaped (GString         *string,
                                          const gchar     *unescaped,
                                          const gchar     *reserved_chars_allowed,
                                          gboolean         allow_utf8);

/* -- optimize g_strig_append_c --- */
#ifdef G_CAN_INLINE
static inline GString*
g_string_append_c_inline (GString *gstring,
                          gchar    c)
{
  if (gstring->len + 1 < gstring->allocated_len)
    {
      gstring->str[gstring->len++] = c;
      gstring->str[gstring->len] = 0;
    }
  else
    g_string_insert_c (gstring, -1, c);
  return gstring;
}
#define g_string_append_c(gstr,c)       g_string_append_c_inline (gstr, c)
#endif /* G_CAN_INLINE */


GLIB_DEPRECATED
GString *g_string_down (GString *string);
GLIB_DEPRECATED
GString *g_string_up   (GString *string);

#ifndef G_DISABLE_DEPRECATED
#define  g_string_sprintf  g_string_printf
#define  g_string_sprintfa g_string_append_printf
#endif

G_END_DECLS

#endif /* __G_STRING_H__ */
