On 5/21/26 6:12 PM, Quentin Schulz wrote:

Hello Quentin,

+    p = strrchr(start, '.');
+    end = p ? p : start + strlen(start);
      len = end - start;
      if (len >= size)
          len = size - 1;

Why not call basename(3) directly in here ? Why reimplement it ?

"""
Warning: there are two different functions basename() - see below.

[...]

Notes

There are two different versions of basename() - the POSIX version described above, and the GNU version, which one gets after

     #define _GNU_SOURCE         /* See feature_test_macros(7) */
     #include <string.h>

The GNU version never modifies its argument, and returns the empty string when path has a trailing slash, and in particular also when it is "/". There is no GNU version of dirname().

With glibc, one gets the POSIX version of basename() when <libgen.h> is included, and the GNU version otherwise.

Bugs

In the glibc implementation of the POSIX versions of these functions they modify their argument, and segfault when called with a static string like "/usr/". Before glibc 2.2.1, the glibc version of dirname() did not correctly handle pathnames with trailing '/' characters, and generated a segfault if given a NULL argument.
"""

Not very reassuring, tbh.

Writing our own variant with its own set of bugs is worse than using a common implementation which has the bugs removed over time due to effort of the various users.

If basename(3) is not an option, is there another common alternative ?

Reply via email to