Debian, glibc, basename(3) -- das ist doch ein Scherz?

OP #7742662
Lesenswert?
• ▲
▼

Mahlzeit!

char *basename(char *path);

die man page fängt schon gut an, da fehlt ein "const" und noch besser: "Warning: there are two different functions basename()". Und tatsächlich: "basename() may modify the contents of path". Unter Umständen bekomme ich die andere Version char *basename (const char *__filename); "The GNU version never modifies its argument"

Das ist mir zu unsicher. Oder kann ich beim Übersetzen oder zur Laufzeit prüfen, welche dazu gelinkt wurde?

Mit einer eigenen basename() wird keine aus der libc benutzt, aber das scheint mir auch nicht wasserdicht zu sein. Außerdem darf ich die nicht in meiner lib.h definieren, das wäre redundant.

Mit my_basename() oder base_name() wäre zwar alles einwandfrei sauber, aber das nützt mir nichts. Wer den Pfad aufspalten will, schreibt nicht my_ davor. OK, immerhin müsste ich dann nur prüfen, ob /irgendeine/ basename() dazu gelinkt wurde, aber wie?

Bitte, wie macht man das richtig, danke?

Persönliche Seite #7742675
Lesenswert?
• ▲
▼

Was man machen kann ist vorher eine Kopie von Filename anzulegen.

Und wenn zwischen dem Aufruf von basename() und der Verwendung des Ergebnisses weitere Aufrufe von basename() getätigt werden, dann auch das Ergebnis kopieren, etwa mit stp[n]cpy oder str[n]cpy.

Bzw. einen entsprechenden Wrapper um basename() bauen.

Falls basename() nicht millionenfach verwendet wird, wirst du das an der Performance nicht merken. Und wenn du es doch merkst, dann bist du vielleicht sogar froh wenn basename() nicht einen neuen malloc String liefert sondern einen Pointer in den übergebenen Dateiname.

#7742687
Lesenswert?
• ▲
▼

Bauform B. schrieb:

Bitte, wie macht man das richtig, danke?

Das kommt darauf an, wie portabel Du es haben möchtest. Wann welche Variante der basename(3) benutzt wird, steht allerdings in der Manpage. Da steht auch, wie man darauf hinarbeiten kann, welche Version verwendet wird, und wie man die Modifikation bei der POSIX-Version unterbinden kann, sogar mit Beispiel.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.