[msvc] Update csproj files
[mono.git] / eglib / src / gstring.c
index f5d899d2755e0258cee9957a7a5bdd37dac2b462..ba75789bc80788719d2e9ffaf972e835a88f6887 100644 (file)
@@ -26,7 +26,6 @@
  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
-#define _GNU_SOURCE
 #include <stdio.h>
 #include <glib.h>
 
@@ -42,10 +41,14 @@ g_string_new_len (const gchar *init, gssize len)
 {
        GString *ret = g_new (GString, 1);
 
-       ret->len = len < 0 ? strlen(init) : len;
+       if (init == NULL)
+               ret->len = 0;
+       else
+               ret->len = len < 0 ? strlen(init) : len;
        ret->allocated_len = MAX(ret->len + 1, 16);
        ret->str = g_malloc(ret->allocated_len);
-       memcpy(ret->str, init, ret->len);
+       if (init)
+               memcpy(ret->str, init, ret->len);
        ret->str[ret->len] = 0;
 
        return ret;
@@ -129,6 +132,20 @@ g_string_append_c (GString *string, gchar c)
        return string;
 }
 
+GString *
+g_string_append_unichar (GString *string, gunichar c)
+{
+       gchar utf8[6];
+       gint len;
+       
+       g_return_val_if_fail (string != NULL, NULL);
+       
+       if ((len = g_unichar_to_utf8 (c, utf8)) <= 0)
+               return string;
+       
+       return g_string_append_len (string, utf8, len);
+}
+
 GString *
 g_string_prepend (GString *string, const gchar *val)
 {
@@ -146,6 +163,24 @@ g_string_prepend (GString *string, const gchar *val)
        return string;
 }
 
+GString *
+g_string_insert (GString *string, gssize pos, const gchar *val)
+{
+       gssize len;
+       
+       g_return_val_if_fail (string != NULL, string);
+       g_return_val_if_fail (val != NULL, string);
+       g_return_val_if_fail (pos <= string->len, string);
+
+       len = strlen (val);
+       
+       GROW_IF_NECESSARY(string, len); 
+       memmove(string->str + pos + len, string->str + pos, string->len - pos - len + 1);
+       memcpy(string->str + pos, val, len);
+
+       return string;
+}
+
 void
 g_string_append_printf (GString *string, const gchar *format, ...)
 {
@@ -160,7 +195,20 @@ g_string_append_printf (GString *string, const gchar *format, ...)
        va_end (args);
        g_string_append (string, ret);
 
-       free (ret);
+       g_free (ret);
+}
+
+void
+g_string_append_vprintf (GString *string, const gchar *format, va_list args)
+{
+       char *ret;
+
+       g_return_if_fail (string != NULL);
+       g_return_if_fail (format != NULL);
+
+       ret = g_strdup_vprintf (format, args);
+       g_string_append (string, ret);
+       g_free (ret);
 }
 
 void
@@ -187,12 +235,42 @@ g_string_truncate (GString *string, gsize len)
        g_return_val_if_fail (string != NULL, string);
 
        /* Silent return */
-       if (len < 0 || len >= string->len) {
+       if (len >= string->len)
                return string;
-       }
        
        string->len = len;
        string->str[len] = 0;
        return string;
 }
 
+GString *
+g_string_set_size (GString *string, gsize len)
+{
+       g_return_val_if_fail (string != NULL, string);
+
+       GROW_IF_NECESSARY(string, len);
+       
+       string->len = len;
+       string->str[len] = 0;
+       return string;
+}
+
+GString *
+g_string_erase (GString *string, gssize pos, gssize len)
+{
+       g_return_val_if_fail (string != NULL, string);
+
+       /* Silent return */
+       if (pos >= string->len)
+               return string;
+
+       if (len == -1 || (pos + len) >= string->len) {
+               string->str[pos] = 0;
+       }
+       else {
+               memmove (string->str + pos, string->str + pos + len, string->len - (pos + len) + 1);
+               string->len -= len;
+       }
+
+       return string;
+}