#define DEF_NDIR #include #include #include "ndir.h" extern char *malloc(); #define MALLOC(x) (x *)malloc(sizeof(x)) DIR *opendir(name)char *name; { DIR *directory; int status; char *p; if((directory=MALLOC(DIR))==NULL) return NULL; directory->FileFlags=D_FIRST; /* parse and construct full path name */ if(index(name,':')!=NULL) strcpy(directory->FilePath,name); else { status=Dgetdrv(); directory->FilePath[0]=status+'A'; directory->FilePath[1]=':'; Dgetpath(directory->FilePath+2,status+1); strcat(directory->FilePath,"\\"); strcat(directory->FilePath,name); } for(p=directory->FilePath;*p;p++) if(*p=='/') *p='\\'; if(index(directory->FilePath,'*') || index(directory->FilePath,'?')) ; else { p=directory->FilePath; if(p[strlen(p)-1]) strcat(p,"\\*.*"); else strcat(p,"*.*"); } directory->FileDirect.d_ino=0; return directory; } static struct direct *getdent(dir)DIR *dir; { struct direct *d_ans= &(dir->FileDirect); strcpy(d_ans->d_name,dir->FileName); d_ans->d_namlen=strlen(d_ans->d_name); d_ans->d_reclen=sizeof(struct direct); d_ans->d_ino++; return d_ans; } struct direct *readdir(dir)DIR *dir; { int res; DMABUFFER *hold; struct direct *d_struct= &(dir->FileDirect); hold=Fgetdta(); Fsetdta(dir); if(dir->FileFlags & D_FIRST) { res=Fsfirst(dir->FilePath,0xff); dir->FileFlags &= ~(D_FIRST); } else res=Fsnext(); Fsetdta(hold); if(!res) return getdent(dir); else return NULL; } void closedir(dir)DIR *dir; { free(dir); } void rewinddir(dir)DIR *dir; { dir->FileFlags=D_FIRST; dir->FileDirect.d_ino=0; } void seekdir(dir,where)DIR *dir;long where; { struct direct *w; rewind(dir); while(dir->FileDirect.d_ino!=(where-1)) w=readdir(dir); } long telldir(dir)DIR *dir; { return (long)(dir->FileDirect.d_ino); }