rc: avoid stat calls for directory globbing
On Plan9, we can count on Readdir() onlydirs argument to work, which allows us to avoid stating every single file to see if it is a directory.
This commit is contained in:
parent
e9df4c718a
commit
53800208bd
2 changed files with 13 additions and 22 deletions
|
@ -60,9 +60,15 @@ globdir(word *list, char *p, char *name, char *namep)
|
|||
{
|
||||
char *t, *newp;
|
||||
int f;
|
||||
/* scan the pattern looking for a component with a metacharacter in it */
|
||||
|
||||
/* append slashes, Readdir() already filtered directories */
|
||||
while(*p=='/'){
|
||||
*namep++=*p++;
|
||||
*namep='\0';
|
||||
}
|
||||
if(*p=='\0')
|
||||
return newword(name, list);
|
||||
/* scan the pattern looking for a component with a metacharacter in it */
|
||||
t = namep;
|
||||
newp = p;
|
||||
while(*newp){
|
||||
|
|
|
@ -345,23 +345,15 @@ struct{
|
|||
int
|
||||
Opendir(char *name)
|
||||
{
|
||||
Dir *db;
|
||||
int f;
|
||||
f = open(name, 0);
|
||||
if(f==-1)
|
||||
return f;
|
||||
db = dirfstat(f);
|
||||
if(db!=nil && (db->mode&DMDIR)){
|
||||
if(f<NFD){
|
||||
dir[f].i = 0;
|
||||
dir[f].n = 0;
|
||||
}
|
||||
free(db);
|
||||
|
||||
if((f = open(name, 0)) < 0)
|
||||
return f;
|
||||
if(f<NFD){
|
||||
dir[f].i = 0;
|
||||
dir[f].n = 0;
|
||||
}
|
||||
free(db);
|
||||
close(f);
|
||||
return -1;
|
||||
return f;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -375,13 +367,6 @@ trimdirs(Dir *d, int nd)
|
|||
return w;
|
||||
}
|
||||
|
||||
/*
|
||||
* onlydirs is advisory -- it means you only
|
||||
* need to return the directories. it's okay to
|
||||
* return files too (e.g., on unix where you can't
|
||||
* tell during the readdir), but that just makes
|
||||
* the globber work harder.
|
||||
*/
|
||||
int
|
||||
Readdir(int f, void *p, int onlydirs)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue