]> git.wh0rd.org Git - nano.git/commitdiff
username_tab_completion(): - Optimization and removal of useless vars (Rocco).
authorChris Allegretta <chrisa@asty.org>
Fri, 19 Jan 2001 04:17:24 +0000 (04:17 +0000)
committerChris Allegretta <chrisa@asty.org>
Fri, 19 Jan 2001 04:17:24 +0000 (04:17 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@491 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
files.c

index e12a8a030d62cda572684d76274da39d582269b5..48e74b34049d32c1a2b71fbb5bab658a97bd58c5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,8 @@ CVS code -
        - Don't free() realname on error, if it needs to be free()d later
          it will be (fixes crash on successful write after failed write,
          discovered by David Sobon).
+  username_tab_completion()
+       - Optimization and removal of useless vars (Rocco).
 
 nano 0.9.99-pre1 - 01/17/2001
 General
diff --git a/files.c b/files.c
index 5d19a0b5e7e4ea1e902def8d30a6de1c49152180..909c7eaeb82484937a0e9857e68207273d0423d7 100644 (file)
--- a/files.c
+++ b/files.c
@@ -575,7 +575,6 @@ int do_writeout_void(void)
 }
 
 #ifndef DISABLE_TABCOMP
-static char **homedirs;
 
 /* Return a malloc()ed string containing the actual directory, used
  * to convert ~user and ~/ notation...
@@ -703,7 +702,7 @@ int append_slash_if_dir(char *buf, int *lastWasTab, int *place)
 char **username_tab_completion(char *buf, int *num_matches)
 {
     char **matches = (char **) NULL, *line = NULL, *lineptr;
-    char *matchline = NULL, *matchdir = NULL;
+    char *matchline = NULL;
 
     int fd, i = 0, status = 1;
     char byte[1];
@@ -712,20 +711,15 @@ char **username_tab_completion(char *buf, int *num_matches)
        return NULL;
     }
 
-    if (homedirs != NULL) {
-       for (i = 0; i < *num_matches; i++)
-           free(homedirs[i]);
-       free(homedirs);
-       homedirs = (char **) NULL;
-       *num_matches = 0;
-    }
+    *num_matches = 0;
     matches = nmalloc(BUFSIZ * sizeof(char *));
-    homedirs = nmalloc(BUFSIZ * sizeof(char *));
+
     strcat(buf, "*");
+
     do {
        i = 0;
-       line = nmalloc(1);
-       while ((status = read(fd, byte, 1)) != 0 && byte[0] != '\n') {
+       line = nrealloc(line, 1);
+       while ((status = read(fd, byte, 1)) == 1 && byte[0] != '\n') {
 
            line[i] = byte[0];
            i++;
@@ -740,41 +734,46 @@ char **username_tab_completion(char *buf, int *num_matches)
 
        if (check_wildcard_match(line, &buf[1]) == TRUE) {
 
-           if (*num_matches == BUFSIZ)
-               break;
-
            /* Cool, found a match.  Add it to the list
             * This makes a lot more sense to me (Chris) this way...
             */
+
            matchline = nmalloc(strlen(line) + 2);
            sprintf(matchline, "~%s", line);
 
            for (i = 0; i <= 4 && lineptr != NULL; i++)
                lineptr = strtok(NULL, ":");
 
-           if (lineptr == NULL)
-               break;
+           if (lineptr != NULL) {
 
-           matchdir = mallocstrcpy(matchdir, lineptr);
-           homedirs[*num_matches] = matchdir;
-           matches[*num_matches] = matchline;
+               /* /etc/passwd entry has the required number of fields */
 
-           ++*num_matches;
+               matches[*num_matches] = matchline;
+               ++*num_matches;
 
-           /* If there's no more room, bail out */
-           if (*num_matches == BUFSIZ)
-               break;
+               /* If there's no more room, bail out */
+               if (*num_matches == BUFSIZ)
+                   break;
+           }
+           else {
+
+               /* /etc/passwd entry is missing at least one field */
+
+               free(matchline);
+           }
        }
 
-       free(line);
 
-    } while (status != 0);
+    } while (status == 1);
+
+    free(line);
 
     close(fd);
-    return matches;
+
 #ifdef DEBUG
     fprintf(stderr, "\nin username_tab_completion\n");
 #endif
+
     return (matches);
 }