Partially sync files.el from XEmacs 21.5 for wildcard support.
[sxemacs] / src / sysdep.h
index 4ee497d..f34b944 100644 (file)
@@ -223,35 +223,24 @@ x__dirlen(const char *file, size_t len)
 extern_inline void
 x__dirname(char *restrict res, const char *file, size_t len)
        __attribute__((always_inline));
-#if defined(HAVE_DIRNAME) && defined(DIRNAME_SIDE_EFFECT)
+#if defined(HAVE_DIRNAME)
 extern_inline void
 x__dirname(char *restrict res, const char *file, size_t len)
 {
-       /* assumes res is malloc'd of size LEN */
-       xstrncpy(res, file, len);
-       dirname(res);
-       return;
-}
-#elif defined(HAVE_DIRNAME) && !defined(DIRNAME_ACCEPTS_PROTMEM)
-extern_inline void
-x__dirname(char *restrict res, const char *file, size_t len)
-{
-       /* assumes res is malloc'd of size LEN */
-       char *result;
-       xstrncpy(res, file, len);
-       /* if we were using side effects we woulda matched the above cond */
-       result = dirname(res);
-       xstrncpy(res, result, xmin_size_t(len, xstrlen(result)));
-       return;
-}
-#elif defined(HAVE_DIRNAME)
-extern_inline void
-x__dirname(char *restrict res, const char *file, size_t len)
-{
-       /* assumes res is malloc'd of size LEN */
-       char *result = dirname(res);
-       xstrncpy(res, result, xmin_size_t(len, xstrlen(result)));
-       return;
+        /* assumes res is malloc'd of size LEN */
+        char *result;
+        xstrncpy(res, file, len);
+        result = dirname(res);
+        if (res == result) {
+                return;
+        }
+        if (result < res || result >= (res+len)) {
+                xstrncpy(res, result, len);
+        } else {
+                /* Use memmove if result overlaps res */
+                memmove(res, result, strlen(result)+1);
+        }
+        return;
 }
 #endif
 
@@ -261,7 +250,7 @@ xdirname(const char *file)
 extern_inline char*
 xdirname(const char *file)
 {
-       size_t len = xstrlen(file);
+       size_t len = xstrlen(file)+1;
        char *res = xmalloc_atomic(len);
 
        x__dirname(res, file, len);