username_tab_completion: rewritten using getpwent

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@503 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
master
Chris Allegretta 2001-01-23 03:27:31 +00:00
parent e5e4d49316
commit 2c2c5f2156
2 changed files with 15 additions and 55 deletions

View File

@ -12,6 +12,7 @@ General
discovered by David Sobon). discovered by David Sobon).
username_tab_completion() username_tab_completion()
- Optimization and removal of useless vars (Rocco). - Optimization and removal of useless vars (Rocco).
- Rewritten using getpwent (suggested by Rocco).
real_dir_from_tilde() real_dir_from_tilde()
- Rewritten using getpwent (suggested by Adam, much optimized by Rocco). - Rewritten using getpwent (suggested by Adam, much optimized by Rocco).
- global.c: - global.c:

69
files.c
View File

@ -676,78 +676,37 @@ int append_slash_if_dir(char *buf, int *lastWasTab, int *place)
char **username_tab_completion(char *buf, int *num_matches) char **username_tab_completion(char *buf, int *num_matches)
{ {
char **matches = (char **) NULL, *line = NULL, *lineptr; char **matches = (char **) NULL;
char *matchline = NULL; char *matchline = NULL;
struct passwd *userdata;
int fd, i = 0, status = 1;
char byte[1];
if ((fd = open("/etc/passwd", O_RDONLY)) == -1) {
return NULL;
}
*num_matches = 0; *num_matches = 0;
matches = nmalloc(BUFSIZ * sizeof(char *)); matches = nmalloc(BUFSIZ * sizeof(char *));
strcat(buf, "*"); strcat(buf, "*");
do { while ((userdata = getpwent()) != NULL) {
i = 0;
line = nrealloc(line, 1);
while ((status = read(fd, byte, 1)) == 1 && byte[0] != '\n') {
line[i] = byte[0]; if (userdata == NULL)
i++;
line = nrealloc(line, i + 1);
}
if (i == 0)
break; break;
line[i] = 0; if (check_wildcard_match(userdata->pw_name, &buf[1]) == TRUE) {
lineptr = strtok(line, ":");
if (check_wildcard_match(line, &buf[1]) == TRUE) {
/* Cool, found a match. Add it to the list /* Cool, found a match. Add it to the list
* This makes a lot more sense to me (Chris) this way... * This makes a lot more sense to me (Chris) this way...
*/ */
matchline = nmalloc(strlen(line) + 2); matchline = nmalloc(strlen(userdata->pw_name) + 2);
sprintf(matchline, "~%s", line); sprintf(matchline, "~%s", userdata->pw_name);
matches[*num_matches] = matchline;
++*num_matches;
for (i = 0; i <= 4 && lineptr != NULL; i++) /* If there's no more room, bail out */
lineptr = strtok(NULL, ":"); if (*num_matches == BUFSIZ)
break;
if (lineptr != NULL) {
/* /etc/passwd entry has the required number of fields */
matches[*num_matches] = matchline;
++*num_matches;
/* 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);
}
} }
}
endpwent();
} while (status == 1);
free(line);
close(fd);
#ifdef DEBUG
fprintf(stderr, "\nin username_tab_completion\n");
#endif
return (matches); return (matches);
} }