[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")