[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?