diff --git a/src/fileio.c b/src/fileio.c
index e80009f..6e66a3e 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -3367,6 +3367,7 @@
 #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
 	|| defined(FEAT_GUI_MSWIN) \
 	|| defined(FEAT_GUI_MAC) \
+	|| defined(FEAT_GUI_HAIKU) \
 	|| defined(PROTO)
 /*
  * Shorten all filenames in "fnames[count]" by current directory.
@@ -4422,130 +4423,133 @@
     void	*context,
     int		(*checkitem)(void *context, char_u *name))
 {
-    int			failed = FALSE;
-# ifdef MSWIN
-    char_u		*buf, *p;
-    int			ok;
-    HANDLE		hFind = INVALID_HANDLE_VALUE;
-    WIN32_FIND_DATAW    wfb;
-    WCHAR		*wn = NULL;	// UTF-16 name, NULL when not used.
-# endif
+    int		failed = FALSE;
+    char_u	*p;
 
     ga_init2(gap, (int)sizeof(char *), 20);
 
 # ifdef MSWIN
-    buf = alloc(MAXPATHL);
-    if (buf == NULL)
-	return FAIL;
-    STRNCPY(buf, path, MAXPATHL-5);
-    p = buf + STRLEN(buf);
-    MB_PTR_BACK(buf, p);
-    if (*p == '\\' || *p == '/')
-	*p = NUL;
-    STRCAT(buf, "\\*");
+    {
+	char_u		*buf;
+	int		ok;
+	HANDLE		hFind = INVALID_HANDLE_VALUE;
+	WIN32_FIND_DATAW    wfb;
+	WCHAR		*wn = NULL;	// UTF-16 name, NULL when not used.
 
-    wn = enc_to_utf16(buf, NULL);
-    if (wn != NULL)
-	hFind = FindFirstFileW(wn, &wfb);
-    ok = (hFind != INVALID_HANDLE_VALUE);
-    if (!ok)
-    {
-	failed = TRUE;
-	smsg(_(e_notopen), path);
-    }
-    else
-    {
-	while (ok)
+	buf = alloc(MAXPATHL);
+	if (buf == NULL)
+	    return FAIL;
+	STRNCPY(buf, path, MAXPATHL-5);
+	p = buf + STRLEN(buf);
+	MB_PTR_BACK(buf, p);
+	if (*p == '\\' || *p == '/')
+	    *p = NUL;
+	STRCAT(buf, "\\*");
+
+	wn = enc_to_utf16(buf, NULL);
+	if (wn != NULL)
+	    hFind = FindFirstFileW(wn, &wfb);
+	ok = (hFind != INVALID_HANDLE_VALUE);
+	if (!ok)
 	{
-	    int	ignore;
-
-	    p = utf16_to_enc(wfb.cFileName, NULL);   // p is allocated here
-	    if (p == NULL)
-		break;  // out of memory
-
-	    ignore = p[0] == '.' && (p[1] == NUL
-					      || (p[1] == '.' && p[2] == NUL));
-	    if (!ignore && checkitem != NULL)
-	    {
-		int r = checkitem(context, p);
-
-		if (r < 0)
-		{
-		    vim_free(p);
-		    break;
-		}
-		if (r == 0)
-		    ignore = TRUE;
-	    }
-
-	    if (!ignore)
-	    {
-		if (ga_grow(gap, 1) == OK)
-		    ((char_u**)gap->ga_data)[gap->ga_len++] = vim_strsave(p);
-		else
-		{
-		    failed = TRUE;
-		    vim_free(p);
-		    break;
-		}
-	    }
-
-	    vim_free(p);
-	    ok = FindNextFileW(hFind, &wfb);
+	    failed = TRUE;
+	    smsg(_(e_notopen), path);
 	}
-	FindClose(hFind);
-    }
+	else
+	{
+	    while (ok)
+	    {
+		int	ignore;
 
-    vim_free(buf);
-    vim_free(wn);
+		p = utf16_to_enc(wfb.cFileName, NULL);   // p is allocated here
+		if (p == NULL)
+		    break;  // out of memory
+
+		ignore = p[0] == '.' && (p[1] == NUL
+						  || (p[1] == '.' && p[2] == NUL));
+		if (!ignore && checkitem != NULL)
+		{
+		    int r = checkitem(context, p);
+
+		    if (r < 0)
+		    {
+			vim_free(p);
+			break;
+		    }
+		    if (r == 0)
+			ignore = TRUE;
+		}
+
+		if (!ignore)
+		{
+		    if (ga_grow(gap, 1) == OK)
+			((char_u**)gap->ga_data)[gap->ga_len++] = vim_strsave(p);
+		    else
+		    {
+			failed = TRUE;
+			vim_free(p);
+			break;
+		    }
+		}
+
+		vim_free(p);
+		ok = FindNextFileW(hFind, &wfb);
+	    }
+	    FindClose(hFind);
+	}
+
+	vim_free(buf);
+	vim_free(wn);
+    }
 # else
-    DIR		*dirp;
-    struct dirent *dp;
-    char_u	*p;
+    {
+	DIR			*dirp;
+	struct dirent	*dp;
 
-    dirp = opendir((char *)path);
-    if (dirp == NULL)
-    {
-	failed = TRUE;
-	smsg(_(e_notopen), path);
-    }
-    else
-    {
-	for (;;)
+	dirp = opendir((char *)path);
+	if (dirp == NULL)
 	{
-	    int	ignore;
-
-	    dp = readdir(dirp);
-	    if (dp == NULL)
-		break;
-	    p = (char_u *)dp->d_name;
-
-	    ignore = p[0] == '.' &&
-		    (p[1] == NUL ||
-		     (p[1] == '.' && p[2] == NUL));
-	    if (!ignore && checkitem != NULL)
+	    failed = TRUE;
+	    smsg(_(e_notopen), path);
+	}
+	else
+	{
+	    for (;;)
 	    {
-		int r = checkitem(context, p);
+		int	ignore;
 
-		if (r < 0)
+		dp = readdir(dirp);
+		if (dp == NULL)
 		    break;
-		if (r == 0)
-		    ignore = TRUE;
-	    }
+		p = (char_u *)dp->d_name;
 
-	    if (!ignore)
-	    {
-		if (ga_grow(gap, 1) == OK)
-		    ((char_u**)gap->ga_data)[gap->ga_len++] = vim_strsave(p);
-		else
+		ignore = p[0] == '.' &&
+			(p[1] == NUL ||
+			 (p[1] == '.' && p[2] == NUL));
+		if (!ignore && checkitem != NULL)
 		{
-		    failed = TRUE;
-		    break;
+		    int r = checkitem(context, p);
+
+		    if (r < 0)
+			break;
+		    if (r == 0)
+			ignore = TRUE;
+		}
+
+		if (!ignore)
+		{
+		    if (ga_grow(gap, 1) == OK)
+			((char_u**)gap->ga_data)[gap->ga_len++] = vim_strsave(p);
+		    else
+		    {
+			failed = TRUE;
+			break;
+		    }
 		}
 	    }
-	}
 
-	closedir(dirp);
+	    closedir(dirp);
+	}
     }
 # endif
 
