[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] Neue io_get_absolute_path
Kevin Wolf wrote:
> 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. ;-)
>
Okay...
Aber ich habe mir jetzt noch das mit den Pfaden Relativ zum aktuellen
Service nochmal überlegt. Irgendwie fällt mir gerade keine Möglichkeit
ein, wie ich beim letzten Service-Seperator stoppen könnte, ohne sie
zuerst alle zu speichern. Rückwärts durchgehen geht ja nicht, weil ich
nicht weiss, wieviele Elemente da sind. Fällt dir da was ein?