From dc588aea5dd887372d6905fa87c249840fc3bd20 Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Wed, 18 Apr 2007 17:13:36 +0000
Subject: [PATCH] simplify real_dir_from_tilde()

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4079 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
---
 ChangeLog   |  1 +
 src/files.c | 30 ++++++++++++++----------------
 2 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 092f9e56..56ac3f29 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,6 @@
 2007-04-18  David Lawrence Ramsey  <pooka109@gmail.com>
 
+	* files.c (real_dir_from_tilde): Simplify.
 	* winio.c (parse_kbinput): Interpret Cancel and Shift-Cancel.
 	* winio.c (get_escape_seq_kbinput): Add missing comments.
 
diff --git a/src/files.c b/src/files.c
index d4c5995e..68a1288e 100644
--- a/src/files.c
+++ b/src/files.c
@@ -1973,13 +1973,13 @@ void do_writeout_void(void)
  * convert ~user/ and ~/ notation. */
 char *real_dir_from_tilde(const char *buf)
 {
-    char *dirtmp = NULL;
+    char *retval;
 
     assert(buf != NULL);
 
     if (buf[0] == '~') {
 	size_t i;
-	const char *tilde_dir = NULL;
+	char *tilde_dir;
 
 	/* Figure out how much of the str we need to compare. */
 	for (i = 1; buf[i] != '/' && buf[i] != '\0'; i++)
@@ -1988,32 +1988,30 @@ char *real_dir_from_tilde(const char *buf)
 	/* Get the home directory. */
 	if (i == 1) {
 	    get_homedir();
-	    tilde_dir = homedir;
+	    tilde_dir = mallocstrcpy(NULL, homedir);
 	} else {
 	    const struct passwd *userdata;
 
+	    tilde_dir = mallocstrncpy(NULL, buf, i + 1);
+	    tilde_dir[i] = '\0';
+
 	    do {
 		userdata = getpwent();
 	    } while (userdata != NULL &&
-		(strncmp(userdata->pw_name, buf + 1, i - 1) != 0 ||
-		strlen(userdata->pw_name) != strnlen(buf + 1, i - 1)));
+		strcmp(userdata->pw_name, tilde_dir + 1) != 0);
 	    endpwent();
 	    if (userdata != NULL)
-		tilde_dir = userdata->pw_dir;
+		tilde_dir = mallocstrcpy(tilde_dir, userdata->pw_dir);
 	}
 
-	if (tilde_dir != NULL) {
-	    dirtmp = charalloc(strlen(tilde_dir) + strlen(buf + i) + 1);
-	    sprintf(dirtmp, "%s%s", tilde_dir, buf + i);
-	}
-    }
+	retval = charalloc(strlen(tilde_dir) + strlen(buf + i) + 1);
+	sprintf(retval, "%s%s", tilde_dir, buf + i);
 
-    /* Set a default value for dirtmp, in case the user's home directory
-     * isn't found. */
-    if (dirtmp == NULL)
-	dirtmp = mallocstrcpy(NULL, buf);
+	free(tilde_dir);
+    } else
+	retval = mallocstrcpy(NULL, buf);
 
-    return dirtmp;
+    return retval;
 }
 
 #if !defined(DISABLE_TABCOMP) || !defined(DISABLE_BROWSER)
-- 
GitLab