]> git.wh0rd.org Git - nano.git/commitdiff
Rocco's groovy fixes to real_dir_from_tilde
authorChris Allegretta <chrisa@asty.org>
Tue, 23 Jan 2001 03:09:15 +0000 (03:09 +0000)
committerChris Allegretta <chrisa@asty.org>
Tue, 23 Jan 2001 03:09:15 +0000 (03:09 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@502 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
files.c

index 738e90f4e594a4941de7153095700a12c952b18d..92b723bd60ec4183fb9b997a08881ea062fb1d93 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,7 +13,7 @@ General
   username_tab_completion()
        - Optimization and removal of useless vars (Rocco).
   real_dir_from_tilde()
-       - Rewritten using getpwent (suggested by Adam).
+       - Rewritten using getpwent (suggested by Adam, much optimized by Rocco).
 - global.c:
        - Don't define toggles global or toggle_init_one if using --tiny.
 - nano.c:
diff --git a/files.c b/files.c
index d7a1719a2ba30eeec74f396bf06cde628df72d71..554429e6a64e38cf9a44168e9c8aa261122c88de 100644 (file)
--- a/files.c
+++ b/files.c
@@ -582,49 +582,51 @@ int do_writeout_void(void)
  */
 char *real_dir_from_tilde(char *buf)
 {
-    char *dirtmp = NULL;
-    int searchctr = 1;
+    char *dirtmp = NULL, *find_user = NULL;
+    int i = 1;
     struct passwd *userdata;
 
+    /* set a default value for dirtmp, in the case user home dir not found */
+    dirtmp = mallocstrcpy(dirtmp, buf);
+
     if (buf[0] == '~') {
-       if (buf[1] == '~')
-           goto abort;         /* Handle ~~ without segfaulting =) */
-       else if (buf[1] == 0 || buf[1] == '/') {
+       if (buf[1] == 0 || buf[1] == '/') {
            if (getenv("HOME") != NULL) {
+
+               free(dirtmp);
                dirtmp = nmalloc(strlen(buf) + 2 + strlen(getenv("HOME")));
 
-               if (strlen(buf) > 2)
-                   sprintf(dirtmp, "%s/%s", getenv("HOME"), &buf[2]);
-               else
-                   sprintf(dirtmp, "%s/", getenv("HOME"));
+               sprintf(dirtmp, "%s%s", getenv("HOME"), &buf[1]);
 
            }
-       } else if (buf[1] != 0) {
+       }
+       else {
 
            /* Figure how how much of of the str we need to compare */
-           for (searchctr = 1; buf[searchctr] != '/' &&
-                buf[searchctr] != 0; searchctr++);
+           for (i = 1; buf[i] != '/' && buf[i] != 0; i++)
+               ;
+
+           find_user = mallocstrcpy(find_user, &buf[1]);
+           find_user[i - 1] = 0;
 
            for (userdata = getpwent(); userdata != NULL && 
-                 strncmp(userdata->pw_name, &buf[1], searchctr - 1); 
+                 strcmp(userdata->pw_name, find_user); 
                  userdata = getpwent());
 
-           if (userdata == NULL) /* No such user or getpwent() failed */
-               goto abort;
+           free(find_user);
+
+           if (userdata != NULL) {  /* User found */
 
-           /* Else copy the new string into the new buf */
-           dirtmp = nmalloc(strlen(buf) + 2 + strlen(userdata->pw_dir));
+               free(dirtmp);
+               dirtmp = nmalloc(strlen(buf) + 2 + strlen(userdata->pw_dir));
+               sprintf(dirtmp, "%s%s", userdata->pw_dir, &buf[i]);
+
+           }
 
-           sprintf(dirtmp, "%s%s", userdata->pw_dir, &buf[searchctr]);
            endpwent();
        }
-    } else
-       dirtmp = mallocstrcpy(dirtmp, buf);
-
-    return dirtmp;
+    }
 
-  abort:
-    dirtmp = mallocstrcpy(dirtmp, buf);
     return dirtmp;
 }