]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
glib-2.0: Add string.splice method
authorJürg Billeter <j@bitron.ch>
Sat, 19 Dec 2009 09:35:40 +0000 (10:35 +0100)
committerJürg Billeter <j@bitron.ch>
Sat, 19 Dec 2009 09:35:40 +0000 (10:35 +0100)
vapi/glib-2.0.vapi

index ed4d9e990a23b59dd92c7023bb83feb818319724..3adad3ff073706ea862868b86414fb9719a6204b 100644 (file)
@@ -984,6 +984,42 @@ public class string {
                return start_string.ndup (((char*) start_string.offset (end - start)) - ((char*) start_string));
        }
 
+       public string splice (long start, long end, string? str = null) {
+               long string_length = this.len ();
+               if (start < 0) {
+                       start = string_length + start;
+               }
+               if (end < 0) {
+                       end = string_length + end;
+               }
+               GLib.return_val_if_fail (start >= 0 && start <= string_length, null);
+               GLib.return_val_if_fail (end >= 0 && end <= string_length, null);
+               GLib.return_val_if_fail (start <= end, null);
+
+               unowned string start_string = this.offset (start);
+               unowned string end_string = start_string.offset (end - start);
+               size_t str_size;
+               if (str == null) {
+                       str_size = 0;
+               } else {
+                       str_size = str.size ();
+               }
+
+               string* result = GLib.malloc0 (this.size () - ((char*) end_string - (char*) start_string) + str_size + 1);
+
+               char* dest = result;
+
+               GLib.Memory.copy (dest, this, (char*) start_string - (char*) this);
+               dest += (char*) start_string - (char*) this;
+
+               GLib.Memory.copy (dest, str, str_size);
+               dest += str_size;
+
+               GLib.Memory.copy (dest, end_string, end_string.size ());
+
+               return (owned) result;
+       }
+
        public bool contains (string needle) {
                return this.str (needle) != null;
        }