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

Re: [Lost] Neue io_get_absolute_path



Kevin Wolf wrote:
>> +/**
>> + * Zerstueckelt einen Pfad in die einzelnen Elemente
>> + */
>> +static bool get_path_element(const char* path, int index, struct path_element* element)
>>     
>
> Soll der Kommentar eine ausreichende Beschreibung für eine Funktion mit 
> diesem Prototyp sein? Ich kann mir darunter ehrlich gesagt nichts 
> vorstellen, ohne den Code anzuschauen. Beschreibung der Parameter und 
> des Rückgabewerts wäre nett - bei den folgenden Funktionen ebenso.
>   
Ok stimmt, da war ich etwas geizig mit dem Kommentar ;-)
>> +{
>> +    bool escaped = FALSE;
>> +    char* pos = (char*) path;
>> +    char* last_element = (char*) path;
>> +    path_sep_t left_sep = NO_SEP;
>> +
>> +    // 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?
>> +                escaped = TRUE;
>> +            }
>> +            // Auf Service-Seperator :/ Pruefen
>> +            else if ((*pos == ':') && (*(pos + 1) == '/')) {
>> +                // Ist das das gewuenschte Element?
>> +                if (index-- == 0) {
>> +                    element->left_sep = left_sep;
>> +                    element->right_sep = SERVICE_SEP;
>> +                    
>> +                    // 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?
>> +            // Pfad-Seperator /
>> +            else if (*pos == '|') {
>>     
>
> Offensichtlich unverändert kopierter Kommentar.
>   
Auf gar keinen Fall... das ist nicht so wies aussieht *g*
>> +/**
>> + * Erstellt aus einem Beliebigen Pfad einen absoluten
>> + */
>> +char* io_get_absolute_path(const char* path)
>>     
>
> 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.
>> +{
>> +    char* cwd = getcwd(NULL, 0);
>> +    // Hier wird eine Liste mit all den Pfad-Elementen erstellt
>> +    struct path_element* element = malloc(sizeof(struct path_element));
>> +    list_t* element_stack = list_create();
>> +
>> +    int i = 0;
>> +    // Elemente einzeln holen, und an Liste anhaengen
>> +    while (get_path_element(path, i++, element) == TRUE) { 
>> +        list_push(element_stack, element);
>> +        element = malloc(sizeof(struct path_element));
>> +    }
>> +    // Das letzte Element ist unbenutzt und kann freigegeben werden
>> +    free(element);
>>     
>
> 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....
>> +    // Jetzt werden relative Pfade aufgeloest
>> +    int last_element = list_size(element_stack) - 1;
>> +    element = list_get_element_at(element_stack, last_element++);
>>     
>
> Das ist verwirrend. Wozu erst eins abziehen und in der nächsten Zeile 
> wieder ein verstecktes ++ drauf? Außerdem wäre ein Hinweis gut, daß 
> last_element logisch das erste (vorderste) Element bezeichnet.
>   
Werde ich deutlicher beschreiben