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

Re: [Lost] Neue io_get_absolute_path



Toni Kaufmann schrieb:
Kevin Wolf wrote:
+    // Pfad Zeichenweise durchgehen
+    while (TRUE) {
+        // Wenn das letzte Zeichen ein Escape-Zeichen war, muss das aktuelle
+        // nicht beruecksichtigt werden
+        if (escaped == TRUE) {
+            escaped = FALSE;
+        } else {
+            size_t cur_size = (uintptr_t) pos - (uintptr_t) last_element;
+            // Wenn das aktuelle Zeichen ein Escape ist, wird escaped auf TRUE
+            // gesetzt, damit das naechste Zeichen nicht beachtet wird
+            if (*pos == '\\') {
Darf ich mir hier ein switch wünschen?
Und darf ich fragen was du gerne geswitcht sehen würdest? Respektiv wie
du dir den 2. Block mit dem :/ vorstellst? Mit einem case aussen und
noch einem if drin?

Genau darauf wird es wohl hinauslaufen. Aber in den anderen drei Fällen ist es genau ein Zeichen, das du prüfst.

+                    // Text kopieren
+                    memcpy(element->text, last_element, cur_size);
+                    element->text[cur_size] = '\0';
+
+                    // Wir sind am Ende angekommen
+                    return TRUE;
+                }
Dieses if kommt ein paar Mal unverändert vor und Codeduplikation ist böse. Das memcpy könnte außerdem element->text overflowen, wenn ich mich nicht täusche und path lang genug ist.
Okay, ich werde mal schauen was ich machen kann...
Wie soll ich denn das mit dem text deiner Meinung nach machen?
Allozieren? Oder einfach abschneiden?

Abschneiden sollte es tun. Wer mehr als 255 Zeichen lange Pfade benutzt, ist halt selber schuld.

Vielleicht besser einen Puffer für das Ergebnis mitübergeben?

Das habe ich mir auch schon überlegt, aber der Aufrufer weiss ja nicht
wie gross das Ding wird. Deswegen habe ich das so gemacht.

Hm, eine obere Grenze kann er über strlen(getcwd) + strlen(path) aber schon abschätzen, oder? Neuer Rückgabewert wäre dann sinnvollerweise die tatsächlich benutzte Länge.

Das Verfahren funktioniert zwar, ist aber natürlich völlig ineffizient. Du nimmt den Pfad hier in O(n²) auseinander, indem du für jeden Bestandteil den kompletten String neu parst.

Jo, ist mir bewusst. Ich glaube ich Ändere die Funktion oben so ab, dass
sie Alle Elemente aufs mal in eine Liste hängt....

Begrüßenswert. ;-)