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

Re: [Lost] Neue io_get_absolute_path



Gefällt mir schon wesentlich besser, besonders was die Kommentierung betrifft, nur noch ein paar Anmerkungen:

+struct path_element {
+    path_sep_t left_sep;
+    path_sep_t right_sep;
+
+    char text[256];

Aus den 255 besser eine Konstante machen und hier die Konstante + 1 nehmen.

+static int get_path_elements(const char* path, list_t* list, int position)
+{
+    bool escaped = FALSE;
+    const char* pos = path;
+    const char* last_element = path;
+    path_sep_t left_sep = NO_SEP;
+    struct path_element* element = NULL;
+    int element_count = 0;

Ist eigentlich unnötig, die Liste zählt schon selbst mit und ein list_size-Aufruf ist nun wirklich nicht teuer.

+/**
+ * Ueberarbeitet einen Pfad, der in die einzelnen Elemente zerlegt als liste
+ * uebergeben wird, so dass keine Dot und Dotdot-Elemente mehr vorkommen
+ *
+ * @param list Liste mit den Elementen
+ */
+static void eliminate_dot_elements(list_t* list)

Vielleicht im Kommentar noch erwähnen, daß die Funktion nur mit absoluten Pfaden funktioniert, weil sie auch .. am Anfang killt, ohne es ersetzen zu können.

+/**
+ * Verarbeitet einen Pfad relativ zum aktuellen Service verarbeiten. Dabei
+ * werden von CWD erst alle verzeichnisse bis zum hintersten Service abgetrennt
+ * werden, und danach wird das was uebrig bleibt vor den anderen Pfad
+ * geschrieben (Achtung: Auch hier wieder ist die Liste in der umgekehrten
+ * Reihenfolge).
+ *
+ * @param list Pfad als Liste
+ */
+static inline void resolve_relative_serv_path(list_t* list)
+{
+
+    // Temporaere Liste fuer die CWD-Elemente erstellen
+    list_t* cwd_list = list_create();
+
+    // CWD-Elemente holen und an Liste anhaengen
+    char* cwd = getcwd(NULL, 0);
+    get_path_elements(cwd, cwd_list, 0);
+    free(cwd);
+    struct path_element* element;
+ + + // Jetzt werden alle Elemente bis zum Service-Element verworfen
+    int i = 0;
+    while ((element = list_get_element_at(cwd_list, i)) && (element->
+        right_sep != SERVICE_SEP))
+    {
+        list_remove(cwd_list, i);
+        free(element);
+
+        i++;

Wenn der Eintrag weg ist, darf i nicht erhöht werden, sonst wird nur jedes zweite Element gelöscht.

+    }
+
+    // Die uebrig gebliebenen Elemente werden an die Pfad-Liste angehaengt
+    int last_element = list_size(list);
+    i = list_size(cwd_list);
+    while ((element = list_get_element_at(cwd_list, --i))) {

Hast du nachgeschaut, wie eine Liste auf einen Index -1 reagiert? Da bin ich mir nämlich im Moment nicht sicher. ;-)

+/**
+ * Wandelt den Pfad von der Listen-Form in einen String um, und gibt alle
+ * Elemente Frei. + *
+ * @param list Pfad als Liste
+ * @param buffer Puffer in dem der String gespeichert werden soll
+ * @param free_element TRUE, falls die elemente gefreet werden sollen
+ */
+static inline void create_path_string(list_t* list, char* buffer,
+    bool free_element)
+{
+    // Jetzt muss der Pfad rueckwaerts abgearbeitet werden, damit er im String
+    // in der richtigen reihenfolge ist
+    int i = list_size(list);
+    size_t size;
+    struct path_element* element;
+    while ((element = list_get_element_at(list, --i))) {
+        // Element-Text kopieren
+        size = strlen(element->text);
+        memcpy(buffer, element->text, size);

Wieso nicht strcpy?


+char* io_get_absolute_path(const char* path)
+{

+    // Das erste Element ist aufgrund der Reihenfolge in der Liste das letzte,
+    // also das mit dem höchsten Index.

Zeichensatz ("hoechsten")