[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Lost] [Patch] LostIO - io_split_dirname



Dieser Patch ergänzt unsere Pfadfunktionen um eine Funktion, die das
letzte Glied vom Pfad abtrennt und nur den Anfang zurückgibt.
Index: lib/lost_path.c
===================================================================
--- lib/lost_path.c	(Revision 616)
+++ lib/lost_path.c	(Arbeitskopie)
@@ -499,3 +499,47 @@
         return NULL;
     }
 }
+
+/**
+ * Trennt aus einem Pfad den Pfad zum Verzeichnis ab, in dem das Oberste
+ * Element liegt. (d.h. das letzte Pfadelement wird abgeschnitten)
+ * Es wird keine Ueberpruefung vorgenommen, ob die Datei existiert.
+ *
+ * @param path Zu splittender Pfad
+ *
+ * @return Pfad zur angegebenen Datei
+ */
+char* io_split_dirname(const char* path)
+{    
+    // Liste fuer die Elemente des Pfades erstellen
+    list_t* element_stack = list_create();
+    get_path_elements(path, element_stack, 0);
+    
+    // Erstes Element loeschen
+    list_remove(element_stack, 0);
+
+    // Wenn keine Elemente mehr Existieren ist der Fall erledigt.
+    if (list_size(element_stack) == 0) {
+        return NULL;
+    }
+    
+    // Ansonsten wird jetzt ein Puffer fuer den Pfad angelegt
+    char* result;
+    size_t size = calc_path_length(element_stack);
+    if ((result = malloc(size + 1))) {
+        // Wenn das geklappt hat, wird der Pfad jetzt wieder in einen String
+        // umgewandelt
+        create_path_string(element_stack, result, TRUE);
+    } else {
+        // Falls ein Fehler beim anlegen des Puffers aufgetreten ist, wurden
+        // die Elemente nich freigegeben. Dann geschieht das jetzt manuell.
+        struct path_element* element;
+        while ((element = list_pop(element_stack))) {
+            free(element);
+        }
+    }
+
+    // Liste zerstoeren
+    list_destroy(element_stack);
+    return result;
+}